powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Общие принципы построения приложения в FoxPro
25 сообщений из 424, страница 16 из 17
Общие принципы построения приложения в FoxPro
    #38159126
PaulWist
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sg12PaulWist

Вы уж совсем ... того ... мне мои ответы начали диктовать.
Вы на форуме находитесь, а не в школе, диктант диктуете.
...

Ну хорошо, оставим это.

sg12PaulWist

Вам нужен:
PaulWist КОД КЛАССА ОБЁРТКИ НАД SQLEXEC()
Что вас не устраивает в существующем классе?

Базовый класс,... а кстати, на основе какого базового класса построен класс?
...
Рейтинг: 0 / 0
Общие принципы построения приложения в FoxPro
    #38159202
sg12
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PaulWist

Какой у вас базовый класс? Лучше всего подходит класс Custom.
Что еще вас смущает в существующем классе?

ЗЫ. Это случаем не тот класс-самоубица от ДимыТ, который сам автор не смог запустить, потому что тот прилюдно просил его "убить"?
И который сам автор загнал куда-то подальше, чтобы не брать себе на душу такой грех.
...
Рейтинг: 0 / 0
Общие принципы построения приложения в FoxPro
    #38159280
PaulWist
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sg12PaulWist

Какой у вас базовый класс? Лучше всего подходит класс Custom.

...

ОК, вот уже предметный разговор.

Хорошо, пусть будет Custom.

У меня тоже Custom.

sg12PaulWist

Что еще вас смущает в существующем классе?

...

Как инициализируется этот класс, те в какой момент происходит его создание (Creat/NewObject), поясню созданный на основе этого класса обьект является общим для приложения или же для каждого обьекта приложения создаётся свой экземпляр?


sg12PaulWist

ЗЫ. Это случаем не тот класс-самоубица от ДимыТ, который сам автор не смог запустить, потому что тот прилюдно просил его "убить"?
И который сам автор загнал куда-то подальше, чтобы не брать себе на душу такой грех.

Давайте условимся, у нас технический разговор, и не будем в нашем треде отвлекаться на других участников.
...
Рейтинг: 0 / 0
Общие принципы построения приложения в FoxPro
    #38159372
sg12
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PaulWistКак инициализируется этот класс, те в какой момент происходит его создание (Creat/NewObject), поясню созданный на основе этого класса обьект является общим для приложения или же для каждого обьекта приложения создаётся свой экземпляр?


Это уже серьезный вопрос.
Я бы посоветовал забыть, что это класс только для SQLEXEC() и начать на его основе создавать глобальный класс вообще для работы со всем SQL-сервером.
Так как это тема достаточно посещаема, и надеюсь не только троллями, то могу остановиться на этом объемном вопросе подробнее.
Но сразу замечу, что некоторые вопросы у меня еще "сырые" - в свое время их забросил за отсутствием необходимости.
...
Рейтинг: 0 / 0
Общие принципы построения приложения в FoxPro
    #38159428
PaulWist
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sg12PaulWistКак инициализируется этот класс, те в какой момент происходит его создание (Creat/NewObject), поясню созданный на основе этого класса обьект является общим для приложения или же для каждого обьекта приложения создаётся свой экземпляр?


Это уже серьезный вопрос.
Я бы посоветовал забыть, что это класс только для SQLEXEC() и начать на его основе создавать глобальный класс вообще для работы со всем SQL-сервером.
...

Отлично, задам вопрос по другому:

Как инициализируется этот ГЛОБАЛЬНЫЙ класс, те в какой момент происходит его создание (Creat/NewObject), созданный на основе этого класса обьект является общим для приложения или же для каждого обьекта приложения создаётся свой экземпляр?


sg12Так как это тема достаточно посещаема, и надеюсь не только троллями, то могу остановиться на этом объемном вопросе подробнее.


Мы вроде договорились, обсуждать технические проблемы, а не личные качества участников.

sg12Но сразу замечу, что некоторые вопросы у меня еще "сырые" - в свое время их забросил за отсутствием необходимости.

Не ошибается тот кто ничего не делает, ... значит класс всё таки есть, можете его запостить на форуме?
...
Рейтинг: 0 / 0
Общие принципы построения приложения в FoxPro
    #38159602
sg12
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PaulWistКак инициализируется этот ГЛОБАЛЬНЫЙ класс, те в какой момент происходит его создание (Creat/NewObject), созданный на основе этого класса обьект является общим для приложения или же для каждого обьекта приложения создаётся свой экземпляр?


Этот глобальный класс, назовем его _server должен находиться в том же .vcx, где у вас нахолится _application.
Если заполнен его Init, то его нужно освободить во временную процедуру _server._init, к этому можно будет вернуться позже.
Этот объект лучше добавлять AddObject() к goApp, но сейчас это у вас вызовет затруднения, знаю по себе.
Поэтому сейчас лучше объявлять его как глобальную переменную goServer (условимся названия принимать мои, чтобы избежать ненужных разночтений).
Он один и объявляется примерно после того, когда у вас закончились SET-настройки и установлены пути.
PUBLIC goServer
goServer = CREATEOBJECT('_server') (я использую CREATEOBJECT(), может и есть какая разница от NEWOBJECT(), мне неважно)
Теперь его методы и свойства будут доступны как глобальные для всего приложения, и в него можно начать закачивать все необходимые процедуры для работы с SQL-сервером.
Однако это не исключает, что в случае какой необходимости вы на местах можете писать свои процедуры.
При закрытии приложения этот объект обязательно нужно закрывать, иначе он будет торчать в памяти.
...
Рейтинг: 0 / 0
Общие принципы построения приложения в FoxPro
    #38159747
PaulWist
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sg12Этот глобальный класс, назовем его _server должен находиться в том же .vcx, где у вас нахолится _application.
...

А в другой библиотеке классов _server может находиться или обязательное условие одновременное нахождение с _application и чем грозит находжение их в разных библиотеках классов?

sg12Если заполнен его Init, то его нужно освободить во временную процедуру _server._init, к этому можно будет вернуться позже.
...

Поясните, что такое временная процедура _server._init это имя файла с таким расширением?

sg12Поэтому сейчас лучше объявлять его как глобальную переменную goServer (условимся названия принимать мои, чтобы избежать ненужных разночтений).
...

Не вопрос, договорились.


sg12Он один и объявляется примерно после того, когда у вас закончились SET-настройки и установлены пути.
PUBLIC goServer
goServer = CREATEOBJECT('_server') (я использую CREATEOBJECT(), может и есть какая разница от NEWOBJECT(), мне неважно)
...

Тут всё понятно, непонятно в следующей цитате:

sg12Теперь его методы и свойства будут доступны как глобальные для всего приложения, и в него можно начать закачивать все необходимые процедуры для работы с SQL-сервером.
...

Как закачивать (те с помощью чего) и какие процедуры необходимы для работы с SQL сервером, расскажите по подробнее?

sg12При закрытии приложения этот объект обязательно нужно закрывать, иначе он будет торчать в памяти.

Тут тоже не очень понятно, зачем этот обьект закрывать, ведь при повторном запуске не надо тратить ресурсы на его создание, а можно этот обьект повторно использовать, .. Вам не кажется, что лучше не закрывать, так более рационально, можно использовать ресурсы компа или всё таки необходимо его закрыть, тогда какие последствия могут возникнуть, если этот обьект не закрывать?
А если просто выдать команду QUIT обьект всё рано останется в памяти?
...
Рейтинг: 0 / 0
Общие принципы построения приложения в FoxPro
    #38159805
sg12
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PaulWist

_server вместе c _application необязательно в одной библиотеке (назовем _appobj.vcx/_appobj.vct), но намного удобнее, это будет часть фреймворка.
Методы _server не используются (init,destroy,error ..., да и вообще это слово "метод" с _server не будем употреблять, только слово "процедуры"), но у вас ведь там могут быть коды.
Чтобы они не пропали для следующей переделки, мы их сохраняем в специально созданных нами временных процедурах в этом же классе с приставкой "_".
Куда-то нам их сейчас надо деть, после переделки кодов эти временные процедуры нам будут не нужны.
"Закачивать" - неудачный термин. Вы будете создавать в этом классе новые нужные вам процедуры и постепенно переносить процедуры из разных углов и форм в этот класс.
Разумеется, продуманно и с отладкой - теперь этот класс у вас "резиновый" и модифицируется.
Но это надо смотреть конкретно, когда приступите к этому.
Например, вы уже можете начать переносить процедуры подключения к серверу.
Закрывать объекты обязательно, повторно они не используются. Вообще, с объектами правило жесткое - что создано, открыто - должно быть продуманно и вовремя закрыто.
Иначе заставит это сделать обработчик ошибок, если вообще закроете программу. Да и по новой они не запустятся, запросят "убить", т.е. очистить из памяти.
Команды типа QUIT, CLEAR ALL и т.п. в основном надо привыкать рассматривать как аварийные - значит где-то в программе недоделки, хотя они все уничтожают.
Если при процедурном программированни такой метод сходит, то с объектами быстро выявляется через ошибки.
...
Рейтинг: 0 / 0
Общие принципы построения приложения в FoxPro
    #38159846
PaulWist
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sg12PaulWist

...Методы _server не используются (init,destroy,error ..., да и вообще это слово "метод" с _server не будем употреблять, только слово "процедуры"), но у вас ведь там могут быть коды.
Чтобы они не пропали для следующей переделки, мы их сохраняем в специально созданных нами временных процедурах в этом же классе с приставкой "_".
Куда-то нам их сейчас надо деть, после переделки кодов эти временные процедуры нам будут не нужны.
...

А, вот оно что, а я думал что "init,destroy,error" - это события, а не методы, и считал, что код в родительском классе не обязательно сохранять как отдельный метод, а достаточно пергрузить код связанный событиями и методами из дочернего класса и при необходимости код родителя вызвать из дочернего класса ... ну да ладно, как условились будем их называть процедурами.

sg12PaulWist
"Закачивать" - неудачный термин. Вы будете создавать в этом классе новые нужные вам процедуры и постепенно переносить процедуры из разных углов и форм в этот класс.
...

Ок, не возражаю.

sg12PaulWist
Например, вы уже можете начать переносить процедуры подключения к серверу.


Хорошо, а покажите код который Вы используете для подключения к серверу?
...
Рейтинг: 0 / 0
Общие принципы построения приложения в FoxPro
    #38160190
sg12
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PaulWistХорошо, а покажите код который Вы используете для подключения к серверу?

Коды у меня сырые, и вам придется довести их под свои нужды, как договорились.
Вот то, что вы просили, вряд ли у вас вызовет затруднения:
* Процедура DoSQL()
LPARAMETERS tcCase
LOCAL lcString,lnDisconnect,i
DO CASE
CASE tcCase == 'Otkr'
*lcStr = goApp.oInfo.ServerList('SQL')
lcStr = 'Соединение,Проверка,Параметры,Инициализация,БазаДанных,ИмяСервера,Логин,Регистрация'
FOR i = 1 TO GETWORDCOUNT(lcStr,',')
IF !THIS.DoSQLEx(GETWORDNUM(lcStr,i,','))
goSet.hSQL = 0
RETURN .F.
ENDIF
ENDFOR
CASE tcCase == 'Zakr'
lnDisconnect = SQLDISCONNECT(goSet.hSQL)
IF lnDisconnect > 1
THIS.DoSQL_Error('Disconnect',lnDisconnect)
ENDIF
goSet.hSQL = 0
ENDCASE
...
Рейтинг: 0 / 0
Общие принципы построения приложения в FoxPro
    #38160267
tanglir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Нет, ну мне вот всё-таки стало интересно.
sg12, о чём говорил Владимир, и чего я не пойму - ну зачем процедура/метод с кейсом, если внутри кейса разные по смыслу действия производятся? Чем DoSQL('Otkr') и DoSQL('Zakr') лучше OpenConnection()/ExecuteSQL() и CloseConnection()?
Смысл таких изменений какой? Вы уже 15-ю страницу только и делаете, что обвиняете других в троллизме, глупости и пр., но сами так и не удосужились внятно разъяснить преимущества своего подхода, или хотя бы недостатки других подходов.
ЗЫ. На всякий - да, я прочитал всю ветку. Объяснений не было. Правда, посты с закидыванием собеседников какашками я сразу же пропускал, не читая до конца.
ЗЗЫ. А что делает DoSQLEx?
...
Рейтинг: 0 / 0
Общие принципы построения приложения в FoxPro
    #38160269
PaulWist
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sg12PaulWistХорошо, а покажите код который Вы используете для подключения к серверу?

Коды у меня сырые, и вам придется довести их под свои нужды, как договорились.
...

ОК, не вопрос.

sg12...Вот то, что вы просили, вряд ли у вас вызовет затруднения:
* Процедура DoSQL()
LPARAMETERS tcCase
LOCAL lcString,lnDisconnect,i
DO CASE
CASE tcCase == 'Otkr'
*lcStr = goApp.oInfo.ServerList('SQL')
lcStr = 'Соединение,Проверка,Параметры,Инициализация,БазаДанных,ИмяСервера,Логин,Регистрация'
FOR i = 1 TO GETWORDCOUNT(lcStr,',')
IF !THIS.DoSQLEx(GETWORDNUM(lcStr,i,','))
goSet.hSQL = 0
RETURN .F.
ENDIF
ENDFOR
CASE tcCase == 'Zakr'
lnDisconnect = SQLDISCONNECT(goSet.hSQL)
IF lnDisconnect > 1
THIS.DoSQL_Error('Disconnect',lnDisconnect)
ENDIF
goSet.hSQL = 0
ENDCASE

Два вопроса:

1. Что делает THIS.DoSQLEx(GETWORDNUM(lcStr,i,',')), хотелось бы увидеть код этой, как мы договарились, - процедуры.

2. goSet.hSQL - это как я понимаю хендл соединения, goSet - это скорее всего ещё один глобальый обьект (судя по названию) , собственно вопрос - покажите код, как значение hSQL становится отличным от нуля.
...
Рейтинг: 0 / 0
Общие принципы построения приложения в FoxPro
    #38160305
Sergey Sizov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sg12PaulWistХорошо, а покажите код который Вы используете для подключения к серверу?

Коды у меня сырые,Ну вот и отмазы пошли :) и вам придется довести их под свои нужды, как договорились.
Вот то, что вы просили, вряд ли у вас вызовет затруднения:
* Процедура DoSQL()
LPARAMETERS tcCase
LOCAL lcString,lnDisconnect,i
DO CASE
CASE tcCase == 'Otkr'
*lcStr = goApp.oInfo.ServerList('SQL')
lcStr = 'Соединение,Проверка,Параметры,Инициализация,БазаДанных,ИмяСервера,Логин,Регистрация'
FOR i = 1 TO GETWORDCOUNT(lcStr,',')
IF !THIS.DoSQLEx(GETWORDNUM(lcStr,i,','))
goSet.hSQL = 0
RETURN .F.
ENDIF
ENDFOR
CASE tcCase == 'Zakr'
lnDisconnect = SQLDISCONNECT(goSet.hSQL)
IF lnDisconnect > 1
THIS.DoSQL_Error('Disconnect',lnDisconnect)
ENDIF
goSet.hSQL = 0
ENDCASEИ эти люди запрещают нам ковырятьтся в носу (с) :)
Хотите я вам накидаю вот такие процеДУРЫ, авторов которых иногда так хочется долбануть чем-нить тяжелым? Ибо сопровождать их сплошное мучение.
Вы почему решили, что открываете для нас что-то новое?
ООП как раз и придумано в том числе и для избавления от таких портянок.

ps: трюк с плохим и хорошим полицейскими таки сработал :)
...
Рейтинг: 0 / 0
Общие принципы построения приложения в FoxPro
    #38160477
sg12
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PaulWist

Структура DoSQLEx() типовая:
DO CASE
CASE tcCase == 'Соединение'
CASE tcCase == 'Проверка'
* и т.д.
ENDCASE

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

Если у вас какая есть специфика в каком приложении, то вы добавляете еще CASE (т.е. решаете вопрос универсально в _server), но в строку lcStr вставляете нужный вызов в нужном месте уже в приложении.
Если в каком приложении нет необходимости в каких пунктах, то вы их просто убираете из lcStr.
Т.е. конфигурацию и порядок подключения вы создаете теперь уж не в каждом коде в приложении, а индивидуально одними маневрами с lcStr.
Обратите внимание, что подлинная строка lcStr забита звездочкой для простоты изложения.

Аналогична структура DoSQL_Error:
DO CASE
CASE tcCase == 'Connect'
CASE tcCase == 'Disconnect'
CASE tcCase == 'Exec'
ENDCASE

goSet это глобальный объект класса EMPTY, свойства которого заменяют все Public и константы. Создается в самом начале при запуске, о нем я упоминал в начале темы.
После того, как вы его освоите, от него уже не откажетесь, удобная вещь.
Ноу-Хау не мое, я давно еще его откуда-то слизал.

tanglir.
Разница в том, что в своем варианте вы на каждый код геройски бросаетесь каждый раз в каждом приложении как на амбразуру.
Просмотрите темы, в основном выясняется - не там не та буква проставлена и поиск ее приравнивается к подвигу.
Здесь же коды подразделяются, отлаживаются один раз в объектах и из приложений только вызываются. После этого ошибка может возникнуть только при передачи неверных параметров.
Если у вас аллергия на DO CASE, то вы можете разделить процедуры и возиться с вызовами вместо Otkr/Zakr, с постоянными поисками нужных названий и ошибок в синтаксисе.
Если вы в постах ищете только какашки, то это ваша проблема.

Sergey Sizov
Накидайте. Только напомню, что вы один раз накидывали, только не процедуры, а "сусликов".
И не переоценивайте себя - здесь не только "полицейские", на компетентно сформулированные вопросы я отвечаю серьезно.
И если уж сам tanglir начал просматривать тему - это что-то значит.
...
Рейтинг: 0 / 0
Общие принципы построения приложения в FoxPro
    #38160526
tanglir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>Разница в том, что в своем варианте вы на каждый код геройски бросаетесь каждый раз в каждом приложении как на амбразуру.
Нет такой разницы - см. ниже.
>Просмотрите темы, в основном выясняется - не там не та буква проставлена и поиск ее приравнивается к подвигу.
Если "не та буква" проставлена внутри кейса, а не внутри процедуры, это как-то облегчит нахождение места ошибки??
>Если у вас аллергия на DO CASE, то вы можете разделить процедуры и возиться с вызовами вместо Otkr/Zakr, с постоянными поисками нужных названий и ошибок в синтаксисе.
У меня аллергия на пихание в ду кейс всего подряд.
И какая всё-таки разница, что искать - название процедуры или название параметра?
Ну и ошибки синтаксиса опять же могут быть что в отдельной процедуре, что в одном из "кейс"ов...

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
*lcStr = goApp.oInfo.ServerList('SQL')
lcStr = 'Соединение,Проверка,Параметры,Инициализация,БазаДанных,ИмяСервера,Логин,Регистрация'
FOR i = 1 TO GETWORDCOUNT(lcStr,',')
	IF !THIS.DoSQLEx(GETWORDNUM(lcStr,i,','))
		goSet.hSQL = 0
		RETURN .F.
	ENDIF
ENDFOR

Код: sql
1.
2.
3.
4.
5.
6.
Структура DoSQLEx() типовая:
DO CASE
CASE tcCase == 'Соединение'
CASE tcCase == 'Проверка'
* и т.д.
ENDCASE

Вообще не понял. То есть имеется метод goApp.oInfo.ServerList('SQL'), который может возвращать некую строку. Потом в DoSQL эта строка разбивается на "слова", которые скармливаются DoSQLEx-у. Вопрос - вот, например, запустили DoSQL с параметром "открыть", получили строку со словом "соединение", скормили эту строку DoSQLEx-у. Что там в кейсе соответствующем будет? Соединение с сервером? А параметры соединения откуда возьмутся? Из другого свойства/метода объекта goApp? Или всё-таки формат строки lcStr несколько иной?
Как по мне, так проще - чисто для читабельности даже - сделать отдельный метод для соединения, туда и параметры соединения можно сразу прописать (в смысле, как параметры метода), а не подтягивать не пойми что где-то посреди кода, который кому-то, возможно, ещё и в наследство достанется.

>Если вы в постах ищете только какашки, то это ваша проблема.
У меня проблема несколько иного характера - я их не ищу, но, к сожалению, они там есть. И при просмотре темы "находятся" сами собой.
...
Рейтинг: 0 / 0
Общие принципы построения приложения в FoxPro
    #38160533
tanglir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
tanglirИли всё-таки формат строки lcStr несколько иной?Хотя нет, именно такой, количество параметров DoSQLEx не оставляет в этом сомнений.
...
Рейтинг: 0 / 0
Общие принципы построения приложения в FoxPro
    #38160564
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я понял зачем этот огород с кэйсами. Чтоб в строчку последовательность действий написать и циклом вызвать по очереди
Код: sql
1.
lcStr = 'Соединение,Проверка,Параметры,Инициализация,БазаДанных,ИмяСервера,Логин,Регистрация'


Только я так и не понял что такого криминального в последовательности вызовов методов
Код: sql
1.
2.
3.
This.Соединение()
This.Проверка()
...


И как в этой однострочной схеме параметры передавать?
...
Рейтинг: 0 / 0
Общие принципы построения приложения в FoxPro
    #38160570
tanglir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TИ как в этой однострочной схеме параметры передавать?Подозреваю, что так:
tanglirА параметры соединения откуда возьмутся? Из другого свойства/метода объекта goApp?
...
Рейтинг: 0 / 0
Общие принципы построения приложения в FoxPro
    #38160613
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И чего делать когда код мегаметода DoSQLEx() дорастает до 64к и перестанет работать?
...
Рейтинг: 0 / 0
Общие принципы построения приложения в FoxPro
    #38160628
Sergey Sizov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sg12Накидайте. Только напомню, что вы один раз накидывали, только не процедуры, а "сусликов".
И не переоценивайте себя - здесь не только "полицейские", на компетентно сформулированные вопросы я отвечаю серьезно.
И если уж сам tanglir начал просматривать тему - это что-то значит.Самолюбование продолжается :) Аргументов опять 0.
...
Рейтинг: 0 / 0
Общие принципы построения приложения в FoxPro
    #38160658
PaulWist
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sg12PaulWist

Структура DoSQLEx() типовая:
DO CASE
CASE tcCase == 'Соединение'
CASE tcCase == 'Проверка'
* и т.д.
ENDCASE

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

Если у вас какая есть специфика в каком приложении, то вы добавляете еще CASE (т.е. решаете вопрос универсально в _server), но в строку lcStr вставляете нужный вызов в нужном месте уже в приложении.
Если в каком приложении нет необходимости в каких пунктах, то вы их просто убираете из lcStr.
Т.е. конфигурацию и порядок подключения вы создаете теперь уж не в каждом коде в приложении, а индивидуально одними маневрами с lcStr.
Обратите внимание, что подлинная строка lcStr забита звездочкой для простоты изложения.

Аналогична структура DoSQL_Error:
DO CASE
CASE tcCase == 'Connect'
CASE tcCase == 'Disconnect'
CASE tcCase == 'Exec'
ENDCASE

goSet это глобальный объект класса EMPTY, свойства которого заменяют все Public и константы. Создается в самом начале при запуске, о нем я упоминал в начале темы.
После того, как вы его освоите, от него уже не откажетесь, удобная вещь.
Ноу-Хау не мое, я давно еще его откуда-то слизал.

...

Фу блин, наконец-то мы добрались до сути вопроса

Ниже я привел код в ваших терминах, что бы вам не мучаться,....

Заполните переменные server, uid, pwd в методе, блин "процедуре" DoSQLEx класса _Server, нажмите на Кнопку и ПОКАЖИТЕ КАК ПОЛУЧИТЬ алиас SqlResult в приватной сессии данных формы gridcommand ???

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
PUBLIC goSet, goServer, o

goServer = CREATEOBJECT('_server')

goSet = CREATEOBJECT('Empty')
ADDPROPERTY(goSet, 'hSQL', 0)

o = CREATEOBJECT('gridcommand')
o.show(1)

DEFINE CLASS _Server as Custom
PROCEDURE DoSQLEx
LPARAMETERS cStr
LOCAL server, uid, pwd
***************************
** Заполнить реквизиты !!!!
***************************
server = 'MyServer'
uid = 'MyUser'
pwd = 'MyPwd'
DO case
	CASE cStr = 'Connect'
		goSet.hSQL=SQLSTRINGCONNECT("DRIVER=SQL Server;SERVER=" + server + ";UID=" + uid + ";PWD=" + pwd)
		IF goSet.hSQL < 0
		ERROR 'Ошибка подсоединения'
		ENDIF  
	CASE cStr = 'SQLEXEC'
		SQLEXEC(goSet.hSQL, 'select @@version', 'SqlResult')
ENDCASE 
ENDDEFINE

DEFINE 

DEFINE CLASS gridcommand AS form
	Caption = "Form1"
	Name = "Form1"
	datasession = 2


	ADD OBJECT grid1 AS grid WITH ;
		Height = 169, ;
		Left = 12, ;
		Top = 12, ;
		Width = 349, ;
		Name = "Grid1"


	ADD OBJECT command1 AS commandbutton WITH ;
		Top = 192, ;
		Left = 12, ;
		Height = 37, ;
		Width = 349, ;
		Caption = "Жми", ;
		Name = "Command1"

PROCEDURE command1.click
	goServer.DoSQLEx('Connect')
	goServer.DoSQLEx('SQLEXEC')
	IF USED('SqlResult')
		WITH thisform.grid1
			.recordsource = 'SqlResult'
		ENDWITH 
	ELSE 
		MESSAGEBOX('НЕТУ алиаса SqlResult', 0, 'ПОПАДОС :)')
	ENDIF 	
ENDPROC 

ENDDEFINE



И после этого прочтите ещё раз ссылку от Алексея Цингауза.
...
Рейтинг: 0 / 0
Общие принципы построения приложения в FoxPro
    #38160794
sg12
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
tanglir

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

Распутаем lcStr.
В lcStr в приложении вы выставляете только те пункты, которые вам надо выбрать из DoSQL.
К примеру, ведь к серверу можно подсоединиться не только через строку.
Тогда будет так, с отлаженными кодами, они ведь кушать не просят:
CASE tcCase == 'Соединение'
CASE tcCase == 'Соединение2'
CASE tcCase == 'Соединение3'
В них и отрабатываются параметры соединений.
Забегая вперед - они тоже хранятся в приложении, в том же goApp.oInfo, но в другой процедуре ConnectList.
Но сама процедура их обработки находится в 'Соединении' и отлаживается тоже один раз.

Но теперь в приложении у вас уже появится выбор, в зависимости от задачи:
lcStr = 'Соединение'
или, а не "и"
lcStr = 'Соединение2'

Или к примеру с параметрами подсоединения, у вас может несколько наработанных конфигураций:
CASE tcCase == 'Параметры'
CASE tcCase == 'Параметры2'
...
И нужный один из них вы также выбираете в lcStr.

Или, другой пример, в каком-то приложении вам необходимо обойтись без логина - вы просто не вписываете это слово в lcStr.
Хотя в _server у вас уже есть отлаженный код, он в этом конкретном приложении вам не нужен.

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

ДимаТ.
Если код процедуры разрастется, то он разделяется на несколько процедур. На самом деле этот код не так велик.
С параметрами - допишите их, это же "сырой" код, в принципе только структура кода.
Сейчас основное - понять смысл преобразований, поэтому я не загромождаю деталями.

PaulWist
CASE tcCase == 'SQLEXEC' пока перенесите в процедуру _DoSQLExec(), пропавший алиас будем искать там, но сначала надо подключиться к серверу.
goServer.DoSQLEx('Connect') вынесите из формы в свою процедуру запуска приложения до открытия форм - сначала надо подключиться к серверу.
...
Рейтинг: 0 / 0
Общие принципы построения приложения в FoxPro
    #38160844
PaulWist
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sg12PaulWist
CASE tcCase == 'SQLEXEC' пока перенесите в процедуру _DoSQLExec(), пропавший алиас будем искать там, ...

Не вопрос

Только давайте договоримся, код примера я привёл, а Вы теперь модифицируйте его так, что бы результат запроса select @@version попал в приватную сессию данных используя вызов SQLEXEC в методе глобального обьекта (так сказать даш на даш),.... потренируйтесь, и потом расскажите что у вас получится.

sg12... но сначала надо подключиться к серверу.
goServer.DoSQLEx('Connect') вынесите из формы в свою процедуру запуска приложения до открытия форм - сначала надо подключиться к серверу.

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

Вы серьёзно думаете, что от перестановки мест вызова подключения что-то изменится в поведении обьектов?

Прочтите ещё раз ссылку от Алексея Цингауза, подумай и переосмыслите что же делает пример.

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
PUBLIC goSet, goServer, o

goServer = CREATEOBJECT('_server')

goSet = CREATEOBJECT('Empty')
ADDPROPERTY(goSet, 'hSQL', 0)

***************************
** Заполнить реквизиты !!!!
***************************
server = 'MyServer'
uid = 'MyUser'
pwd = 'MyPwd'

goSet.hSQL=SQLSTRINGCONNECT("DRIVER=SQL Server;SERVER=" + server + ";UID=" + uid + ";PWD=" + pwd)
IF goSet.hSQL < 0
	ERROR 'Ошибка подсоединения'
	RETURN 
ENDIF 

o = CREATEOBJECT('gridcommand')
o.show(1)

function _DoSQLExec()
	SQLEXEC(goSet.hSQL, 'select @@version', 'SqlResult')
ENDFUNC 

DEFINE CLASS _Server as Custom
PROCEDURE DoSQLEx
LPARAMETERS cStr
LOCAL server, uid, pwd
DO case
	CASE cStr = 'SQLEXEC'
		_DoSQLExec()
ENDCASE 
ENDDEFINE

DEFINE 

DEFINE CLASS gridcommand AS form
	Caption = "Form1"
	Name = "Form1"
	datasession = 2


	ADD OBJECT grid1 AS grid WITH ;
		Height = 169, ;
		Left = 12, ;
		Top = 12, ;
		Width = 349, ;
		Name = "Grid1"


	ADD OBJECT command1 AS commandbutton WITH ;
		Top = 192, ;
		Left = 12, ;
		Height = 37, ;
		Width = 349, ;
		Caption = "Жми", ;
		Name = "Command1"

PROCEDURE command1.click
	goServer.DoSQLEx('SQLEXEC')
	IF USED('SqlResult')
		WITH thisform.grid1
			.recordsource = 'SqlResult'
		ENDWITH 
	ELSE 
		MESSAGEBOX('НЕТУ алиаса SqlResult', 0, 'ПОПАДОС :)')
	ENDIF 	
ENDPROC 

ENDDEFINE
...
Рейтинг: 0 / 0
Общие принципы построения приложения в FoxPro
    #38161048
sg12
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PaulWist

Что-то вы меня совсем запутали с этим 'НЕТУ алиаса'.
Добавьте в вашу форму эту процедуру _DoSQLExec() и вызовите ее из этой же кнопки.
Алиас появляется?
...
Рейтинг: 0 / 0
Общие принципы построения приложения в FoxPro
    #38161100
RAZ_DVA_TRI
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
...
Рейтинг: 0 / 0
25 сообщений из 424, страница 16 из 17
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Общие принципы построения приложения в FoxPro
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]