ХП в Condition behavior
Модератор: Andrew™
Правила форума
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion и MAV который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion и MAV который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
-
- Бывалый
- Сообщения: 70
- Зарегистрирован: 07 Июль 2005, 5:39
- Откуда: Хабаровск
- Контактная информация:
ХП в Condition behavior
Я так понимаю это сделано для того чтобы в бровзе показывать результат выполнения ХП, или нет ?
хочется пояснений как с этим правельно работать
хочется пояснений как с этим правельно работать
Re: ХП в Condition behavior
именно для этого, но надо придерживаться определённых правил.Денис писал(а):Я так понимаю это сделано для того чтобы в бровзе показывать результат выполнения ХП, или нет ?
хочется пояснений как с этим правельно работать
декларируешь с помощью EXTENSION шаблона Storage procedure
накручиваешь её логикой как тебе надо
ХП должна в конце концов возвращать SELECT ...
количество и качество колонок в SELECTе должно совпадать с количеством и качеством пробинденных колонок в Browse
т е это последовательньсть .AddCol в .Init методе.
но можно и переопределить количество/последовательность колонок, для этого в Condition Behaviour при выборе в качестве загрузки Browse ХП можно создать список колонок для приёма.
кнопку FORMULA я не стал поддерживать т к есть много ограничений в её функционале.OVV писал(а):Андрей!
А как из ХП в брауз получить вычисляемое поле? (т.е. физически отсутствующее в таблице)
всё делается штатно, закрепляем за колонкой локальную переменную
в методе .FillQueue до вызова PARENT'а её инициализируем
только надо понимать следующее, если мы её инициализируем по условиям закгрузки записи, то обращаться к полям загруженной - текущей записи надо не через FILE:FIELD, а через SELF.Rec.Field, т к Browse грузит в свой буфер - прямо в List Queue
Я, наверное, плохо объяснил свою проблему.
Вычисляемое поле у меня возвращает ХП. Я поместил в Hot Fields локальную переменную и ожидал примерно следующего:
Можно, конечно, в методе .FillQueue для каждой записи вызвать ХП и заполнить это поле, но как-то это криво по моему...
Пока сделал так: Завел в таблице дополнительное поле и в браузе использую его, а гружу брауз из ХП. Но это тоже как-то криво.
Есть ли правильный путь?
Вычисляемое поле у меня возвращает ХП. Я поместил в Hot Fields локальную переменную и ожидал примерно следующего:
Но, увы... Теперь, кажется, понял разницу между SELF.AddCol и SELF.AddFieldХП должна в конце концов возвращать SELECT ...
количество и качество колонок в SELECTе должно совпадать с количеством и качеством пробинденных колонок в Browse
т е это последовательньсть .AddCol в .Init методе.
Можно, конечно, в методе .FillQueue для каждой записи вызвать ХП и заполнить это поле, но как-то это криво по моему...
Пока сделал так: Завел в таблице дополнительное поле и в браузе использую его, а гружу брауз из ХП. Но это тоже как-то криво.
Есть ли правильный путь?
ну ты сам процитировал, количество и качество колонок должно совпадать с приёмным SELECT'ом, раз у тебя есть вычисляемое поле и работа через ХП, что означает нам по барабану какой мог бы получиться SELECT запрос без ХП, вставляем в колонку любое поле любого другого файла (ОбразецТипаКолонки) - и оно будет получать данные из ХП для соответсвующей колонки.OVV писал(а):Я, наверное, плохо объяснил свою проблему.
Вычисляемое поле у меня возвращает ХП. Я поместил в Hot Fields локальную переменную и ожидал примерно следующего:Но, увы... Теперь, кажется, понял разницу между SELF.AddCol и SELF.AddFieldХП должна в конце концов возвращать SELECT ...
количество и качество колонок в SELECTе должно совпадать с количеством и качеством пробинденных колонок в Browse
т е это последовательньсть .AddCol в .Init методе.
Можно, конечно, в методе .FillQueue для каждой записи вызвать ХП и заполнить это поле, но как-то это криво по моему...
Пока сделал так: Завел в таблице дополнительное поле и в браузе использую его, а гружу брауз из ХП. Но это тоже как-то криво.
Есть ли правильный путь?
Хм... Но это
Уже через месяц я сам буду долго вспоминать при чем же тут поле "любого другого файла", а если еще кому-то придется разбираться....
Хотелось бы все-таки, чтоб через локальную переменную в Hot Fields.
как-то еще более криво, чем то, что я придумал с дополнительным полем..вставляем в колонку любое поле любого другого файла (ОбразецТипаКолонки) - и оно будет получать данные из ХП для соответсвующей колонки.
Уже через месяц я сам буду долго вспоминать при чем же тут поле "любого другого файла", а если еще кому-то придется разбираться....
Хотелось бы все-таки, чтоб через локальную переменную в Hot Fields.
надо понимать следующее:OVV писал(а):Хм... Но этокак-то еще более криво, чем то, что я придумал с дополнительным полем..вставляем в колонку любое поле любого другого файла (ОбразецТипаКолонки) - и оно будет получать данные из ХП для соответсвующей колонки.
Уже через месяц я сам буду долго вспоминать при чем же тут поле "любого другого файла", а если еще кому-то придется разбираться....
Хотелось бы все-таки, чтоб через локальную переменную в Hot Fields.
есть таблицы - структуры на серваке, при первом обращении к которым происходит проверка соответсивя описания в DCT и в БД, повторно эти проверки уже не происходят. Так вот штатно Browse строится по структурам из БД(DCT), биндование колонок происходит по образцам - оригиналам - полям соответсвующих файлов
ХП же как таковая не продекларирована как структура в DCT, т е по хорошему Browse на неё не натравить, То что реализовано в библиотеке - это ухищрение, подружить ХП с Browse, НО Brows'у нужны колонки для приёма, а он их биндит по полям из DCT, вот такая петрушка, Brows'у нужны для биндования ОРИГИНАЛЫ (типы колонок), читает же всё равно в свой буфер.
Ничего не мешает. Более того: именно там и вычисляется!Денис писал(а):Вот что я подумал: Если Browse заполняется из результата ХП то что мешает вычислять значение поля прямо в этой ХП в селекте ?
А я вот что подумал: А почему бы в DCT не объявлять структуру для приема результатов ХП? Только при первом обращении не проверять ее на соответствие таблице на сервере. Или в структуре MAVFILE объявлять поля, которые не проверять на наличие в БД.
я ж писал что для биндования колонок нужен ОБРАЗЕЦ для биндования, который берётся как поле из любого файла, этот образец (SQLDESCRIBE) инициализируется автоматически при первом обращении к полю файла и всего один раз в одном соединенииOVV писал(а):Ничего не мешает. Более того: именно там и вычисляется!Денис писал(а):Вот что я подумал: Если Browse заполняется из результата ХП то что мешает вычислять значение поля прямо в этой ХП в селекте ?
А я вот что подумал: А почему бы в DCT не объявлять структуру для приема результатов ХП? Только при первом обращении не проверять ее на соответствие таблице на сервере. Или в структуре MAVFILE объявлять поля, которые не проверять на наличие в БД.
ну в DCT STRING, в БД LONG, на самом деле ничего тут страшного нет, но нам надо знать что же в БД, а по твоей логике мы этого не знаем
Ну, наверное, я плохо представляю себе физику процесса...Andrew Myalin писал(а):я ж писал что для биндования колонок нужен ОБРАЗЕЦ для биндования, который берётся как поле из любого файла, этот образец (SQLDESCRIBE) инициализируется автоматически при первом обращении к полю файла и всего один раз в одном соединенииOVV писал(а):
А я вот что подумал: А почему бы в DCT не объявлять структуру для приема результатов ХП? Только при первом обращении не проверять ее на соответствие таблице на сервере. Или в структуре MAVFILE объявлять поля, которые не проверять на наличие в БД.
Мы знаем, что в БД: Там нет вообще такого поля.ну в DCT STRING, в БД LONG, на самом деле ничего тут страшного нет, но нам надо знать что же в БД, а по твоей логике мы этого не знаем
есть правило, чтобы пробиндить колонку, нужЁн образец для биндования - какие параметры подставлять в SQLbindCol, там их немеренно(зависимы от структуры приёма в БД) , отдавать это наружу не вижу смысла, теряется контроль, а так я сам инициализирую этот образец после поверки соответсвия структуры в DCT и в БДOVV писал(а):Ну, наверное, я плохо представляю себе физику процесса...Andrew Myalin писал(а):я ж писал что для биндования колонок нужен ОБРАЗЕЦ для биндования, который берётся как поле из любого файла, этот образец (SQLDESCRIBE) инициализируется автоматически при первом обращении к полю файла и всего один раз в одном соединенииOVV писал(а):
А я вот что подумал: А почему бы в DCT не объявлять структуру для приема результатов ХП? Только при первом обращении не проверять ее на соответствие таблице на сервере. Или в структуре MAVFILE объявлять поля, которые не проверять на наличие в БД.Мы знаем, что в БД: Там нет вообще такого поля.ну в DCT STRING, в БД LONG, на самом деле ничего тут страшного нет, но нам надо знать что же в БД, а по твоей логике мы этого не знаем
Мне надо, чтоб вычисляемое поле попадало в брауз. Если я загружу результат в свою очередь (что без проблем), то и брауз мне придется рисовать самому. А зачем? Есть же шаблон.Денис писал(а):А зачем городить такое ? Андрей же расписал как можно из результата ХП заполнить свою очередь. Дальше делаем с ней что хотим.
Вычисляемое поле можно передать в брауз немного исхитрившись. Что я и делаю. Хотелось бы, так сказать, более эстетично , но Андрей сказал, что не прокатит. Жаль, но ему виднее...