11.
Збянтэжаны Саўка
245
17.04.09 17:41
Сейчас в теме
Спасибо, я пока учусь на Ваших примерах профи
Сорри, за маленькие замечания новичка если они не в тему:
(мои дополнения отмечены комментами: //aga)
В ф-ии СоединениеДвухТЗПоПолю:
Функция СоединениеДвухТЗПоПолю(ТЗПриемник, ТЗИсточник,
СтрПоляПриемника,
СтрПоляИсточника,
стрПолеСоединенияП,
стрПолеСоединенияИ = Неопределено) Экспорт
Если стрПолеСоединенияИ=Неопределено Тогда
стрПолеСоединенияИ = стрПолеСоединенияП;
КонецЕсли;
//Удаляем колонки, с типом NULL, т.к. в запросе с ВТ нельзя использовать такие поля
МассивПустыхКолонок = Новый Массив;
//aga+ здесь я бы хотел иметь возможность передавать свою строку полей приемника, и проверку включить, только если не передан список полей
Если НЕ ЗначениеЗаполнено(стрПоляПриемника) Тогда //aga+
ОписаниеТиповNULL = Новый ОписаниеТипов("NULL");
Для каждого Колонка Из ТЗПриемник.Колонки Цикл
Если Колонка.ТипЗначения = ОписаниеТиповNULL Тогда
МассивПустыхКолонок.Добавить(Колонка.Имя);
Иначе
Если Не стрПоляПриемника = "" Тогда
стрПоляПриемника = стрПоляПриемника + ",";
КонецЕсли;
стрПоляПриемника = стрПоляПриемника + Колонка.Имя;
КонецЕсли;
КонецЦикла;
КонецЕсли; //aga+
Запрос = Новый Запрос;
Запрос.Текст = "
|ВЫБРАТЬ
| вТабПриемник." + стрПоляПриемника + "
|ПОМЕСТИТЬ вТабПриемник
|ИЗ &ТЗПриемник КАК вТабПриемник
|;
|//_____________________________________________________________________
// таблица-источник
|ВЫБРАТЬ
| вТабИсточник." + стрПолеСоединенияИ + ",
| " + СтрПоляИсточника + "
|ПОМЕСТИТЬ вТабИсточник
|ИЗ &ТЗИсточник КАК вТабИсточник
|;
|//_____________________________________________________________________
// объединяем две таблицы
|ВЫБРАТЬ
| вТабПриемник.*,
| " + СтрПоляИсточника + "
|ИЗ
| вТабПриемник КАК вТабПриемник
| ЛЕВОЕ СОЕДИНЕНИЕ вТабИсточник КАК вТабИсточник
| ПО вТабПриемник." + стрПолеСоединенияП + " = вТабИсточник." + стрПолеСоединенияИ + "
|УПОРЯДОЧИТЬ ПО
//|" + СтрПолеИсточника; //aga- ошибочка надо стрполЯисточника
|вТабПриемник." + стрПоляПриемника; // aga+. Имхо приемник главнее, так что по нему важнее сортировать, но в общем случае все же это излишне, т.к. в полученном ТЗ потом можно отсортировать выборочно и как угодно, без лишних полей из этого списка в запросе.
Запрос.УстановитьПараметр("ТЗПриемник", ТЗПриемник);
Запрос.УстановитьПараметр("ТЗИсточник", ТЗИсточник);
ТЗРез = Запрос.Выполнить().Выгрузить();
Для каждого ПустаяКолонка Из МассивПустыхКолонок Цикл
ТЗРез.Колонки.Добавить(ПустаяКолонка);
ТЗРез.ЗаполнитьЗначения(NULL,ПустаяКолонка);
КонецЦикла;
Возврат ТЗРез;
КонецФункции //СоединениеДвухТЗПоПолю
Кстати, интересная ситуация, попробовал было эту ф-ию применить два раза к одной исходной ТЗ, ибо одним запросом все поля заполнить невозможно, но увы что-то не так как ожидается работает, глюк пока не знаю где искать у меня в коде или в платформе, будет время посижу, а счас его нет к сож., потому решил свою задачу простым перебором в лоб сравнивая две ТЗ в цикле построчно без использования этой ф-ии (т.е. без запросов). Но проблема заинтересовала своей странностью на ровном месте.