Kbase P10496: How to manage a COMBO-BOX in a browse cell of an updatable browse, and the ability to add or delete
Autor |
  Progress Software Corporation - Progress |
Acesso |
  Público |
Publicação |
  2/8/2008 |
|
Status: Verified
GOAL:
How to manage a COMBO-BOX in a browse cell of an updatable browse, and the ability to add or delete rows?
GOAL:
How to overlay a COMBO-BOX in a browse cell
FACT(s) (Environment):
All Supported Operating Systems
Progress 9.1D
FIX:
/*------------------------------------------------------------------------
File: CellCombo.p works fine in 9.1D
To manage a browse cell as a combo-box.
The browse is updatable and also allows to add or delete rows.
The TAB and BACK-TAB keys on the Combo-box are also managed
------------------------------------------------------------------------*/
/* *************************** Definitions ************************** */
DEFINE VARIABLE FocusInCb AS LOGICAL NO-UNDO.
DEFINE VARIABLE hCurrentSalesRep AS HANDLE NO-UNDO.
DEFINE VARIABLE TabNextPrev AS LOGICAL NO-UNDO.
&SCOPED-DEFINE OPEN-QUERY-bcust OPEN QUERY bcust ~
FOR EACH Customer NO-LOCK INDEXED-REPOSITION.
/* *********************** Control Definitions ********************** */
/* Definitions of the field level widgets */
DEFINE BUTTON BtnAdd LABEL "Add row" SIZE 15 BY 1.14.
DEFINE BUTTON BtnDel LABEL "Del Row" SIZE 15 BY 1.14.
DEFINE VARIABLE cb AS CHARACTER FORMAT "X(256)":U
VIEW-AS COMBO-BOX INNER-LINES 5 LIST-ITEMS "" DROP-DOWN-LIST SIZE 13 BY 1 NO-UNDO.
DEFINE QUERY bcust FOR Customer SCROLLING.
DEFINE BROWSE bcust QUERY bcust NO-LOCK DISPLAY
Customer.CustNum FORMAT ">>>>9":U
Customer.Name FORMAT "x(30)":U
Customer.SalesRep FORMAT "x(4)":U
ENABLE Customer.NAME Customer.SalesRep
WITH NO-ROW-MARKERS SEPARATORS SIZE 57 BY 7.86 ROW-HEIGHT-CHARS .62 EXPANDABLE.
DEFINE FRAME fMain
cb AT ROW 1.24 COL 42 COLON-ALIGNED NO-LABEL
bcust AT ROW 2.67 COL 3
BtnAdd AT ROW 2.91 COL 62
BtnDel AT ROW 4.57 COL 62
WITH 1 DOWN NO-BOX KEEP-TAB-ORDER OVERLAY SIDE-LABELS NO-UNDERLINE THREE-D
AT COL 1 ROW 1 SIZE 79.2 BY 10.14.
/* ************************ Control Triggers ************************ */
ON ROW-LEAVE OF bcust IN FRAME fMain DO:
IF FocusInCb THEN RETURN. /*take the combo as part of the browse row*/
RUN RowLeave NO-ERROR.
IF ERROR-STATUS:ERROR THEN DO: /* errors???*/
MESSAGE "Error during ROW-LEAVE" SKIP RETURN-VALUE
VIEW-AS ALERT-BOX ERROR BUTTONS OK.
RETURN NO-APPLY.
END.
END.
ON ENTRY OF Customer.SalesRep IN BROWSE bcust /* Sales Rep */DO:
IF TabNextPrev THEN RETURN.
ASSIGN hCurrentSalesRep = SELF:HANDLE.
IF hCurrentSalesRep:X < 0 THEN cb:VISIBLE IN FRAME fMain = NO.
ELSE ASSIGN
cb:X IN FRAME fMain = hCurrentSalesRep:X + bcust:X
cb:VISIBLE = YES.
IF hCurrentSalesRep:Y < 0 THEN cb:VISIBLE IN FRAME fMain = NO.
ELSE ASSIGN
cb:Y IN FRAME fMain = hCurrentSalesRep:Y + bcust:Y - 2
cb:VISIBLE = YES.
IF cb:VISIBLE THEN DO:
cb:SENSITIVE = YES.
cb:MOVE-TO-TOP().
cb:SCREEN-VALUE = SELF:SCREEN-VALUE.
APPLY "ENTRY" TO cb.
RETURN NO-APPLY.
END.
END.
ON CHOOSE OF BtnAdd IN FRAME fMain /* Add row */DO:
IF AVAILABLE(customer) THEN bcust:INSERT-ROW("AFTER").
ELSE DO TRANSACTION: /*not sure whether it is required for very first line...*/
CREATE customer.
{&OPEN-QUERY-bcut}
APPLY "ENTRY" TO bcust.
END.
END.
ON CHOOSE OF BtnDel IN FRAME fMain /* Del Row */DO:
IF bcust:NEW-ROW THEN bcust:DELETE-CURRENT-ROW().
ELSE IF AVAILABLE customer THEN DO TRANSACTION:
GET CURRENT bcust EXCLUSIVE.
DELETE customer.
{&OPEN-QUERY-bcust}
END.
END.
ON BACK-TAB OF cb IN FRAME fMain DO:
DEFINE VARIABLE h AS HANDLE NO-UNDO.
TabNextPrev = YES.
APPLY "ENTRY" TO hCurrentSalesRep.
APPLY "BACK-TAB" TO hCurrentSalesRep.
TabNextPrev = NO.
RETURN NO-APPLY.
END.
ON ENTRY OF cb IN FRAME fMain DO:
FocusInCb = YES.
END.
ON LEAVE OF cb IN FRAME fMain DO:
FocusInCb = NO.
cb:VISIBLE = NO.
END.
ON RETURN OF cb IN FRAME fMain DO:
APPLY "ENTRY" TO hCurrentSalesRep.
APPLY "TAB" TO hCurrentSalesRep.
END.
ON TAB OF cb IN FRAME fMain DO:
TabNextPrev = YES.
APPLY "ENTRY" TO hCurrentSalesRep.
APP.LY "TAB" TO hCurrentSalesRep.
TabNextPrev = NO.
RETURN NO-APPLY.
END.
ON VALUE-CHANGED OF cb IN FRAME fMain DO:
hCurrentSalesRep:MODIFIED = NOT hCurrentSalesRep:SCREEN-VALUE = SELF:SCREEN-VALUE.
hCurrentSalesRep:SCREEN-VALUE = SELF:SCREEN-VALUE.
END.
/* *************************** Main Block *************************** */
/*----------------- Load the combo-box -------- */
DEFINE VARIABLE c AS CHARACTER NO-UNDO.
FOR EACH salesrep NO-LOCK:
c = c + "," + salesrep.salesrep.
END.
cb:LIST-ITEMS = SUBSTR(c,2).
MAIN-BLOCK:
DO ON ERROR UNDO MAIN-BLOCK, LEAVE MAIN-BLOCK
ON END-KEY UNDO MAIN-BLOCK, LEAVE MAIN-BLOCK:
ENABLE bcust BtnAdd BtnDel WITH FRAME fMain.
cb:VISIBLE = NO.
{&OPEN-QUERY-bcust}
WAIT-FOR CLOSE OF THIS-PROCEDURE.
END.
/* ********************** Internal Procedures *********************** */
PROCEDURE RowLeave :
DEFINE VARIABLE MthRtn AS LOGICAL NO-UNDO.
IF NOT bcust:NEW-ROW IN FRAME fMain
AND AVAIL customer THEN DO:
IF NOT bcust:CURRENT-ROW-MODIFIED THEN RETURN.
DO TRANSACTION:
GET CURRENT bcust EXCLUSIVE.
ASSIGN BROWSE bcust customer.name customer.salesr NO-ERROR.
GET CURRENT bcust NO-LOCK.
END.
IF ERROR-STATUS:ERROR THEN RETURN ERROR "ASSIGN BROWSE...".
END.
IF bcust:NEW-ROW IN FRAME fMain THEN DO ON ERROR UNDO, RETURN ERROR:
CREATE customer.
ASSIGN
customer.name = customer.name:SCREEN-VALUE IN BROWSE bcust
customer.salesrep = customer.salesrep:SCREEN-VALUE IN BROWSE bcust.
MthRtn = bcust:CREATE-RESULT-LIST-ENTRY().
IF NOT MthRtn THEN RETURN ERROR "CREATE-RESULT-LIST-ENTRY()".
DISPLAY customer.custnum WITH BROWSE bcust.
END.
END PROCEDURE..