Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / PowerBuilder Новый топик    Ответить
 Как происходит связывание информации в двух DW через retrieval argument?  [new]
Apprehension
Member

Откуда:
Сообщений: 38
Здравствуйте! Заранее извиняюсь за базовые вопросы и некоторый сумбур. Я - полный новичок, читаю и разбираюсь в учебной БД по книге 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 автоматически".)

Перерыл весь пример - не вижу, где этот аргумент устанавливается и где я писал этот скрипт... Может, речь идет о том, что это скрипт пишется АВТОМАТИЧЕСКИ, при помещении объекта в приложение?

Я в некоторой растерянности…
2 дек 16, 13:34    [19959545]     Ответить | Цитировать Сообщить модератору
 Re: Как происходит связывание информации в двух DW через retrieval argument?  [new]
pand
Member

Откуда: Украина Харьков
Сообщений: 330
Apprehension

Перерыл весь пример - не вижу, где этот аргумент устанавливается и где я писал этот скрипт... Может, речь идет о том, что это скрипт пишется АВТОМАТИЧЕСКИ, при помещении объекта в приложение?

Я в некоторой растерянности…


Пересмотрев магический шар могу предположить

1. при загрузке окна ( событие open ) устанавливается связь между двумя ДВ типа

dw_form.shareData(dw_list)
2 дек 16, 13:43    [19959615]     Ответить | Цитировать Сообщить модератору
 Re: Как происходит связывание информации в двух DW через retrieval argument?  [new]
pand
Member

Откуда: Украина Харьков
Сообщений: 330
pand,

вариант 2

при смене строки в списке ( событие rowfocuschanged )
есть строка обновления формы
dw_form.Retrieve( object.key_id[newrow] )


дальше магический шар запотел . Больше ничего не вижу.
Сейчас Dim2000 до рун доберется - точнее расскажет .


P.S. Приводите хотябы обрывки кода который пишете
2 дек 16, 13:48    [19959650]     Ответить | Цитировать Сообщить модератору
 Re: Как происходит связывание информации в двух DW через retrieval argument?  [new]
pand
Member

Откуда: Украина Харьков
Сообщений: 330
Apprehension

В SQL, который поставляет данные для второго, детального DW, определен retrieval argument (по ключевому полю таблицы).

значит всетаки втрой вариант

Apprehension
Но я не пойму, где я успел установить связь этого аргумента с перемещением по первому DW.
Перерыл весь пример - не вижу, где этот аргумент устанавливается и где я писал этот скрипт... Может, речь идет о том, что это скрипт пишется АВТОМАТИЧЕСКИ, при помещении объекта в приложение?

Я в некоторой растерянности…

Автоматически билдер , насколько мне помнится ничего не пишет.
Что Вы могли написать ..... может кто-то из присутствующух и расскажет , мне сложно .
Есть еще вариант если Вы используете библиотеку pfc и при открытии окна
инициализируете сервис Linkage
2 дек 16, 13:52    [19959681]     Ответить | Цитировать Сообщить модератору
 Re: Как происходит связывание информации в двух DW через retrieval argument?  [new]
Apprehension
Member

Откуда:
Сообщений: 38
Вот что я выдрал (функции и события окошка, в котором расположены эти два 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 ) ]

Собственно, вот и все, что я нашел.
2 дек 16, 14:03    [19959769]     Ответить | Цитировать Сообщить модератору
 Re: Как происходит связывание информации в двух DW через retrieval argument?  [new]
Apprehension
Member

Откуда:
Сообщений: 38
Собственно, сами DW нестандартные - они берутся из библиотеки, поставляемой в дистрибутиве специально для примера, но их новый функционал ограничивается только обработкой ошибок (нас, нубов, учат вначале при ошибке закрывать текущую транзакцию, а уж потом сообщать пользователю плохие новости :)
2 дек 16, 14:15    [19959856]     Ответить | Цитировать Сообщить модератору
 Re: Как происходит связывание информации в двух DW через retrieval argument?  [new]
pand
Member

Откуда: Украина Харьков
Сообщений: 330
Apprehension,

dw_master
dw_detail
унаследованы с окна w_pbtutor_basesheet или созданы на текущем окне
если унаследованы то смотри события окна w_pbtutor_basesheet
скорее всего поведение dw описаны в нем
2 дек 16, 15:41    [19960285]     Ответить | Цитировать Сообщить модератору
 Re: Как происходит связывание информации в двух DW через retrieval argument?  [new]
Apprehension
Member

Откуда:
Сообщений: 38
ДВ-шки 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.

Может, у кого-то есть похожие обучалки? ^__^ Илия просто не там смотрел? :(
2 дек 16, 15:58    [19960386]     Ответить | Цитировать Сообщить модератору
 Re: Как происходит связывание информации в двух DW через retrieval argument?  [new]
Dim2000
Member

Откуда: Москва
Сообщений: 5318

02.12.2016 13:34, Apprehension пишет:

> Скажем, в Lazarus надо было бы написать скрипт для события перемещения
> по первому окну, где отслеживалось бы значение ключевого поля, потом оно
> присваивалось бы retrieval argument и подавалась команда на обновление
> второго окна.

Здесь самый очевидный вариант выглядит примерно так же :).

> Перерыл весь пример - не вижу, где этот аргумент устанавливается и где я
> писал этот скрипт... Может, речь идет о том, что это скрипт пишется
> АВТОМАТИЧЕСКИ, при помещении объекта в приложение?

Эхотаг сам ничего не пишет :).

Я бы начала с поиска места, где вызывается dw_detail.Retrieve(). Просто
поиском по всему проекту.

Posted via ActualForum NNTP Server 1.5

2 дек 16, 16:14    [19960482]     Ответить | Цитировать Сообщить модератору
 Re: Как происходит связывание информации в двух DW через retrieval argument?  [new]
Dim2000
Member

Откуда: Москва
Сообщений: 5318
pand
1. при загрузке окна ( событие open ) устанавливается связь между двумя ДВ типа

dw_form.shareData(dw_list)
pand
вариант 2

при смене строки в списке ( событие rowfocuschanged )
есть строка обновления формы
dw_form.Retrieve( object.key_id[newrow] )

Если вычеркнуть пункт "связь через астрал", то так оно и есть :).

pand
Сейчас Dim2000 до рун доберется - точнее расскажет

Я бы, может, и рассказал, если бы хоть раз видел этот самый тьюториал ;).
2 дек 16, 16:15    [19960487]     Ответить | Цитировать Сообщить модератору
 Re: Как происходит связывание информации в двух DW через retrieval argument?  [new]
spas2001
Member

Откуда: Тамбов--->Москва-->Тамбов-->Москва-->Тамбов
Сообщений: 2010
поставить точку останова в событии retrieveend. Если не на что поставить - внести туда выражение типа i= 1. Запустить под дебагером.
Проверить call stack ( стек вызова ). Там должна быть видна последовательность вызова.
4 дек 16, 20:44    [19965765]     Ответить | Цитировать Сообщить модератору
 Re: Как происходит связывание информации в двух DW через retrieval argument?  [new]
Apprehension
Member

Откуда:
Сообщений: 38
Уф! Нашел через окно дебага. К сожалению (или, в нашем деле, - к счастью), чудес не случилось, а была всё-таки невнимательность.
Действительно, событие 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

Спасибо большое за ответы - было интересно! )
5 дек 16, 13:16    [19967829]     Ответить | Цитировать Сообщить модератору
 Re: Как происходит связывание информации в двух DW через retrieval argument?  [new]
Dim2000
Member

Откуда: Москва
Сообщений: 5318

05.12.2016 13:16, Apprehension пишет:

> Действительно, событие rowfocuschanged для dw_master было изменено!

Абсолютно стандартный приём :).

Posted via ActualForum NNTP Server 1.5

5 дек 16, 18:17    [19969477]     Ответить | Цитировать Сообщить модератору
Все форумы / PowerBuilder Ответить