|
Как происходит связывание информации в двух DW через retrieval argument?
|
|||
---|---|---|---|
#18+
Здравствуйте! Заранее извиняюсь за базовые вопросы и некоторый сумбур. Я - полный новичок, читаю и разбираюсь в учебной БД по книге Getting Started, поставляемой с PowerBuilder 10.5. Там строится стандартная система из обычного окна, на котором расположены два DW, чьи DW-объекты получают данные из одной таблицы. Первый DW-объект имеет табличное представление, второй - Freeform, так что при навигации по первому DW во втором должны сменяться данные, отображая их более детально. И они сменяются! Хотя я никак не пойму, как это удалось сделать... В SQL, который поставляет данные для второго, детального DW, определен retrieval argument (по ключевому полю таблицы). Но я не пойму, где я успел установить связь этого аргумента с перемещением по первому DW. Скажем, в Lazarus надо было бы написать скрипт для события перемещения по первому окну, где отслеживалось бы значение ключевого поля, потом оно присваивалось бы retrieval argument и подавалась команда на обновление второго окна. Здесь я только прочитал фразу: "When you put this DataWindow object into the tutorial application, you write a script that passes the required argument to the DataWindow automatically". (Вначале понял как "Когда вы помещаете этот DW-объект [объект с retrieval argument] в учебное приложение, вы пишете скрипт, который передает требуемый аргумент объекту DW автоматически".) Перерыл весь пример - не вижу, где этот аргумент устанавливается и где я писал этот скрипт... Может, речь идет о том, что это скрипт пишется АВТОМАТИЧЕСКИ, при помещении объекта в приложение? Я в некоторой растерянности… ... |
|||
:
Нравится:
Не нравится:
|
|||
02.12.2016, 13:34 |
|
Как происходит связывание информации в двух DW через retrieval argument?
|
|||
---|---|---|---|
#18+
Apprehension Перерыл весь пример - не вижу, где этот аргумент устанавливается и где я писал этот скрипт... Может, речь идет о том, что это скрипт пишется АВТОМАТИЧЕСКИ, при помещении объекта в приложение? Я в некоторой растерянности… Пересмотрев магический шар могу предположить 1. при загрузке окна ( событие open ) устанавливается связь между двумя ДВ типа dw_form.shareData(dw_list) ... |
|||
:
Нравится:
Не нравится:
|
|||
02.12.2016, 13:43 |
|
Как происходит связывание информации в двух DW через retrieval argument?
|
|||
---|---|---|---|
#18+
pand, вариант 2 при смене строки в списке ( событие rowfocuschanged ) есть строка обновления формы dw_form.Retrieve( object.key_id[newrow] ) дальше магический шар запотел . Больше ничего не вижу. Сейчас Dim2000 до рун доберется - точнее расскажет . P.S. Приводите хотябы обрывки кода который пишете ... |
|||
:
Нравится:
Не нравится:
|
|||
02.12.2016, 13:48 |
|
Как происходит связывание информации в двух DW через retrieval argument?
|
|||
---|---|---|---|
#18+
Apprehension В SQL, который поставляет данные для второго, детального DW, определен retrieval argument (по ключевому полю таблицы). значит всетаки втрой вариант ApprehensionНо я не пойму, где я успел установить связь этого аргумента с перемещением по первому DW. Перерыл весь пример - не вижу, где этот аргумент устанавливается и где я писал этот скрипт... Может, речь идет о том, что это скрипт пишется АВТОМАТИЧЕСКИ, при помещении объекта в приложение? Я в некоторой растерянности… Автоматически билдер , насколько мне помнится ничего не пишет. Что Вы могли написать ..... может кто-то из присутствующух и расскажет , мне сложно . Есть еще вариант если Вы используете библиотеку pfc и при открытии окна инициализируете сервис Linkage ... |
|||
:
Нравится:
Не нравится:
|
|||
02.12.2016, 13:52 |
|
Как происходит связывание информации в двух DW через retrieval argument?
|
|||
---|---|---|---|
#18+
Вот что я выдрал (функции и события окошка, в котором расположены эти два Dw): dw_master -- DW с табличным объектом dw_detail -- DW с freeform-объектом ("ленточным"?), где выводится детальная информация только по одной строке таблицы. КЛАСС: w_master_detail_ancestor [w_pbtutor_basesheet] СОБЫТИЕ: open() returns long [pbm_open] dw_master.settransobject( sqlca ) dw_detail.settransobject( sqlca ) this. EVENT ue_retrieve() (ЕСТЬ СОБЫТИЕ ПРЕДКА, но там нет ничего, связанного с ДВ) СОБЫТИЕ: ue_retrieve() IF dw_master.Retrieve() <> -1 THEN dw_master.SetFocus() dw_master.SetRowFocusIndicator(Hand!) END IF СОБЫТИЕ: ue_insert() dw_detail.Reset( ) dw_detail.InsertRow(0) dw_detail.SetFocus( ) СОБЫТИЕ: ue_update() IF dw_detail.update( ) = 1 then COMMIT using SQLCA; MessageBox("Save", "Save succeeded") else ROLLBACK using SQLCA; end if СОБЫТИЕ: ue_delete() dw_detail.DeleteRow( 0 ) [Очевидно, последнее событие написано с ошибкой, поскольку программа вела себя не так, как заявлено. Считаю, что правильно dw_master.DeleteRow( 0 ) ] Собственно, вот и все, что я нашел. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.12.2016, 14:03 |
|
Как происходит связывание информации в двух DW через retrieval argument?
|
|||
---|---|---|---|
#18+
Собственно, сами DW нестандартные - они берутся из библиотеки, поставляемой в дистрибутиве специально для примера, но их новый функционал ограничивается только обработкой ошибок (нас, нубов, учат вначале при ошибке закрывать текущую транзакцию, а уж потом сообщать пользователю плохие новости :) ... |
|||
:
Нравится:
Не нравится:
|
|||
02.12.2016, 14:15 |
|
Как происходит связывание информации в двух DW через retrieval argument?
|
|||
---|---|---|---|
#18+
Apprehension, dw_master dw_detail унаследованы с окна w_pbtutor_basesheet или созданы на текущем окне если унаследованы то смотри события окна w_pbtutor_basesheet скорее всего поведение dw описаны в нем ... |
|||
:
Нравится:
Не нравится:
|
|||
02.12.2016, 15:41 |
|
Как происходит связывание информации в двух DW через retrieval argument?
|
|||
---|---|---|---|
#18+
ДВ-шки dw_master и dw_detail нестандартные и унаследованы от пользовательского класса u_dwstandard, определенного в библиотеке, которая поставляется на дистрибутиве как часть обучалки. Но в этом классе переопределены только некоторые события обработки ошибок Пример: СОБЫТИЕ: dberror(...) this.EVENT uevent_dberr_initial() this.POST EVENT uevent_dberr_message & (sqldbcode,sqlerrtext,row,buffer) RETURN 1 uevent_dberr_initial пока не заполнены (будут дальше по обучалке, судя по всему, в нем мы закроем транзакцию), а uevent_dberr_message просто выводит сообщение. Так что и тут я ничего не нашел... Сам класс u_dwstandard унаследован от datawindow. Может, у кого-то есть похожие обучалки? ^__^ Илия просто не там смотрел? :( ... |
|||
:
Нравится:
Не нравится:
|
|||
02.12.2016, 15:58 |
|
Как происходит связывание информации в двух DW через retrieval argument?
|
|||
---|---|---|---|
#18+
02.12.2016 13:34, Apprehension пишет: > Скажем, в Lazarus надо было бы написать скрипт для события перемещения > по первому окну, где отслеживалось бы значение ключевого поля, потом оно > присваивалось бы retrieval argument и подавалась команда на обновление > второго окна. Здесь самый очевидный вариант выглядит примерно так же :). > Перерыл весь пример - не вижу, где этот аргумент устанавливается и где я > писал этот скрипт... Может, речь идет о том, что это скрипт пишется > АВТОМАТИЧЕСКИ, при помещении объекта в приложение? Эхотаг сам ничего не пишет :). Я бы начала с поиска места, где вызывается dw_detail.Retrieve(). Просто поиском по всему проекту. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
02.12.2016, 16:14 |
|
Как происходит связывание информации в двух DW через retrieval argument?
|
|||
---|---|---|---|
#18+
pand1. при загрузке окна ( событие open ) устанавливается связь между двумя ДВ типа dw_form.shareData(dw_list)pandвариант 2 при смене строки в списке ( событие rowfocuschanged ) есть строка обновления формы dw_form.Retrieve( object.key_id[newrow] ) Если вычеркнуть пункт "связь через астрал", то так оно и есть :). pandСейчас Dim2000 до рун доберется - точнее расскажет Я бы, может, и рассказал, если бы хоть раз видел этот самый тьюториал ;). ... |
|||
:
Нравится:
Не нравится:
|
|||
02.12.2016, 16:15 |
|
Как происходит связывание информации в двух DW через retrieval argument?
|
|||
---|---|---|---|
#18+
поставить точку останова в событии retrieveend. Если не на что поставить - внести туда выражение типа i= 1. Запустить под дебагером. Проверить call stack ( стек вызова ). Там должна быть видна последовательность вызова. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.12.2016, 20:44 |
|
Как происходит связывание информации в двух DW через retrieval argument?
|
|||
---|---|---|---|
#18+
Уф! Нашел через окно дебага. К сожалению (или, в нашем деле, - к счастью), чудес не случилось, а была всё-таки невнимательность. Действительно, событие rowfocuschanged для dw_master было изменено! Вроде смотрел, но, видимо, не вполне еще освоился с интерфейсом. long ll_itemnum ll_itemnum = this.object.data[currentrow, 1] IF dw_detail.retrieve( ll_itemnum ) = -1 then MessageBox("Retrieve", "Retrieve error-detail") end if Спасибо большое за ответы - было интересно! ) ... |
|||
:
Нравится:
Не нравится:
|
|||
05.12.2016, 13:16 |
|
Как происходит связывание информации в двух DW через retrieval argument?
|
|||
---|---|---|---|
#18+
05.12.2016 13:16, Apprehension пишет: > Действительно, событие rowfocuschanged для dw_master было изменено! Абсолютно стандартный приём :). Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
05.12.2016, 18:17 |
|
|
start [/forum/topic.php?fid=15&fpage=6&tid=1335188]: |
0ms |
get settings: |
10ms |
get forum list: |
15ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
53ms |
get topic data: |
13ms |
get forum data: |
3ms |
get page messages: |
53ms |
get tp. blocked users: |
1ms |
others: | 13ms |
total: | 169ms |
0 / 0 |