Переключение на Главную Страницу Страницы: 1 ОтправитьПечать
Горячая тема (более 10 ответов) Можно ли делать запросы к ТЗ (число прочтений - 6530 )
es3000
God Member
*****
Отсутствует



Сообщений: 536
Зарегистрирован: 10. Июля 2006
Можно ли делать запросы к ТЗ
13. Июля 2006 :: 07:45
Печать  
Есть таблица значений, с ней надо выполнять определенные операции: выборки, добавление или удаление записей по какому-то критерию. По строчно это делается очень медлено. Можно ли как-то воспользоваться SQL для этих целей?
Или может быть еще есть какие-нибудь средства в 1С++?
  
Наверх
ICQ  
IP записан
 
U_zer
Экс-Участник


Re: Можно ли делать запросы к ТЗ
Ответ #1 - 13. Июля 2006 :: 09:07
Печать  
Про ВыполнитьSQL_ИзТЗ(Таблица, КоличествоСтрок) почитай в доке.
  
Наверх
 
IP записан
 
DrACe
1c++ donor
1c++ power user
Отсутствует


1С++ любитель

Сообщений: 447
Местоположение: г. Новосибирск
Зарегистрирован: 23. Мая 2006
Пол: Мужской
Re: Можно ли делать запросы к ТЗ
Ответ #2 - 13. Июля 2006 :: 09:35
Печать  
попробуй класс ИндексированнаяТаблица
  
Наверх
 
IP записан
 
es3000
God Member
*****
Отсутствует



Сообщений: 536
Зарегистрирован: 10. Июля 2006
Re: Можно ли делать запросы к ТЗ
Ответ #3 - 13. Июля 2006 :: 11:07
Печать  
DrACe:
Вроде то что нужно, но у меня версия 1С++ 1.8.1.6, там похоже нету такого объекта

U_zer:
Не,  "ВыполнитьSQL_ИзТЗ" это не то. Он выполняет запрос к внешнему источнику, просто использует ТЗ как список параметров для запроса. А мне нужно выполнить что-то типа запроса к таблице значений
  
Наверх
ICQ  
IP записан
 
КилоГрамм
Senior Member
****
Отсутствует


Таити, Таити...

Сообщений: 434
Зарегистрирован: 14. Июня 2006
Пол: Мужской
Re: Можно ли делать запросы к ТЗ
Ответ #4 - 13. Июля 2006 :: 12:59
Печать  
Цитата:
попробуй класс ИндексированнаяТаблица

Это конечно интересно, только какой метод здесь можно прицепить?
Если Это "ВФайл", то ф файле получаем:
Код
Выбрать все
{IndexedTable:
1, 3, 4
Колонка1
Колонка2
Колонка3
{
{"S","0","0","0","0","0","Первая			 "}
{"N","0","0","0","0","0","1000"}
{"D","0","0","0","0","0","20060713"}
}
{
{"S","0","0","0","0","0","Вторая			 "}
{"N","0","0","0","0","0","2000"}
{"D","0","0","0","0","0","20060813"}
}
{
{"S","0","0","0","0","0","Третья			 "}
{"N","0","0","0","0","0","3000"}
{"D","0","0","0","0","0","20060913"}
}
{
{"S","0","0","0","0","0","Четвертая		    "}
{"N","0","0","0","0","0","4000"}
{"D","0","0","0","0","0","20061013"}
}
} 

Как ЭТО применить к запросу?
  

Константин
Наверх
 
IP записан
 
DrACe
1c++ donor
1c++ power user
Отсутствует


1С++ любитель

Сообщений: 447
Местоположение: г. Новосибирск
Зарегистрирован: 23. Мая 2006
Пол: Мужской
Re: Можно ли делать запросы к ТЗ
Ответ #5 - 14. Июля 2006 :: 03:17
Печать  
КилоГрамм
автору требовалось вот это:
es3000 писал(а) 13. Июля 2006 :: 07:45:
Есть таблица значений, с ней надо выполнять определенные операции: выборки, добавление или удаление записей по какому-то критерию. По строчно это делается очень медлено. Можно ли как-то воспользоваться SQL для этих целей?
Или может быть еще есть какие-нибудь средства в 1С++?


а не работа с сохраненной в файл таблицей
  
Наверх
 
IP записан
 
КилоГрамм
Senior Member
****
Отсутствует


Таити, Таити...

Сообщений: 434
Зарегистрирован: 14. Июня 2006
Пол: Мужской
Re: Можно ли делать запросы к ТЗ
Ответ #6 - 14. Июля 2006 :: 08:48
Печать  
Цитата:
а не работа с сохраненной в файл таблицей

Как я понял, его интересует, можно ли выполнить процедуру, обратную методу "ВыполнитьИнструкцию" (из запроса в ТЗ)- из ТЗ в запрос.
Если это так, то меня это тоже интересует. Даже очень.
  

Константин
Наверх
 
IP записан
 
es3000
God Member
*****
Отсутствует



Сообщений: 536
Зарегистрирован: 10. Июля 2006
Re: Можно ли делать запросы к ТЗ
Ответ #7 - 14. Июля 2006 :: 12:07
Печать  
Из ТЗ в запрос как раз можно делать процедурой "ВыполнитьSQL_ИзТЗ".

А мне нужно выполнять групповые операции с ТЗ. Хорошо бы если бы это можно было бы делать обычными SQL-запросами
  
Наверх
ICQ  
IP записан
 
КилоГрамм
Senior Member
****
Отсутствует


Таити, Таити...

Сообщений: 434
Зарегистрирован: 14. Июня 2006
Пол: Мужской
Re: Можно ли делать запросы к ТЗ
Ответ #8 - 15. Июля 2006 :: 12:21
Печать  
Запрос к ТЗ. Попробуй это (для ДБФ)::
Код
Выбрать все
//_____________________________________________________________________________
Функция ПолучитьИД(Объект,НомСтр)
	СЗ = СоздатьОбъект("СписокЗначений");
	Стр=ЗначениеВСтрокуВнутр(Объект);
	СЗ.ИзСтрокиСРазделителями(Стр);
	Возврат  _IdToStr(СЗ.ПолучитьЗначение(НомСтр));
КонецФункции //ПолучитьИД
//_____________________________________________________________________________
Функция Преобразовать(ТипЗнач,ТекЗнач)
	Если ТипЗнач = 2
	Тогда
		Возврат  "'" + ТекЗнач + "'";
	ИначеЕсли ТипЗнач = 3
	Тогда
		Возврат  "{d'"+ ДатаГод(ТекЗнач) +"-"+ Прав("0"+ДатаМесяц(ТекЗнач),2) +"-"+Прав("0"+ДатаЧисло(ТекЗнач),2)  +"'}";
	ИначеЕсли ТипЗнач = 10
	Тогда
		Возврат  "'" + ПолучитьИД(ТекЗнач,7) + "'";
	ИначеЕсли ТипЗнач = 11
	Тогда
		Возврат  "'" + ПолучитьИД(ТекЗнач.ТекущийЭлемент(),7)+ "'";
	ИначеЕсли ТипЗнач = 12
	Тогда
		Возврат  "'" + ПолучитьИД(ТекЗнач.ТекущийДокумент(),7)+ "'";
	Иначе
		Возврат  ТекЗнач;
	КонецЕсли;
КонецФункции //Преобразовать
//*******************************************
Процедура Выполнить()
	Если ТЗ.КоличествоСтрок() = 0
	Тогда
		Возврат;
	КонецЕсли;
	ДБ = СоздатьОбъект("xBase");
	Если ФС.СуществуетФайл(КаталогИБ()+"_Tmp.dbf") = 0
	Тогда
		Для К=1 По ТЗ.КоличествоКолонок() Цикл
			Тип = ""; Длина = 0; Точность = 0;
			ТЗ.ПолучитьПараметрыКолонки(К,Тип,Длина,Точность);
			Если Тип = "Число"
			Тогда
				ДБ.ДобавитьПоле("W_"+К,1,Длина,Точность);
			ИначеЕсли Тип = "Строка"
			Тогда
				ДБ.ДобавитьПоле("W_"+К,2,Длина,0);
			ИначеЕсли Тип = "Дата"
			Тогда
				ДБ.ДобавитьПоле("W_"+К,3,10,0);
			Иначе
				ДБ.ДобавитьПоле("W_"+К,2,9,0);
			КонецЕсли;
		КонецЦикла;
		ДБ.СоздатьФайл(КаталогИБ()+"_Tmp.dbf");
	КонецЕсли;
	ДБ.ЗакрытьФайл();
	//
	База = СоздатьОбъект("OLEDBData");
	Соединение = "Provider=VFPOLEDB.1;Deleted=Yes;Data Source=" + КаталогИБ() + ";Mode=ReadWrite;Extended Properties="";User ID=Админ"";Password="";Mask Password=False;Collating Sequence=RUSSIAN;DSN=""";
	Рез = База.Соединение(Соединение);
	Запрос = База.СоздатьКоманду();

	СЗ = СоздатьОбъект("СписокЗначений");
	ТЗ.ВыбратьСтроки();
	Пока ТЗ.ПолучитьСтроку() = 1 Цикл
		СЗ.УдалитьВсе();
		С = ТЗ.НомерСтроки;
		Для К = 1 По ТЗ.КоличествоКолонок() Цикл
			ТекЗнач = ТЗ.ПолучитьЗначение(С,К);
			ТипЗнач = ТипЗначения(ТекЗнач);
			СЗ.ДобавитьЗначение(Преобразовать(ТипЗнач,ТекЗнач));
		КонецЦикла;
		Стр = "(" + СтрЗаменить(СЗ.ВСтрокуСРазделителями(),"""","") + ")";
		Запрос.Выполнить( + "INSERT INTO   _Tmp VALUES "+Стр);
	КонецЦикла;
КонецПроцедуры
 


Затем с этим файлом в запросе делаешь все, что нужно и удаляешь. Работает. Но меня не всегда это устраивает, особенно при большом количестве строк в ТЗ - выборка строк тормозит всё. Хотелось бы что-нибудь пошустрее.
  

Константин
Наверх
 
IP записан
 
Scorpion
Junior Member
**
Отсутствует


I Love YaBB 2!

Сообщений: 32
Местоположение: Киев
Зарегистрирован: 05. Июня 2006
Пол: Мужской
Re: Можно ли делать запросы к ТЗ
Ответ #9 - 18. Июля 2006 :: 08:55
Печать  
Хотелось бы иметь специальную возможность делать запросы к ТЗ, без всекого там предварительного формирования временной таблицы.
  
Наверх
 
IP записан
 
x-pert
1c++ developer
Отсутствует



Сообщений: 134
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Можно ли делать запросы к ТЗ
Ответ #10 - 18. Июля 2006 :: 11:40
Печать  
как ты себе это представляешь?

а главное - содержимое в ТЗ от сырости завелось?
  
Наверх
 
IP записан
 
КилоГрамм
Senior Member
****
Отсутствует


Таити, Таити...

Сообщений: 434
Зарегистрирован: 14. Июня 2006
Пол: Мужской
Re: Можно ли делать запросы к ТЗ
Ответ #11 - 19. Июля 2006 :: 11:02
Печать  
Цитата:
Хотелось бы иметь специальную возможность делать запросы к ТЗ

Мне бы тоже, но пока приходится обходиться тем, что есть.
  

Константин
Наверх
 
IP записан
 
trdm
1c++ power user
qt1l developer
1c++ moderator
Отсутствует



Сообщений: 2343
Местоположение: г. Ростов-на-Дону
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Можно ли делать запросы к ТЗ
Ответ #12 - 26. Июля 2006 :: 17:40
Печать  
Блин, не уж то сами не догадываетесь как?
Определяем синтаксис языка, пишем файл граматики, Bison в руки и пошел.... Создаем ком-объект, запихиваем туда парсер, на входе структура ТЗ и запрос, на выходе получаем список полей с типами, условия фильтрации строки табл части и обрабатываем в цикле.... в АПИ или 1С..
Все достаточно просто. Кто возьмется?
Если достаточно логично определить синтаксис языка можно сделать и регулярными выражениями.
например:
"Выбрать фирма, товар.цена как новаяЦена, Контрагент контр" и
"Выбрать (фирма как фирма, товар.цена как новаяЦена, Контрагент как контр) " разные вещи и распарсить 2-е можно запросто, а 1-е труднее.
И это только простые примеры.....
  
Наверх
IP записан
 
КилоГрамм
Senior Member
****
Отсутствует


Таити, Таити...

Сообщений: 434
Зарегистрирован: 14. Июня 2006
Пол: Мужской
Re: Можно ли делать запросы к ТЗ
Ответ #13 - 26. Июля 2006 :: 19:18
Печать  
Цитата:
И это только простые примеры...

Для меня оказалось проще сделать доп.класс. Отрывок из него я привел выше. Пользуюсь и доволен (если конечно строк в ТЗ не кошмарно много). Принцип тот-же и нет доп.СОМ-объектов.
  

Константин
Наверх
 
IP записан
 
Переключение на Главную Страницу Страницы: 1
ОтправитьПечать