Kbase P20234: PUBLISH SUBSCRIBE Example with Browses
Autor |
  Progress Software Corporation - Progress |
Acesso |
  Público |
Publicação |
  8/22/2003 |
|
Status: Unverified
GOAL:
PUBLISH SUBSCRIBE Example with Browses
FIX:
This Knowledge Base gives example code showing how to use the PUBLISH
and SUBSCRIBE Statements to interchange information between browses.
The code example has 4 windows: two publishers and two subscribers.
To start the example you should run the publisher.w file against the
sports database and from this window start the others.
When you select a row in the browse of one of the publishers, you will
see that the subscribers change the values. In the first publisher
you have the Customer browser, in the second publisher you have the
Invoice. The first subscriber has the Order browse based on a query
dependant on the cust-num selected in any one of the publisher's
browses. The second window has the Ref-Call browse based on the same
cust-num.
The main window in the example is publisher.w, which must be run
first. The other windows, all run from publisher.w, are publisher2.w,
subscriber1.w and subscriber2.w.
****************
****PUBLISHER.W (main window):
DEFINE BUTTON BtnDone DEFAULT LABEL "&Done" SIZE 15 BY 1.14 BGCOLOR 8.
DEFINE BUTTON BUTTON-12 LABEL "Second Publisher" SIZE 26 BY 1.19.
DEFINE BUTTON BUTTON-15 LABEL "Second Subscriber" SIZE 30 BY 1.19.
DEFINE BUTTON BUTTON-5 LABEL "Subscriber window" SIZE 26 BY 1.19.
DEFINE QUERY BROWSE-1 FOR Customer SCROLLING.
DEFINE BROWSE BROWSE-1
QUERY BROWSE-1 NO-LOCK DISPLAY
Customer.Cust-Num FORMAT ">>>>9":U
Customer.Name FORMAT "x(20)":U WIDTH 18.2
Customer.City FORMAT "x(12)":U
Customer.Country FORMAT "x(20)":U
Customer.Credit-Limit FORMAT "->,>>>,>>9":U WIDTH 17
WITH NO-ROW-MARKERS SEPARATORS SIZE 84 BY 4.52 EXPANDABLE.
DEFINE FRAME pepe
BtnDone AT ROW 1.48 COL 70
BUTTON-5 AT ROW 3.62 COL 22
BUTTON-15 AT ROW 3.62 COL 53
BUTTON-12 AT ROW 5.05 COL 22
BROWSE-1 AT ROW 7.19 COL 2
" PUBLISHER" VIEW-AS TEXT
SIZE 16 BY 1.19 AT ROW 1.95 COL 26
FONT 6
WITH 1 DOWN NO-BOX KEEP-TAB-ORDER OVERLAY
SIDE-LABELS NO-UNDERLINE THREE-D
AT COL 1.2 ROW 1 SIZE 86.2 BY 13.62
DEFAULT-BUTTON BtnDone.
ON VALUE-CHANGED OF BROWSE-1 IN FRAME pepe /* Browse 1 */
DO:
PUBLISH "browsel" ( customer.cust-num ).
END.
ON CHOOSE OF BtnDone IN FRAME pepe /* Done */
DO:
APPLY "CLOSE":U TO THIS-PROCEDURE.
END.
ON CHOOSE OF BUTTON-12 IN FRAME pepe /* Open Second Publisher */
DO:
RUN publisher2.w.
END.
ON CHOOSE OF BUTTON-15 IN FRAME pepe /* Open Second Subscriber */
DO:
RUN subscriber2.w.
END.
ON CHOOSE OF BUTTON-5 IN FRAME pepe /* Open Subscriber window */
DO:
RUN subscriber1.w.
END.
OPEN QUERY BROWSE-1 FOR EACH Customer.
ENABLE ALL WITH FRAME pepe.
WAIT-FOR CLOSE OF this-PROCEDURE.
*****************
****PUBLISHER2.w:
CREATE WIDGET-POOL.
&Scoped-define OPEN-QUERY-BROWSE-6 OPEN QUERY BROWSE-6 FOR EACH
Invoice NO-LOCK INDEXED-REPOSITION.
&Scoped-define OPEN-BROWSERS-IN-QUERY-DEFAULT-FRAME
~{&OPEN-QUERY-BROWSE-6}
DEFINE VAR C-Win AS WIDGET-HANDLE NO-UNDO.
DEFINE BUTTON BtnDone DEFAULT LABEL "&Done" SIZE 15 BY 1.14 BGCOLOR 8.
DEFINE QUERY BROWSE-6 FOR Invoice SCROLLING.
DEFINE BROWSE BROWSE-6
QUERY BROWSE-6 NO-LOCK DISPLAY
Invoice.Cust-Num FORMAT ">>>>9":U
Invoice.Invoice-Date FORMAT "99/99/99":U
Invoice.Invoice-Num FORMAT ">>>>>9":U
Invoice.Order-Num FORMAT ">>>>9":U
Invoice.Ship-Charge FORMAT "->>,>>9.99":U
Invoice.Amount FORMAT "->>,>>9.99":U
WITH NO-ROW-MARKERS SEPARATORS SIZE 66 BY 4.52 EXPANDABLE.
DEFINE FRAME DEFAULT-FRAME
BtnDone AT ROW 1.71 COL 68
BROWSE-6 AT ROW 3.86 COL 10
" SECOND PUBLISHER" VIEW-AS TEXT
SIZE 26 BY 2.14 AT ROW 1.48 COL 27 FONT 6
WITH 1 DOWN NO-BOX KEEP-TAB-ORDER OVERLAY
. SIDE-LABELS NO-UNDERLINE THREE-D
AT COL 1 ROW 1 SIZE 85 BY 8.24
DEFAULT-BUTTON BtnDone.
IF SESSION:DISPLAY-TYPE = "GUI":U THEN
CREATE WINDOW C-Win ASSIGN
HIDDEN = YES
TITLE = "SECOND PUBLISHER"
HEIGHT = 8.24
WIDTH = 85
MAX-HEIGHT = 27.67
MAX-WIDTH = 160
VIRTUAL-HEIGHT = 27.67
VIRTUAL-WIDTH = 160
RESIZE = yes SCROLL-BARS = no
STATUS-AREA = no BGCOLOR = ?
FGCOLOR = ? KEEP-FRAME-Z-ORDER = yes
THREE-D = yes MESSAGE-AREA = no
SENSITIVE = yes.
ELSE C-Win = CURRENT-WINDOW.
IF SESSION:DISPLAY-TYPE = "GUI":U AND VALID-HANDLE(C-Win)
THEN C-Win:HIDDEN = no.
ON END-ERROR OF C-Win /* SECOND PUBLISHER */
OR ENDKEY OF C-Win ANYWHERE DO:
IF THIS-PROCEDURE:PERSISTENT THEN RETURN NO-APPLY.
END.
ON WINDOW-CLOSE OF C-Win /* SECOND PUBLISHER */
DO:
APPLY "CLOSE":U TO THIS-PROCEDURE.
RETURN NO-APPLY.
END.
ON VALUE-CHANGED OF BROWSE-6 IN FRAME DEFAULT-FRAME /* Browse 6 */
DO:
PUBLISH "browsel" (Invoice.cust-num).
END.
ON CHOOSE OF BtnDone IN FRAME DEFAULT-FRAME /* Done */
DO:
APPLY "CLOSE":U TO THIS-PROCEDURE.
END.
ASSIGN CURRENT-WINDOW = C-Win
THIS-PROCEDURE:CURRENT-WINDOW = C-Win.
ON CLOSE OF THIS-PROCEDURE
RUN disable_UI.
PAUSE 0 BEFORE-HIDE.
MAIN-BLOCK:
DO ON ERROR UNDO MAIN-BLOCK, LEAVE MAIN-BLOCK
ON END-KEY UNDO MAIN-BLOCK, LEAVE MAIN-BLOCK:
RUN enable_UI.
IF NOT THIS-PROCEDURE:PERSISTENT THEN
WAIT-FOR CLOSE OF THIS-PROCEDURE.
END.
PROCEDURE disable_UI :
IF SESSION:DISPLAY-TYPE = "GUI":U AND VALID-HANDLE(C-Win)
THEN DELETE WIDGET C-Win.
IF THIS-PROCEDURE:PERSISTENT THEN DELETE PROCEDURE THIS-PROCEDURE.
END PROCEDURE.
PROCEDURE enable_UI :
ENABLE BtnDone BROWSE-6
WITH FRAME DEFAULT-FRAME IN WINDOW C-Win.
{&OPEN-BROWSERS-IN-QUERY-DEFAULT-FRAME}
VIEW C-Win.
END PROCEDURE.
******************
****SUBSCRIBER1.W:
CREATE WIDGET-POOL.
DEFINE QUERY q1 FOR order SCROLLING.
DEFINE BROWSE b1 QUERY q1 DISPLAY cust-num order-num ship-date terms
promise-dat WITH 3 DOWN TITLE "Order Browse".
DEFINE VAR C-Win AS WIDGET-HANDLE NO-UNDO.
DEFINE BUTTON BtnDone DEFAULT LABEL "&Done" SIZE 15 BY 1.14 BGCOLOR 8.
DEFINE FRAME DEFAULT-FRAME
BtnDone AT ROW 1.95 COL 64
" SUBSCRIBER 1" VIEW-AS TEXT
SIZE 22 BY 2.14 AT ROW 1.71 COL 28 FONT 6
WITH 1 DOWN NO-BOX KEEP-TAB-ORDER OVERLAY
SIDE-LABELS NO-UNDERLINE THREE-D
AT COL 1 ROW 1 SIZE 81.2 BY 11.67
DEFAULT-BUTTON BtnDone.
DEFINE FRAME FRAME-A
WITH 1 DOWN NO-BOX KEEP-TAB-ORDER OVERLAY
SIDE-LABELS NO-UNDERLINE THREE-D
AT COL 10 ROW 4 SIZE 67 BY 7.48.
IF SESSION:DISPLAY-TYPE = "GUI":U THEN
CREATE WINDOW C-Win ASSIGN
HIDDEN = YES
TITLE = "SUBSCRIBER"
HEIGHT = 11.67 WIDTH = 81.2
MAX-HEIGHT = 25.19 MAX-WIDTH = 160
VIRTUAL-HEIGHT = 25.19 VIRTUAL-WIDTH = 160
RESIZE = YES SCROLL-BARS = no
STATUS-AREA = no BGCOLOR = ?
FGCOLOR = ? KEEP-FRAME-Z-ORDER = yes
THREE-D = yes MESSAGE-AREA = no
SENSITIVE = yes.
ELSE C-Win = CURRENT-WINDOW.
ASSIGN FRAME FRAME-A:FRAME = FRAME DEFAULT-FRAME:HANDLE.
IF SESSION:DISPLAY-TYPE = "GUI":U AND VALID-HANDLE(C-Win)
THEN C-Win:HIDDEN = no.
ON END-ERROR OF C-Win /* SUBSCRIBER */
OR ENDKEY OF C-Win ANYWHERE DO:
IF THIS-PROCEDURE:PERSISTENT THEN RETURN NO-APPLY.
END.
ON WINDOW-CLOSE OF C-Win /* SUBSCRIBER */
DO:
APPLY "CLOSE":U TO THIS-PROCEDURE.
RE.TURN NO-APPLY.
END.
ON CHOOSE OF BtnDone IN FRAME DEFAULT-FRAME /* Done */
DO:
APPLY "CLOSE":U TO THIS-PROCEDURE.
END.
ASSIGN CURRENT-WINDOW = C-Win
THIS-PROCEDURE:CURRENT-WINDOW = C-Win.
ON CLOSE OF THIS-PROCEDURE
RUN disable_UI.
PAUSE 0 BEFORE-HIDE.
SUBSCRIBE TO "browsel" ANYWHERE.
MAIN-BLOCK:
DO ON ERROR UNDO MAIN-BLOCK, LEAVE MAIN-BLOCK
ON END-KEY UNDO MAIN-BLOCK, LEAVE MAIN-BLOCK:
RUN enable_UI.
IF NOT THIS-PROCEDURE:PERSISTENT THEN
WAIT-FOR CLOSE OF THIS-PROCEDURE.
END.
PROCEDURE browsel :
DEF INPUT PARAMETER custnumber AS INTEGER.
OPEN QUERY q1 FOR EACH Order WHERE Order.Cust-Num = custnumber
NO-LOCK.
ENABLE b1 WITH FRAME FRAME-A.
END PROCEDURE.
PROCEDURE disable_UI :
IF SESSION:DISPLAY-TYPE = "GUI":U AND VALID-HANDLE(C-Win)
THEN DELETE WIDGET C-Win.
IF THIS-PROCEDURE:PERSISTENT THEN DELETE PROCEDURE THIS-PROCEDURE.
END PROCEDURE.
PROCEDURE enable_UI :
ENABLE BtnDone
WITH FRAME DEFAULT-FRAME IN WINDOW C-Win.
{&OPEN-BROWSERS-IN-QUERY-DEFAULT-FRAME}
VIEW FRAME FRAME-A IN WINDOW C-Win.
{&OPEN-BROWSERS-IN-QUERY-FRAME-A}
VIEW C-Win.
END PROCEDURE.
****SUBSCRIBER2.W:
CREATE WIDGET-POOL.
DEFINE QUERY q1 FOR Ref-Call SCROLLING.
DEFINE BROWSE b1 QUERY q1 DISPLAY cust-num call-num call-date
WITH 3 DOWN TITLE "Call Browse".
DEFINE VAR C-Win AS WIDGET-HANDLE NO-UNDO.
DEFINE BUTTON BtnDone DEFAULT LABEL "&Done" SIZE 15 BY 1.14 BGCOLOR 8.
DEFINE FRAME DEFAULT-FRAME
BtnDone AT ROW 1.71 COL 72.4
"SECOND SUBSCRIBER" VIEW-AS TEXT
SIZE 28 BY 2.14 AT ROW 1.71 COL 30 FONT 6
WITH 1 DOWN NO-BOX KEEP-TAB-ORDER OVERLAY
SIDE-LABELS NO-UNDERLINE THREE-D
AT COL 1 ROW 1 SIZE 86.4 BY 8
DEFAULT-BUTTON BtnDone.
DEFINE FRAME FRAME-B
WITH 1 DOWN NO-BOX KEEP-TAB-ORDER OVERLAY
SIDE-LABELS NO-UNDERLINE THREE-D
AT COL 8 ROW 3.62 SIZE 72 BY 5.
IF SESSION:DISPLAY-TYPE = "GUI":U THEN
CREATE WINDOW C-Win ASSIGN
HIDDEN = YES
TITLE = "second subscriber"
HEIGHT = 8 WIDTH = 86.4
MAX-HEIGHT = 16 MAX-WIDTH = 86.4
VIRTUAL-HEIGHT = 16 VIRTUAL-WIDTH = 86.4
RESIZE = yes SCROLL-BARS = no
STATUS-AREA = no BGCOLOR = ?
FGCOLOR = ? KEEP-FRAME-Z-ORDER = yes
THREE-D = yes MESSAGE-AREA = no
SENSITIVE = yes.
ELSE C-Win = CURRENT-WINDOW.
ASSIGN FRAME FRAME-B:FRAME = FRAME DEFAULT-FRAME:HANDLE.
IF SESSION:DISPLAY-TYPE = "GUI":U AND VALID-HANDLE(C-Win)
THEN C-Win:HIDDEN = no.
ON END-ERROR OF C-Win /* second subscriber */
OR ENDKEY OF C-Win ANYWHERE DO:
IF THIS-PROCEDURE:PERSISTENT THEN RETURN NO-APPLY.
END.
ON WINDOW-CLOSE OF C-Win /* second subscriber */
DO:
APPLY "CLOSE":U TO THIS-PROCEDURE.
RETURN NO-APPLY.
END.
ON CHOOSE OF BtnDone IN FRAME DEFAULT-FRAME /* Done */
DO:
APPLY "CLOSE":U TO THIS-PROCEDURE.
END.
ASSIGN CURRENT-WINDOW = C-Win
THIS-PROCEDURE:CURRENT-WINDOW =C-Win.
ON CLOSE OF THIS-PROCEDURE
RUN disable_UI.
PAUSE 0 BEFORE-HIDE.
SUBSCRIBE TO "browsel" ANYWHERE.
MAIN-BLOCK:
DO ON ERROR UNDO MAIN-BLOCK, LEAVE MAIN-BLOCK
ON END-KEY UNDO MAIN-BLOCK, LEAVE MAIN-BLOCK:
RUN enable_UI.
IF NOT THIS-PROCEDURE:PERSISTENT THEN
WAIT-FOR CLOSE OF THIS-PROCEDURE.
END.
PROCEDURE browsel :
DEF INPUT PARAMETER custnumber AS INTEGER.
OPEN QUERY q1 FOR EACH Ref-Call WHERE Ref-Call.Cust-Num = custnumber
NO-LOCK.
ENABLE b1 WITH FRAME FRAME-B.
END PROCEDURE.
PROCEDURE disable_UI :
IF SESSION:DISPLAY-TYPE = "GUI":U AND VALID-HANDLE(C-Win)
THEN DELETE WIDGET C-Win.
IF THIS-PROCEDURE:PERSISTENT THEN D.ELETE PROCEDURE THIS-PROCEDURE.
END PROCEDURE.
PROCEDURE enable_UI :
ENABLE BtnDone
WITH FRAME DEFAULT-FRAME IN WINDOW C-Win.
{&OPEN-BROWSERS-IN-QUERY-DEFAULT-FRAME}
VIEW FRAME FRAME-B IN WINDOW C-Win.
{&OPEN-BROWSERS-IN-QUERY-FRAME-B}
VIEW C-Win.
END PROCEDURE..