|
Поиск документов | ☑ | ||
---|---|---|---|---|
0
Garikus
22.03.15
✎
08:56
|
Доброго времени суток.
Имеется проблема, загружаю из EXCEL файл в котором номер и сумма документа, но номер документа это цифры от номера в базе. Нужно найти документы в базе по короткому номеру.(Полный номер может быть разным, нужно как то искать по последним 5-6 цифрам). Кто подскажет как это можно реализовать? |
|||
1
ДенисЧ
22.03.15
✎
09:14
|
Запрос и ПОДОБНО
|
|||
2
Garikus
22.03.15
✎
09:23
|
(1) Не хотелось бы запрос, т.к. искать нужно порядка 4 тысяч документов.
|
|||
3
Garikus
22.03.15
✎
09:26
|
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ | РеализацияТоваровУслуг.Номер КАК ДокНом, | РеализацияТоваровУслуг.Дата КАК ДокДата, | РеализацияТоваровУслуг.СуммаДокумента КАК СуммаДок |ИЗ | Документ.РеализацияТоваровУслуг КАК РеализацияТоваровУслуг |ГДЕ | РеализацияТоваровУслуг.Номер ПОДОБНО &Номер"; Запрос.УстановитьПараметр("Номер", Прав(Номер,5)); РезультатЗапроса = Запрос.Выполнить(); Соорудил примерный запрос, но почему то нехрена не находит( |
|||
4
ДенисЧ
22.03.15
✎
09:27
|
(3) Запрос.УстановитьПараметр("Номер", "%" + Прав(Номер,5));
(2) Кто мешает сначала собрать все номера, потом всё одним запросом найти? |
|||
5
User_Agronom
22.03.15
✎
09:30
|
(2) Все номера в ТЗ, которую передать в запрос.
Запрос только медленный будет, конечно. |
|||
6
ShoGUN
22.03.15
✎
09:34
|
(5) Можно запросом выбрать таблицу вида
Ссылка | Последние 5 цифр номера | Последние 6 цифр номера Сделать индекс, искать в ТЗ через Найти или НайтиСтроки. Точно будет быстрей, чем запрос в цикле, как в (3). |
|||
7
Garikus
22.03.15
✎
09:37
|
Спасибо всем)) будем экспериментировать) что быстрее)
|
|||
8
User_Agronom
22.03.15
✎
09:59
|
(6) да и это запросом быстрее. цикл то 4000 раз должен будет пройти.
|
|||
9
Garikus
22.03.15
✎
10:08
|
А подскажите как в запрос ТЗ закинуть (Номера находятся в табличном документе на поле?
Запрос.УстановитьПараметр("Номер", "%" + Прав(Номер,5)); - Находит ищет соотвествия не только по последним 5 символам, вообще по любому соотвествию из этих цифр. Сильно не ругайтесь, я вообще сисадминю, а програмлю раз в год по нужде. |
|||
10
фобка
22.03.15
✎
10:12
|
(9) нет верю
|
|||
11
фобка
22.03.15
✎
10:13
|
соответсвие в оюбой части %номер%
|
|||
12
Garikus
22.03.15
✎
10:14
|
Запрос.УстановитьПараметр("Тз", Таблица.ВыгрузитьКолонку("Номер")); как то так?
|
|||
13
фобка
22.03.15
✎
10:15
|
(12) это если параметр - список
|
|||
14
фобка
22.03.15
✎
10:16
|
нет конструкции "подобно в". Только циклом запрос пускать
|
|||
15
ShoGUN
22.03.15
✎
10:32
|
(14) Потому и предложил (6), умники, блин. Параметров-то много. Ну либо сделать ВТ такую же, как в (6) и JOIN по равенству с той ТЗ, что загружена из Excel.
|
|||
16
ShoGUN
22.03.15
✎
10:33
|
(8) Подумай ещё раз. Как ты будешь искать ПОДОБНО любому значению из списка запросом?
|
|||
17
фобка
22.03.15
✎
10:37
|
Можно сделать так:
ТекстЗапроса = " выбрать... Где номер подобно (%номер1)"; Пока ... Цикл Текстзапроса = текстзапроса+" или номер подобно (%номерN)"; Конеццикла; |
|||
18
ShoGUN
22.03.15
✎
10:38
|
(17) 4000 TableScan-ов? :) Ну что, тоже вариант...
|
|||
19
ShoGUN
22.03.15
✎
10:41
|
Хотя нет, один TableScan, нормально. Я думал, ты через ОБЪЕДИНИТЬ ВСЕ предлагаешь.
|
|||
20
фобка
22.03.15
✎
10:42
|
(18) проще в источнике полный номер иметь, а вообще сначала вложенный запрос по сумме, с него уже лайки
|
|||
21
ShoGUN
22.03.15
✎
10:44
|
(20) Согласен :)
У тебя в (17) ещё косяк, документы ты найдёшь, а как понять - какой к какой строке Excel? |
|||
22
фобка
22.03.15
✎
10:48
|
(21) а, ну для сопоставления нужно уже будет результат ворочать типа как в (6).
Так что может 4000 запросов не так плохо для решения задачи? если время исполнения некритично |
|||
23
ShoGUN
22.03.15
✎
10:49
|
(22) Проще сразу выбрать как в (6) и не ипать мозга. Таблица в памяти будет быстро работать, и не будет очень большой.
|
|||
24
ShoGUN
22.03.15
✎
10:50
|
Даже если в базе десять тыщ документов. Если миллион - тогда вопрос)
|
|||
25
Garikus
22.03.15
✎
17:48
|
Решил след образом:
Для каждого строка из Ндок цикл поиск = ТабПоле.Найти(Прав(строка.ДокНом,5), "Колонка10"); Если Поиск <> Неопределено Тогда Если число(Строка.СуммаДок) <> число(поиск.Колонка8) Тогда стр = РезультатСверки.Добавить(); стр.НомерДок = поиск.Колонка10; стр.ДатаДок = поиск.Колонка4; Стр.Сумма = поиск.Колонка8; Стр.ДокРеал = строка.ДокНом; Стр.ДатаРеал = строка.ДокДата; Стр.СуммаР = строка.СуммаДок; стр.Разница = Число(строка.СуммаДок)+Число(поиск.Колонка8); ТабПоле.Удалить(Поиск); Конецесли; КонецЕсли; КонецЦикла; Т.е. Сначало загоняю в ТЗ список документов, а потом начинаю искать по второй тз. Но на данный момент словил глюк, при удалении некоторые строчки пропускаются, т.е. условие срабатывает, все заполняется. а вот ТабПоле.Удалить(Поиск); через раз, в чем заковырка может быть? |
|||
26
Mankubus
22.03.15
✎
17:56
|
(25) делай обход цикла с конца и перебирай по индексу
|
|||
27
Garikus
22.03.15
✎
17:58
|
(26) А как определить индекс(поиск)
|
|||
28
Mankubus
22.03.15
✎
18:00
|
Сч = Ндок.Количество()-1;
Пока Сч>=0 Цикл строка = Ндок[Сч]; --------- Сч = Сч-1; КонецЦикла; |
|||
29
Garikus
22.03.15
✎
18:04
|
(28) Мне удалять надо с другой ТЗ в которой я ищу
поиск = ТабПоле.Найти(Прав(строка.ДокНом,5), "Колонка10"); т.е. ТабПоле А в Ндок исходные данные для поиска, и нужно что то если нашел то заполнил результат, а в ТабПоле удалить строку |
|||
30
Garikus
22.03.15
✎
18:05
|
работает, строку находит, данные заполняет, а удаляет почему то через раз
|
|||
31
Garikus
22.03.15
✎
18:11
|
И еще подскажите ТабПоле.Найти ищет точное соответствие, а можно как то искать по последним 5и цифрам?
|
|||
32
ДенисЧ
22.03.15
✎
18:13
|
(31) Можно. Запросом. )
|
|||
33
Garikus
22.03.15
✎
18:14
|
(32) ага и думает год))) С удалением подскажите в чем глюк может быть? код в (25)
|
|||
34
Garikus
22.03.15
✎
18:27
|
))) вопрос снят)) сам дурак)))
|
|||
35
ДенисЧ
22.03.15
✎
18:27
|
Хотел ответить...
Но дурак - значит, дурак ))) |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |