|
v7: Выборка остатков из регистра. sql | ☑ | ||
---|---|---|---|---|
0
Последняя_
Надежда 19.07.12
✎
10:37
|
ТиС 7.7 Внешняя обработка на выборку остатков из регистра.
В представленном виде работает. НО надо добавить в итоговую таблицу еще и колонку с артикулом, чтобы потом отсортировать по ней. Пока попытки это сделать не увенчались успехом. ТабОстатков = СоздатьОбъект("ТаблицаЗначений"); ТабОстатков.НоваяКолонка("Код"); ТабОстатков.НоваяКолонка("ВсегоОст"); ТабОстатков.НоваяКолонка("Наименование"); тзОст = " |SELECT | Код = :Преф + Спр.Code , | Рег.КоличествоОстаток as ВсегоОст, | Спр.Descr as Наименование |FROM | $РегистрОстатки.ОстаткиТМЦ(:ГрРасч~, , | , | (Номенклатура),(Количество) ) as Рег |JOIN $Справочник.Номенклатура as Спр on Рег.Номенклатура = Спр.ID |JOIN #vr as vr ON vr.code=Спр.code"; РС.Выполнить("DROP TABLE #vr"); РС.Выполнить("CREATE TABLE #vr (code char(10))"); спНомН = ПолучитьНоменклатуруПоН(ВидБазы); Для н=1 по спНомН.РазмерСписка() Цикл тКод = СокрЛП(спНомН.ПолучитьЗначение(н)) ; тКод = Прав(тКод,СтрДлина(тКод)-1) ; РС.Выполнить("INSERT INTO #vr (code) VALUES ('"+тКод+"')") ; КонецЦикла; ТТ = СоздатьОбъект("ТаблицаЗначений"); РС.УстановитьТекстовыйПараметр("ГрРасч",ТекущаяДата()); РС.УстановитьТекстовыйПараметр("Преф",?(ВидБазы="Р","р","о")); Сообщить(тзОст); РС.ВыполнитьИнструкцию(тзОст,ТТ,1); РС.Выполнить("DROP TABLE #vr"); Возврат ТабОстатков; |
|||
1
Ёпрст
19.07.12
✎
10:41
|
(0) весьма забавное условие на код
А так, | ,$Спр.Артикул as Артикул |
|||
2
Последняя_
Надежда 19.07.12
✎
10:44
|
(1) в select ?
|
|||
3
Ёпрст
19.07.12
✎
10:45
|
да
|
|||
4
Ёпрст
19.07.12
✎
10:46
|
И это, почему фильтрацию по коду делаешь? Еще и через инсерт во временную табличку ?
К чужой базе запрос что ли ? |
|||
5
Последняя_
Надежда 19.07.12
✎
10:48
|
(4) да. запрос и к своей и к чужой базе.
это я еще переделываю. надо отловить двойные позиции, т.е. с одинаковыми Артикулами. Вроде выполняется, но колонка Артикула пустая. |
|||
6
Mikeware
19.07.12
✎
10:49
|
А почему Чар(10)?
Почему бы не УложитьСписокОбъектов() ? Почему бы не использовать автогенерируемые имена временных таблиц? |
|||
7
Ёпрст
19.07.12
✎
10:50
|
(6) >>>Почему бы не УложитьСписокОбъектов() ?
для строк не выйдет - будет строку к char(9) приводить... |
|||
8
Последняя_
Надежда 19.07.12
✎
10:51
|
(6) это для меня сложно... да и это не мой код, я просто дорабатываю.
|
|||
9
Ёпрст
19.07.12
✎
10:51
|
(5) дык а сам артикул у данной номенклатуры заполнен хоть в базе ?
|
|||
10
Последняя_
Надежда 19.07.12
✎
10:55
|
(9) упс. на старой копии делаю.
а как сделать чтобы сортировал по Артикулу? |
|||
11
Ёпрст
19.07.12
✎
10:56
|
(10) в конец текста запроса воткни
order by $Спр.Артикул |
|||
12
Mikeware
19.07.12
✎
10:56
|
(10) order by $спр.Артикул
|
|||
13
Последняя_
Надежда 19.07.12
✎
10:58
|
а потом простым перебором в цикле перебрать на поиск одинаковых. А нет никакого метода, который бы искал одинаковые значения в таблице значений?
|
|||
14
Ёпрст
19.07.12
✎
11:08
|
(13) дык в запросе и ищи сразу одинаковые.
Хотя и в ТЗ можно, заполнить единичками служебную колонку и свернуть по ней, потом отсортировать по убыванию. Там где >1 - дубель |
|||
15
Ёпрст
19.07.12
✎
11:08
|
но проще в запросе
:) |
|||
16
Последняя_
Надежда 19.07.12
✎
11:10
|
(15) Мне не просто найти надо. мне еще количество просуммировать надо у двойных.
а каким образом в ТЗ или запросе искать? с помощью какие методов? |
|||
17
Ёпрст
19.07.12
✎
11:12
|
(16) дык суммируй..
group by в тексте запроса + having count(*)>1 |
|||
18
Mikeware
19.07.12
✎
11:13
|
(16) добавь колонку, заполни единичками, и сверни по ратикулу - в добавленной получишь количество дублей
|
|||
19
Mikeware
19.07.12
✎
11:13
|
(17) Сейчас ей еще про группировочные поля объяснять придется...
она ж Бол читать не будет.... |
|||
20
Последняя_
Надежда 19.07.12
✎
11:20
|
(17)поняла что для чего. а куда именно (после чего) поставить эти конструкции?
(19) Уже нашла, читаю. |
|||
21
Ёпрст
19.07.12
✎
11:22
|
(20) гроуп бай перед ордер, только учти, если сворачивать будешь по артикулу - то само наименование номенклатуры ужо не увидишь.. если нужна еще и номенклатура - нужно будет подзапрос писать, в котором найти дубли и уже по этой табличке фильтровать основной запрос
|
|||
22
Последняя_
Надежда 19.07.12
✎
11:25
|
(21) не совсем поняла. если свернуть по артикулу, то другие столбцы пропадут?
|
|||
23
Ёпрст
19.07.12
✎
11:26
|
(22) яя-натюрлих, останется только сумма (количество)
|
|||
24
Последняя_
Надежда 19.07.12
✎
11:32
|
(23) так не пойдет. мне надо еще и Код сохранить.
|
|||
25
Ёпрст
19.07.12
✎
11:36
|
(24) тогда .... общую сумму кому лепить ?
|
|||
26
Ёпрст
19.07.12
✎
11:36
|
к примеру у тебя 3 номенклатуры с одинаковым артикулом будет
|
|||
27
Ёпрст
19.07.12
✎
11:37
|
но с разными наименованиями
|
|||
28
Последняя_
Надежда 19.07.12
✎
11:39
|
(26) можно эту сумму во все прописать или последнему в списке
|
|||
29
Ёпрст
19.07.12
✎
11:47
|
тзОст = "
|SELECT | Преф + Спр.Code as Код , | Рег.КоличествоОстаток as ВсегоОст, | Спр.Descr as Наименование , | $Спр.Артикул as Артикул | |FROM | $РегистрОстатки.ОстаткиТМЦ(:ГрРасч~, , | , | (Номенклатура),(Количество) ) as Рег |inner JOIN $Справочник.Номенклатура as Спр on Рег.Номенклатура = Спр.ID |inner JOIN #vr as vr ON vr.code=Спр.code |where $Спр.Артикул in | (select $С.Артикул from $Справочник.Номенклатура as С group by $С.Артикул having Count($С.Артикул)>1) | | |"; |
|||
30
Ёпрст
19.07.12
✎
11:47
|
где Преф, там : добавь спереди
|
|||
31
also
19.07.12
✎
12:00
|
Ёпрст4 , ответь в почте, плз.
|
|||
32
Последняя_
Надежда 19.07.12
✎
13:04
|
(29) Как-то оно очень сильно сворачивает. Табличка раза в 4 меньше стала, хотя по факту двойных-тройных очень мало. Может дело в том что артикулы все разных форматов? Например, 1 , 209-01, 306-2, 456-ПП, 432С3 и т.п.
|
|||
33
Ёпрст
19.07.12
✎
13:06
|
(32) дык проверить то просто
|
|||
34
Последняя_
Надежда 19.07.12
✎
13:21
|
(33) что-то не могу сообразить на каком этапе проверить.
|
|||
35
sapphire
19.07.12
✎
13:25
|
(34) select $С.Артикул, Count($С.Артикул) ВсегоЗаписей from $Справочник.Номенклатура as С group by $С.Артикул having Count($С.Артикул)>1
Как думаешь, зачем и что покажет? |
|||
36
sapphire
19.07.12
✎
13:26
|
select $С.Артикул, Count(*) ВсегоЗаписей from $Справочник.Номенклатура as С group by $С.Артикул having Count(*)>1
|
|||
37
Ёпрст
19.07.12
✎
13:29
|
(35) у ё..
:) |
|||
38
sapphire
19.07.12
✎
13:39
|
ТабОстатков = СоздатьОбъект("ТаблицаЗначений");
ТабОстатков.НоваяКолонка("Код"); ТабОстатков.НоваяКолонка("ВсегоОст"); ТабОстатков.НоваяКолонка("Наименование"); тзОст = " |SELECT | Код = :Преф + Спр.Code , | Рег.КоличествоОстаток as ВсегоОст, | Спр.Descr as Наименование, | Спр.$Артикул Артикул |FROM | $РегистрОстатки.ОстаткиТМЦ(:ГрРасч~, , | , | (Номенклатура),(Количество) ) as Рег |JOIN $Справочник.Номенклатура as Спр on Рег.Номенклатура = Спр.ID |JOIN #vr as vr ON vr.code=Спр.code |ORDER BY Спр.$Артикул |"; РС.Выполнить("DROP TABLE #vr"); РС.Выполнить("CREATE TABLE #vr (code char(10))"); спНомН = ПолучитьНоменклатуруПоН(ВидБазы); Для н=1 по спНомН.РазмерСписка() Цикл тКод = СокрЛП(спНомН.ПолучитьЗначение(н)) ; тКод = Прав(тКод,СтрДлина(тКод)-1) ; РС.Выполнить("INSERT INTO #vr (code) VALUES ('"+тКод+"')") ; КонецЦикла; ТТ = СоздатьОбъект("ТаблицаЗначений"); РС.УстановитьТекстовыйПараметр("ГрРасч",ТекущаяДата()); РС.УстановитьТекстовыйПараметр("Преф",?(ВидБазы="Р","р","о")); Сообщить(тзОст); РС.ВыполнитьИнструкцию(тзОст,ТТ,1); РС.Выполнить("DROP TABLE #vr"); Возврат ТабОстатков; |
|||
39
Конфигуратор1с
19.07.12
✎
13:43
|
надо и себе поставить такую прекрасную фотку в личку, что бы и мне помогали так активно )))
|
|||
40
sapphire
19.07.12
✎
13:46
|
(39) Не помогают?
|
|||
41
Конфигуратор1с
19.07.12
✎
13:47
|
(40)неа
|
|||
42
sapphire
19.07.12
✎
13:48
|
(41) Может просто ответ настолько очевиден, что лень писать?
|
|||
43
Конфигуратор1с
19.07.12
✎
13:50
|
(42)v8: Заголовки ресурсов в скд как вариант
|
|||
44
Последняя_
Надежда 19.07.12
✎
14:02
|
(35)-(38) Ничего не поняла.
|
|||
45
sapphire
19.07.12
✎
14:04
|
// А так Понятно?
ТабОстатков = СоздатьОбъект("ТаблицаЗначений"); ТабОстатков.НоваяКолонка("Код"); ТабОстатков.НоваяКолонка("ВсегоОст"); ТабОстатков.НоваяКолонка("Наименование"); ТабОстатков.НоваяКолонка("Артикул"); тзОст = " |SELECT | Код = :Преф + Спр.Code , | Рег.КоличествоОстаток as ВсегоОст, | Спр.Descr as Наименование, | Спр.$Артикул Артикул |FROM | $РегистрОстатки.ОстаткиТМЦ(:ГрРасч~, , | , | (Номенклатура),(Количество) ) as Рег |JOIN $Справочник.Номенклатура as Спр on Рег.Номенклатура = Спр.ID |JOIN #vr as vr ON vr.code=Спр.code |ORDER BY Спр.$Артикул |"; РС.Выполнить("DROP TABLE #vr"); РС.Выполнить("CREATE TABLE #vr (code char(10))"); спНомН = ПолучитьНоменклатуруПоН(ВидБазы); Для н=1 по спНомН.РазмерСписка() Цикл тКод = СокрЛП(спНомН.ПолучитьЗначение(н)) ; тКод = Прав(тКод,СтрДлина(тКод)-1) ; РС.Выполнить("INSERT INTO #vr (code) VALUES ('"+тКод+"')") ; КонецЦикла; ТТ = СоздатьОбъект("ТаблицаЗначений"); РС.УстановитьТекстовыйПараметр("ГрРасч",ТекущаяДата()); РС.УстановитьТекстовыйПараметр("Преф",?(ВидБазы="Р","р","о")); Сообщить(тзОст); РС.ВыполнитьИнструкцию(тзОст,ТТ,1); РС.Выполнить("DROP TABLE #vr"); Возврат ТабОстатков; |
|||
46
sapphire
19.07.12
✎
14:04
|
(44) Что именно непонятно?
|
|||
47
Ёпрст
19.07.12
✎
14:05
|
(46) да всё.. к чему этот не рабочий код ?
|
|||
48
sapphire
19.07.12
✎
14:06
|
(47)?
|
|||
49
sapphire
19.07.12
✎
14:06
|
(47) Неть семерки под рукой, но с запросом вроде должно канать
|
|||
50
Последняя_
Надежда 19.07.12
✎
14:07
|
(45) максимум что этот код сделает. так это выведет номенклатуру с остатком отсортированную по артикулу. это уже сделано. Вопрос стоит в сложении остатков по позициям с одинаковыми артикулами.
|
|||
51
sapphire
19.07.12
✎
14:08
|
(50) И? Что сложного-то?!
|
|||
52
sapphire
19.07.12
✎
14:09
|
ТабОстатков = СоздатьОбъект("ТаблицаЗначений");
ТабОстатков.НоваяКолонка("Код"); ТабОстатков.НоваяКолонка("ВсегоОст"); ТабОстатков.НоваяКолонка("Наименование"); ТабОстатков.НоваяКолонка("Артикул"); тзОст = " |SELECT | Код = :Преф + MAX(Спр.Code) , | SUM(Рег.КоличествоОстаток) as ВсегоОст, | MAX(Спр.Descr) as Наименование, | Спр.$Артикул Артикул |FROM | $РегистрОстатки.ОстаткиТМЦ(:ГрРасч~, , | , | (Номенклатура),(Количество) ) as Рег |JOIN $Справочник.Номенклатура as Спр on Рег.Номенклатура = Спр.ID |JOIN #vr as vr ON vr.code=Спр.code |GROUP BY Спр.$Артикул |ORDER BY Спр.$Артикул |"; РС.Выполнить("DROP TABLE #vr"); РС.Выполнить("CREATE TABLE #vr (code char(10))"); спНомН = ПолучитьНоменклатуруПоН(ВидБазы); Для н=1 по спНомН.РазмерСписка() Цикл тКод = СокрЛП(спНомН.ПолучитьЗначение(н)) ; тКод = Прав(тКод,СтрДлина(тКод)-1) ; РС.Выполнить("INSERT INTO #vr (code) VALUES ('"+тКод+"')") ; КонецЦикла; ТТ = СоздатьОбъект("ТаблицаЗначений"); РС.УстановитьТекстовыйПараметр("ГрРасч",ТекущаяДата()); РС.УстановитьТекстовыйПараметр("Преф",?(ВидБазы="Р","р","о")); Сообщить(тзОст); РС.ВыполнитьИнструкцию(тзОст,ТТ,1); РС.Выполнить("DROP TABLE #vr"); Возврат ТабОстатков; |
|||
53
sapphire
19.07.12
✎
14:11
|
ну для вящей красоты можно и по-другому из(ъе../врати)ться
|
|||
54
Ёпрст
19.07.12
✎
14:12
|
(52) дык это же не верно. Одинаковый артикул может быть у разных наименований.
|
|||
55
sapphire
19.07.12
✎
14:13
|
(54) Конечно :)
А коли подумать :))) |
|||
56
sapphire
19.07.12
✎
14:14
|
(54) А код и наименование тогда вообще зачем?
|
|||
57
sapphire
19.07.12
✎
14:16
|
(54) Если нужны остатки артикулов тогда:
ТабОстатков = СоздатьОбъект("ТаблицаЗначений"); ТабОстатков.НоваяКолонка("Код"); // ТабОстатков.НоваяКолонка("ВсегоОст"); // ТабОстатков.НоваяКолонка("Наименование"); ТабОстатков.НоваяКолонка("Артикул"); тзОст = " |SELECT // | Код = :Преф + MAX(Спр.Code) , | SUM(Рег.КоличествоОстаток) as ВсегоОст, // | MAX(Спр.Descr) as Наименование, | Спр.$Артикул Артикул |FROM | $РегистрОстатки.ОстаткиТМЦ(:ГрРасч~, , | , | (Номенклатура),(Количество) ) as Рег |JOIN $Справочник.Номенклатура as Спр on Рег.Номенклатура = Спр.ID |JOIN #vr as vr ON vr.code=Спр.code |GROUP BY Спр.$Артикул |ORDER BY Спр.$Артикул |"; РС.Выполнить("DROP TABLE #vr"); РС.Выполнить("CREATE TABLE #vr (code char(10))"); спНомН = ПолучитьНоменклатуруПоН(ВидБазы); Для н=1 по спНомН.РазмерСписка() Цикл тКод = СокрЛП(спНомН.ПолучитьЗначение(н)) ; тКод = Прав(тКод,СтрДлина(тКод)-1) ; РС.Выполнить("INSERT INTO #vr (code) VALUES ('"+тКод+"')") ; КонецЦикла; ТТ = СоздатьОбъект("ТаблицаЗначений"); РС.УстановитьТекстовыйПараметр("ГрРасч",ТекущаяДата()); // РС.УстановитьТекстовыйПараметр("Преф",?(ВидБазы="Р","р","о")); Сообщить(тзОст); РС.ВыполнитьИнструкцию(тзОст,ТТ,1); РС.Выполнить("DROP TABLE #vr"); Возврат ТабОстатков; |
|||
58
sapphire
19.07.12
✎
14:16
|
ТабОстатков = СоздатьОбъект("ТаблицаЗначений");
// ТабОстатков.НоваяКолонка("Код"); ТабОстатков.НоваяКолонка("ВсегоОст"); // ТабОстатков.НоваяКолонка("Наименование"); ТабОстатков.НоваяКолонка("Артикул"); тзОст = " |SELECT // | Код = :Преф + MAX(Спр.Code) , | SUM(Рег.КоличествоОстаток) as ВсегоОст, // | MAX(Спр.Descr) as Наименование, | Спр.$Артикул Артикул |FROM | $РегистрОстатки.ОстаткиТМЦ(:ГрРасч~, , | , | (Номенклатура),(Количество) ) as Рег |JOIN $Справочник.Номенклатура as Спр on Рег.Номенклатура = Спр.ID |JOIN #vr as vr ON vr.code=Спр.code |GROUP BY Спр.$Артикул |ORDER BY Спр.$Артикул |"; РС.Выполнить("DROP TABLE #vr"); РС.Выполнить("CREATE TABLE #vr (code char(10))"); спНомН = ПолучитьНоменклатуруПоН(ВидБазы); Для н=1 по спНомН.РазмерСписка() Цикл тКод = СокрЛП(спНомН.ПолучитьЗначение(н)) ; тКод = Прав(тКод,СтрДлина(тКод)-1) ; РС.Выполнить("INSERT INTO #vr (code) VALUES ('"+тКод+"')") ; КонецЦикла; ТТ = СоздатьОбъект("ТаблицаЗначений"); РС.УстановитьТекстовыйПараметр("ГрРасч",ТекущаяДата()); // РС.УстановитьТекстовыйПараметр("Преф",?(ВидБазы="Р","р","о")); Сообщить(тзОст); РС.ВыполнитьИнструкцию(тзОст,ТТ,1); РС.Выполнить("DROP TABLE #vr"); Возврат ТабОстатков; |
|||
59
Последняя_
Надежда 19.07.12
✎
14:32
|
(58) не то. Коды и наименования тоже нужны! Артикулы нужны лишь для группировки двойных позиций...
запутали меня еще больше. лучше простым циклом переберу. |
|||
60
Ёпрст
19.07.12
✎
14:39
|
(32) как в (29) чем не устроило ?
Покажет только те записи, где с одинаковым артикулом >1 |
|||
61
Последняя_
Надежда 19.07.12
✎
14:47
|
(60) эм... а остальные?
|
|||
62
Последняя_
Надежда 19.07.12
✎
14:48
|
в общем надо еще доскональнее тестировать.
|
|||
63
Ёпрст
19.07.12
✎
14:50
|
(61) тебе же только дубли нужны, не ?
|
|||
64
Последняя_
Надежда 19.07.12
✎
14:51
|
мне дубли надо просуммировать и все остальные оставить.
|
|||
65
viktor_vv
19.07.12
✎
14:52
|
(61) Ну так к своей таблице с несвернутыми остатками приджойни подзапрос с задвоенными артикулами по полю артикул.
|
|||
66
Ёпрст
19.07.12
✎
14:52
|
(64) это как ?
если есть номенклатура с разным наименованием, но артикул у неё одинаковый, или отсутствует, к примеру, тогда чего ? Сумму по ним куда писать ? |
|||
67
sapphire
19.07.12
✎
14:53
|
(64) Ты можешь внятно сказать что именно нужно?
Остатки по номенклатуре и остатки по артикулам одновременно? |
|||
68
sapphire
19.07.12
✎
14:54
|
(65) Маразм
|
|||
69
viktor_vv
19.07.12
✎
14:56
|
(68) Че это? Как раз получится (28) "можно эту сумму во все прописать или последнему в списке". В этом подзапросе заодно и просуммировать по одинаковым артикулам.
|
|||
70
sapphire
19.07.12
✎
15:15
|
(69) Таблицу с остатками во времянку надо, а не рассчитывать одно и то же дважды.
|
|||
71
viktor_vv
19.07.12
✎
15:20
|
(70) Ну это согласен.
|
|||
72
Mikeware
20.07.12
✎
11:09
|
(61) получи все записи с артикулами и остатками (и колонка с единичкой), выгрузи в ИТЗ, сгруппируй по артикулу (суммируя единички и остатки), проиндексируй по счетчику, и смотри: в счетчике будет число дублей, в потомках получищь развернутые остатки по всем товарам с совпадающими артикулами.
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |