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

Сообщений: 300
Дата регистрации: 06.04.2022
AndyNigmatec
Загадка природы блин нехорошо это public делать ... может неожиданно помешать где-нито.

согласен, пробую еще варианты.
thisform.cMyParam выглядит привлекательно, но не получается что-то.
Ratings: 0 negative/0 positive
Re: передать параметр
AndyNigmatec

Сообщений: 1573
Откуда: Волгоград
Дата регистрации: 28.06.2015
а что говорит - TYPE("m.lcParameter") ?
Ratings: 0 negative/0 positive
Re: передать параметр
DmitryKn
Автор

Сообщений: 300
Дата регистрации: 06.04.2022
"C"
я при объявлении указывал
но не буду глобальную переменную использовать.
Ratings: 0 negative/0 positive
Re: передать параметр
DmitryKn
Автор

Сообщений: 300
Дата регистрации: 06.04.2022
у меня на форме объект
this.oDBFB = CREATEOBJECT('DBFB')

dbfb - класс с методами

thisform.odbfb.exec() - в нем вызывается SQLEXEC

будет в этом методе видно свойство thisform.cparam ?
Ratings: 0 negative/0 positive
Re: передать параметр
AndyNigmatec

Сообщений: 1573
Откуда: Волгоград
Дата регистрации: 28.06.2015
Должно быть видно - что мешает проверить например таким же способом через TYPE()
Ratings: 0 negative/0 positive
Re: передать параметр
akvvohinc

Сообщений: 4219
Откуда: Москва
Дата регистрации: 11.11.2008
Цитата:
Но если опять пропадет, у меня будет истерика.
Вместо истерик лучше сесть и разобраться, наконец, во всём, что касается областей видимости переменных и прочих объектов.
Потому что нельзя написать ничего надежно работающего, если возникают такие вопросы:
Цитата:
будет в этом методе видно свойство thisform.cparam ?

Я например, так и не понял, описана ли у вас переменная m.lcParameter, и если описана, то как.
А ведь если проблема в том, что в методе Sqlexec она не существует, то именно в этом направлении и надо копать.

Второе - вместо простого копирования реального кода ваших программ, вы выкладываете здесь "непонятно что" - то у вас переменные написаны то так, то сяк, то на скрине одно, а в теме - другое.
К чему эти шпионские игры, которые только всё запутывают?

Третье - вместо того, чтобы просто воспользоваться дебаггером самому, вы приводите фрагменты "нереального" кода, чередуя их с художественной литературой:
Цитата:
Это происходит не зависимо от оператора "?" , пробовал убирать, пробовал убирать префикс "m. " , но не избавился.
С той же целью и с равным успехом вы могли бы попробовать добавить в команду абзац из "Войны и мира", или предварительно подержать компьютер часок в холодильнике.

И так будет всегда, пока вы, наконец, не поймёте, что прежде, чем решать дифуры, надо выучить таблицу умножения.

PS
Ладно, не сдержался, прошу прощения.
Видимо, вы просто не мой "клиент" - оставляю вас тем, у кого нервы крепче.



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

Сообщений: 300
Дата регистрации: 06.04.2022
akvvohinc
...
Ладно, не сдержался, прошу прощения.
Видимо, вы просто не мой "клиент" - оставляю вас тем, у кого нервы крепче.

не-не-не, раз не сдержался, теперь обязан!



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

Сообщений: 300
Дата регистрации: 06.04.2022
Похоже разобрался.
Если объявлять переменную PUBLIC то работает. Но глобальные переменные не идеальный вариант.
Если добавить пустое поле в курсор - тоже работает, но и этот вариант не эстетичен.
Передать через свойство формы:

** есть форма, на ней объект из класса odbfb, есть свойство odbfb.cparam
* В методе save формы:
* параметр:
thisform.odbfb.cparam = IIF(EMPTY(thisform.txtpassw2.Value),'',thisform.txtpassw2.Value)
* запрос
m.lcQuery = 'execute procedure edit_user ' + ;
'?person.cnalogin,?this.cparam,' + ;
'?person.cnalast,?person.iexist,?person.crole'
IF this.odbfb.oexec(m.lcQuery,'')
IF this.odbfb.commit()
MESSAGEBOX('Готово!',0+64)
ENDIF
ELSE
MESSAGEBOX('commit FB not ok!',48)
ENDIF
** метод odbfb.oexec:
LPARAMETERS tcQuery,tcCursor
LOCAL llOk
llOk = .f.
MESSAGEBOX(this.cparam,48)
IF !EMPTY(tcQuery)
IF EMPTY(tcCursor)
m.lnExec = SQLEXEC(goApp.nConnect,tcQuery)
ELSE
m.lnExec = SQLEXEC(goApp.nConnect,tcQuery, tcCursor)
ENDIF
IF m.lnExec > 0
llOk = .t.
ELSE
AERROR(laInfo)
MESSAGEBOX("Ошибка запроса SQLEXEC :" + CHR(13) + m.laInfo[2] + CHR(13) + ' ' + m.laInfo[3] + ' ' + CHR(13) + STR(m.laInfo[5]), 0+48, 'oDBFB.OEXEC')
ENDIF
ELSE
=MESSAGEBOX('Запрос к базе данных не существует!',48,'oDBFB.OEXEC')
ENDIF
RELEASE laInfo
RETURN llOk

И, когда я пробовал пихать в lcQuery ?thisform.odbfb.cparam , метод в классе его не видел. И вот с трудом догадался поставить ?this.cparam , получается, это в методе формы, но свойство класса, он его там читает.
Такое получилось решение. И спасибо вам всем, в том числе за критику.



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

Сообщений: 4219
Откуда: Москва
Дата регистрации: 11.11.2008
Цитата:
Если объявлять переменную PUBLIC то работает. Но глобальные переменные не идеальный вариант.
Если добавить пустое поле в курсор - тоже работает, но и этот вариант не эстетичен.
Я предлагал вам передавать эту переменную в метод как параметр:
Цитата:
Чтобы lcParameter передался в sqlexec надо выполнить:
thisform.oObject.sqlexec(m.lcQuery, m.lcParameter, '')
Но можно было бы и описать её как PRIVATE.
Ratings: 0 negative/0 positive
Re: передать параметр
DmitryKn
Автор

Сообщений: 300
Дата регистрации: 06.04.2022
akvvohinc
Цитата:
Если объявлять переменную PUBLIC то работает. Но глобальные переменные не идеальный вариант.
Если добавить пустое поле в курсор - тоже работает, но и этот вариант не эстетичен.
Я предлагал вам передавать эту переменную в метод как параметр:
...

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

Как PRIVAT попробую.
Ratings: 0 negative/0 positive
Re: передать параметр
of63

Сообщений: 25254
Откуда: Н.Новгород
Дата регистрации: 13.02.2008
Придмать "универсальность" - часто (у меня) заканчивалась "раздумиями" над структурой, над разделением задачи на несвязанные части, "философией" деления программы на "подпрограммы".
Ratings: 0 negative/0 positive
Re: передать параметр
akvvohinc

Сообщений: 4219
Откуда: Москва
Дата регистрации: 11.11.2008
DmitryKn
Да, но тогда пришлось бы в классе с ней отдельно работать, и в нем теряется смысл, класс этот как универсальный для, назовем это так, проекта задумывался, что бы можно его было использовать не меняя кода методов со всеми остальными формами.
Как PRIVAT попробую.
Опять пошли непонятки, вызванные понятно чем.

Я не понимаю, что изменится в вашем универсальном классе, если переменная будет не наследоваться, а передаваться как параметр.
Поясните, что конкретно и где вам придется изменить, если помимо m.lcQuery метод будет принимать и m.lcParameter.

Почему при этом вам пришлось бы с lcParameter "отдельно работать"?
Почему при этом класс потеряет "универсальность"?
---------

А теперь я напишу, как у вас устроен метод Sqlexec()
1) Внутри метода выполняется команда SQLEXEC, требующая наличия переменной lcParameter.
2) Эта переменная может быть:
___ - создана в самом методе;
___ - передана в метод как параметр;
___ - создана где-то выше в стеке вызовов как PUBLIC или PRIVATE.

Во всех трех вариантах команда SQLEXEC будет выполнена одинаково при одинаковом значении переменной lcParameter.
Ничего принципиального в методе Sqlexec() править не придется.
В варианте "передана в метод как параметр" вам всего лишь придется дописать ещё один параметр в начало метода :
LPARAMETERS tcQuery, tcCursor, lcParameter

Если же под универсальностью вы понимаете то, что количество таких параметров может быть более одного, то ничего не меняется:
- либо вы обеспечиваете видимость всех этих переменных-параметров в методе Sqlexec(), описывая их перед вызовом как PRIVATE.
- либо передаете/принимаете всё количество параметров, рассчитывая на максимально возможное их число (и помня, что общее количество передаваемых аргументов не может быть больше 27)
LPARAMETERS tcQuery, tcCursor, lcParameter, lcParameter2, lcParameter3 ...



Исправлено 6 раз(а). Последнее : akvvohinc, 11.05.23 00:45
Ratings: 0 negative/0 positive
Re: передать параметр
of63

Сообщений: 25254
Откуда: Н.Новгород
Дата регистрации: 13.02.2008
> если переменная будет не наследоваться, а передаваться как параметр.
параметры мы умеем пердавать
Что за "переменная" возбожная как "наследуется" ?

Наследование - это у нас как "копирование образца класса" (ну, плмс ИНИТ-метод, которые может.. и галлактикуразрушить),. Но значения - наследовать - в фоксе невозможно, клонирование обьекта фокс-разрабы не сделали.



Исправлено 1 раз(а). Последнее : of63, 11.05.23 00:59
Ratings: 0 negative/0 positive
Re: передать параметр
akvvohinc

Сообщений: 4219
Откуда: Москва
Дата регистрации: 11.11.2008
Я использовал здесь слово "наследуется" не в буквальном смысле.
Если ты читал тему, то поймешь, что имелась в виду переменная, созданная где-то выше в стеке вызовов и которая "видна" в вызванном методе.
Ratings: 0 negative/0 positive
Re: передать параметр
of63

Сообщений: 25254
Откуда: Н.Новгород
Дата регистрации: 13.02.2008
"В стеке вызывов" (НУ, В СТЕКЕGTHTVTYYS[? НПБЛЮДАЕМЫХ ИЗ ПОДПРОгРАММЫ ФОКСА ), О йЕ!

СЕРЕГА!
апаратная, техническая (транзисторная) часть - это основа этой манишерии



Исправлено 2 раз(а). Последнее : of63, 11.05.23 01:15
Ratings: 0 negative/0 positive
Re: передать параметр
akvvohinc

Сообщений: 4219
Откуда: Москва
Дата регистрации: 11.11.2008
Цитата:
И, когда я пробовал пихать в lcQuery ?thisform.odbfb.cparam , метод в классе его не видел.
Вот код, который, на мой взгляд, аналогичен тому, что вы делаете.
И он работает независимо от того, с помощью какой ссылки внутри метода - thisform, this или даже this.parent вы работаете со свойством класса.




Исправлено 1 раз(а). Последнее : akvvohinc, 11.05.23 02:17
Ratings: 0 negative/0 positive
Re: передать параметр
of63

Сообщений: 25254
Откуда: Н.Новгород
Дата регистрации: 13.02.2008
() Серега, не связывайся

ДмКныр параметер передал, надеюсь...



Исправлено 1 раз(а). Последнее : of63, 11.05.23 03:27
Ratings: 0 negative/0 positive
Re: передать параметр
AndyNigmatec

Сообщений: 1573
Откуда: Волгоград
Дата регистрации: 28.06.2015
Разберется, там с головой все в порядке )))
Ratings: 0 negative/0 positive
Re: передать параметр
PaulWist

Сообщений: 14618
Дата регистрации: 01.04.2004
Как я понимаю, тут основная проблема в том, что строка с "?" формируется в одном методе, а выполнение sqlexec происходит в другом методе, ТС видимо хочет (и я его понимаю), создать универсальный метод выполнения sqlexec независимо от количество параметров, что бы в методе выполнения были видны "?переменнЫЕ".

Тут, либо private переменные, либо использовать/создавать курсор, в который класть значения, тогда проблем с областью видимости не будет.


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

Сообщений: 300
Дата регистрации: 06.04.2022
akvvohinc
Опять пошли непонятки, вызванные понятно чем.
...
Я не понимаю, что изменится в вашем универсальном классе, если переменная будет не наследоваться, а передаваться как параметр.
Поясните, что конкретно и где вам придется изменить, если помимо m.lcQuery метод будет принимать и m.lcParameter.
...

Идея была в том, что вот, я сделал класс, и в нем, например, метод oexec, который отправляет запрос серверу :
IF !EMPTY(tcQuery)
IF EMPTY(tcCursor)
m.lnExec = SQLEXEC(goApp.nConnect,tcQuery)
ELSE
m.lnExec = SQLEXEC(goApp.nConnect,tcQuery, tcCursor)
ENDIF
IF m.lnExec > 0
llOk = .t.
ELSE
AERROR(laInfo)
MESSAGEBOX("Ошибка запроса SQLEXEC :" + CHR(13) + m.laInfo[2] + CHR(13) + ' ' + m.laInfo[3] + ' ' + CHR(13) + STR(m.laInfo[5]), 0+48, 'oDBFB.OEXEC')
ENDIF
ELSE

Предполагалось, что это будет в таком виде для всех вообще запросов: select, update, insert ...
переменная tcQuery содержит в себе этот запрос в виде строки и подготавливается в соответствующих методах разных форм из необходимости.
Если передавать параметр отдельно , то его нужно как-то внутри доставать и называть, что бы в запросе вычислялось его значение перед отправкой на сервер. А нужно это только в одном случае, только с конкретной текущей формой, а в остальных не нужно, это я имел в виду, когда говорил об универсальности.
Можно было в классе формы нарезать свойств и методов и вообще таким классом не пользоваться, ну так вышло вот таким путем пошел.

Но возможно, я как-то неправильно объект создаю, все говорят про приват переменную, а у меня никак.
Создаю так:
есть класс DBFB, на форме добавлено свойство odbfb
в load формы:
SET CLASSLIB TO dbfb ADDITIVE
thisform.odbfb = CREATEOBJECT('dbfb')
Ratings: 0 negative/0 positive


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

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

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