:: Visual Foxpro, Foxpro for DOS
как программно сделать приватную датасесию
ZenTigra
Автор

Сообщений: 514
Дата регистрации: 03.12.2004
Как программно сделать приватную датасесию, но не для таблицы, а для курсора SQL запроса

Столкнулся, с проблемкой, использование одного и того же имени курсора в разных SQL запросах.
Есть форма, на ней Grid, В Grid-е отображается курсор SQL запроса, и необходимо из этой формы вызвать новую форму, где также есть Grid, из тем же именем курсора (но совершенно с другими данными)

PS.Надеюсь доходчиво объяснил.
Ratings: 0 negative/0 positive
Re: как программно сделать приватную датасесию
AndyNigmatec

Сообщений: 1573
Откуда: Волгоград
Дата регистрации: 28.06.2015
ZenTigra
... необходимо из этой формы вызвать новую форму ...
- обе формы в приватной датасессии ведите - и не придется "программить" лишнего ...
Не, можете конечно поиграться с CREATEOBJECT('session') - но лишнее мне кажется это



Исправлено 2 раз(а). Последнее : AndyNigmatec, 28.02.17 00:01
Ratings: 0 negative/0 positive
Re: как программно сделать приватную датасесию
LUCIAN

Сообщений: 343
Откуда: Лида Беларусь
Дата регистрации: 25.03.2008
PARAMETER nSumma
curses=SET('DATASESSION')
LOCAL loSession as Session
loSession = CREATEOBJECT("Session")
SET DATASESSION TO (loSession.DataSessionId)
.............
............
release loSession
SET DATASESSION TO curses
RETURN PROP
Ratings: 0 negative/0 positive
Re: как программно сделать приватную датасесию
ssa

Сообщений: 13007
Откуда: Москва
Дата регистрации: 23.03.2005
ZenTigra
Как программно сделать приватную датасесию, но не для таблицы, а для курсора SQL запроса
А с каких пор таблица и курсор для датасессии стали чем-то отличаться? Кстати, чем? И что такое "датасессия для таблицы"?
Цитата:

Столкнулся, с проблемкой, использование одного и того же имени курсора в разных SQL запросах.
Стандартная проблема для тех, кто пользуется только одной датасессией.
Цитата:
Есть форма, на ней Grid, В Grid-е отображается курсор SQL запроса, и необходимо из этой формы вызвать новую форму, где также есть Grid, из тем же именем курсора (но совершенно с другими данными)
Достаточно в вызываемой форме установить приватную датасессию. Собственно, для этого все и было придумано.

------------------
Лень - это неосознанная мудрость.
Ratings: 0 negative/0 positive
Re: как программно сделать приватную датасесию
ZenTigra
Автор

Сообщений: 514
Дата регистрации: 03.12.2004
Проблема в том, что программе уже больше 10 лет, и начиналась она писаться еще на VFP вер.5 (или даже 3), и мозгами которые мыслили FoxPro v.2

Тому открытие таблиц было прописано в отдельной процедуре, еще ставилась задача, открытия разных таблиц (типа Склад №1, Склад №2 и т.п.) одной и той же формой (для редактирования).

Все оно нормально работает, тому переписывать его уже нет смысла, но вот неправильность такой стратегии временами начинает вылезать боком, вот и спрашиваю у вас как сделать подпорки...
Ratings: 0 negative/0 positive
Re: как программно сделать приватную датасесию
matod

Сообщений: 3062
Откуда: Иркутск
Дата регистрации: 31.10.2001
Это ничего не меняет: сделать для второй формы приватную сессию, настроить ее, открыть нужные таблицы - и собственно все. Остальная программа будет работать как ни в чем не бывало. Форма сама по себе. Даже если нужно открыть таблицы, установить указатели - это ведь не так много кода, если речь идет конкретно об одной форме.

Да и если не об одной - можно спрятать формирование нужной среды данных в функцию/класс/DE по желанию и подключать это к формам, которые требуют приватной сессии, оставляя все остальное "как было".
Ratings: 0 negative/0 positive
Re: как программно сделать приватную датасесию
Igor Korolyov

Сообщений: 34580
Дата регистрации: 28.05.2002
Если из формы с приватной DS вызвать какую-то старорежимную процедуру (не метод объекта, именно простую плоскую процедуру/функцию) то эта процедура будет работать именно в DS вызвавшей её формы.
Дёргать SET DATASESSION нужно лишь если методам классов потребуется работать в чужих DS, т.к. по умолчанию каждый объект "цепляется" за ту DS в которой он создан, и его методы работают именно с курсорами открытыми в этой DS (ну и с её SET настройками, конечно же).


------------------
WBR, Igor
Ratings: 0 negative/0 positive
Re: как программно сделать приватную датасесию
of63

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

Сообщений: 3408
Откуда: Куда:
Дата регистрации: 25.04.2003
Igor Korolyov
Если из формы с приватной DS вызвать какую-то старорежимную процедуру
а про лоад формы нада было упомянуть или нет?
под рукой фокса нет, так бы и сам проверил


------------------
Мойте ноги, моя ноги вы моете и руки
Ratings: 0 negative/0 positive
Re: как программно сделать приватную датасесию
lulgu

Сообщений: 1838
Дата регистрации: 30.11.2016
of63
(мб. проще найти место в форме, где что-то там "открыватется", кстате, повеселее в проекте можно присутствовать

А что его долго искать, это место - создается класс CUSTOM, где и прописываются обертки с открывалками и создавалками, и который подключается к классу формы.
Дело в другом - в кайфе от рассуждений типа: "Как открыть, как создать, как вызвать".
Не слишком ли это много - полтора десятка лет открывать форму.
А вопросы типа про LOAD после появления DE стали традиционными - чем-то вроде «Hello, world!».
Ratings: 0 negative/0 positive
Re: как программно сделать приватную датасесию
Igor Korolyov

Сообщений: 34580
Дата регистрации: 28.05.2002
Foxtrot
а про лоад формы нада было упомянуть или нет?
Зачем? В каком контексте?
Load, как и любой другой метод формы, работает в той DS в которой работает и сама форма.

lulgu
А что его долго искать, это место - создается класс CUSTOM, где и прописываются обертки с открывалками и создавалками, и который подключается к классу формы.
Там есть свои нюансы. В частности всё сильно зависит от того как именно "подключается к классу формы".
Широко распространённый шаблон "создал объект, раздаю всем желающим ссылки на него для использования" a-la goApp, в данном случае не подходит. Нужно создавать такой объект в коде формы, либо же (теоретически, для объекта-"открывателя курсоров" это не подходит) "бросать" его в визуальном редакторе на форму (по сути тоже "создавать каждый раз в форме"). Альтернатива - передавать в методы "чужого" объекта ID датасессии и там уже внутри кода "вручную" переключать DS туда-сюда.

При том в полный рост встанет вопрос использования этого объекта - т.к. по хорошему все процессы "открытия курсоров" должны завершиться ДО срабатывания Init формы и Init вложенных в неё объектов. Ну да, в 9-ке есть послабление при помощи BindControls, но оно ОЧЕНЬ уж условное, и помогает лишь от одной из множества проблем (от того что в Init каких-то контролов будет код использующий курсор это не спасёт)...
По сути только в Load формы и можно создавать такой объект. Ну или как следует по****ся с DE (оно инициализируется ещё раньше) - чего лично я никому не советую.


------------------
WBR, Igor
Ratings: 0 negative/0 positive
Re: как программно сделать приватную датасесию
lulgu

Сообщений: 1838
Дата регистрации: 30.11.2016
Igor Korolyov
Если вопрос подключения решен еще в классе формы, то в форме этот объект уже подключен, уже является его частью, и его не надо никуда "бросать".
Если же кто-то имеет какие-то нюансы с DE или LOAD, то ничто не мешает ему заниматься этими нюансами - причем здесь этот объект.
Ratings: 0 negative/0 positive
Re: как программно сделать приватную датасесию
AndyNigmatec

Сообщений: 1573
Откуда: Волгоград
Дата регистрации: 28.06.2015
lulgu
Если вопрос подключения решен еще в классе формы, то в форме этот объект уже подключен, уже является его частью, и его не надо никуда "бросать".
Если же кто-то имеет какие-то нюансы с DE или LOAD, то ничто не мешает ему заниматься этими нюансами - причем здесь этот объект.

нюансы могут быть именно с DE, с лоад как раз-таки все прозрачно и явно
Ratings: 0 negative/0 positive
Re: как программно сделать приватную датасесию
lulgu

Сообщений: 1838
Дата регистрации: 30.11.2016
AndyNigmatec
lulgu
Если вопрос подключения решен еще в классе формы, то в форме этот объект уже подключен, уже является его частью, и его не надо никуда "бросать".
Если же кто-то имеет какие-то нюансы с DE или LOAD, то ничто не мешает ему заниматься этими нюансами - причем здесь этот объект.

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

Вот и троллик прилетел.
У вас что-за нюансы - DE ведь по сути комплект оберток по работе с таблицами и курсорами.
Ratings: 0 negative/0 positive
Re: как программно сделать приватную датасесию
AndyNigmatec

Сообщений: 1573
Откуда: Волгоград
Дата регистрации: 28.06.2015
ну спасибо за "троллика"

Вот из-за этого "комплекта оберток" многие ваще не понимают что и откуда открывают ... я лично предпочитаю явно все делать
Ratings: 0 negative/0 positive
Re: как программно сделать приватную датасесию
Igor Korolyov

Сообщений: 34580
Дата регистрации: 28.05.2002
lulgu
Если вопрос подключения решен еще в классе формы, то в форме этот объект уже подключен, уже является его частью, и его не надо никуда "бросать".
Ещё раз - всё зависит от того как именно такой класс "подключен".

DEFINE CLASS MyBaseForm as Form
oOpener = .f.
cContext = "some_key"
proc Load
This.oOpener = goApp.oOpener
This.oOpener.OpenNeededTables(This.cContext)
endproc
enddefine

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

А по DE - там перемешан ко всем чертям порядок срабатывания событий - не понимая что за чем идёт и что от чего зависит никак не написать нормальный код. Кроме того все эти "автооткрытия" и "автозакрытия" - малоконтролируемый процесс. В общем я не советую никому использовать DE - лучше уж свою обёртку, хотя при наличии CAD и смысла то в какой-то особой обёртке нет - просто сами CAD-ы к форме цепляй (создавая новые экземпляры, конечно, не один и тот же экземпляр по всем формам гонять) и всё.


------------------
WBR, Igor
Ratings: 0 negative/0 positive
Re: как программно сделать приватную датасесию
lulgu

Сообщений: 1838
Дата регистрации: 30.11.2016
Igor Korolyov
Откуда только вы все это берете. Какой-то goApp.oOpener откуда-то нашли, да еще так мудрено его закрутили.

Обычный CUSTOM ставится на форму как и любой другой объект (как кнопка, к примеру - или ее тоже через goApp на форму ставите) еще на стадии проектирования класса формы:
Меню-View-Form Controls Toolbar-View Classes-Add-CustomObj.vcx.
И, опять же - если у кого-то с DE проблемы, то какое отношение к этому имеет этот объект, и причем здесь я.
Ratings: 0 negative/0 positive
Re: как программно сделать приватную датасесию
Igor Korolyov

Сообщений: 34580
Дата регистрации: 28.05.2002
Если сделать такой объект частью класса формы (т.е. "бросить на форму") то неизбежно возникнет вторая проблема описанная мной
Igor Korolyov
При том в полный рост встанет вопрос использования этого объекта - т.к. по хорошему все процессы "открытия курсоров" должны завершиться ДО срабатывания Init формы и Init вложенных в неё объектов.
Управлять тем в какой момент отработает Init этого "открывателя" можно лишь весьма опосредованно, соответственно попытки обращения к полям курсоров из Init других объектов (или из их ControlSource), и уж тем более попытка обратится к курсору из Load формы приведёт к ошибке.
Надеюсь пример кода не требуется чтобы понять этот простой факт

Тогда как создание объекта через Createobject из кода Load формы (ну и сохранение ссылки на него в каком-то свойстве формы) практически решает эту проблему - единственное что потребуется помнить, это вызывать через DODEFAULT() данную логику в Load форм/классов-наследников ДО того как будем обращаться к курсорам.

P.S. goApp - типичный для фокса шаблон. "Объект приложения" где содержатся всякие "общие" методы/свойства ну и подобъекты реализующие "типичные задачи". Например хранение настроек приложения, авторизация, логгирование и т.д.


------------------
WBR, Igor
Ratings: 0 negative/0 positive
Re: как программно сделать приватную датасесию
lulgu

Сообщений: 1838
Дата регистрации: 30.11.2016
Этот объект в форме является его частью и находящиеся в нем функции становятся доступными только после запуска формы,т.е. после LOAD.
Причем они уже работают в сессии формы и ничего никуда не надо переназначать. INIT у этого объекта пустой, как у большинства объектов на форме.

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

Если вам нужны эти функции в LOAD какой-либо формы, то вы действительно там пишете loObj = CREATEOBJECT(этот класс), но эти локальные loObj самоуничтожается по завершению LOAD, и не нуждаются в сохранении или переназначении, т.к. эти обертки в формах уже есть.
В DE необходимости в этом объекте нет, но при нужде может и там создаваться.

Также этот класс может быть подключен (но не обязательно) к классу для работы с SQL-server (например, для тестового прогона при загрузке goApp) из-за нюансов с функцией SQLEXEC().
Эти обертки также могут находиться (опять же, совсем не обязательно) в .prg в виде класса, и вызываться откуда угодно.
Как видите, в решениях недостатка нет, ни одно решение не отменяет другие, и нет никакой необходимости в ваших трюках с переназначениями - VFP не JavaScript.

P.S. Вашу ошибку с goApp я вам уже указывал, когда простым циклом заменил довольно обширный ломовой код при загрузке.
goApp - это просто загрузчик, и нет никакой необходимости вешать на него что-либо, как обычно принято.
Для меняющихся от приложения к приложению параметров создается сооответствующий класс.
Ratings: 0 negative/0 positive
Re: как программно сделать приватную датасесию
Igor Korolyov

Сообщений: 34580
Дата регистрации: 28.05.2002
Не вижу практического смысла в классе-загрузчике данных работать с которым можно лишь ПОСЛЕ отработки всех Init в форме.
Загрузка данных (как минимум "пустых" курсоров, которые потом будут REQUERY-тся с нужными параметрами) должна происходить вовремя - на стадии Load формы, а никак не где-то там опосля "Позднее" открытие курсоров вынудит отказаться от прямой привязки элементов управления к полям курсоров (просто в дизайнере форм/классов прописанные ControlSource), и от вполне логичного кода инициализации объектов в их Init - придётся городить слишком много лишнего...

Создавать "сугубо локальный" экземпляр в Load я тоже не вижу смысла. В чём преимущество то? Сделал этот экземпляр в Load - ну и запомни ссылку на него в свойство формы - зачем же убивать то его?
Тем более что если этот класс тем или иным образом включает в себя объекты курсорадаптеров, то уничтожать его никак нельзя - закроются все управляемые им курсоры.

Про DE я ещё раз скажу - я его не использую и другим не советую - так что вопросов как же туда чего "засунуть" у меня, естественно, возникать никак не может

Не понимаю про какие ещё "трюки с переназначениями" идёт речь.

По goApp нет вопросов - да, в нём не нужны 100500 методов и свойств - он лишь "точка входа". Все "подключаемые плюшки" будут доступны через него как свойства-подобъекты (goApp.oParameters к примеру - т.к. это "жизненно важный" сервис), ну или как метод возвращающий ссылку на объект по "имени" сервиса для "необязательных" модулей. Т.е. в "использующем" коде будет нечто типа
loMailInterop=goApp.GetService("MailInterop")
IF !ISNULL(m.loMailInterop)
* Пользуемся услугами класса работы с e-mail.
* Пока мы не запросим хоть раз этот сервис,
* он не будет инициализироваться и чего-то там делать.
ENDIF
Т.е. принцип разделения ответственности нарушен не будет, и сам класс App останется достаточно лёгким.


------------------
WBR, Igor
Ratings: 0 negative/0 positive


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

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

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