:: Visual Foxpro, Foxpro for DOS
запрос к fox-DBF через ADO из 1C
Yason

Сообщений: 214
Откуда: Питер
Дата регистрации: 03.07.2002
Приветствую Вас , Коллеги!

Вот и до меня добралась интеграция с 1c, хоть я и боролся успешно с ней почти 3 года ;)

в фоксовую базу затягивать 1с-ные файлы у меня получилось довольно быстро.
а вот наоборот застопорил жестко ;)

пока осиливаю конфигуратор и синтасис, наилучшим решением мне показалось ;) следующее :

Path="c:\1c\";
DBConn = CreateObject("ADODB.Connection");
DBConn.Open("Provider=vfpoledb;" +
"Data Source=" + Path + ";" +
"Extended Properties=""DBASE IV;"";");

// и вот в самом запросе не получается вставить переменную.
//т.е. если я пишу :

newtable = DBConn.Execute("Select * from Dogov where month(Dogov.data) == 3");
// то все четко отрабатывает.
// а если хочу поставить выборку по точной дате, которую определяю
// переменной dvyb

ДатаДок = ТекущаяДата();
dvyb = ДатаДок;
newtable = DBConn.Execute("Select * from Dogov where Dogov.data == dvyb");
// 1C говорит :
newtable = DBConn.Execute("Select * from Dogov where Dogov.data == dvyb");
{C:\1C\PROB\EXTFORMS\ADO_DBF.ERT(104)}: Microsoft OLE DB Provider for Visual FoxPro: SQL: Column 'DVYB' is not found.
вобщем, вопрос наверно туповатый, но что делать, иду напролом ;)
Как правильно задать в 1С переменную и передать ее в запрос ADO к фоксу ?

ps. может я изобретаю велосипед? и все это можно как-то проще слепить?
тогда покажите плиз неразумному, как в 1C-синтаксисе (от которого просто на дыбы кидает старого лисовода ) запрос составить по аналогии с нашим "родным"

Заранее благодарю.
С ув.
Игорь.



Исправлено 2 раз(а). Последнее : Yason, 17.03.09 19:20
Ratings: 0 negative/0 positive
Re: запрос к fox-DBF через ADO из 1C
ssa

Сообщений: 13008
Откуда: Москва
Дата регистрации: 23.03.2005
Откройте для себя коллекцию Paramemters в ADO у бъекта ADODB.Command.
Пример, выдранный из фокса.
loConnection = Createobject('ADODB.Connection')
loCommand = Createobject('ADODB.Command')
loAdostream = Createobject('ADODB.Stream')
loRecordset = Createobject('ADODB.Recordset')
loConnection.Open(This.m_Ado_getconnstring())
loCommand.acTiveconnection = loConnection
With loRecordset
.cuRsortype = 1
.cuRsorlocation = 3
.loCktype = 3
Endwith
With loCommand
.acTiveconnection = loConnection
.coMmandtype = 4
.coMmandtext = "sei_Documents_SelectWithUniq"
.Parameters.Append(.crEateparameter('ID', 3, 1, , lnId))
loRecordset = .exEcute()
Endwith


------------------
Лень - это неосознанная мудрость.
Ratings: 0 negative/0 positive
Re: запрос к fox-DBF через ADO из 1C
rubinov
Автор

Сообщений: 483
Дата регистрации: 07.02.2005
Yason
Приветствую Вас , Коллеги!
Вот и до меня добралась интергация с 1c, хоть я и боролся успешно с ней почти 3 года ;)

в фоксовую базу затягивать 1с-ные файлы у меня получилось довольно быстро.
а вот наоборот застопорил жестко ;)

пока осиливаю конфигуратор и синтасис, наилучшим решением мне показалось ;) следующее :

Path="c:\1c\";
DBConn = CreateObject("ADODB.Connection");
DBConn.Open("Provider=vfpoledb;" +
"Data Source=" + Path + ";" +
"Extended Properties=""DBASE IV;"";");

// и вот в самом запросе не получается вставить переменную.
//т.е. если я пишу :

newtable = DBConn.Execute("Select * from Dogov where month(Dogov.data) == 3");
// то все четко отрабатывает.
// а если хочу поставить выборку по точной дате, которую определяю
// переменной dvyb

ДатаДок = ТекущаяДата();
dvyb = ДатаДок;
newtable = DBConn.Execute("Select * from Dogov where Dogov.data == dvyb");
// 1C говорит :
newtable = DBConn.Execute("Select * from Dogov where Dogov.data == dvyb");
{C:\1C\PROB\EXTFORMS\ADO_DBF.ERT(104)}: Microsoft OLE DB Provider for Visual FoxPro: SQL: Column 'DVYB' is not found.
вобщем, вопрос наверно туповатый, но что делать, иду напролом ;)
Как правильно задать в 1С переменную и передать ее в запрос ADO к фоксу ?

ps. может я изобретаю велосипед? и все это можно как-то проще слепить?
тогда покажите плиз неразумному, как в 1C-синтаксисе (от которого просто на дыбы кидает старого лисовода ) запрос составить по аналогии с нашим "родным"

Заранее благодарю.
С ув.
Игорь.

dvyb - это же переменная и ее надо передать как параметер. В засасимости от типа переменной, что-то вроде:

newtable = DBConn.Execute("Select * from Dogov where Dogov.data == '"+dvyb+"'");
Ratings: 0 negative/0 positive
Re: запрос к fox-DBF через ADO из 1C
Yason

Сообщений: 214
Откуда: Питер
Дата регистрации: 03.07.2002
О, спасибо.
с синтаксисом 1c у меня все еще беда.

тогда, если можно крайний вопрос по теме :
как правильно присвоить переменной дату и эту переменную, типа даты, туда в запрос воткнуть.

ДатаДок = ТекущаяДата();
dvyb = ДатаДок;
newtable = DBConn.Execute("Select * from Dogov where Dogov.data == "+dvyb+"");

ругается на синтаксис фокса.

с "плюсами" у меня получилось с числовым значением переменной. С датой нет.
подскажите правильное написание с форматом даты.

и вобще - можно ли с 1с как у нас в дебаггере посмотреть чему равна переменная, если код заткнулся.

Мерси!
Ratings: 0 negative/0 positive
Re: запрос к fox-DBF через ADO из 1C
Myhailo

Сообщений: 750
Дата регистрации: 07.02.2006
newtable = DBConn.Execute("Select * from Dogov where Dogov.data == CTOD(["+TRANSFORM(dvyb)+"])")
Ratings: 0 negative/0 positive
Re: запрос к fox-DBF через ADO из 1C
Yason

Сообщений: 214
Откуда: Питер
Дата регистрации: 03.07.2002
Спасибо, но на эту строку сообщает:

newtable = DBConn.Execute("Select * from Dogov where Dogov.data == CTOD(["+TRANSFORM<<?>>(dvyb)+"])")
{C:\1C\PROB\EXTFORMS\ADO_DBF.ERT(107)}: Функция не обнаружена (TRANSFORM)
newtable = DBConn.Execute("Select * from Dogov where Dogov.data == CTOD(["+TRANSFORM(dvyb)+"])"<<?>>)
{C:\1C\PROB\EXTFORMS\ADO_DBF.ERT(107)}: Неопознанный оператор
Ratings: 0 negative/0 positive
Re: запрос к fox-DBF через ADO из 1C
boba

Сообщений: 6269
Откуда: Медвежьи озера-
Дата регистрации: 26.03.2001
ctod тут лишнее в строку пытается вставить дату
Ratings: 0 negative/0 positive
Re: запрос к fox-DBF через ADO из 1C
Yason

Сообщений: 214
Откуда: Питер
Дата регистрации: 03.07.2002
Вчера прочел, но не попробовал.
Если не сложно - можно чуть подробнее, как получить для изучения эти параметры?

Спасибо.
Ratings: 0 negative/0 positive
Re: запрос к fox-DBF через ADO из 1C
Yason

Сообщений: 214
Откуда: Питер
Дата регистрации: 03.07.2002
Нет, увы, тоже самое.

Ладно, сдаюсь...

Плиз ткните пальцем, где можно прочитать как в этом мегаязыке (1с) правильно расставлять плюсы, кавычки, квадратные скобки и т.д., и в частности что означает "transform"

может угадаю что-нить ;)
Ratings: 0 negative/0 positive
Re: запрос к fox-DBF через ADO из 1C
ssa

Сообщений: 13008
Откуда: Москва
Дата регистрации: 23.03.2005
Yason
Вчера прочел, но не попробовал.
Если не сложно - можно чуть подробнее, как получить для изучения эти параметры?
Что значит получить? Их вроде как передать надо, а не получить? Или я чего-то не понял?
Вот еще пример, в том числе с датой:
.Parameters.Append(.crEateparameter('FirmID', 3, 1, , lnFirmid))
.Parameters.Append(.crEateparameter('Date', 7, 1, , ldDate))


------------------
Лень - это неосознанная мудрость.
Ratings: 0 negative/0 positive
Re: запрос к fox-DBF через ADO из 1C
ssa

Сообщений: 13008
Откуда: Москва
Дата регистрации: 23.03.2005
Yason
Плиз ткните пальцем, где можно прочитать как в этом мегаязыке (1с) правильно расставлять плюсы, кавычки, квадратные скобки и т.д., и в частности что означает "transform"
Аргумент DBConn.Execute() - строка. Строка ограничивается двойнsми кавычками. Все, что внутри этой строки. передается серверу и должно быть в его синтаксисе. Так как сервером в данном случае прикидывается фокс, то строка должна быть написана на фоксе. Transform() - функция фокса. Но в предложенном примере она вызвана в 1С при формировании строки запроса и потому не работает. В 1С конвертация в строку происходит функцией Строка(), а не Transform().
Прежде чем вызывать DBConn.Execute(), сформируйте корректную строку запроса.


------------------
Лень - это неосознанная мудрость.




Исправлено 2 раз(а). Последнее : ssa, 18.03.09 13:47
Ratings: 0 negative/0 positive
Re: запрос к fox-DBF через ADO из 1C
Yason

Сообщений: 214
Откуда: Питер
Дата регистрации: 03.07.2002
простите, недопонял.
Я подумал, что вы дали код чтобы получить материал для изучения того, какие параметры имеет этот механизм.

а передать у меня не получается из 1c запрос к фокс-таблице, причем причина как я на данный момент уяснил, в элементарном незнании мной синтаксиса языка 1с.

можете дать простой пример как в конструкцию :

newtable = DBConn.Execute("Select * from Dogov where Dogov.data == ?");

вставить дату из 1с вместо "?"
например переменную ДатаДок = ТекущаяДата();

буду весьма признателен.
Ratings: 0 negative/0 positive
Re: запрос к fox-DBF через ADO из 1C
Yason

Сообщений: 214
Откуда: Питер
Дата регистрации: 03.07.2002
вот это боле-менее понятно, спасибо.

в моем понимании корректная строка фокса :

"Select * from Dogov where Dogov.data == dvyb"

где переменой dvyb присвоено значение искомой даты.

но в 1с эта конструкция не идет. Даже как аргумент DBConn.Execute()
Ratings: 0 negative/0 positive
Re: запрос к fox-DBF через ADO из 1C
ssa

Сообщений: 13008
Откуда: Москва
Дата регистрации: 23.03.2005
Yason
вот это боле-менее понятно, спасибо.
в моем понимании корректная строка фокса :

"Select * from Dogov where Dogov.data == dvyb"
Она корректная при наличии в фоксе переменной dvyb. Переменной! Откуда она в фоксе возмется?
Цитата:

где переменой dvyb присвоено значение искомой даты.
Где присвоено? В 1С? А фокс тут при чем?
Цитата:

но в 1с эта конструкция не идет. Даже как аргумент DBConn.Execute()
Да она нигде не пойдет! Ибо переменная dvyb находится в 1С, а ее пытаются использовать в фоксе. Понятно?
Надо сформировать в 1С строку с подставленным значением. Не с переменной, а с подставленным значением переменной.
Выполни в 1С:
Предупреждение("Select * from Dogov where Dogov.data == CTOD(["+Строка(dvyb)+"])")
Вот полученную строку и изучай на предмет корректности для фокса.


------------------
Лень - это неосознанная мудрость.
Ratings: 0 negative/0 positive
Re: запрос к fox-DBF через ADO из 1C
Yason

Сообщений: 214
Откуда: Питер
Дата регистрации: 03.07.2002
Спасибо за терпеливое объяснение. ;)

с вашей помощью, методом научного тыка был получен правильный код !;)

dd = Строка(ДатаДок);
newtable = DBConn.Execute("Select * from Dogov where Dogov.data_z == CTOD('"+dd+"')");

эта конструкция работает. Передает дату и получает выборку по ней.
Правда день и месяц меняет местами, но это уже мелочи ;) с этим разберемси ...

Еще раз всех благодарю, первая проба 1с-ного кода доведена до логического завершения.

С ув.
Игорь.
Ratings: 0 negative/0 positive
Re: запрос к fox-DBF через ADO из 1C
Mitchman

Сообщений: 9978
Откуда: Николаев
Дата регистрации: 24.05.2002
Yason
Правда день и месяц меняет местами, но это уже мелочи ;) с этим разберемси ...

это зависит от национальных настроек - потому так делать не стоит - лучше потрудитесь перед передачей привести дату в такой вид "^ГГГГММДД" где ГГГГ - год ММ - месяц ДД день а ^ есть символ ^ - в этом случае такая строка воспринимается однозначо


------------------
-
«свидомые украинцы озабочены не столько созданием украинской культуры, сколько уничтожением русской»
-
Олесь Бузина
Ratings: 0 negative/0 positive
Re: запрос к fox-DBF через ADO из 1C
Yason

Сообщений: 214
Откуда: Питер
Дата регистрации: 03.07.2002
да-да, спасибо и вам ;)
такие трудности не пугают, уже все готово ;)
Ratings: 0 negative/0 positive
Re: запрос к fox-DBF через ADO из 1C
Yason

Сообщений: 214
Откуда: Питер
Дата регистрации: 03.07.2002
извините, напорол...

сейчас поищу правильное решение - исправлю.



Исправлено 1 раз(а). Последнее : Yason, 19.03.09 15:53
Ratings: 0 negative/0 positive


Извините, только зарегистрированные пользователи могут оставлять сообщения в этом форуме.

On-line: 28 Victoriacom  (Гостей: 27)

© 2000-2024 Fox Club 
Яндекс.Метрика