Переключение на Главную Страницу Страницы: 1 ОтправитьПечать
Обычная тема раньше на ИТленде был хороший фак по прямым запрос (число прочтений - 5158 )
Черномор
1c++ donor
Отсутствует



Сообщений: 72
Зарегистрирован: 20. Мая 2006
Пол: Мужской
раньше на ИТленде был хороший фак по прямым запрос
22. Декабря 2007 :: 20:58
Печать  
Был сабж на ИТЛенде простенький и доходчивый.
Я давно не юзал прямых запросов к ДБФ, но тут понадобилось. Сам текс запроса я еще навояю, но как грамотно к базе подключиться и выполнить запрос ни где не нашел. Рыть форум и мануалы уже задолбался. полезной инфы крохи.

вот к примеру это

Цитата:
Статья крайне хорошая и дополнения о базе ДБФ очень полезны. Я как раз сейчас оптимизирую одну ДБФ базу и это мне очень пригодилось. Но есть и некоторые неточности:

1) Подключение к базе. Там такой текст:
Цитата:

Для DBF версии рекомендуется использовать объект “ OLEDBData”(для версии 1С++ 2.0.0.0 и выше) следующим образом:
База = СоздатьОбъект("OLEDBData");
Соединение = "Provider=VFPOLEDB.1;Deleted=Yes;Data Source=" + КаталогИБ()+ ";Mode=ReadWrite;Extended Properties="";User ID="";Password="";Mask Password=False;Collating Sequence=RUSSIAN;DSN=""";
Рез = База.Соединение(Соединение);
Запрос = База.СоздатьКоманду();

RS = СоздатьОбъект("ODBCRecordset");
SQL версия не требует дополнительной инструкции подключения к базе
//RS.УстБД1С();
ТекстЗапроса = "
|SELECT
| Спр.Code as Код,
| Спр.Descr as Наименование
|FROM
| sc433 as Спр";

ТЗ = RS.ВыполнитьИнструкцию(ТекстЗапроса);
ТЗ.ВыбратьСтроку();


Для подключения к БД используется OLEDBData, а для выполнения запроса ODBCRecordset. Естественно, это не работает...

Плюс, строка подключения некорректная (хотя и работает). Например, строковые константы указаны неправильно (две кавычки в тексте 1С превращает в одну). Также в строке есть ненужные параметры. Вот про строку подключения из МСДН:

Цитата:

After the connection is open, you can query the value of ConnectionString to determine the data source evaluated.

A connection string includes the following attribute keywords and values:

Provider= cVFPOLEDBProvider


Specifies the Visual FoxPro OLE DB Provider (VFPOLEDB).
Data Source= cPath


Specifies the path to the Visual FoxPro database or a folder containing free tables. For example, c:\Microsoft Visual FoxPro\Samples\Data\Testdata.dbc
DSN= cDSNName


Specifies an existing ODBC DSN.
Mode= cMode


Specifies one of the following: Read, ReadWrite, Share Deny None (default), Share Deny Read, Share Deny Write, or Share Exclusive, which includes the previous two modes.
For a complete explanation of connection string syntax, see the Microsoft OLE DB 2.5 Programmer's Reference and SDK Guide.


Также есть неточность здесь:

Цитата:

И еще: в DBF версии в модуле проведения ЗАПРОСЫ НЕ РАБОТАЮТ! Т.к. при этом происходит начало транзакции и драйвер FoxPro не может ничего получить из базы.


ну раз здесь не точно, то как е-мое правильно.

Цитата:
База = СоздатьОбъект("OLEDBData");
Соединение = "Provider=VFPOLEDB.1;Deleted=Yes;Data Source=" + КаталогИБ()+ ";Mode=ReadWrite;Extended Properties="";User ID="";Password="";Mask Password=False;Collating Sequence=RUSSIAN;DSN=""";
Рез = База.Соединение(Соединение);
Запрос = База.СоздатьКоманду();

RS = СоздатьОбъект("ODBCRecordset");
SQL версия не требует дополнительной инструкции подключения к базе
//RS.УстБД1С();


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

  

Наверх
ICQ  
IP записан
 
noprogrammer
1c++ power user
Отсутствует


I Love YaBB 2!

Сообщений: 465
Зарегистрирован: 16. Июня 2006
Re: раньше на ИТленде был хороший фак по прямым за
Ответ #1 - 23. Декабря 2007 :: 06:56
Печать  
Код
Выбрать все
Процедура Конструктор()
	МетаИнфо=СоздатьОбъект("MetaInfoClasses");
	фЭтоSQL=МетаИнфо.ЭтоSQL_Версия();

	Если фЭтоSQL=1 Тогда
		RS=СоздатьОбъект("ODBCRecordSet");
		RS.УстБД1С();
		RS.РежимRPC(1);
	Иначе
		БД=СоздатьОбъект("OLEDBData");
		Если Константа.ТипПровайдера=Перечисление.ТипыПровайдеров.VFPOLEDB Тогда
			Каталог=?(Прав(КаталогИБ(), 1)= "\", Лев(КаталогИБ(), СтрДлина(КаталогИБ())-1), КаталогИБ());
			СтрокаСоединения="Provider=VFPOLEDB.1;Deleted=Yes;Data Source="+Каталог+";Mode=ReadWrite;Extended Properties="";User ID="";Password="";Mask Password=False;Collating Sequence=RUSSIAN;DSN=""";;
		ИначеЕсли Константа.ТипПровайдера=Перечисление.ТипыПровайдеров.AdvantageOLEDB Тогда
			СтрокаСоединения = "Provider=Advantage.OLEDB.1;Data Source=" + КаталогИБ()+";ServerType=ADS_LOCAL_SERVER;TableType=ADS_CDX;";
		КонецЕсли;
		Рез=БД.Соединение(СтрокаСоединения);
		RS=БД.СоздатьКоманду();
	КонецЕсли;
КонецПроцедуры
 

  
Наверх
wwwICQ  
IP записан
 
varelchik
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 788
Зарегистрирован: 22. Мая 2006
Re: раньше на ИТленде был хороший фак по прямым за
Ответ #2 - 23. Декабря 2007 :: 07:14
Печать  
Или так:
Код
Выбрать все
Функция глСоединение(ТипСоединения="",ПутьИБ="",Пользователь="",Пароль="") Экспорт
	Каталог=КаталогИБ();
	Если Врег(ТипСоединения)="SQL" Тогда
		БД =СоздатьОбъект("ODBCDataBase");
		Запрос=СоздатьОбъект("ODBCRecordSet");
		Если ПустоеЗначение(ПутьИБ)=0 Тогда
			СтрокаСоединения = "Driver={SQL Server};Server=%1;Database=%2;Uid=%3;Pwd=%4;";
			БД.ПрисоединитьИБ(ПутьИБ,Пользователь,Пароль,СтрокаСоединения);
			Запрос.УстБД(БД);
		КонецЕсли;
		Возврат Запрос;
	ИначеЕсли Врег(ТипСоединения)="ОЛЕ" Тогда
		Попытка
			БД = СоздатьОбъект("OLEDBData");  
			Если ПустоеЗначение(ПутьИБ)=0 Тогда
				БД.ПрисоединитьИБ(ПутьИБ);
			Иначе
				СтрокаСоединения = "Provider=VFPOLEDB.1;Deleted=Yes;Data Source=" + Каталог
				+ ";Mode=ReadWrite;Extended Properties="";User ID="";Password="";Mask Password=False;Collating Sequence=RUSSIAN;DSN=""";;
				БД.Соединение(СтрокаСоединения);
			КонецЕсли;
			Команда=БД.СоздатьКоманду();
			Команда.УстановитьКаталогВремТаблиц(КаталогВременныхФайлов());
			Возврат Команда;
		Исключение
			Возврат глСоединение("ДБФ",ПутьИБ);
		КонецПопытки;
	ИначеЕсли Врег(ТипСоединения)="ДБФ" Тогда
		Попытка
			БД =СоздатьОбъект("ODBCDataBase");
			Если ПустоеЗначение(ПутьИБ)=0 Тогда
				БД.ПрисоединитьИБ(ПутьИБ);
			Иначе
				БД.Соединение("DRIVER={Microsoft Visual FoxPro Driver};Deleted=Yes;
				|Null=Yes;Collate=RUSSIAN;Exclusive=No;SourceType=DBF;SourceDB="+Каталог);
			КонецЕсли;
			Запрос=СоздатьОбъект("ODBCRecordSet");
			Запрос.УстБД(БД);
			Возврат Запрос;
		Исключение
			Возврат 0;
		КонецПопытки;
	ИначеЕсли Врег(ТипСоединения)="ADV" Тогда
		СтрокаСоединения="
		|Provider=Advantage.OLEDB.1;
		|Data Source=" + Каталог + ";
		|TableType=ADS_CDX;
		|ServerType=ADS_LOCAL_SERVER;
		|SecurityMode=ADS_IGNORERIGHTS;
		|LockMode=ADS_COMPATIBLE_LOCKING;
		|ShowDeleted=FALSE;
		|DbfsUseNulls=TRUE;
		|CharType=ADS_ANSI;
		|TrimTrailingSpaces=FALSE;
		|";
		БД = СоздатьОбъект("OLEDBData");  
		БД.Соединение(СтрокаСоединения);
		Команда=БД.СоздатьКоманду();
		Команда.УстановитьКаталогВремТаблиц(КаталогВременныхФайлов());
		Возврат Команда;
	Иначе
		МФ=СоздатьОбъект("MetaInfoClasses");
		Если МФ.ЭтоSQL_Версия()=1 Тогда
			Возврат глСоединение("SQL");
		Иначе
			Если МонопольныйРежим()=1 Тогда
				Возврат 0;
			Иначе
				Возврат глСоединение("ОЛЕ",ПутьИБ);
			КонецЕсли;
		КонецЕсли;
	КонецЕсли;
КонецФункции	// глСоединение

 



А что касается примеров, то смотри доку по 1С++ в разделе Учебник.
в последней версии документации есть примеры использования запросов к DBF базе.
  
Наверх
 
IP записан
 
Черномор
1c++ donor
Отсутствует



Сообщений: 72
Зарегистрирован: 20. Мая 2006
Пол: Мужской
Re: раньше на ИТленде был хороший фак по прямым за
Ответ #3 - 23. Декабря 2007 :: 08:05
Печать  
Спасибо. А то меня аж накрывать стало. 12 часов потратил на поиски. Нде...  нельза сразу конфигурить 7-ку, 7-ку с 1с++, и 8-ку. башенку рвать начинает.
  

Наверх
ICQ  
IP записан
 
kiruha
1c++ power user
Отсутствует



Сообщений: 1249
Зарегистрирован: 11. Апреля 2007
Re: раньше на ИТленде был хороший фак по прямым за
Ответ #4 - 23. Декабря 2007 :: 08:52
Печать  
Ну не знаю -
Поиск "Provider=VFPOLEDB.1"
Результат 87!! сообщений.

В том числе в FAQ в статье по прямым запросам, в прикрепленных ветках к форуму по прямым запросам.
« Последняя редакция: 23. Декабря 2007 :: 12:31 - kiruha »  
Наверх
 
IP записан
 
Черномор
1c++ donor
Отсутствует



Сообщений: 72
Зарегистрирован: 20. Мая 2006
Пол: Мужской
Re: раньше на ИТленде был хороший фак по прямым за
Ответ #5 - 24. Декабря 2007 :: 10:14
Печать  
Да это я перетрудился...
Несколько разношерстных баз да еще на разных платформах...
В отпуск надо
  

Наверх
ICQ  
IP записан
 
Черномор
1c++ donor
Отсутствует



Сообщений: 72
Зарегистрирован: 20. Мая 2006
Пол: Мужской
Re: раньше на ИТленде был хороший фак по прямым за
Ответ #6 - 24. Декабря 2007 :: 15:48
Печать  
ТекстЗапроса = "
     |SELECT
     |      Жур.IDDoc as [Док $Документ],
     |      Жур.IDDocDef as Док_вид
     |FROM
     |      1SJourn as Жур
     |WHERE
     |      Жур.Date BETWEEN :НачДата~~ AND :КонДата~~ AND
     |      Жур.IDDocDef = $ВидДокумента.Реализация";

Meta name parser error: модификатор не определен для типа ":НачДата~~"
           
  

Наверх
ICQ  
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: раньше на ИТленде был хороший фак по прямым за
Ответ #7 - 25. Декабря 2007 :: 08:14
Печать  
Цитата:
ТекстЗапроса = "
     |SELECT
     |      Жур.IDDoc as [Док $Документ],
     |      Жур.IDDocDef as Док_вид
     |FROM
     |      1SJourn as Жур
     |WHERE
     |      Жур.Date BETWEEN :НачДата~~ AND :КонДата~~ AND
     |      Жур.IDDocDef = $ВидДокумента.Реализация";

Meta name parser error: модификатор не определен для типа ":НачДата~~"
           

Ограничения на интервал дат надо задавать так ( иначе нач дата не будет попадать)

Код
Выбрать все
BETWEEN :НачДата AND :КонДата~ 



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


I Love YaBB 2!

Сообщений: 788
Зарегистрирован: 22. Мая 2006
Re: раньше на ИТленде был хороший фак по прямым за
Ответ #8 - 25. Декабря 2007 :: 08:49
Печать  
Обращаю внимание:
Код
Выбрать все
|FROM
| 1SJourn as Жур
 


это батенька DBF!
посему утверждение:
Код
Выбрать все
BETWEEN :НачДата AND :КонДата~
 


в корне не верно!
и странно чего у вас господа не отрабатывает?
у мене вот это работает как надо:
Код
Выбрать все
SELECT
 Жур.IDDoc as [Док $Документ],
 Жур.IDDocDef as Док_вид
FROM
 1SJourn as Жур
WHERE
 Жур.IDDocDef = $ВидДокумента.Чек  AND
 Жур.Date BETWEEN :НачДата AND :КонДата~~
 


хотя пробовал и так:
Код
Выбрать все
SELECT
 Жур.IDDoc as [Док $Документ],
 Жур.IDDocDef as Док_вид
FROM
 1SJourn as Жур
WHERE
 Жур.Date BETWEEN :НачДата AND :КонДата~~ AND
 Жур.IDDocDef = $ВидДокумента.Чек
 



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