как программно сделать приватную датасесию | |
---|---|
ZenTigra Автор Сообщений: 514 Дата регистрации: 03.12.2004 |
Как программно сделать приватную датасесию, но не для таблицы, а для курсора SQL запроса
Столкнулся, с проблемкой, использование одного и того же имени курсора в разных SQL запросах. Есть форма, на ней Grid, В Grid-е отображается курсор SQL запроса, и необходимо из этой формы вызвать новую форму, где также есть Grid, из тем же именем курсора (но совершенно с другими данными) PS.Надеюсь доходчиво объяснил. |
Re: как программно сделать приватную датасесию | |
---|---|
AndyNigmatec Сообщений: 1573 Откуда: Волгоград Дата регистрации: 28.06.2015 |
- обе формы в приватной датасессии ведите - и не придется "программить" лишнего ... Не, можете конечно поиграться с CREATEOBJECT('session') - но лишнее мне кажется это Исправлено 2 раз(а). Последнее : AndyNigmatec, 28.02.17 00:01 |
Re: как программно сделать приватную датасесию | |
---|---|
LUCIAN Сообщений: 343 Откуда: Лида Беларусь Дата регистрации: 25.03.2008 |
|
Re: как программно сделать приватную датасесию | |
---|---|
ssa Сообщений: 13007 Откуда: Москва Дата регистрации: 23.03.2005 |
А с каких пор таблица и курсор для датасессии стали чем-то отличаться? Кстати, чем? И что такое "датасессия для таблицы"? Цитата:Стандартная проблема для тех, кто пользуется только одной датасессией. Цитата:Достаточно в вызываемой форме установить приватную датасессию. Собственно, для этого все и было придумано. ------------------ Лень - это неосознанная мудрость. |
Re: как программно сделать приватную датасесию | |
---|---|
ZenTigra Автор Сообщений: 514 Дата регистрации: 03.12.2004 |
Проблема в том, что программе уже больше 10 лет, и начиналась она писаться еще на VFP вер.5 (или даже 3), и мозгами которые мыслили FoxPro v.2
Тому открытие таблиц было прописано в отдельной процедуре, еще ставилась задача, открытия разных таблиц (типа Склад №1, Склад №2 и т.п.) одной и той же формой (для редактирования). Все оно нормально работает, тому переписывать его уже нет смысла, но вот неправильность такой стратегии временами начинает вылезать боком, вот и спрашиваю у вас как сделать подпорки... |
Re: как программно сделать приватную датасесию | |
---|---|
matod Сообщений: 3062 Откуда: Иркутск Дата регистрации: 31.10.2001 |
Это ничего не меняет: сделать для второй формы приватную сессию, настроить ее, открыть нужные таблицы - и собственно все. Остальная программа будет работать как ни в чем не бывало. Форма сама по себе. Даже если нужно открыть таблицы, установить указатели - это ведь не так много кода, если речь идет конкретно об одной форме.
Да и если не об одной - можно спрятать формирование нужной среды данных в функцию/класс/DE по желанию и подключать это к формам, которые требуют приватной сессии, оставляя все остальное "как было". |
Re: как программно сделать приватную датасесию | |
---|---|
Igor Korolyov Сообщений: 34580 Дата регистрации: 28.05.2002 |
Если из формы с приватной DS вызвать какую-то старорежимную процедуру (не метод объекта, именно простую плоскую процедуру/функцию) то эта процедура будет работать именно в DS вызвавшей её формы.
Дёргать SET DATASESSION нужно лишь если методам классов потребуется работать в чужих DS, т.к. по умолчанию каждый объект "цепляется" за ту DS в которой он создан, и его методы работают именно с курсорами открытыми в этой DS (ну и с её SET настройками, конечно же). ------------------ WBR, Igor |
Re: как программно сделать приватную датасесию | |
---|---|
of63 Сообщений: 25244 Откуда: Н.Новгород Дата регистрации: 13.02.2008 |
(мб. проще найти место в форме, где что-то там "открыватется", кстате, повеселее в проекте можно присутствовать
|
Re: как программно сделать приватную датасесию | |
---|---|
Foxtrot Сообщений: 3408 Откуда: Куда: Дата регистрации: 25.04.2003 |
а про лоад формы нада было упомянуть или нет? под рукой фокса нет, так бы и сам проверил ------------------ Мойте ноги, моя ноги вы моете и руки |
Re: как программно сделать приватную датасесию | |
---|---|
lulgu Сообщений: 1838 Дата регистрации: 30.11.2016 |
А что его долго искать, это место - создается класс CUSTOM, где и прописываются обертки с открывалками и создавалками, и который подключается к классу формы. Дело в другом - в кайфе от рассуждений типа: "Как открыть, как создать, как вызвать". Не слишком ли это много - полтора десятка лет открывать форму. А вопросы типа про LOAD после появления DE стали традиционными - чем-то вроде «Hello, world!». |
Re: как программно сделать приватную датасесию | |
---|---|
Igor Korolyov Сообщений: 34580 Дата регистрации: 28.05.2002 |
Зачем? В каком контексте? Load, как и любой другой метод формы, работает в той DS в которой работает и сама форма. Там есть свои нюансы. В частности всё сильно зависит от того как именно "подключается к классу формы". Широко распространённый шаблон "создал объект, раздаю всем желающим ссылки на него для использования" a-la goApp, в данном случае не подходит. Нужно создавать такой объект в коде формы, либо же (теоретически, для объекта-"открывателя курсоров" это не подходит) "бросать" его в визуальном редакторе на форму (по сути тоже "создавать каждый раз в форме"). Альтернатива - передавать в методы "чужого" объекта ID датасессии и там уже внутри кода "вручную" переключать DS туда-сюда. При том в полный рост встанет вопрос использования этого объекта - т.к. по хорошему все процессы "открытия курсоров" должны завершиться ДО срабатывания Init формы и Init вложенных в неё объектов. Ну да, в 9-ке есть послабление при помощи BindControls, но оно ОЧЕНЬ уж условное, и помогает лишь от одной из множества проблем (от того что в Init каких-то контролов будет код использующий курсор это не спасёт)... По сути только в Load формы и можно создавать такой объект. Ну или как следует по****ся с DE (оно инициализируется ещё раньше) - чего лично я никому не советую. ------------------ WBR, Igor |
Re: как программно сделать приватную датасесию | |
---|---|
lulgu Сообщений: 1838 Дата регистрации: 30.11.2016 |
Igor Korolyov
Если вопрос подключения решен еще в классе формы, то в форме этот объект уже подключен, уже является его частью, и его не надо никуда "бросать". Если же кто-то имеет какие-то нюансы с DE или LOAD, то ничто не мешает ему заниматься этими нюансами - причем здесь этот объект. |
Re: как программно сделать приватную датасесию | |
---|---|
AndyNigmatec Сообщений: 1573 Откуда: Волгоград Дата регистрации: 28.06.2015 |
нюансы могут быть именно с DE, с лоад как раз-таки все прозрачно и явно |
Re: как программно сделать приватную датасесию | |
---|---|
lulgu Сообщений: 1838 Дата регистрации: 30.11.2016 |
Вот и троллик прилетел. У вас что-за нюансы - DE ведь по сути комплект оберток по работе с таблицами и курсорами. |
Re: как программно сделать приватную датасесию | |
---|---|
AndyNigmatec Сообщений: 1573 Откуда: Волгоград Дата регистрации: 28.06.2015 |
ну спасибо за "троллика"
Вот из-за этого "комплекта оберток" многие ваще не понимают что и откуда открывают ... я лично предпочитаю явно все делать |
Re: как программно сделать приватную датасесию | |
---|---|
Igor Korolyov Сообщений: 34580 Дата регистрации: 28.05.2002 |
Ещё раз - всё зависит от того как именно такой класс "подключен".
Типа благая идея - только 1 экземпляр класса-открывателя держать, не плодя для каждой формы "свой", а ничего работать не будет как задумывалось... А по DE - там перемешан ко всем чертям порядок срабатывания событий - не понимая что за чем идёт и что от чего зависит никак не написать нормальный код. Кроме того все эти "автооткрытия" и "автозакрытия" - малоконтролируемый процесс. В общем я не советую никому использовать DE - лучше уж свою обёртку, хотя при наличии CAD и смысла то в какой-то особой обёртке нет - просто сами CAD-ы к форме цепляй (создавая новые экземпляры, конечно, не один и тот же экземпляр по всем формам гонять) и всё. ------------------ WBR, Igor |
Re: как программно сделать приватную датасесию | |
---|---|
lulgu Сообщений: 1838 Дата регистрации: 30.11.2016 |
Igor Korolyov
Откуда только вы все это берете. Какой-то goApp.oOpener откуда-то нашли, да еще так мудрено его закрутили. Обычный CUSTOM ставится на форму как и любой другой объект (как кнопка, к примеру - или ее тоже через goApp на форму ставите) еще на стадии проектирования класса формы: Меню-View-Form Controls Toolbar-View Classes-Add-CustomObj.vcx. И, опять же - если у кого-то с DE проблемы, то какое отношение к этому имеет этот объект, и причем здесь я. |
Re: как программно сделать приватную датасесию | |
---|---|
Igor Korolyov Сообщений: 34580 Дата регистрации: 28.05.2002 |
Если сделать такой объект частью класса формы (т.е. "бросить на форму") то неизбежно возникнет вторая проблема описанная мной
Управлять тем в какой момент отработает Init этого "открывателя" можно лишь весьма опосредованно, соответственно попытки обращения к полям курсоров из Init других объектов (или из их ControlSource), и уж тем более попытка обратится к курсору из Load формы приведёт к ошибке. Надеюсь пример кода не требуется чтобы понять этот простой факт Тогда как создание объекта через Createobject из кода Load формы (ну и сохранение ссылки на него в каком-то свойстве формы) практически решает эту проблему - единственное что потребуется помнить, это вызывать через DODEFAULT() данную логику в Load форм/классов-наследников ДО того как будем обращаться к курсорам. P.S. goApp - типичный для фокса шаблон. "Объект приложения" где содержатся всякие "общие" методы/свойства ну и подобъекты реализующие "типичные задачи". Например хранение настроек приложения, авторизация, логгирование и т.д. ------------------ WBR, Igor |
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 - это просто загрузчик, и нет никакой необходимости вешать на него что-либо, как обычно принято. Для меняющихся от приложения к приложению параметров создается сооответствующий класс. |
Re: как программно сделать приватную датасесию | |
---|---|
Igor Korolyov Сообщений: 34580 Дата регистрации: 28.05.2002 |
Не вижу практического смысла в классе-загрузчике данных работать с которым можно лишь ПОСЛЕ отработки всех Init в форме.
Загрузка данных (как минимум "пустых" курсоров, которые потом будут REQUERY-тся с нужными параметрами) должна происходить вовремя - на стадии Load формы, а никак не где-то там опосля "Позднее" открытие курсоров вынудит отказаться от прямой привязки элементов управления к полям курсоров (просто в дизайнере форм/классов прописанные ControlSource), и от вполне логичного кода инициализации объектов в их Init - придётся городить слишком много лишнего... Создавать "сугубо локальный" экземпляр в Load я тоже не вижу смысла. В чём преимущество то? Сделал этот экземпляр в Load - ну и запомни ссылку на него в свойство формы - зачем же убивать то его? Тем более что если этот класс тем или иным образом включает в себя объекты курсорадаптеров, то уничтожать его никак нельзя - закроются все управляемые им курсоры. Про DE я ещё раз скажу - я его не использую и другим не советую - так что вопросов как же туда чего "засунуть" у меня, естественно, возникать никак не может Не понимаю про какие ещё "трюки с переназначениями" идёт речь. По goApp нет вопросов - да, в нём не нужны 100500 методов и свойств - он лишь "точка входа". Все "подключаемые плюшки" будут доступны через него как свойства-подобъекты (goApp.oParameters к примеру - т.к. это "жизненно важный" сервис), ну или как метод возвращающий ссылку на объект по "имени" сервиса для "необязательных" модулей. Т.е. в "использующем" коде будет нечто типа
------------------ WBR, Igor |
© 2000-2024 Fox Club  |