Имя: Пароль:
1C
1C 7.7
v7: Прямой запрос: получить оставшиеся цифры...
0 Злопчинский
 
20.10.12
06:38
Вот кропаю.. прямой запрос.. как умею...
.
Справочник.Номенклатура
Вводим с клавы цифры - это НАЧАЛЬНЫЕ ЦИФРЫ артикула.
.
Хочу получить ПЕРЕЧЕНЬ ЦИФР, которые есть в хвостах артикулов, начинающихся с введенных цифр.
.
т.е.
есть например у меня артикулы в базе
.
825
853
.
ввожу с клавы 8
.
сумел получить перечень хвостов артикулов -
то есть выборка такого вида получилась:
.
25
53
.
надо получить перечень уникальных цифр в этих "хвостах" - то есть хочу получить
.
2
3
5
.
(по этим цифрам будут подсвечиваться нужные кнопки для набора типа как в терминалах платежных)
.
Запрос:
.
   ТекстЗапроса = "SELECT
   |Артикул,
   |TRIM(SUBSTR(Артикул,%ДлинаАртикулПлюсОдин%)) Хвост,
   |Descr Наименование
   |FROM Номенклатура
   |WHERE
   |SUBSTR(Артикул,1,%ДлинаАртикул%) = '%Артикул%'";    
.
где %Артикул% - набор первых цифр артикулов
.
спсб!
1 Злопчинский
 
20.10.12
06:40
идея вроде бы такая - имеющийся запрос использовать как источник (подзапрос) - каждую запись результирующей выборки разлагать на цифры, получившуюся выборку сгруппировать до уникальных значений... как-то так себе представляю.. но мутно...
2 orefkov
 
20.10.12
06:44
where Артикул like '123%'
3 Злопчинский
 
20.10.12
06:45
(2) это замена SUBSTR - в услвоии...
4 Злопчинский
 
20.10.12
06:45
?
5 el-gamberro
 
20.10.12
06:47
Откуда 3 в задаче? Ведь она в третьем символе?

select DISTINCT
SUBSTR(Артикул,1,@position+1)
where patindex('8', Артикул) = @position
6 orefkov
 
20.10.12
06:49
А на цифры разбивать и группировать их имхо лучше уже на клиенте, при обработке результата запроса.
7 Злопчинский
 
20.10.12
06:51
(5) О! это правильная идея! выдавать только следующие цифры!! да, это правильнО!!
8 Злопчинский
 
20.10.12
06:51
(6) дбф, в терминале, SQLite
9 Злопчинский
 
20.10.12
06:53
(5) но пока не вьехал в эти сложные слова что ты нарисовал.. морщу мозг...
10 Злопчинский
 
20.10.12
07:01
вот такой сделал с попроще записью...
   ТекстЗапроса = "SELECT DISTINCT
   |SUBSTR(Артикул,%ДлинаАртикулПлюсОдин%,1) Хвост
   |FROM Номенклатура
   |WHERE
   |Артикул LIKE '%Артикул%'";
11 Mikeware
 
20.10.12
07:03
а может, тупо собирать в подзапросах n+1? n+2? и.т.п\д. цифры, а потом из них уже выбирать различающиеся?
12 Злопчинский
 
20.10.12
07:05
(11) запрос из (10) дает нужный результат
13 Злопчинский
 
20.10.12
07:05
patindex - пишет no such function: patindex
14 Злопчинский
 
20.10.12
07:09
навскидку в SQlite не нашел аналога patindex
15 Злопчинский
 
20.10.12
07:10
прока вроде (10) дает что надо...
16 orefkov
 
20.10.12
07:14
Select 1 where exist (select * from Номенклатура where Артикул like '123%1%')
union
Select 2 where exist (select * from Номенклатура where Артикул like '123%2%')
....
Можно примерно так, но тормозить будет жутко.
Все таки лучше выбрать сами хвосты(при наличии сортировки по артикулу это влет where Артикул between 123 and 12399999)
А уже хвосты обработать в 1С.
17 Злопчинский
 
20.10.12
07:16
(16) спасибо за помощь!
ограничиваюсь (10) - при вводе очереднйо цифры дает перечень следующих цифр - мне этого достаточно!
.
спасибо всем за обучение!
18 Злопчинский
 
20.10.12
07:17
номенклатуры мало - порядка 4000
запрос срабатывает быстро, гетпероформансекаунтер дает 0.008 сек
19 orefkov
 
20.10.12
07:21
Условие поменяй на указанное в (16) - 1sqlite не оптимизирует like, с ним будет полный скан таблицы.
А с between 1230000 and 12399999 будет быстрый отбор по индексу.
20 Злопчинский
 
20.10.12
07:28
(19) понял! учту!!!
21 Злопчинский
 
20.10.12
07:37
(19) а с учетом того, что артикул - это строка, надо писать
where Артикул between '123' and '12399999'
-
прокатит так?
22 Злопчинский
 
20.10.12
07:42
Посмотрел синтаксические диаграммы - вроде должно прокатить.. сейчас попроьбуем
23 Злопчинский
 
20.10.12
07:51
(19) да, с битвином почти на порядок быстрее...
24 Злопчинский
 
20.10.12
10:22
у! наваял вчерновую макет для менеджеров на планшетник рабочее место... для хождения по шоуруму.. зашибись!
.
вопрос закрыт.
Основная теорема систематики: Новые системы плодят новые проблемы.