Переключение на Главную Страницу Страницы: [1] 2  ОтправитьПечать
Горячая тема (более 10 ответов) Передать в запрос в качестве условия колонку ТЗ (число прочтений - 16847 )
lustin
1c++ power user
Отсутствует


1C *.*, ROR, Java - на
этом остановимся

Сообщений: 907
Местоположение: Москва
Зарегистрирован: 20. Октября 2006
Пол: Мужской
Передать в запрос в качестве условия колонку ТЗ
01. Февраля 2007 :: 09:34
Печать  
вообщем ситуация следующая

Имеем ТЗ формата

№строки  |элемент_спрКонтрагенты | Реквизит1БезОтбора::тип=Строка(240) | Реквизит2БезОтбора::тип=Строка(580) |
1
2
3
...
...
n-1
n

реквизит "элемент_спрКонтрагенты" не заполнен, зато заполнены Реквизит1БезОтбора и Реквизит2БезОтбора

Необходимо в ТЗ проставить элемент Справочника при совпадении Реквизитов, и только если одно из значений уникально для всего справочника

Сейчас все решается простым
Код
Выбрать все
ВыбратьЭлементы()
Пока ПолучитьЭлемент()=1 Цикл
.... ЕСли Реквизит2БезОтбора=...

КонецЦикла 



то есть простым перебором, так как назначать отбор по таким реквизитам считаю неоптимальным.


Мысли
1. Я так понимаю выборку можно сделать Прямым запросом получив нужных мне контрагентов.

Вопросы:
1. как передать в запрос правильную структуру и последовательность колонок Реквизит1Отбора и Реквизит2Отбора, что бы мне вернулась ТЗЗапроса с тем же количеством строк что и основная ТЗ и правильной структуры ТО есть
после запроса у меня должна прийти ко мне ТЗ с одной колонкой с агрегатным типом данных, чтобы после объединения основной ТЗ и ТЗ запроса я получил итоговую Таблицу -

№строки  |элемент_спрКонтрагенты | Реквизит1БезОтбора |Реквизит2БезОтбора |
1                   Элемент, если нашли                  "Значение1"
2                   ПустоеЗначение если нет          "Значение2"
3
...
...
n-1
n






  

бизнес-процесс как техническое задание прекрасно, только у бизнеса нет процессов; у бизнеса есть желание выжить
Наверх
GTalkSkype/VoIPICQ  
IP записан
 
Вадимко
God Member
*****
Отсутствует


Нам бы чего про ОдноЦэ...

Сообщений: 1048
Местоположение: Минск
Зарегистрирован: 24. Мая 2006
Пол: Мужской
Re: Передать в запрос в качестве условия колонку Т
Ответ #1 - 01. Февраля 2007 :: 10:35
Печать  
Что-то трудновато осилеть

>>ВыбратьЭлементы()
>>Пока ПолучитьЭлемент()=1 Цикл

Вот это нельзя заменить на запрос? Использовать в нем Case
  

Кампутер, кофе и сигареты - это очень плохо для моего здоровья...
Наверх
IP записан
 
lustin
1c++ power user
Отсутствует


1C *.*, ROR, Java - на
этом остановимся

Сообщений: 907
Местоположение: Москва
Зарегистрирован: 20. Октября 2006
Пол: Мужской
Re: Передать в запрос в качестве условия колонку Т
Ответ #2 - 01. Февраля 2007 :: 11:09
Печать  
Вообще я хочу произвести рефакторинг одного алгоритма

я храню реквизиты в ТЗ: Реквизит1 и Реквизит2 - количество строк 12000 (то есть в принципе 12000 возможных связок для условия по этим реквизитам)

Создаем колонку "ЭлементСправочникаДляКоторогоВыполняетсяРавенство_Рекв1_иРекв2"
-значений в этой колонке нет

мне нужно в каждую строку в пустую колонку проставить элемент у которого реквизиты равны соответсвующим значениям

раньше было (написано не мной):
Код
Выбрать все
спрКонтр.ВыбратьЭлементы()
Пока спрКонтр.ПолучитьЭлемент()=1 Цикл
     ТЗ.ВыбратьСтроки()
     Пока ТЗ.ПолучитьСтроку()=1 Цикл
	   ЕСли спрКонтр.Рекв1 = ТЗ.Реквз1 и спрКонтр.Рекв2 = ТЗ.Реквз2 Тогда
			 ТЗ.ЭлементСправочникаДляКоторогоВыполняетсяРавенство_Рекв1_иРекв2 =
				   спрКонтр.ТекущийЭлемент()
			 Прервать;
	   КонецЕсли
    КонецЦикла
КонецЦикла
 



Слегка долго и глупо...

Я пока сделал таким образом

Код
Выбрать все
	 ТекстЗапроса = "
	 |Обрабатывать НеПомеченныеНаУдаление;
	 |Элемент = Справочник.Контрагенты.ТекущийЭлемент;
	 |Наименование = Справочник.Контрагенты.Наименование;
	 |ИНН = Справочник.Контрагенты.ИНН;
	 |ИДОбъектаДляОбмена = Справочник.Контрагенты.ИДОбъектаДляОбмена;
	 |Группировка Элемент упорядочить по Элемент.ИДОбъектаДляОбмена, Элемент.Наименование без групп;";

	 итзСправочник = СоздатьОбъект("ИндексированнаяТаблица");
	 Запрос = СоздатьОбъект("Запрос");
	 Запрос.Выполнить(ТекстЗапроса);

	 итзСправочник.ЗагрузитьЗапрос(Запрос,1);
	 //итзСправочник.Показать();

	 итзСправочник.ДобавитьИндекс("ИндексИД","#ИДОбъектаДляОбмена");
	 итзСправочник.ДобавитьИндекс("ИндексИНН","#ИНН");
	 итзСправочник.ДобавитьИндекс("ИндексНаименование","#Наименование");
... дальше идет поиск по индексам - занимает около полутора секунд
 



1. Нужно переделать стандартный запрос в Прямой с 1С++ (это то я сделаю, но мера половинчатая)

Вопрос стоит вот в чем
- я хочу загнать в прямой запрос и алгоритм поиска чтобы уже из запроса 1С++ получить ТЗ_Запроса которую можно просто объединить с ТЗданных, и получить ИТОГОВУЮ_ТЗ нужно мне формата
Элемент Реквизит1 Реквизит2




  

бизнес-процесс как техническое задание прекрасно, только у бизнеса нет процессов; у бизнеса есть желание выжить
Наверх
GTalkSkype/VoIPICQ  
IP записан
 
lustin
1c++ power user
Отсутствует


1C *.*, ROR, Java - на
этом остановимся

Сообщений: 907
Местоположение: Москва
Зарегистрирован: 20. Октября 2006
Пол: Мужской
Re: Передать в запрос в качестве условия колонку Т
Ответ #3 - 01. Февраля 2007 :: 11:23
Печать  
Вообщем задача стоит оптимизировать весь алгоритм
сейчас он выполняется 43 секунды примерно (+/- 0.5)

1. Формирование файла таблицы с 12000 строк и 39 колонками
2. Архивация
3. Отправка по фтп протоколу
4. Получение по фтп протоколу
5. Разархивация
6. Проверка синхронизационной таблицы
7. Поиск соответствий
8. Собственно синхронизация

Единственное где я могу хоть что-то еще оптимизировать это пункт 7.
  

бизнес-процесс как техническое задание прекрасно, только у бизнеса нет процессов; у бизнеса есть желание выжить
Наверх
GTalkSkype/VoIPICQ  
IP записан
 
lustin
1c++ power user
Отсутствует


1C *.*, ROR, Java - на
этом остановимся

Сообщений: 907
Местоположение: Москва
Зарегистрирован: 20. Октября 2006
Пол: Мужской
Re: Передать в запрос в качестве условия колонку Т
Ответ #4 - 01. Февраля 2007 :: 11:38
Печать  
Еще бы в справочник одним запросом все изменения записать, это был бы высший пилотаж
  

бизнес-процесс как техническое задание прекрасно, только у бизнеса нет процессов; у бизнеса есть желание выжить
Наверх
GTalkSkype/VoIPICQ  
IP записан
 
Вадимко
God Member
*****
Отсутствует


Нам бы чего про ОдноЦэ...

Сообщений: 1048
Местоположение: Минск
Зарегистрирован: 24. Мая 2006
Пол: Мужской
Re: Передать в запрос в качестве условия колонку Т
Ответ #5 - 01. Февраля 2007 :: 12:50
Печать  
Пугающий механизм обмена  Ужас
В принципе можно перебирать ТЗ а не справочник и искать в справочнике элемент по реквизиту (наверное сортировка же стоит?)
А если именно прямым запросом - ну значит таблицу создавать надо и соединяться
  

Кампутер, кофе и сигареты - это очень плохо для моего здоровья...
Наверх
IP записан
 
lustin
1c++ power user
Отсутствует


1C *.*, ROR, Java - на
этом остановимся

Сообщений: 907
Местоположение: Москва
Зарегистрирован: 20. Октября 2006
Пол: Мужской
Re: Передать в запрос в качестве условия колонку Т
Ответ #6 - 01. Февраля 2007 :: 13:02
Печать  
1. механизм не пугающий а естественный в данном случае
- менеджеры по клиентам сидят в разных филиалах (а точнее юр.лицах, у каждого юр.лица свой программист и своя база, своего формата) , там сложные права доступа на создание нового и видимость клиентов других менеджеров. Вообще единого в этих базах только клиенты и взаиморасчеты соответственно (вообщем это уже другая история).

2. Сейчас я попробовал (как выше написал), стандартный запрос к справочнику и затем индексированная таблица для поиска - работает запрос примерно 14 секунд, нехорошо это.

3. В данный момент запускаю простой прямой запрос на выборку всех элементов справочника контрагентов, результат опять в ИТЗ и дальше по старой схеме.

4. вопрос стоит как и раньше:
- что быстрее ?
= остановится на полной выборке а резьтаты анализировать в таблице
= сделать (КАК?) соединение с моей ТЗ и из справочника проставить туда значения элементов.

Вообщем кажется наконец-то сформулировал вопрос

Как в SQL запросе получить доступ к созданной в модуле ТЗ и ее значениям ???
  

бизнес-процесс как техническое задание прекрасно, только у бизнеса нет процессов; у бизнеса есть желание выжить
Наверх
GTalkSkype/VoIPICQ  
IP записан
 
trad
1c++ power user
1c++ donor
1c++ moderator
На связи



Сообщений: 3050
Местоположение: Киров
Зарегистрирован: 23. Мая 2006
Пол: Мужской
Re: Передать в запрос в качестве условия колонку Т
Ответ #7 - 01. Февраля 2007 :: 13:14
Печать  
lustin писал(а) 01. Февраля 2007 :: 13:02:
Как в SQL запросе получить доступ к созданной в модуле ТЗ и ее значениям ???
ответ прост - уложить ее в таблицу на сервере:
Код
Выбрать все
Процедура УложитьТаблицу(пТЗ, ИмяТаб, Колонки="") Экспорт
	Перем ТЗ;

	рс=СоздатьОбъект("ODBCRecordset");

	Если ПустаяСтрока(Колонки)=1 Тогда
		ТЗ=пТЗ;
	Иначе
		пТЗ.Выгрузить(ТЗ,,,Колонки);
	КонецЕсли;
	СтрCreate="create table %Имя% (/*column_definition*/)";
	СтрInsert="insert into %Имя% values(/*?*/)";
	Тип="";
	Длина="";
	Точность="";
	ФорматнаяСтрока="";
	КолонкиЕсть=0;
	Для Тек=1 По ТЗ.КоличествоКолонок() Цикл
		Идентификатор=ТЗ.ПолучитьПараметрыКолонки(Тек,Тип,Длина,Точность,,,
ФорматнаяСтрока);
		Если (ПустаяСтрока(Колонки)=0)И(Найти(Колонки,Идентификатор)=0) Тогда
			Продолжить;
		КонецЕсли;
		КолонкиЕсть=1;
		Если ПустаяСтрока(ФорматнаяСтрока)=0 Тогда
			SQL_тип=ФорматнаяСтрока;
			рс.ДобПараметр(1,);
		ИначеЕсли ПустаяСтрока(Тип)=1 Тогда
			SQL_тип="char(9)";
			рс.ДобПараметр(1,14,9,0);
		ИначеЕсли Тип="Число" Тогда
			Если Длина=0 Тогда
				Длина=38;
				Точность=10;
			КонецЕсли;
			SQL_тип="numeric(%p%,%s%)";
			SQL_тип=СтрЗаменить(SQL_тип,"%p%",Длина);
			SQL_тип=СтрЗаменить(SQL_тип,"%s%",Точность);
			рс.ДобПараметр(1,11,Длина,Точность);
		ИначеЕсли Тип="Строка" Тогда
			Если Длина=0 Тогда
				SQL_тип="varchar(%n%)";
				SQL_тип=СтрЗаменить(SQL_тип,"%n%",255);
				рс.ДобПараметр(1,15,255,0);
			Иначе
				SQL_тип="char(%n%)";
				SQL_тип=СтрЗаменить(SQL_тип,"%n%",Длина);
				рс.ДобПараметр(1,14,Длина,0);
			КонецЕсли;
		ИначеЕсли Тип="Дата" Тогда
			SQL_тип="datetime";
			рс.ДобПараметр(1,8,0,0);
		ИначеЕсли Найти(Тип,".")>0 Тогда
			SQL_тип="char(9)";
			рс.ДобПараметр(1,14,9,0);
		Иначе
			SQL_тип="char(13)";
			рс.ДобПараметр(1,14,13,0);
			ТЗ.УстановитьПараметрыКолонки(Идентификатор,,,,"?2");
		КонецЕсли;
		СтрCreate=СтрЗаменить(СтрCreate,"/*,*/",", ");
		СтрCreate=СтрЗаменить(СтрCreate,"/*column_definition*/",Идентификатор+" "+SQL_тип+"/*,*//*column_definition*/");
		СтрInsert=СтрЗаменить(СтрInsert,"/*,*/",", ");
		СтрInsert=СтрЗаменить(СтрInsert,"/*?*/","?/*,*//*?*/");
	КонецЦикла;
	Если КолонкиЕсть=1 Тогда
		ТекстЗапроса="
		|set nocount on
		|if exists (select * from tempdb..sysobjects where id=object_id('tempdb..%Имя%') and sysstat & 0xf = 3 )
		|  drop table %Имя%;
		|"+СтрCreate+"
		|set nocount off
		|";
		рс_=СоздатьОбъект("ODBCRecordset");
		рс_.ВыполнитьИнструкцию(СтрЗаменить(ТекстЗапроса,"%Имя%",ИмяТаб));
		рс.Подготовить(СтрЗаменить(СтрInsert,"%Имя%",ИмяТаб));
		рс.ВыполнитьSQL_ИзТЗ(ТЗ,100);
	КонецЕсли;
КонецПроцедуры 


« Последняя редакция: 30. Мая 2019 :: 09:51 - trad »  

1&&2&&3
Наверх
 
IP записан
 
trad
1c++ power user
1c++ donor
1c++ moderator
На связи



Сообщений: 3050
Местоположение: Киров
Зарегистрирован: 23. Мая 2006
Пол: Мужской
Re: Передать в запрос в качестве условия колонку Т
Ответ #8 - 01. Февраля 2007 :: 13:17
Печать  
,где:
пТЗ - таблица значений
ИмяТаб - (строка) имя таблицы, которая будет создана на сервере
Колонки - (строка) перечисленные через запятую идентификаторы колонок, которые нужно уложить. Если не указаны, то все
  

1&&2&&3
Наверх
 
IP записан
 
lustin
1c++ power user
Отсутствует


1C *.*, ROR, Java - на
этом остановимся

Сообщений: 907
Местоположение: Москва
Зарегистрирован: 20. Октября 2006
Пол: Мужской
Re: Передать в запрос в качестве условия колонку Т
Ответ #9 - 01. Февраля 2007 :: 13:22
Печать  
О-как... Спасибо...
  

бизнес-процесс как техническое задание прекрасно, только у бизнеса нет процессов; у бизнеса есть желание выжить
Наверх
GTalkSkype/VoIPICQ  
IP записан
 
trad
1c++ power user
1c++ donor
1c++ moderator
На связи



Сообщений: 3050
Местоположение: Киров
Зарегистрирован: 23. Мая 2006
Пол: Мужской
Re: Передать в запрос в качестве условия колонку Т
Ответ #10 - 01. Февраля 2007 :: 13:33
Печать  
на этот фрагмент:
Код
Выбрать все
Если ПустаяСтрока(ФорматнаяСтрока)=0 Тогда
			SQL_тип=ФорматнаяСтрока;
			рс.ДобПараметр(1,); 

можно не обращать внимания.
Тут я планировал реализовать возможность типизации колонок таблицы пользовательским типом, но не доделал
  

1&&2&&3
Наверх
 
IP записан
 
trad
1c++ power user
1c++ donor
1c++ moderator
На связи



Сообщений: 3050
Местоположение: Киров
Зарегистрирован: 23. Мая 2006
Пол: Мужской
Re: Передать в запрос в качестве условия колонку Т
Ответ #11 - 01. Февраля 2007 :: 13:40
Печать  
и еще
Код
Выбрать все
ТЗ.УстановитьПараметрыКолонки(Идентификатор,,,,"?2"); 


можно убрать - не имеет значения
  

1&&2&&3
Наверх
 
IP записан
 
Вадимко
God Member
*****
Отсутствует


Нам бы чего про ОдноЦэ...

Сообщений: 1048
Местоположение: Минск
Зарегистрирован: 24. Мая 2006
Пол: Мужской
Re: Передать в запрос в качестве условия колонку Т
Ответ #12 - 01. Февраля 2007 :: 14:51
Печать  
CREATE TABLE #vv (x INT, a char(9))
INSERT INTO #vv VALUES (2, '454f')

А вот интересно, почему не взлетает пример из документации по "ВыполнитьSQL_ИзТЗ"

Произошла ошибка при формировании автоматических параметров.               
Необходимо выполнить подготовку запроса или проверить синтаксис!
State 42S02, native 208, message [Microsoft][ODBC SQL Server Driver][SQL Server]Invalid object name 'MyTable'.

2.0.3.0 - не та версия?
  

Кампутер, кофе и сигареты - это очень плохо для моего здоровья...
Наверх
IP записан
 
Вадимко
God Member
*****
Отсутствует


Нам бы чего про ОдноЦэ...

Сообщений: 1048
Местоположение: Минск
Зарегистрирован: 24. Мая 2006
Пол: Мужской
Re: Передать в запрос в качестве условия колонку Т
Ответ #13 - 01. Февраля 2007 :: 15:04
Печать  
А на приведенном примере trad ашипка:

Произошла ошибка при выполнении запроса.                  
State 22001, native 0, message [Microsoft][ODBC SQL Server Driver]String data, right truncation

Много текста. Помогите понять что там нахимичено
  

Кампутер, кофе и сигареты - это очень плохо для моего здоровья...
Наверх
IP записан
 
DmitrO
1c++ power user
Отсутствует


ex developer

Сообщений: 579
Местоположение: г. Киров
Зарегистрирован: 22. Мая 2006
Пол: Мужской
Re: Передать в запрос в качестве условия колонку Т
Ответ #14 - 01. Февраля 2007 :: 15:10
Печать  
Цитата:
А на приведенном примере trad ашипка:

Произошла ошибка при выполнении запроса.                  
State 22001, native 0, message [Microsoft][ODBC SQL Server Driver]String data, right truncation

Много текста. Помогите понять что там нахимичено

Колонки в передаваемой в процедуру ТЗ должны быть типизированы.
  
Наверх
ICQ  
IP записан
 
Переключение на Главную Страницу Страницы: [1] 2 
ОтправитьПечать