|
v7: Поиск строки в колонке ТЗ. | ☑ | ||
---|---|---|---|---|
0
rain65
27.07.15
✎
10:17
|
Есть таблица значений, одна из колонок ее — телефоны .
На форме есть поле ввода. Задача — поиск телефона по введенному в поле ввода и сортировка . Делаю так: НайтиТел — Идентификатор поля ввода. Если СокрЛП(НайтиТел) = "" Тогда Табл.Сортировать("АОН"); стр=0; Табл.НайтиЗначение(НайтиТел,стр,"АОН"); Табл.ТекущаяСтрока(стр); КонецЕсли; Колонка тупо сортируется по телефонам, и не ищет нужный номер. Где ошибка? |
|||
1
DCKiller
27.07.15
✎
10:20
|
Если Табл.НайтиЗначение(НайтиТел,стр,"АОН") = 1 Тогда
Табл.ТекущаяСтрока(стр); КонецЕсли; |
|||
2
Serginio1
27.07.15
✎
10:22
|
Зачем сортировать?
Используй функцию Функция глНайтиЗначениеВТз(Тз,Значение,ИмяКолонки) Экспорт стр=0; Если Тз.НайтиЗначение(Значение,стр,ИмяКолонки)=1 Тогда Тз.ПолучитьСтрокуПоНомеру(стр); Возврат 1; КонецЕсли; Возврат 0; КонецФункции // глНайтиЗначениеВТз Если глНайтиЗначениеВТз(Тз,СокрП(стр),"АОН")=1 Тогда Посмотри длину стр |
|||
3
Serginio1
27.07.15
✎
10:23
|
Если глНайтиЗначениеВТз(Тз,СокрП(НайтиТел),"АОН")=1 Тогда
|
|||
4
HawkEye
27.07.15
✎
10:25
|
(0) в пробелах ))
|
|||
5
Duke1C
27.07.15
✎
10:48
|
(0) Если колонка "АОН" типизирована (т.е. указан тип "Строка" и длина её), то при поиске по энтой колонке нужно искомое значение привести к типу колонки (типа Формат(НайтиТел,"С20")), иначе кукиш.
|
|||
6
rain65
27.07.15
✎
12:53
|
(5) Совершенно верно, колонка типизирована. Тип "Строка" длина 15 символов. Да и длина телефонных номеров разная.Пробелов между цифрами нет.
Попробовал вот так: Если СокрЛП(НайтиТел)="" Тогда Формат(НайтиТел,"С15"); Табл.Сортировать("АОН"); стр=0; Табл.НайтиЗначение(СокрЛП (НайтиТел),стр,"АОН"); Табл.ТекущаяСтрока(стр); КонецЕсли; Не ищет |
|||
7
Serginio1
27.07.15
✎
13:43
|
(6) Если колонка типизирована ищи без СокрП
|
|||
8
HawkEye
27.07.15
✎
13:51
|
(6)
наверное все таки: НайтиТел = Формат(НайтиТел,"С15"); отладчик то что говорит? глазами посмотри что ты ищешь и что у тебя в ТЗ имеется... |
|||
9
rain65
27.07.15
✎
14:20
|
Поправил
Если НайтиТел = "" Тогда НайтиТел = Формат(НайтиТел,"С15"); Табл.Сортировать("АОН"); стр=0; Табл.НайтиЗначение(НайтиТел,стр,"АОН"); Табл.ТекущаяСтрока(стр); КонецЕсли; Ничего не происходит. Меня честно говоря смущает условие Если НайтиТел = "" Я его правильно делаю? Т.е. тел. должен искаться при введении номера в поле ввода. |
|||
10
Simod
27.07.15
✎
14:27
|
(9) Держи - "<>"
|
|||
11
HawkEye
27.07.15
✎
14:34
|
(9) конечно не равно..
Если СокрЛП(НайтиТел) <> "" Тогда здесь СокрЛП() - надо использовать |
|||
12
rain65
27.07.15
✎
14:45
|
(11) Если СокрЛП(НайтиТел) <> "" Тогда
НайтиТел = Формат(НайтиТел,"С15"); Табл.Сортировать("АОН"); стр=0; Табл.НайтиЗначение(НайтиТел,стр,"АОН"); Табл.ТекущаяСтрока(стр); КонецЕсли; Ничего не происходит |
|||
13
Ёпрст
27.07.15
✎
15:07
|
(12) Есть уверенность, что телефоны с пробелами справа, а не слева ?
:) |
|||
14
Ёпрст
27.07.15
✎
15:09
|
Ну и писать для реквизита формы
НайтиТел = Формат(НайтиТел,"С15"); - бред сивой кобылы.. |
|||
15
Ёпрст
27.07.15
✎
15:10
|
реквизит формы и так типизирован и так имеет уже ту длину строки, что в свойствах его и присваивать ему другую "типизированную" строку отличной длины - что мертвому припарки
|
|||
16
dk
27.07.15
✎
15:10
|
может уже выложишь искомую строку
|
|||
17
Duke1C
27.07.15
✎
15:14
|
(9) Если НайтиТел это реквизит формы, то установи ему длину такую же как у колонки "АОН" и выкинь нафиг эту строку:
НайтиТел = Формат(НайтиТел,"С15"); |
|||
18
rain65
27.07.15
✎
15:15
|
(13) Так вроде СокрЛП отсекает пробелы и слева и справа?
|
|||
19
Ёпрст
27.07.15
✎
15:16
|
(18) для реквизита формы длина будет всегда = длине в свойствах реквизита формы, фирштейн ?
|
|||
20
rain65
27.07.15
✎
15:24
|
(19) Ну хорошо, в свойствах реквизита формы я тоже поставил длину 15. И СокрЛП убрал.
Если (НайтиТел) <> "" Тогда Табл.Сортировать("АОН"); стр=0; Табл.НайтиЗначение(НайтиТел,стр,"АОН"); Табл.ТекущаяСтрока(стр); КонецЕсли; Теперь тоже тупо сортирует без поиска, даже если не вводить телефона, а тупо нажать сформировать. |
|||
21
Serginio1
27.07.15
✎
15:30
|
(20) Специально сделал тест
Процедура Сформировать() Если глНайтиЗначениеВТз(тз,Номер,"Номер")=1 Тогда тз.ТекущаяСтрока(тз.НомерСтроки); КонецЕсли; КонецПроцедуры //====================================================================== Процедура Добавить(стр) Тз.НоваяСтрока(); Тз.Номер=стр КонецПроцедуры // Добавить Тз.НоваяКолонка("Номер","Строка",15); Добавить("Строка1"); Добавить("Строка2"); Добавить("Строка3"); Все работает |
|||
22
Serginio1
27.07.15
✎
15:31
|
Но учти, что поиск идет с учетом регистра
|
|||
23
Ёпрст
27.07.15
✎
15:35
|
(20) показывай, как создаешь тз и что в неё пишешь
|
|||
24
rain65
27.07.15
✎
15:58
|
(23) Процедура ПриОткрытии ()
Табл.НоваяКолонка("ДатаВремя","ДатаВремя",,,"Дата Время",17); Табл.НоваяКолонка("Длительность","Число",5); Табл.НоваяКолонка("НаправлениеЗвонка","Строка",5); Табл.НоваяКолонка("ЧейЗвонок","Строка",12); Табл.НоваяКолонка("Сотрудник","Справочник.Сотрудники",,,"Сотрудник",35); Табл.НоваяКолонка("Отдел",,,,"Отдел",20); Табл.НоваяКолонка("Должность",,,,"Должность",23); Табл.НоваяКолонка("Филиал",,,,"Филиал",10); Табл.НоваяКолонка("ВнутрНомер","Строка",,,"Внутр Номер",10); Табл.НоваяКолонка("АОН","Строка",15,3,"АОН",15); Табл.НоваяКолонка("Клиенты","Справочник.Клиенты",,,"Клиент"); Табл.НоваяКолонка("Файл",,,,"Файл",7); Табл.НоваяКолонка("Отрасль","Отрасль",,,"Отрасль",15); Табл.НоваяКолонка("РегИНН",,,,"РегИНН",20); абл.НоваяКолонка("Регион","Рег",,,"Регион",21); КонецПроцедуры Процедура Сформировать() sql = СоздатьОбъект("ODBCDatabase"); sql.Соединение("Driver={SQL Server};Server=08dbsql;Database=Dragnet_1c;UID=sa;PWD=********"); rs = СоздатьОбъект("ODBCRecordSet"); rs.УстБД(sql); rs.Отладка(0); ТекстЗапроса = "select |Type as[НаправлениеЗвонка] , |Priznac_call as [ЧейЗвонок], |TimeRazgovor as [Длительность], |Id_kl_1c as [Клиенты $Справочник.Клиенты], |Id_agsb_1c as [Агент $Справочник.Агент_сбыта], |Id_sotr_1c as [Должность $Сотрудник.Должность_Х1], |Id_sotr_1c as [Отдел $Сотрудник.Отдел_Х1], |Id_sotr_1c as [Сотрудник $Справочник.Сотрудники], |Region as [Рег], |Otrasl as [Отрасль], |NumOut as [ВнешнНомер], |NumIn as [ВнутрНомер], |Files as [Файл], |convert(char ,StartTime, 20) as [ДатаВремя] |from Dragnet_1c..x_calls_1c |where StartTime between '20080303 09:30:00' and '20080303 19:30:00'"; ИТЗ = СоздатьОбъект("ИндексированнаяТаблица"); ИТЗ = rs.ВыполнитьИнструкцию(ТекстЗапроса,ИТЗ,1); ИТЗ.ВыбратьСтроки(); Пока ИТЗ.ПолучитьСтроку() = 1 Цикл Табл.НоваяСтрока(); Табл.Клиенты=ИТЗ.Клиенты; В=ИТЗ.Клиенты; Табл.РегИНН=В.ПочтАдр_Город; Если ПустоеЗНачение(В.ПочтАдр_Город) = 1 Тогда Табл.РегИНН=В.ПочтАдр_Регион; Табл.Сотрудник=ИТЗ.Сотрудник; С=ИТЗ.Сотрудник; Табл.Файл=ИТЗ.Файл; Табл.Регион=ИТЗ.Рег; Табл.Отрасль=ИТЗ.Отрасль; Табл.АОН= ИТЗ.ВнешнНомер; Табл.АОН=СокрЛП(Табл.АОН); Табл.ВнутрНомер=ИТЗ.ВнутрНомер; Табл.НаправлениеЗвонка=ИТЗ.НаправлениеЗвонка; --------------------------------------------------------------------------------------ну и т. д. КонецЦикла; ИТЗ.Загрузить(Табл); ИТЗ.ДобавитьИндекс("ДатаВремя","*ДатаВремя",0); ИТЗ.ДобавитьИндекс("Длительность","*Длительность",0); ИТЗ.ДобавитьИндекс("НаправлениеЗвонка","*НаправлениеЗвонка",0); ИТЗ.ДобавитьИндекс("ЧейЗвонок","*ЧейЗвонок",0); ИТЗ.ДобавитьИндекс("Сотрудник","*Сотрудник",0); ИТЗ.ДобавитьИндекс("Отдел","*Отдел",0); ИТЗ.ДобавитьИндекс("Должность","*Должность",0); ИТЗ.ДобавитьИндекс("Филиал","*Филиал",0); ИТЗ.ДобавитьИндекс("ВнутрНомер","*ВнутрНомер",0); ИТЗ.ДобавитьИндекс("АОН","*АОН",0); ИТЗ.ДобавитьИндекс("Клиенты","*Клиенты",0); ИТЗ.ДобавитьИндекс("Файл","*Файл",0); ИТЗ.ДобавитьИндекс("Отрасль","*Отрасль",0); // ИТЗ.ДобавитьИндекс("Агент","*Агент",0); ИТЗ.ДобавитьИндекс("Регион","*Регион",0); Процедура Сформировать1(); Если ВыбСотрудник.Выбран() = 1 Тогда Табл.Сортировать("Сотрудник"); стр = 0; Табл.НайтиЗначение(ВыбСотрудник, стр, "Сотрудник"); Табл.ТекущаяСтрока(стр); КонецЕсли; Выбор и сортировка работает Если (НайтиТел) <> "" Тогда Табл.Сортировать("АОН"); стр=0; Табл.НайтиЗначение(НайтиТел,стр,"АОН"); Табл.ТекущаяСтрока(стр); КонецЕсли; Не работает. |
|||
25
Ёпрст
27.07.15
✎
16:02
|
На вот, дарю:
//Табл.НоваяКолонка("АОН","Строка",15,3,"АОН",15); Табл.НоваяКолонка("АОН"); ...... стр=0; Табл.НайтиЗначение(СокрЛП(НайтиТел),стр,"АОН"); Табл.ТекущаяСтрока(стр); |
|||
26
Serginio1
27.07.15
✎
16:20
|
Или ищи в индексированой таблице в позиционируйся в тз по найденому индексу в ИТЗ НайтиСтроку. Там кстати можешь индекс сделать без учета регистра
|
|||
27
rain65
27.07.15
✎
16:24
|
(25) Ну т.е грубо говоря убрали типизацию колонки АОН, а далее
Если НайтиТел <> "" Тогда Табл.Сортировать("АОН"); стр=0; Табл.НайтиЗначение(СокрЛП(НайтиТел),стр,"АОН"); Табл.ТекущаяСтрока(стр); КонецЕсли; Я пробовал уже это делать. Поиска нет, только сортировка. Уже всю голову сломал. |
|||
28
rain65
27.07.15
✎
16:26
|
(26) Спасибо. Буду думать.
|
|||
29
rain65
27.07.15
✎
16:42
|
Опять повторюсь, что при последнем варианте сортировка происходит даже только при нажатии кнопки сформировать, без введения телефона в поле ввода. Т.е. я делаю вывод, что позиционирование и условие
Если НайтиТел <> "" Тогда Не работает |
|||
30
Serginio1
27.07.15
✎
16:58
|
(29) Так при строке 15 будет 15 пробелов
Если СокрЛП(НайтиТел) <> "" Тогда |
|||
31
Serginio1
27.07.15
✎
17:00
|
Для проверки
Табл.ПолучитьСтрокуПоНомеру(2); стр=0; Если Табл.НайтиЗначение(Табл.АОН,стр,"АОН")=1 Тогда Табл.ТекущаяСтрока(стр); КонецЕсли; |
|||
32
Serginio1
27.07.15
✎
17:01
|
Табл.ПолучитьСтрокуПоНомеру(2);
НайтиТел=Табл.АОН; стр=0; Если Табл.НайтиЗначение(НайтиТел,стр,"АОН")=1 Тогда Табл.ТекущаяСтрока(стр); КонецЕсли; |
|||
33
palpetrovich
27.07.15
✎
17:07
|
(27) нафейхуа тебе все время сортировать по одной и той-же колонке?
Процедура ЗаполнениеТаблицы() // заполняешь как там у тебя Табл.Сортировать("АОН"); КонецПроцедуры Процедура ПоискТелефона() Если СокрЛП(НайтиТел) <> "" Тогда стр=0; Если Табл.НайтиЗначение(НайтиТел,стр,"АОН")=1 Тогда Табл.ТекущаяСтрока(стр); КонецЕсли; КонецЕсли; КонецПроцедуры |
|||
34
rain65
27.07.15
✎
17:42
|
(33) Гы))
Прикольно, предварительную сортировку поставил - в глазах зарябило. Во первых таблица заполняется на 5-7 секунд дольше(порядка 5000 строк - общее время заполнение 30-40 секунд), во вторых пользователю нужно будет отворачиваться от экрана, т.к. в глазах рябит от этой сортировки - сортировка видна на форме. Ну и в третьих, не нужно это, т.к. телефонные номера должны вываливаться для пользователя в хронологическом порядке по времени звонка. Ну и все равно не работает |
|||
35
palpetrovich
27.07.15
✎
17:45
|
(34) "Гы"(цы)
по-ходу тут в консерватории что-то менять надо(еще цы) |
|||
36
Serginio1
27.07.15
✎
17:47
|
(34) Ты в запросе сразу отсортируй и назови правильно клонки. Используй Загрузить Выгрузить.
А вообще у тебя есть ИТЗ в ней и ищи |
|||
37
rain65
27.07.15
✎
17:58
|
(35) Петрович, не обижайся)) Я ж не со зла. Ты же знаешь мой "стаж"))
(36) А что значит правильно назвать колонки? Придется осваивать ИТЗ. Только примеров в сети практически нет. Я работаю в этой области всего два месяца. До этого программированием не занимался вообще. Так что прошу не судить строго. |
|||
38
Serginio1
27.07.15
✎
18:16
|
(37) Для начала проверь 31,32
Колонки в запросе NumOut as [АОН], Да уж тяжело тебе придется |
|||
39
HawkEye
27.07.15
✎
19:35
|
(37) еще раз говорю, посмотри в отладчике
чему равны НайтиТел и Табл.ПолучитьЗначение(1, АОН") |
|||
40
rain65
27.07.15
✎
19:48
|
(39) Еще бы знать как))))
Я знаю как запускать отладчик, как ставить точки останова. Как идти по этим точкам. Как сделать, чтобы в табло выскакивали значения? |
|||
41
HawkEye
27.07.15
✎
20:19
|
(40) в отладчике:
отладка - табло внизу откроется табло в нем напиши: НайтиТел = Табл.ПолучитьЗначение(1, АОН") = точку останова поставь на строку: Если Табл.НайтиЗначение(НайтиТел,стр,"АОН")=1 Тогда |
|||
42
rain65
27.07.15
✎
20:52
|
(41) Спасибо. Завтра попробую.
|
|||
43
rain65
28.07.15
✎
09:30
|
(41) В общем так.
Использую процедуру: Процедура Сформировать2() Если НайтиТел <> "" Тогда стр=0; Если Табл.НайтиЗначение(НайтиТел,стр,"АОН")=1 Тогда Табл.ТекущаяСтрока(стр); КонецЕсли; КонецЕсли; КонецПроцедуры Причем если поставить Если СокрЛП (НайтиТел)- ничего не происходит. Если убрать СокрЛП, то в табло появляется сообщение: НайтиТел = Табл.ПолучитьЗначение(1, АОН") = = Ошибка в выражении! (Точка останова там, где ты указал) |
|||
44
rain65
28.07.15
✎
10:16
|
(41) Максим, посмотри пож-ста почту.
|
|||
45
palpetrovich
28.07.15
✎
10:21
|
(44) лови примерчик, там и отбор и поиск
http://www.fayloobmennik.net/5346743 |
|||
46
rain65
28.07.15
✎
10:30
|
(45) Спасибо. Сейчас гляну.
А вообще интересно получается. Сделал так: Если НайтиТел <> "" Тогда Сообщить ("Тел="""); После того, как набрал номер в поле ввода, по идее должен этот телефон высветиться в табло. Так там нефига нет, только Тел=" Получается, что поле ввода не активно. что ли у меня? |
|||
47
palpetrovich
28.07.15
✎
10:32
|
(46) хз что у тебя там неактивно, а если "НайтиТел" - это реквизит формы с фиксированной длиной, то "Если НайтиТел <> "" Тогда" - смысла не имеет вообще, так как оно ВСЕГДА неравно ""
|
|||
48
Ёпрст
28.07.15
✎
10:33
|
(46) Перем НайтиТел; поди в коде еще у тебя, да ?
|
|||
49
rain65
28.07.15
✎
10:36
|
(48) Угу...точно.Есть такая переменная(
|
|||
50
rain65
28.07.15
✎
10:47
|
Убрал переменную. Все заработало.И зачем я ее вводил? Не помню уже. Всем огромное спасибо. Ну а Ёпрст - просто колдун, однако)))
|
|||
51
Mikeware
28.07.15
✎
10:47
|
(50) Он просто умеет читать документацию...
|
|||
52
varelchik
28.07.15
✎
10:52
|
(50) Он не колдун.
Он просто классный программист и имеет свойства правильно программировать. |
|||
53
HawkEye
28.07.15
✎
11:34
|
(43) Табл.ПолучитьЗначение(1, АОН") = = Ошибка в выражении!
одно равно удали.. |
|||
54
Serginio1
28.07.15
✎
11:35
|
(53) Там еще и кавычки нет
|
|||
55
HawkEye
28.07.15
✎
11:36
|
(54) угу
(43) и кавычку перед АОН |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |