![]() |
![]() |
![]() |
|
Помогите объединить две таблицы. | ☑ | ||
---|---|---|---|---|
0
konstanciy
18.05.11
✎
10:24
|
Всем доброго дня! Появилась необходимость объединить две таблицы значений. Для примера, создали обработку с двумя реквизитами Документ1 и Документ2. И будем объединять их табличные части. В модуле:
&НаКлиенте Процедура СлитьДоки(Команда) СлитьДокиНаСервере(Объект.Документ1, Объект.Документ2); КонецПроцедуры &НаСервере Процедура СлитьДокиНаСервере(Д1, Д2) Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | Док1.Номенклатура, | Док1.Количество, | Док1.Цена |ИЗ | Док1 КАК Док1 | ВНУТРЕННЕЕ СОЕДИНЕНИЕ Док2 КАК Док2 | ПО Док1.Номенклатура = Док2.Номенклатура |ГДЕ | Док1 = &Док1 | Док2 = &Док2"; Запрос.УстановитьПараметр("Док1",Д1.Товары); Запрос.УстановитьПараметр("Док2",Д2.Товары); Результат = Запрос.Выполнить(); ВыборкаДетальныеЗаписи = Результат.Выбрать(); Пока ВыборкаДетальныеЗаписи.Следующий() Цикл // Вставить обработку выборки ВыборкаДетальныеЗаписи КонецЦикла; КонецПроцедуры Запрос не выполняется. Ругается на Параметры. Вложенные запросы и т.д не предлагать. Смысл - в запрос передать две таблицы и там их оъединить. Если такое возможно, конечно. Заранее всем спасибо. |
|||
1
ДенисЧ
18.05.11
✎
10:26
|
Запрос.Текст =
"ВЫБРАТЬ | Док1.Номенклатура, | Док1.Количество, | Док1.Цена |ИЗ | Док1 КАК Док1.Товары | ВНУТРЕННЕЕ СОЕДИНЕНИЕ Док2.Товары КАК Док2 | ПО Док1.Номенклатура = Док2.Номенклатура |ГДЕ | Док1 = &Док1 | Док2 = &Док2"; Так не предлагать? |
|||
2
azernot
18.05.11
✎
10:33
|
ВЫБРАТЬ
Объединение.Номенклатура, СУММА(Объединение.Количество) КАК Количество, Объединение.Цена ИЗ (ВЫБРАТЬ Док1.Номенклатура КАК Номенклатура, Док1.Количество КАК Количество, Док1.Цена КАК Цена ИЗ Документ.РеализацияТоваровУслуг.Товары КАК Док1 ГДЕ Док1.Ссылка = &Док1 ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ Док1.Номенклатура, Док1.Количество, Док1.Цена ИЗ Документ.РеализацияТоваровУслуг.Товары КАК Док1 ГДЕ Док1.Ссылка = &Док2) КАК Объединение СГРУППИРОВАТЬ ПО Объединение.Номенклатура, Объединение.Цена Так тоже не предлагать? |
|||
3
Fatum1980
18.05.11
✎
10:46
|
так табличные части документов объединить или таблицы значений. имхо это несколько разными путями делается :)
|
|||
4
azernot
18.05.11
✎
10:50
|
Дано
ТЗ1 и ТЗ2 (одинаковой структуры колонок) Функция ОбъединитьДвеТЗ(ТЗ1, ТЗ2) Для каждого СтрокаТЗ2 Из ТЗ2 Цикл НоваяСтрокаТЗ1 = ТЗ1.Добавить(); ЗаполнитьЗначенияСвойств(НоваяСтрокаТЗ1 , СтрокаТЗ2); КонецЦикла; Возврат ТЗ1; КонецФункции; |
|||
5
konstanciy
18.05.11
✎
10:51
|
Нет, ребят. Так не подходит. Смысл - объединить две таблицы значений переданные из вне в качестве параметров. То что я беру два документа, это только для того чтобы воспользаваться их табличными частями. В строках:
Запрос.УстановитьПараметр("Док1",Д1.Товары); Запрос.УстановитьПараметр("Док2",Д2.Товары); Товары - Это табличная часть документа! Поэтому в запросе уже нет никаких документов. Только таблицы :)) |
|||
6
Нуф-Нуф
18.05.11
✎
10:52
|
ээээ
|
|||
7
73
18.05.11
✎
10:54
|
(5) Почитай в справке про временные таблицы, внешний источник, пакетные запросы...
|
|||
8
azernot
18.05.11
✎
10:59
|
(5) Чем не устраивает вариант (4)?
Зачем такие слодности с запросами? Запрос.УстановитьПараметр("Док1",Д1.Товары.Выгрузить()); Вот так параметры указываются в твоём случае.. |
|||
9
73
18.05.11
✎
11:04
|
(8) В его случае запрос другой нужен.
|
|||
10
Fatum1980
18.05.11
✎
11:06
|
может не оптимально но:
Менеджер = Новый МенеджерВременныхТаблиц; ВременнаяТаблица = Новый Запрос; ВременнаяТаблица.МенеджерВременныхТаблиц = Менеджер; ТекстЗапроса = "ВЫБРАТЬ | * |ПОМЕСТИТЬ врЛист1 |ИЗ | &ТЗЛист1 КАК ТЗЛист1"; ВременнаяТаблица.УстановитьПараметр("ТЗЛист1", ТЗЛист1); ВременнаяТаблица.Текст = ТекстЗапроса; ВременнаяТаблица.Выполнить(); ТекстЗапроса = "ВЫБРАТЬ | * |ПОМЕСТИТЬ врЛист2 |ИЗ | &ТЗЛист2 КАК ТЗЛист2"; ВременнаяТаблица.УстановитьПараметр("ТЗЛист2", ТЗЛист2); ВременнаяТаблица.Текст = ТекстЗапроса; ВременнаяТаблица.Выполнить(); Дальше две таблицы врЛист1 и ВрЛист2 объединяешь по нужным тебе полям ВременнаяТаблица.Текст = "Выбрать Лист1.* | из врЛист1 как Лист1 | Внутреннее соединение врЛист2 как лист2 | по Лист1.Поле=Лист2.Поле "; РезультатЗапроса = ВременнаяТаблица.Выполнить(); Результат = РезультатЗапроса.Выбрать(); как то так наверное |
|||
11
azernot
18.05.11
✎
11:11
|
ЗапросДляОбъединения = Новый Запрос;
Менеджер = Новый МенеджерВременныхТаблиц; ЗапросДляОбъединения.МенеджерВременныхТаблиц = Менеджер; ЗапросДляОбъединения.Текст = "ВЫБРАТЬ | Док1.Номенклатура КАК Номенклатура, | Док1.Количество КАК Количество, | Док1.Цена КАК Цена |ПОМЕСТИТЬ ТЗ1 |ИЗ | &Док1 КАК Док1 |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | Док2.Номенклатура КАК Номенклатура, | Док2.Количество КАК Количество, | Док2.Цена КАК Цена |ПОМЕСТИТЬ ТЗ2 |ИЗ | &Док2 КАК Док2 |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | Объединение.Номенклатура, | СУММА(Объединение.Количество) КАК Количество, | Объединение.Цена |ИЗ | (ВЫБРАТЬ | Док1.Номенклатура КАК Номенклатура, | Док1.Количество КАК Количество, | Док1.Цена КАК Цена | ИЗ | ТЗ1 КАК Док1 | | ОБЪЕДИНИТЬ ВСЕ | | ВЫБРАТЬ | Док1.Номенклатура, | Док1.Количество, | Док1.Цена | ИЗ | ТЗ2 КАК Док1) КАК Объединение | |СГРУППИРОВАТЬ ПО | Объединение.Номенклатура, | Объединение.Цена"; ЗапросДляОбъединения.УстановитьПараметр("Док1", Док1.Товары.Выгрузить()); ЗапросДляОбъединения.УстановитьПараметр("Док2", Док2.Товары.Выгрузить()); ОбъединеннаяТаблица = ЗапросДляОбъединения.Выполнить().Выгрузить(); Менеджер.Закрыть(); |
|||
12
73
18.05.11
✎
11:12
|
Запрос = Новый Запрос("
|Выбрать * Поместить ТЧ1 Из &ТЧ1 КАК ТЧ1 |; |Выбрать * Поместить ТЧ2 Из &ТЧ2 КАК ТЧ2 |; |Выбрать * ИЗ ТЧ1 //тут для примера |Объединить все |Выбрать * ИЗ ТЧ2 |"); Запрос.УстановитьПараметр("ТЧ1", ТЧ1); Запрос.УстановитьПараметр("ТЧ2", ТЧ2); |
|||
13
azernot
18.05.11
✎
11:13
|
+(11) Хотя в данном случае, даже менеджер временных таблиц не нужен..
|
|||
14
konstanciy
18.05.11
✎
11:21
|
Всем спасибо!
Рабочим решением на поставленную задачу является в посте (12). Т.е. по сути это функция, которая получает две таблицы значений и объединяет их. Спасибо большое 73. |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |