:: Visual Foxpro, Foxpro for DOS
передать параметр
DmitryKn
Автор

Сообщений: 300
Дата регистрации: 06.04.2022
Доброго всем праздничного дня!

Хочу передать переменную, выражение типа:

& существует курсор cur
m.lcParameter = thisform.texbox1.value
m.lcQuery = 'execute procedure myProc ?cur.field1,?cur.field2,?m.lcParameter,?cur.field3'
& передаю в объект
thisform.oObject.sqlexec(m.lcQuery, '')
& там выполняется
SQLEXEC(m.lnConnect,m.lcQuery)
Все как-то поначалу шло хорошо, потом на каком то этапе фокс вдруг стал запрашивать значение View Parameter , введите значение параметра, т.е. m.lcParameter , и требует его ввести руками.
Это происходит не зависимо от оператора "?" , пробовал убирать, пробовал убирать префикс "m. " , но не избавился.
Не подскажете ли, где мне чего поправить?



Исправлено 6 раз(а). Последнее : DmitryKn, 09.05.23 16:48
Ratings: 0 negative/0 positive
Re: передать параметр
akvvohinc

Сообщений: 4224
Откуда: Москва
Дата регистрации: 11.11.2008
Цитата:
m.lcParameter = thisform.texbox1.value
m.lcQuery = 'execute procedure myProc ?cur.field1,?cur.field2,?m.lcParametr,?cur.field3'
Особо не вчитывался, возможно, это просто описка здесь, на форуме.
Но вижу, что сначала написано lcParameter, а позже - lcParametr.
Ratings: 0 negative/0 positive
Re: передать параметр
DmitryKn
Автор

Сообщений: 300
Дата регистрации: 06.04.2022
Да, описка здесь.



Исправлено 1 раз(а). Последнее : DmitryKn, 09.05.23 16:47
Ratings: 0 negative/0 positive
Re: передать параметр
PaulWist

Сообщений: 14621
Дата регистрации: 01.04.2004
Судя по всему, локальную переменную испольщуешь пр вызове метода, эта пепеменная там просто не видна.


------------------
Есть многое на свете, друг Горацио...
Что и не снилось нашим мудрецам.
(В.Шекспир Гамлет)
Ratings: 0 negative/0 positive
Re: передать параметр
akvvohinc

Сообщений: 4224
Откуда: Москва
Дата регистрации: 11.11.2008
Цитата:
Все как-то поначалу шло хорошо, потом на каком то этапе фокс вдруг стал запрашивать значение View Parameter
Возможно, сначала переменная lcParameter не была описана, и по умолчанию становилась PRIVATE.
Затем ты её описал как LOCAL, и внутри thisform.oObject.sqlexec она стала не видна.
Если так, то передай и её как параметр.



Исправлено 1 раз(а). Последнее : akvvohinc, 09.05.23 18:23
Ratings: 0 negative/0 positive
Re: передать параметр
DmitryKn
Автор

Сообщений: 300
Дата регистрации: 06.04.2022
Спасибо за отклик в праздник!

Да, локальная. Но дело не в этом, объявил паблик, тоже самое (
и это же параметр, должен быть виден

он в объект как параметр передается. И до какого-то момента был виден. Переставлю-ка я фокс, вчера глюк проскочил, может поэтому.



Исправлено 1 раз(а). Последнее : DmitryKn, 09.05.23 20:01
Ratings: 0 negative/0 positive
Re: передать параметр
Vedmak

Сообщений: 5971
Откуда: CiTY
Дата регистрации: 30.10.2003
Я тоже в начале использовал эту конструкцию со "ссылкой" на переменную "?m.<fieldname>" работало. Но в какой то момент тоже перестало. Я недельку провел в изысканиях... но терпение кончилось и просто переделал на явное указание значения поля. Не исключено вопрос совместитмости новых драйверов ODBC и "устаревшего" VFP. Но меня на долгие академические исследования не хватает. Вижу цели и обхожу препятствия. ))

Прилагаю свой класс для работы с MySQL. Основа это сознание объекта с полями из таблицы БД с заведомо неизвестной структурой.

Методы:

add_record - вставляем запись в таблицу и новая запись возвращается в приложение в виде объекта loRecord
get_record - получаем запись из БД в виде объекта loRecord
put_record - укладываем объекта loRecord в базу

*ins_record - вставка объекта loRecord в таблицу не имеющей ID реализована, но в базовом проекте нет в этом надобности. покажу по запросу.

Пример метода на форме обновления записи в справочнике:

LPARAMETERS lnRecordId

LOCAL loRec, loSign

IF EMPTY( This.record_id )
	IF !goSql.add_record( "country_list", @loRec)
		RETURN goApp.error_id = no_error
	ENDIF 

	lnRecordId = loRec.id
else

	IF !goSql.get_record( "country_list",  This.record_id, @loRec)
		RETURN goApp.error_id = no_error
	ENDIF 
ENDIF 

IF !goSql.add_sign( loRec.sign, @loSign, sign_note_update )
	RETURN goApp.error_id = no_error
ENDIF 

loRec.sign = loSign.id
loRec.name = This.txtName.Value
loRec.code = This.txtCode.Value

goSql.put_record( "country_list", loRec.id, loRec )

RETURN goApp.error_id = no_error

P.S. sing_list - служебная таблица за регистрации факта обновления записи

P.P.S. Извиняюсь на ошибки, новая клава без русских букв. ) Еще не прикупил наклейки. Моторика тоже не изменилась пока под новый девайс.


------------------
Говорить стоит лишь для тех, кто слушает.




Исправлено 2 раз(а). Последнее : Vedmak, 09.05.23 20:59
Ratings: 0 negative/0 positive
Re: передать параметр
PaulWist

Сообщений: 14621
Дата регистрации: 01.04.2004
Vedmak
Я тоже в начале использовал эту конструкцию со "ссылкой" на переменную "?m.<fieldname>" работало. Но в какой то момент тоже перестало. Я недельку провел в изысканиях... но терпение кончилось и просто переделал на явное указание значения поля.

Это действие (убрать параметризированный запрос) приводит к тому, что ЛЮБОЙ запрос отдельно компилируется, забивая кэш процедур, вытесняя планы откомпилированных/параметризированных запросов.
Пока запросов немного (до 1 транзакции/сек) можно наплевать и забыть, при высоконагруженной системе сразу возникнут тормоза выполнения запросов и разгрести их будет ой как непросто.

И второе (главное), если надо вынуть/обновить/удалить/добавить на сервере 100 записей, то как будешь делать, 100 раз вызывать соответстующие методы класса

Третье, если для DML таблицы потребуется запрос, когда не знаешь ID (например, обновление должно быть на основе 2-3 итд таблиц), то как обновить табличку?? (будешь сначала на клиенте получать ID, а затем в обратную сторону слать DML запросы) ??

И что делать, если надо вызвать ф-ию, хранимую процедуру??

И что делать, если нет прав на чтение таблиц??

И четвертое, где управление транзакциями??

PS как начальный опыт пойдёт, но в прод, слишком сыро.


------------------
Есть многое на свете, друг Горацио...
Что и не снилось нашим мудрецам.
(В.Шекспир Гамлет)




Исправлено 2 раз(а). Последнее : PaulWist, 09.05.23 21:44
Ratings: 0 negative/0 positive
Re: передать параметр
DmitryKn
Автор

Сообщений: 300
Дата регистрации: 06.04.2022
Попробую переставить, а там видно будет.
Ratings: 0 negative/0 positive
Re: передать параметр
Vedmak

Сообщений: 5971
Откуда: CiTY
Дата регистрации: 30.10.2003
PaulWist
Vedmak
Я тоже в начале использовал эту конструкцию со "ссылкой" на переменную "?m.<fieldname>" работало. Но в какой то момент тоже перестало. Я недельку провел в изысканиях... но терпение кончилось и просто переделал на явное указание значения поля.

Это действие (убрать параметризированный запрос) приводит к тому, что ЛЮБОЙ запрос отдельно компилируется, забивая кэш процедур, вытесняя планы откомпилированных/параметризированных запросов.
Пока запросов немного (до 1 транзакции/сек) можно наплевать и забыть, при высоконагруженной системе сразу возникнут тормоза выполнения запросов и разгрести их будет ой как непросто.

Вот про высоко нагруженные системы я только краем зачерпнул на опыте в паре проектов. Совершено не знаю как это правильно выполнять. Отдельная тема. Мне не доводилось массово апдейтить таблицы где кол-во затронутых записей в сотнях+ мегабайтах. Одним "хапом" update до 500к в рамках одних транзакционных скобок выполняется. Хостер (MySQL) такую БД в ~100 Гб переваривает во вменяемые (для бизнеса) сроки. По факту накладная в +/- 500 позиций вообще не вопрос для MySQL 8.* в варианте инсталляции DeveloperStation.А что там на серверах... одному админу хостера известно.

А вот вопрос со сложными SQL-запросами это действительно большая тема! Молодые получают образование (шаблоны) в ВУЗ-е сжато, а старики накапливают в поиске как привыкли.


------------------
Говорить стоит лишь для тех, кто слушает.
Ratings: 0 negative/0 positive
Re: передать параметр
akvvohinc

Сообщений: 4224
Откуда: Москва
Дата регистрации: 11.11.2008
DmitryKn
он в объект как параметр передается.
Не передается (не хочется повторяться, но это опять "отсутствие базовых знаний").
Как параметр передается m.lcQuery, который является просто строкой.

Чтобы lcParameter передался в sqlexec надо выполнить:
thisform.oObject.sqlexec(m.lcQuery, m.lcParameter, '')

Так что если m.lcParameter - действительно локальная переменная, то она не может быть видна в методе sqlexec.
Если же она не локальная (Private или Public), то она будет видна в соответствии со своей областью видимости.
(можно, но не стоит называть методы именем существующих функций, я sqlexec() имею в виду)

Цитата:
на каком то этапе фокс вдруг стал запрашивать значение View Parameter , введите значение параметра, т.е. m.lcParameter
Лучше приведите скрин сообщения (или точный его текст без перевода).
Что-то у меня есть сомнения, что речь обязательно идет о переменной lcParameter.

Что вам мешает остановить выполнение перед командой
SQLEXEC(m.lnConnect,m.lcQuery)
и проверить значения всех полей/переменных, использующихся в lcQuery?

Цитата:
Переставлю-ка я фокс, вчера глюк проскочил, может поэтому.
Маловероятно, что дело в Фоксе.
Ratings: 0 negative/0 positive
Re: передать параметр
akvvohinc

Сообщений: 4224
Откуда: Москва
Дата регистрации: 11.11.2008
Цитата:
Я недельку провел в изысканиях... но терпение кончилось
Непонятно, что здесь "изыскивать".
Достаточно перед вызовом SQLEXEC проверить существование и значения всех полей/переменных, используемых в этой функции.
Ratings: 0 negative/0 positive
Re: передать параметр
AndyNigmatec

Сообщений: 1574
Откуда: Волгоград
Дата регистрации: 28.06.2015
Сдается мне проблема может быть в этом:
m.lcParameter = thisform.texbox1.value

Вроде как читая написанное проблемы быть не должно, но ... сталкивался как-то с подобными непонятками.

Предлагаю вам сделать так:
1. заводим на форме св-во для этого параметра, типа thisform.AddProperty("cMyParam",null) ну или инициализировав сразу нужным типом/значением
2.в InteractiveChange (например) этого texbox1 делаем - thisform.cMyParam=thisform.texbox1.value
3. в вашем запросе - m.lcQuery = 'execute procedure myProc ?cur.field1,?cur.field2,?thisform.cMyParam,?cur.field3'

100% будет работать )))
Ratings: 0 negative/0 positive
Re: передать параметр
DmitryKn
Автор

Сообщений: 300
Дата регистрации: 06.04.2022
akvvohinc
DmitryKn
он в объект как параметр передается.
...
Лучше приведите скрин сообщения (или точный его текст без перевода).
Что-то у меня есть сомнения, что речь обязательно идет о переменной lcParameter.
...

во вложении. В реале называлась lcpassw
Ratings: 0 negative/0 positive
Re: передать параметр
DmitryKn
Автор

Сообщений: 300
Дата регистрации: 06.04.2022
AndyNigmatec
Сдается мне проблема может быть в этом:
m.lcParameter = thisform.texbox1.value

Вроде как читая написанное проблемы быть не должно, но ... сталкивался как-то с подобными непонятками.

Предлагаю вам сделать так:
1. заводим на форме св-во для этого параметра, типа thisform.AddProperty("cMyParam",null) ну или инициализировав сразу нужным типом/значением
2.в InteractiveChange (например) этого texbox1 делаем - thisform.cMyParam=thisform.texbox1.value
3. в вашем запросе - m.lcQuery = 'execute procedure myProc ?cur.field1,?cur.field2,?thisform.cMyParam,?cur.field3'

100% будет работать )))

не прокатило, выдает такой же запрос, как на картинке в предыдущем посте, только уже, конечно, с thisform.сMyParam .
Явно значение присваивал, thisform.cMyParam = '123' , тоже не помогло.
Ratings: 0 negative/0 positive
Re: передать параметр
DmitryKn
Автор

Сообщений: 300
Дата регистрации: 06.04.2022
решил так - добавил поле в курсор
запрос принял вид
m.lcQuery = 'execute procedure myProc ?cur.field1,?cur.field2,?cur.field3,?cur.field4'
и все стало нормально.

Природа явления осталась загадкой.



Исправлено 1 раз(а). Последнее : DmitryKn, 10.05.23 13:42
Ratings: 0 negative/0 positive
Re: передать параметр
Владимир Максимов

Сообщений: 14100
Откуда: Москва
Дата регистрации: 02.09.2000
Так просили же посмотреть, существует ли переменная непосредственно перед выполнением SQLExec(). Если через отладчик не получается, то можно заглушку поставить

& там выполняется
if type("m.lcParameter") = "U"
MessageBox("Переменная m.lcParameter не существует")
endif
SQLEXEC(m.lnConnect,m.lcQuery)



Исправлено 1 раз(а). Последнее : Владимир Максимов, 10.05.23 13:58
Ratings: 0 negative/0 positive
Re: передать параметр
DmitryKn
Автор

Сообщений: 300
Дата регистрации: 06.04.2022
Владимир Максимов
Так просили же посмотреть, существует ли переменная непосредственно перед выполнением SQLExec(). Если через отладчик не получается, то можно заглушку поставить
& там выполняется
if type("m.lcParameter") = "U"
MessageBox("Переменная m.lcParameter не существует")
endif
SQLEXEC(m.lnConnect,m.lcQuery)

Есть такой термин - "эффект присутствия".
Я ранее и public объявлял, и свойство в форму. Теперь, скрепя сердцем, ну сделаю еще раз, хотя и безполезно ... и вот, переменная существует и значение передается.
Вы, Владимир, почаще заходите в мои темы, честное слово, одно присутствие помогает.

Но если опять пропадет, у меня будет истерика.
Ratings: 0 negative/0 positive
Re: передать параметр
DmitryKn
Автор

Сообщений: 300
Дата регистрации: 06.04.2022
Большое спасибо всем, кто откликнулся.
Ratings: 0 negative/0 positive
Re: передать параметр
AndyNigmatec

Сообщений: 1574
Откуда: Волгоград
Дата регистрации: 28.06.2015
Загадка природы блин
нехорошо это public делать ... может неожиданно помешать где-нито.
Ratings: 0 negative/0 positive


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

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

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