Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / FoxPro, Visual FoxPro Новый топик    Ответить
 execscript передача параметра  [new]
Valli377
Guest
Здравствуйте, помогите, пожалуйста, разобраться с следующим вопросом

Delphi + ADOCommand + VFPOleDB provider.
Имеется DBF таблица ~ 700 тыс. записей и индексом по ключевому полю.
Подключаюсь к таблице. В Delphi через ADOCommand пытаюсь выполнить следующий скрипт:

ADOCommand.CommandType := cmdText;
ADOCommand.CommandText := 'execscript("parameter nod"+chr(13)+"SELECT _mdt"+chr(13)+"SET ORDER TO REF_IDX"+chr(13)+"retval=SEEK(nod)"+chr(13)+"RETURN retval", nod)';
ADOCommand.Execute;

Параметр retval возвращает необходимое значение, но при использовании параметра nod, команда выполняется с ошибкой "Variable 'NOD' is not found".

Вопрос: как правильно передать параметр в execscript?
Заранее спасибо за ответы!
21 сен 11, 19:33    [11315089]     Ответить | Цитировать Сообщить модератору
 Re: execscript передача параметра  [new]
ВладимирМ
Member

Откуда: г. Москва
Сообщений: 7864
Напрямую подставить значение в символьную строку.

ADOCommand.CommandText := 'execscript("...",' + '123' + ')';

Не знаю, как корректно в Delphi сложить символьные строки.

Ругань идет на последний параметр. Тот, значение которого, должно быть вставлено в ExecScript(). Т.е. вместо последнего nod надо подставить его значение. Ну, должно получиться что-то вроде такого

execScript("parameter nod ... RETURN retval", 123)
21 сен 11, 21:31    [11315693]     Ответить | Цитировать Сообщить модератору
 Re: execscript передача параметра  [new]
Sergey Sizov
Member

Откуда:
Сообщений: 1547
Valli377
Здравствуйте, помогите, пожалуйста, разобраться с следующим вопросом

Delphi + ADOCommand + VFPOleDB provider.
Имеется DBF таблица ~ 700 тыс. записей и индексом по ключевому полю.
Подключаюсь к таблице. В Delphi через ADOCommand пытаюсь выполнить следующий скрипт:

ADOCommand.CommandType := cmdText;
ADOCommand.CommandText := 'execscript("parameter nod"+chr(13)+"SELECT _mdt"+chr(13)+"SET ORDER TO REF_IDX"+chr(13)+"retval=SEEK(nod)"+chr(13)+"RETURN retval", nod)';
ADOCommand.Execute;

Параметр retval возвращает необходимое значение, но при использовании параметра nod, команда выполняется с ошибкой "Variable 'NOD' is not found".

Вопрос: как правильно передать параметр в execscript?
Заранее спасибо за ответы!
И где тут передача параметра? И с чего взяли, что 'execscript создает функцию с параметром?
21 сен 11, 21:31    [11315694]     Ответить | Цитировать Сообщить модератору
 Re: execscript передача параметра  [new]
Valli377
Guest
ВладимирМ
Напрямую подставить значение в символьную строку.

ADOCommand.CommandText := 'execscript("...",' + '123' + ')';

Не знаю, как корректно в Delphi сложить символьные строки.


Да, строчку скомпоновать не сложно, все работает. Но все дело в том, что при изменении свойства CommandText уничтожаются параметры и параметр "retval" приходится создавать заново. Параметр создать не сложно, но при этом страдает производительность (по таблице динамически строится дерево).

Параметр retval (тип параметра pdReturnValue) успешно возвращает результат, но вот как передать параметр??? Синтаксис функции execscript должен позволять это:

ExecScript(cExpression [, eParameter1, eParameter2, ...])

eParameter1, eParameter2, ...
Optional. Specify parameters passed to a script that has a parameter statement in first line
22 сен 11, 08:07    [11316468]     Ответить | Цитировать Сообщить модератору
 Re: execscript передача параметра  [new]
ВладимирМ
Member

Откуда: г. Москва
Сообщений: 7864
А как бы Вы передали параметр в команду Select-SQL?

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

ADOCommand.CommandText := 'execscript("parameter nod"+chr(13)' + 
                                      '+"SELECT _mdt"+chr(13)' + 
                                      '+"SET ORDER TO REF_IDX"+chr(13)' + 
                                      '+"retval=SEEK(nod)"+chr(13)' + 
                                      '+"RETURN retval", ?)';

Обозначение места параметра в команде - это вопросительный знак. Само значение параметра формируется через ADODB.PARAMETER и наполняется конкретным значением непосредственно перед выполнением

=================

А зачем Вы вообще используете "навигационные" команды поиска? Насколько я вижу, то, что Вам надо, можно получить запросом вида

select count(*) from _mdt where ... = nod

Если запрос вернул 0, то нет ни одной записи. Если значение отличное от 0, то что-то есть.
22 сен 11, 11:11    [11317402]     Ответить | Цитировать Сообщить модератору
 Re: execscript передача параметра  [new]
Valli377
Guest
ВладимирМ
А как бы Вы передали параметр в команду Select-SQL?

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

ADOCommand.CommandText := 'execscript("parameter nod"+chr(13)' + 
                                      '+"SELECT _mdt"+chr(13)' + 
                                      '+"SET ORDER TO REF_IDX"+chr(13)' + 
                                      '+"retval=SEEK(nod)"+chr(13)' + 
                                      '+"RETURN retval", ?)';

Огромное Вам спасибо! Все работает!
А по поводу SELECT'а - как ни странно, но работает медленней чем скрипт. При большом количестве узлов дерево открывается с небольшой, но задержкой

Спасибо еще раз за помощь!
22 сен 11, 12:44    [11318374]     Ответить | Цитировать Сообщить модератору
 Re: execscript передача параметра  [new]
SSn888
Member

Откуда:
Сообщений: 340
Valli377,

так и не октрывайте все сразу :)
загоняйте dummy, а при прямом обращениии "доподгружайте" что надо
23 сен 11, 20:46    [11329722]     Ответить | Цитировать Сообщить модератору
Все форумы / FoxPro, Visual FoxPro Ответить