Переключение на Главную Страницу Страницы: 1 ОтправитьПечать
Обычная тема Использование ADO для доступа к данным 1С в DBF (число прочтений - 10992 )
fez
Forum Administrator
1c++ power user
Отсутствует


I wanted to cry, but the
tears wouldn't come

Сообщений: 2712
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Использование ADO для доступа к данным 1С в DBF
19. Мая 2006 :: 12:14
Печать  
Q. Можно-ли осуществить SQL запросы к данным в dbf версии с целью ускорения формирования отчетов?

A. Можно.
Но не в монопольном режиме

Код
Выбрать все
Перем ADO, MDW;


Функция GetThis(Конт)

Возврат Конт;

КонецФункции // GetThis()		  



Функция ВыбратьЭлементы(РеквизитПоиска, Знач ПодСтрокаПоиска) Экспорт
//#if _DEBUG
НачТаймер = _GetPerformanceCounter();  
//#endif
				    
ПодСтрокаПоиска = СтрЗаменить(ПодСтрокаПоиска, "*", "%");
ТекВид = GetThis(Context).Вид("");
Сообщить(ТекВид);
ИмяТаблицы = MDW.ИмяТаблицыСправочника(ТекВид);

ПодСтрокаПоиска = СокрЛП(ПодСтрокаПоиска);
Пока Найти(ПодСтрокаПоиска, "  ")>0 Цикл
 ПодСтрокаПоиска = СтрЗаменить(ПодСтрокаПоиска, "  ", " ");    
КонецЦикла;					  
ПодСтрокаПоиска = ВРег(СтрЗаменить(ПодСтрокаПоиска, " ", "%"));
ПолеБД = "";
Если РеквизитПоиска = "Код" Тогда
 ПолеБД = "CODE";    
ИначеЕсли РеквизитПоиска = "Наименование" Тогда
    ПолеБД = "DESCR";
Иначе
 ПолеБД = "SP"+MDW.ИДРеквизитаСправочника(ТекВид, РеквизитПоиска);
КонецЕсли;										  

СтрокаЗапроса = "select ID from [ИмяТаблицы] where UPPER([ПолеБД]) like '[ПодСтрокаПоиска]'";

СтрокаЗапроса = Шаблон(СтрокаЗапроса);

Результаты = СоздатьОбъект("СписокЗначений");
//Попытка
 rs = ADO.Execute(СтрокаЗапроса);
 Если Rs.EOF() = 0 Тогда
  Rs.MoveFirst();		    
  Пока Rs.EOF() = 0 do  
   Зн = Rs.Fields("ID").Value;  
   Результаты.ДобавитьЗначение(MDW.ЗначениеИзСтрокиБД("Справочник."+ТекВид, Зн));
   Rs.MoveNext();
  КонецЦикла;    
 КонецЕсли;
 rs.close();
//Исключение  
// Сообщить(ОписаниеОшибки());
//КонецПопытки;

//#if _DEBUG
КонТаймер = _GetPerformanceCounter();  
Сообщить(Шаблон("Поиск по подстроке [Результаты.РазмерСписка()] элементов [(КонТаймер-НачТаймер)] мс."));
//#endif
Возврат Результаты;
КонецФункции // ВыбратьЭлементы()


Процедура Конструктор()

MDW = СоздатьОбъект("MetaDataWork");
ADO = СоздатьОбъект("ADODB.Connection");    
ADO.Open("Provider=MSDASQL.1;Persist Security Info=False;Extended Properties=""Driver={Microsoft Visual FoxPro h=Yes;Collate=Machine;Null=Yes;Deleted=Yes;""");
 


КонецПроцедуры // Контруктор()
« Последняя редакция: 08. Ноября 2006 :: 11:42 - fez »  
Наверх
www  
IP записан
 
fez
Forum Administrator
1c++ power user
Отсутствует


I wanted to cry, but the
tears wouldn't come

Сообщений: 2712
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: FAQ. Прямые запросы в dbf
Ответ #1 - 19. Мая 2006 :: 12:18
Печать  
Q. В описании 1с++ я ничего не видел про ADODB.Connection
A. ADODB.Connection - к 1С++(и к 1С просто) никакого отношения не имеет - это объект ADO

Q. А как же ODBC?
A. в 1С++ гораздо удобнее вместо ADO юзать ODBCRecordSet & ODBCDataBase.
строка подключения почти такая же. Используется драйвер Visual FoxPro. Надо только учесть, что в XP и в w2k3 падучий фоксовый драйвер, и не работает. Надо скачать с сайта МС и установить. Либо взять vfpodbc.dll с w2k.
  
Наверх
www  
IP записан
 
kiruha
1c++ power user
Отсутствует



Сообщений: 1249
Зарегистрирован: 11. Апреля 2007
Re: Использование ADO для доступа к данным 1С в DB
Ответ #2 - 13. Августа 2007 :: 14:14
Печать  
Строку подключения лучше делать стандартной
Код
Выбрать все
ADO = СоздатьОбъект("ADODB.Connection");
	ADO.Open("
	|Provider=VFPOLEDB.1;
	|Deleted=Yes;
	|Null = Yes;
	|Exclusive = No;
	|SourceType = DBF;
	|Data Source=" + КаталогИБ() + ";
	|Mode=ReadWrite;
	|Extended Properties="""";
	|User ID="""";
	|Password="""";
	|Mask Password=False;
	|Collating Sequence=MACHINE;
	|DSN=""""");
 



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