Updateable Browse; how to save changes?

palthe

Member
Hi!
I've been struggling with some Progress code for a while now, and I thought it was time to bring it to the attention of the community because I can not figure it out.

I've been trying to develop a "black tool" for a peace of software, in which you can call a table and it's contents in a dynamic browse. I've made this browse updateable with a dynamic temp-table in which I buffer-copy the contents of the original table. So all you see is the contents, in a temp-table.
Now here's is the problem: since the browse is updateable, I'd really like to make it interactive. So the user can update a field, hit the save button and only THAT field is updated in the buffer. But I cannot seem to trigger the browse in that way that only one field (or multiple for that matter) is updated with the leave of the browse or with the save action.

Can anybody give me some insight?

Here is the code:

/*
Name: browsedatabase.p
Description: Generic Dynamic browse based on dynamic temp-table
Date: 28 juli 2007
Owner: M. Palthe
Version: 1.0
Changes:
*/

&SCOPED-DEFINE WINDOW-NAME C-Win
&SCOPED-DEFINE FRAME-NAME DEFAULT-FRAME

DEFINE VARIABLE cTable AS CHARACTER NO-UNDO.
DEFINE VARIABLE cString AS CHARACTER NO-UNDO.
DEFINE VARIABLE cQuery AS CHARACTER NO-UNDO.
DEFINE VARIABLE dWidth AS DECIMAL NO-UNDO.
DEFINE VARIABLE iChar AS INTEGER NO-UNDO.
DEFINE VARIABLE dColumn AS INTEGER NO-UNDO.
DEFINE VARIABLE dText AS INTEGER NO-UNDO.
DEFINE VARIABLE n AS INTEGER NO-UNDO.
DEFINE VARIABLE i AS INTEGER NO-UNDO.
DEFINE VARIABLE lOk AS LOGICAL NO-UNDO.
DEFINE VARIABLE tt AS HANDLE NO-UNDO.
DEFINE VARIABLE bhTable AS HANDLE NO-UNDO.
DEFINE VARIABLE bhTT AS HANDLE NO-UNDO.
DEFINE VARIABLE qrTable AS HANDLE NO-UNDO.
DEFINE VARIABLE brTable AS HANDLE NO-UNDO.
DEFINE VARIABLE bc AS HANDLE NO-UNDO.
DEFINE VARIABLE hLabel AS HANDLE NO-UNDO.
DEFINE VARIABLE bhTName AS HANDLE NO-UNDO.
DEFINE VARIABLE qrTName AS HANDLE NO-UNDO.
DEFINE VARIABLE hTable AS HANDLE NO-UNDO.
DEFINE VARIABLE C-Win AS HANDLE NO-UNDO.
DEFINE VARIABLE hField AS HANDLE NO-UNDO.
DEFINE VARIABLE hWild AS HANDLE NO-UNDO.
DEFINE BUTTON btGet LABEL "Get Results" FONT 0.
DEFINE BUTTON btSave LABEL "Save Changes" FONT 0.
DEFINE BUTTON btLeave LABEL "Leave Screen" FONT 0.

DEFINE FRAME DEFAULT-FRAME
btGet AT ROW 15 COLUMN 10
btSave AT ROW 15 COLUMN 31
btLeave AT ROW 15 COLUMN 53

WITH 1 DOWN NO-BOX KEEP-TAB-ORDER OVERLAY
SIDE-LABELS NO-UNDERLINE THREE-D
AT COL 1 ROW 1
SIZE 80 BY 16 FONT 0.

FUNCTION CreateSideLabel RETURNS LOGICAL (INPUT hTable AS HANDLE, INPUT cText AS CHARACTER):
DEFINE VARIABLE hLabel AS HANDLE NO-UNDO.
DEFINE VARIABLE dWidth AS DECIMAL NO-UNDO.
DEFINE VARIABLE iChar AS INTEGER NO-UNDO.
DEFINE VARIABLE dColumn AS INTEGER NO-UNDO.
DEFINE VARIABLE dText AS INTEGER NO-UNDO.

cText = TRIM(cText).
dWidth = FONT-TABLE:GET-TEXT-WIDTH-PIXELS(cText).
iChar = LENGTH(cText).


ASSIGN dColumn = hTable:X
dText = hTable:X - dWidth - 14.
hTable:X = dColumn.
CREATE TEXT hlabel
ASSIGN
FRAME = hTable:FRAME
FORMAT = SUBSTITUTE("X(&1)", iChar)
Y = hTable:Y + 3
X = dText
SCREEN-VALUE = cText
VISIBLE = TRUE.

hTable:SIDE-LABEL-HANDLE = hLabel.
END.

CREATE WINDOW C-Win ASSIGN
HIDDEN = YES
TITLE = "Dynamic Browse"
HEIGHT = 16
WIDTH = 80
MAX-HEIGHT = 16
MAX-WIDTH = 80
VIRTUAL-HEIGHT = 16
VIRTUAL-WIDTH = 80
RESIZE = yes
SCROLL-BARS = no
STATUS-AREA = no
BGCOLOR = ?
FGCOLOR = ?
KEEP-FRAME-Z-ORDER = yes
THREE-D = yes
MESSAGE-AREA = no
SENSITIVE = yes
FONT = 0.
c-Win:HIDDEN = NO.
CREATE FILL-IN hTable
ASSIGN
FRAME = FRAME default-frame:HANDLE
X = 150
Y = 1
HIDDEN = FALSE
SENSITIVE = YES
FONT = 0
.

DYNAMIC-FUNCTION("CreateSideLabel", hTable, "Tablename:").

ON CHOOSE OF btGet
DO:
RUN Main(INPUT hTable).
END.
ON CHOOSE OF btSave
DO:
RUN SaveAll(INPUT FRAME default-frame:HANDLE, INPUT bhTT).
END.
ON CHOOSE OF btLeave
DO:
MESSAGE "Save changes?"
VIEW-AS ALERT-BOX QUESTION BUTTONS YES-NO UPDATE lOk.
IF lOk THEN
DO:
RUN SaveAll(INPUT FRAME default-frame:HANDLE, INPUT bhTT).
APPLY "CLOSE":u TO THIS-PROCEDURE.
END.
ELSE APPLY "CLOSE":u TO THIS-PROCEDURE.
END.


ON END-ERROR OF C-Win
OR ENDKEY OF {&WINDOW-NAME} ANYWHERE DO:
END.
IF THIS-PROCEDURE:pERSISTENT THEN RETURN NO-APPLY.

ON WINDOW-CLOSE OF C-Win
DO:

APPLY "CLOSE":U TO THIS-PROCEDURE.
RETURN NO-APPLY.
END.
ASSIGN CURRENT-WINDOW = {&WINDOW-NAME}
THIS-PROCEDURE:CURRENT-WINDOW = {&WINDOW-NAME}.

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.
&ANALYZE-RESUME
&ANALYZE-SUSPEND _UIB-CODE-BLOCK _PROCEDURE disable_UI C-Win _DEFAULT-DISABLE
PROCEDURE disable_UI :
DELETE WIDGET C-Win.
IF THIS-PROCEDURE:pERSISTENT THEN DELETE PROCEDURE THIS-PROCEDURE.
END PROCEDURE.
&ANALYZE-RESUME
&ANALYZE-SUSPEND _UIB-CODE-BLOCK _PROCEDURE enable_UI C-Win _DEFAULT-ENABLE
PROCEDURE enable_UI :
VIEW FRAME DEFAULT-FRAME IN WINDOW C-Win.
ENABLE ALL WITH FRAME default-frame.
VIEW C-Win.
END PROCEDURE.

PROCEDURE Main.
DEFINE INPUT PARAMETER hTable AS HANDLE NO-UNDO.

cTable = hTable:SCREEN-VALUE.
IF hTable:SCREEN-VALUE = "" THEN

DO:
MESSAGE "Table field not filled!"
VIEW-AS ALERT-BOX WARNING BUTTONS OK.
RETURN.
END.
ELSE
DO:
cQuery = STRING("FOR EACH _file").
CREATE QUERY qrTName.
CREATE BUFFER bhTName FOR TABLE "_file".
qrTName:SET-BUFFERS(bhTName).
qrTName:QUERY-PREPARE(cQuery).
qrTName:QUERY-OPEN.
cString = "".
lOk = NO.
qrTName:GET-FIRST(NO-LOCK) NO-ERROR.

DO WHILE NOT qrTName:QUERY-OFF-END:

IF LOOKUP(STRING(ctable),STRING(bhTName:BUFFER-FIELD("_file-name"):BUFFER-VALUE)) = 1 THEN lOk = YES.
qrTName:GET-NEXT(NO-LOCK) NO-ERROR.
END.

IF NOT lOk THEN
DO:
MESSAGE "Tablename does not exist."
VIEW-AS ALERT-BOX INFO BUTTONS OK.
RETURN.

END.
ELSE
RUN FillTemp (FRAME default-frame:HANDLE, cTable).

END.
END PROCEDURE.

PROCEDURE Filltemp.
DEFINE INPUT PARAMETER hFrame AS HANDLE NO-UNDO.
DEFINE INPUT PARAMETER cTable AS CHARACTER NO-UNDO.
CREATE BUFFER bhTable FOR TABLE cTable.
CREATE TEMP-TABLE tt.
tt:CREATE-LIKE(bhTable).
tt:TEMP-TABLE-PREPARE(STRING("tt" + cTable)).

bhTT = tt:BUFFER-HANDLE.
cQuery = STRING("FOR EACH " + cTable).
CREATE QUERY qrTable.
qrTable:SET-BUFFERS(bhTable).
qrTable:QUERY-PREPARE(cQuery).
qrTable:QUERY-OPEN.
qrTable:GET-FIRST(NO-LOCK) NO-ERROR.
DO WHILE NOT qrTable:QUERY-OFF-END:
DO TRANSACTION:
qrTable:GET-CURRENT(EXCLUSIVE-LOCK) NO-ERROR.
bhTT:BUFFER-CREATE.
bhTT:BUFFER-COPY(bhTable).
END.
qrTable:GET-NEXT(NO-LOCK) NO-ERROR.
END.
qrTable:QUERY-CLOSE().
DELETE OBJECT qrTable.
cQuery = STRING("FOR EACH " + STRING("tt" + cTable)).

CREATE QUERY qrTable.
qrTable:SET-BUFFERS(bhTT).
qrTable:QUERY-PREPARE(cQuery).
qrTable:QUERY-OPEN.

CREATE BROWSE brTable
ASSIGN
QUERY = qrTable
FRAME = hFrame
ROW = 2
WIDTH = 80
DOWN = 12
SENSITIVE = YES
COLUMN-SCROLLING = TRUE
SEPARATORS = YES
VISIBLE = YES
READ-ONLY = NO
.

DO n = 1 TO bhTT:NUM-FIELDS:
hField = bhTT:BUFFER-FIELD(n).
hField:VALIDATE-EXPRESSION = "".
brTable:ADD-LIKE-COLUMN(hField).
END.
DO n = 1 TO brTable:NUM-COLUMNS:
bc = brTable:GET-BROWSE-COLUMN(n).
bc:COLUMN-READ-ONLY = FALSE.
bc:READ-ONLY = FALSE.
bc:COLUMN-FONT = 0.

END.

VIEW hFrame.
END.
PROCEDURE SaveAll.
DEFINE INPUT PARAMETER hFrame AS HANDLE NO-UNDO.
DEFINE INPUT PARAMETER bhTT AS HANDLE NO-UNDO.

END.
 
Top