Подскажите С Запросом

Allexei

Well-known member
02.05.2008
322
1
#1
Здравствуйте! Подскажите по такому вопросу. Есть справочник Номенклатура, есть регистр сведений ШтрихКода. Для каждой позиции номенклатуры штрих код может быть, может не быть, может быть их несколько. Вопрос как в запросе можно выбрать Номенклатуру со всеми ее штрих кодами.Результат должен быть примерно следующий:
|Товар-1|ШтрихКод-1;ШтрихКод-2|
|Товар-2| |
|Товар-3|ШтрихКод-3; |
Подскажите как можно сделать, а то уже все что мог придумать перепробовал.
 

Allexei

Well-known member
02.05.2008
322
1
#4
А что же тут не нормального то? Есть позиция номенклатуры Товар 1 со штрих кодами ШтрихКод-1, ШтрихКод-2. Есть позиция номенклатуры Товар-2 у которой вообще нет штрих кодов. Есть позиция номенклатуры Товар3 со штрих кодом 3. Что где хранится написано выше. Результатом запроса должна быть табличка состоящая из 2-х колонок(первая - номенклатура, вторая штрих кода строкой).
Проблема в том что как сделать штрих кода по номенклатуре одной строкой (т.е. штрих1+штрих2...+штрих-n), причем между штрих коами должен быть какой либо разделитель(без разницы какой).
123.jpg
 

Вложения

  • 19.9 КБ Просмотры: 123

KiR

НЕ шибка опытный програмер)
11.09.2007
1 581
0
#6
я не понял логики зачем при отсутствии штрихкода1 забивать штрихкод3?
а вообще можешь выбирать все штрихкоды, потом циклом обходить полученный результат и формировать либо переменные, которые сразу в форму выводишь либо Таблицу Значений с 2 колонками (что-то типа ШК = Строка(Штрихкод1)+";"+Строка(Штрихкод2) и т.д)
 

unknown181538

НеГуру
28.12.2008
1 417
0
#7
Если предположить, что количество штрихкодов не может быть больше N, гуглите нумерацию строк в запросе.
Потом раскладываем на разные колонки... что-то вроде
ВЫБОР КОГДА НомерСтроки = 3 Тогда
Выборка.Штрихкод...

потом
ЕСТЬNULL(Штрихкод1,"")+";"+ЕСТЬNULL(ШтрихКод2,"")
ну мысль такая... но не представляю, зачем это.
В СКД можно попробовать его средства.

Добавлено:
я не понял логики зачем при отсутствии штрихкода1 забивать штрихкод3?
а вообще можешь выбирать все штрихкоды, потом циклом обходить полученный результат и формировать либо переменные, которые сразу в форму выводишь либо Таблицу Значений с 2 колонками (что-то типа ШК = Строка(Штрихкод1)+";"+Строка(Штрихкод2) и т.д)
Мне кажется, он имел в виду, что у третьего товара один штрихкод. Условно :
|Носки|111111;22222|
|Портянки| |
|Гетры с кошечками|333333; |
 

Allexei

Well-known member
02.05.2008
322
1
#8
Хех... Порядка 95000 тысяч позиций, у каждой позиции по 3-7 штрих кодов. Цикл ну уж ОЧЕНЬ долгий. Зачем надо - поставщик просит присылать ему такую форму. Количество штрих кодов заранее не известно, может быть и 7 а может не быть ни одного...Вот как то так :) Есть идеи?
Штрих кода и товар конечно заданы условно. Примерно как должно быть можно удивить во вложении выше.
 

KiR

НЕ шибка опытный програмер)
11.09.2007
1 581
0
#9
Allexei, а что делать-то? все равно тебе нужно отбирать все 7, а потом уже смотреть где там есть ШК, а где нет. Отбирай товары по условию - Поставщик или товарная группа или остаток, думаю это сократит список.
разве что в запросе, вроде бы, можно поставить условие отбора если не Null
 

Darlock

Well-known member
04.01.2008
560
1
#10
Мне кажется проще идти не от номенклатуры, а от штрих-кодов. Т.е. Запрос к регистру со штрихКодами и итоги по номенклатуре. На выходе имеем дерево в корне которого номенклатура, а внутри все его штрих коды. И в цикле обходить и собирать в одну строку.
 

Allexei

Well-known member
02.05.2008
322
1
#11
Кстати тогда вопрос. Что быстрее (теоретически) сделать как сказал Darlock или же сделать цикл по номенклатуре и запросом выбирать для каждой позиции шк?
Второй вариант представлен ниже:
<!--shcode--><pre><code class='1С'>...
Для Каждого ТекСтрока Из спсНоменклатуры Цикл
Состояние("Формирую штрих кода. Необходимо обработать "+спсНоменклатуры.Количество()+ " записей");
НоваяСтрока = ТабШтрихКода.Добавить();
НоваяСтрока.Номенклатура = ТекСтрока.Номенклатура;
НоваяСтрока.ШтрихКод = ВернутьШтрихКодаНоменклатуры(НоваяСтрока.Номенклатура);
КонецЦикла;
...
Функция ВернутьШтрихКодаНоменклатуры(Номенклатура) ЭКСПОРТ

СтрокаШтрихКода= "";
Запрос= Новый Запрос("ВЫБРАТЬ
| ШтрихкодыНоменклатуры.Штрихкод КАК ШтрихКод
|ИЗ
| РегистрСведений.ШтрихкодыНоменклатуры КАК ШтрихкодыНоменклатуры
|ГДЕ
| ШтрихкодыНоменклатуры.Номенклатура = &Номенклатура");
Запрос.УстановитьПараметр("Номенклатура" , Номенклатура);
Выборка= Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
Если НЕ СтрДлина(Выборка.ШтрихКод)= 13 Тогда
Продолжить;
КонецЕсли;
СтрокаШтрихКода= СтрокаШтрихКода+ СокрЛП(Выборка.ШтрихКод)+ Символы.ПС;//";";
КонецЦикла;
Возврат СтрокаШтрихКода;
КонецФункции[/CODE]
 

KiR

НЕ шибка опытный програмер)
11.09.2007
1 581
0
#12
нет, для каждой позиции ШК выбирать имхо это утопия. их нада выбрать скопом и потом уже в цикле обходить результаты. хотя возможно Darlock советует самый правильный вариант
 

unknown181538

НеГуру
28.12.2008
1 417
0
#13
Так у тебя запрос в цикле ж!
Надо получать данные одним запросом. Ну и итоги по номенклатуре. Скорее все, больше всего времени уйдет на вывод в табличный документ.
А идти надо все же от номенклатуры, т.к. позиции с null-ами тоже надо выводить.
 

Allexei

Well-known member
02.05.2008
322
1
#14
Всем спасибо, буду делать как сказал Darlock

...
А ведь действительно стало быстрее работать раза в 3