|
Запрос по таблице значений | ☑ | ||
---|---|---|---|---|
0
Oz11
17.01.12
✎
17:09
|
Вопрос таков. Есть табличная часть с реквизитами (Сотрудник, Период, Статья, Кол-во), которая заполняется в момент записи формы данными из таблицы значений на форме, причем количество и название колонок этой таблицы значений динамически создается в момент указания параметров на форме (аналог того как динамически формируется таб часть в документе "УстановкаЦенНоменклатуры" в УТП). у меня все зависит от двух параметров (количество месяцев, получающиеся из указанных пользователем дат и списка статей на той-же форме) выходит что если количество месяцев равно, например, 2 и количество статей 2 то состав колонок таблицы значений на форме будет таков: Сотрудник, Месяц1, Статья1, Статья2, Месяц2, Статья1, Статья2. Когда пользователь вводит, например, одну строку и заполняет ее данными, то при при записи этого всего в табличную часть выходит 4 строки: 1) Сотрудник = Сотрудник, Период = Месяц1, Статья = Статья1, Количество = Статья1.Количество 2) Сотрудник = Сотрудник, Период = Месяц1, Статья = Статья2, Количество = Статья2.Количество 3) Сотрудник = Сотрудник, Период = Месяц2, Статья = Статья1, Количество = Статья1.Количество 4) Сотрудник = Сотрудник, Период = Месяц2, Статья = Статья2, Количество = Статья2.Количество. как видите пишется все отлично, а вот при считывании получается 4 строки. вопрос в том как свернуть это все так как оно было в первоначальном виде в таблице значений на форме?
|
|||
1
1с-кин
17.01.12
✎
17:13
|
(0) что у вас первично - ТЗ или ТЧ НА ФОРМЕ? потому как ТЧ - это отображение ТЗ в данном случае, а не наоборот.
Если нужно что-то свернуть с ТЧ - выгрузите в ТЗ, сверните по полям, загрузите обратно. |
|||
2
Oz11
17.01.12
✎
17:15
|
на форме лежит таблица значений (табличное поле) колонки которой формируются динамически (как описано выше), а табличная часть - обычная табличная часть документа (на форме ее нет, она заполняется при записи формы из таблицы значений на форме)
|
|||
3
GenV
17.01.12
✎
17:19
|
(0) Можно через ОБЪЕДИНИТЬ ВСЕ подтаблицы (условие на ячейки) для ТЗ в запросе.
|
|||
4
Oz11
17.01.12
✎
17:23
|
(3) можно подробней. нифига не понял
|
|||
5
1с-кин
17.01.12
✎
17:27
|
(4) он предлагает обработать ТЗ запросом.
Так вам колонки надо убрать лишние? а данные - по другим колонкам распределить что ли? |
|||
6
GenV
17.01.12
✎
17:28
|
5+ ТЗ в запрос во временную таблицу. Потом по количеству колонок добавить выборки с условие суммы колонки <> 0. Все выборки объединить, потом сгруппировать.
|
|||
7
Oz11
17.01.12
✎
17:33
|
я сейчас работаю с запросом и временными таблицами. выходит что нужно как-бы развернуть состав таблицы из вертикального положения в горизонтальное, что-то типа того. сейчас пытаюсь сделать это левыми соединениями. убирать ничего не нужно. нужно правильно расставить все в таблице значений на форме.
|
|||
8
GenV
17.01.12
✎
17:36
|
(7) Если разворачивать, то можно и аналогично, по условиям. Можно и левыми соединениями.
|
|||
9
Oz11
17.01.12
✎
17:38
|
может Ваш метод проще, просто не могу понять как он работает. сутра сижу над этой задачей - мало что уже соображаю. если можно - опишите детальней.
|
|||
10
AAlexandra
17.01.12
✎
17:39
|
(6) Из "вертикальной" в "горизонтальную" ты в запросе таблицу никак не развернешь, если заранее не известно максимальное число колонок..
Можно динамически текст запроса составить. Поля будут определяться примерно так: ВТ.Сотрудник Как Сотрудник, Сумма(Выбор когда ВТ.Период = &Период1 и ВТ.Статья = &Статья1 Тогда ВТ.Количество Иначе 0 Конец) КАК МояКолонкаПериод1Статья1, Сумма(Выбор когда ВТ.Период = &Период1 и ВТ.Статья = &Статья2 Тогда ВТ.Количество Иначе 0 Конец) КАК МояКолонкаПериод1Статья2 ... Группировка по сотруднику, по всем колонкам сумма() |
|||
11
1с-кин
17.01.12
✎
17:42
|
(7) так откуда тогда взялся термин "свернуть"? :)
чтобы проще было - сделайте выгрузку в промежуточную ТЗ (и обработайте, как надо), а потом снова заполните ТП на форме. |
|||
12
GenV
17.01.12
✎
17:43
|
(10) А где написано, что это не так ?!
|
|||
13
Oz11
17.01.12
✎
17:44
|
(11) термин "свернуть" от того что в таблице значений на форме 1 строка, а в табличной части - 4.
|
|||
14
AAlexandra
17.01.12
✎
17:46
|
(12) малость промахнулась, пост (10) для автора топика.. ;)
|
|||
15
GenV
17.01.12
✎
17:46
|
Ты определись: тебе из Формы в ТЧ "развернуть" или из ТЧ в форму "свернуть".
|
|||
16
GenV
17.01.12
✎
17:46
|
(15) -> (13)
|
|||
17
1с-кин
17.01.12
✎
17:47
|
(13) вы че-то всех запутали...
свернуть строки в ТЗ - это выгрузить в ТЗ и ТЗ.Свернуть(<"указать несворачиваемые поля через запятую","указать по каким полям сворачивать">) |
|||
18
Oz11
17.01.12
✎
17:50
|
"Свернуть" в этом контексте абстрактное понятие, а не метод ТаблицыЗначений. Задача состоит в том чтобы вытягивать данные из ТабличногоПоля (где их по примеру 4 строки), обрабатывать ("сворачивать", "группировать" как вам захочется) и помещать на форму в ТаблицуЗначений (где по примеру должна быть 1 строка)
|
|||
19
GenV
17.01.12
✎
17:56
|
(18) Первый вариант левыми соединениями, второй:
В вложенный запрос и сгруппировать суммы по сотруднику и периоду: ВЫБРАТЬ ТЧ.Сотрудник, ТЧ.Период, ТЧ.Сумма КАК СуммаСтатья1, 0 КАК СуммаСтатья2 ИЗ ТЧ ГДЕ ТЧ.Статья = &Статья1 ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ ТЧ.Сотрудник, ТЧ.Период, 0 ТЧ.Сумма ИЗ ТЧ ГДЕ ТЧ.Статья = &Статья2 |
|||
20
Oz11
17.01.12
✎
18:02
|
делаю такую штуку, но что-то ни к чему хорошему меня это не привело:
Запрос = Новый Запрос; МВТ = Новый МенеджерВременныхТаблиц; Запрос.МенеджерВременныхТаблиц = МВТ; Запрос.Текст = "ВЫБРАТЬ | ТЗ.Сотрудник, | ТЗ.Период, | ТЗ.СтатьяПланирования, | ТЗ.Количество, | ТЗ.ПериодОригинальноеНазвание, | ТЗ.СтатьяОригинальноеНазвание |ПОМЕСТИТЬ ТаблицаПланирование |ИЗ | &ТЗ КАК ТЗ |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | Основа.Сотрудник "; Для каждого Стр Из Статьи Цикл Запрос.Текст = Запрос.Текст + ", | "+Стр.СтатьяОригинальноеНазвание+".Период, | "+Стр.СтатьяОригинальноеНазвание+".ПериодОригинальноеНазвание, | "+Стр.СтатьяОригинальноеНазвание+".СтатьяПланирования, | "+Стр.СтатьяОригинальноеНазвание+".СтатьяОригинальноеНазвание, | "+Стр.СтатьяОригинальноеНазвание+".Количество "; КонецЦикла; Запрос.Текст = Запрос.Текст + " |ИЗ | ТаблицаПланирование КАК Основа "; Для каждого Стр Из Статьи Цикл Запрос.Текст = Запрос.Текст + " | ЛЕВОЕ СОЕДИНЕНИЕ ТаблицаПланирование КАК "+Стр.СтатьяОригинальноеНазвание+" | ПО Основа.Сотрудник = "+Стр.СтатьяОригинальноеНазвание+".Сотрудник | И Основа.Период = "+Стр.СтатьяОригинальноеНазвание+".Период | и Основа.СтатьяПланирования = "+Стр.СтатьяОригинальноеНазвание+".СтатьяПланирования "; КонецЦикла; Запрос.УстановитьПараметр("ТЗ", ТЗ); Запрос.УстановитьПараметр("Статьи", Статьи); ТЗ = Запрос.Выполнить().Выгрузить(); |
|||
21
Oz11
17.01.12
✎
18:44
|
(19) объясните пожалуйста что за суммы. не могу понять идею. а если идти моим вариантом - левыми соединениями, тогда как написать запрос?
|
|||
22
GenV
17.01.12
✎
22:16
|
(21) Для соединений будет примерно так (колонки Сотрудник, Период_№Период, Статья_№Периода_№Статьи), остальное сам допилишь:
Запрос = Новый Запрос; Запрос.УстановитьПараметр("ТЧ", ТЧ); ТекстЗапроса = "ВЫБРАТЬ | ТЧ.Сотрудник, | ТЧ.Период, | ТЧ.СтатьяПланирования, | ТЧ.Количество |ПОМЕСТИТЬ ТаблицаПланирование |ИЗ | &ТЧ КАК ТЧ |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ РАЗЛИЧНЫЕ | ТаблицаПланирование.Сотрудник |ПОМЕСТИТЬ ТаблицаОснова |ИЗ | ТаблицаПланирование КАК ТаблицаПланирование |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | ТаблицаОснова.Сотрудник"; НомСтатьи = 1; Для Каждого ТекСтатья Из Статьи Цикл Запрос.УстановитьПараметр("Статья_" +НомСтатьи, ТекСтатья.Значение); НомСтатьи = НомСтатьи + 1; КонецЦикла; НомПериода = 1; Для Каждого ТекПериод Из Периоды Цикл Запрос.УстановитьПараметр("Период_" +НомПериода, ТекПериод.Значение); ТекстЗапроса = ТекстЗапроса + СтрЗаменить(", | &Период_#П КАК Период_#П", "#П", Строка(НомПериода)); НомСтатьи = 1; Для Каждого ТекСтатья Из Статьи Цикл ТекстПоля = ", | ЕСТЬNULL(ТаблицаПланирование_#П_#С.Количество, 0) КАК Количество_#П_#С"; ТекстПоля = СтрЗаменить(ТекстПоля, "#С", Строка(НомСтатьи)); ТекстПоля = СтрЗаменить(ТекстПоля, "#П", Строка(НомПериода)); ТекстЗапроса = ТекстЗапроса + ТекстПоля; НомСтатьи = НомСтатьи+1; КонецЦикла; НомПериода = НомПериода+1; КонецЦикла; ТекстЗапроса = ТекстЗапроса + " |ИЗ | ТаблицаОснова КАК ТаблицаОснова"; НомПериода = 1; Для Каждого ТекПериод Из Периоды Цикл НомСтатьи = 1; Для Каждого ТекСтатья Из Статьи Цикл ТекстСоединения = " |ЛЕВОЕ СОЕДИНЕНИЕ ТаблицаПланирование КАК ТаблицаПланирование_#П_#С | ПО ТаблицаОснова.Сотрудник = ТаблицаПланирование_#П_#С.Сотрудник | И (ТаблицаПланирование_#П_#С.Период = &Период_#П) | И (ТаблицаПланирование_#П_#С.СтатьяПланирования = &Статья_#С)"; ТекстСоединения = СтрЗаменить(ТекстСоединения, "#С", НомСтатьи); ТекстСоединения = СтрЗаменить(ТекстСоединения, "#П", НомПериода); ТекстЗапроса = ТекстЗапроса + ТекстСоединения; НомСтатьи = НомСтатьи+1; КонецЦикла; НомПериода = НомПериода+1; КонецЦикла; Запрос.Текст = ТекстЗапроса; ТЗ = Запрос.Выполнить().Выгрузить(); |
|||
23
Oz11
18.01.12
✎
13:30
|
ТЗ = Планирование.Выгрузить();
Сотрудники = Планирование.Выгрузить(); Сотрудники.Свернуть("Сотрудник"); Статьи = Планирование.Выгрузить(); Статьи.Свернуть("СтатьяОригинальноеНазвание"); Запрос = Новый Запрос; МВТ = Новый МенеджерВременныхТаблиц; Запрос.МенеджерВременныхТаблиц = МВТ; Запрос.Текст = "ВЫБРАТЬ | ТЗ.Сотрудник, | ТЗ.Период, | ТЗ.СтатьяПланирования, | ТЗ.Количество, | ТЗ.ПериодОригинальноеНазвание, | ТЗ.СтатьяОригинальноеНазвание |ПОМЕСТИТЬ ТаблицаПланирование |ИЗ | &ТЗ КАК ТЗ |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | Сотрудники.Сотрудник |ПОМЕСТИТЬ ТаблицаСотрудников |ИЗ | &Сотрудники КАК Сотрудники |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | Статьи.СтатьяОригинальноеНазвание |ПОМЕСТИТЬ СтатьяТаблица |ИЗ | &Статьи КАК Статьи |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | ТаблицаСотрудников.Сотрудник КАК Сотрудник "; Нумератор = 0; Для каждого Стр Из Статьи Цикл Нумератор = Нумератор + 1; НазваниеПодзапроса = "" + Стр.СтатьяОригинальноеНазвание + "__"; Запрос.Текст = Запрос.Текст + ", | "+НазваниеПодзапроса+".СтатьяОригинальноеНазвание КАК "+Стр.СтатьяОригинальноеНазвание+" "; КонецЦикла; Запрос.Текст = Запрос.Текст + " |ПОМЕСТИТЬ ОригинальныеНазванияСтатейПоСотрудникам |ИЗ | ТаблицаСотрудников КАК ТаблицаСотрудников "; Для каждого Стр Из Статьи Цикл НазваниеПараметра = "" + Стр.СтатьяОригинальноеНазвание + "_"; НазваниеПодзапроса = "" + Стр.СтатьяОригинальноеНазвание + "__"; Запрос.Текст = Запрос.Текст + " |ЛЕВОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ | ТаблицаСтатей.СтатьяОригинальноеНазвание |ИЗ | СтатьяТаблица КАК ТаблицаСтатей |ГДЕ | ТаблицаСтатей.СтатьяОригинальноеНазвание = &"+НазваниеПараметра+") КАК "+НазваниеПодзапроса+" | ПО Истина "; КонецЦикла; Запрос.Текст = Запрос.Текст + " |; | |////////////////////////////////////////////////////////////////////////////// делаю так. это дает мне в итоге Таблицу с колонками Сотрудник, СтатьяОригинальноеНазвание1, СтатьяОригинальноеНазвание2 и т.д. от количества статей. не могу придумать как дальше прикрутить к этому всему остальные показатели (Период, СтатьяПланирования, Количество, ПериодОригинальноеНазвание). СтатьяОригинальноеНазвание и ПериодОригинальноеНазвание - это колонки табличной части, которые содержат название колонки, динамически созданной на форме. планировал что так будет проще заполнять таблицу значений на форме при восстановлении данных. |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |