Problem with appserver and dynamic query

Hi all.

i have a function that creates a query handle and buffer handle as output parameters and sends them to my window.

in that window i make a dynamic browser and fill it with the query.

then i fill my dynamic browser with the columns of my buffer. this all worked but know i need to run my procedure on the appserver and i get following errors:

1) add/set buffers argument 1 was invalid or not found
2) query prepare requires that set-buffers has been used to asign buffers to query
3) in add-columns-from: could not find table from handle in browsers query

This all worked when i didnt run them on appserver. this is my code:

DEFINE VARIABLE hAppserver AS HANDLE NO-UNDO.

connectie-appserver:
DO ON ERROR UNDO connectie-appserver, LEAVE connectie-appserver
ON STOP UNDO connectie-appserver, LEAVE connectie-appserver:
/* persistent runnen */
RUN quicksearch/pChangeBulk.p ON DYNAMIC-FUNCTION("getAppHandle":U, INPUT "TVH":U) PERSISTENT SET hAppserver.
RUN 'MaakEngine':U IN hAppserver
(INPUT iiMachkode,
OUTPUT qh,
OUTPUT bh ).

CREATE QUERY qh.
qh:SET-BUFFERS(bh).
qh:QUERY-PREPARE("for each TTMachines").
IF VALID-HANDLE(hbrw) THEN
DELETE WIDGET hbrw.

CREATE BROWSE hbrw NO-ERROR
ASSIGN FRAME = FRAME frmPossible:HANDLE
EXPANDABLE = FALSE
VISIBLE = TRUE
SENSITIVE = TRUE
SEPARATORS = TRUE
DOWN = 5
X = 40
Y = 6
WIDTH-CHARS = 80
HEIGHT-CHARS = 9
QUERY = qh
NO-VALIDATE = FALSE
TRIGGERS:
ON 'row-display':U PERSISTENT RUN kleurenEngine IN THIS-PROCEDURE.
ON 'value-changed':U PERSISTENT RUN KiesEngine IN THIS-PROCEDURE.
ON 'RIGHT-MOUSE-CLICK':U PERSISTENT RUN ToonMenuEngine IN THIS-PROCEDURE.
END TRIGGERS.
hbrw:ADD-COLUMNS-FROM(bh).
ASSIGN hbrw:EXPANDABLE = TRUE
hbrw:COLUMN-RESIZABLE = TRUE
hbrw:FIRST-COLUMN:WIDTH-PIXELS = 50
bchandle = hbrw:GET-BROWSE-COLUMN(1)
bchandle1 = hbrw:GET-BROWSE-COLUMN(2)
bchandle2 = hbrw:GET-BROWSE-COLUMN(3)
bchandle3 = hbrw:GET-BROWSE-COLUMN(4).
qh:QUERY-OPEN().
APPLY "value-changed" TO hbrw.

RUN ToonMenuEngine (OUTPUT menuHandle).
ASSIGN hbrw:POPUP-MENU = menuHandle.

LEAVE connectie-appserver.
END. /* connectie-appserver */
/* delete handle */
IF VALID-HANDLE(hAppserver) THEN
DELETE PROCEDURE hAppserver.
RETURN FALSE.

END FUNCTION.

.

procedure maakengine


/*------------------------------------------------------------------------------
Purpose:
Parameters: <none>
Notes:
------------------------------------------------------------------------------*/
DEFINE INPUT PARAMETER iMachkode AS INTEGER NO-UNDO.
DEFINE OUTPUT PARAMETER qh AS HANDLE NO-UNDO.
DEFINE OUTPUT PARAMETER bh AS HANDLE NO-UNDO.
DEFINE VARIABLE hBrand AS HANDLE NO-UNDO.
DEFINE VARIABLE hModel AS HANDLE NO-UNDO.
DEFINE VARIABLE hFuel AS HANDLE NO-UNDO.
CREATE TEMP-TABLE TTMachines.
TTMachines:ADD-LIKE-FIELD("Mkode","OptixMotor.MKode").
TTMachines:ADD-LIKE-FIELD("Merk","OptixMotor.merk").
TTMachines:ADD-LIKE-FIELD("Type","OptixMotor.type").
TTMachines:ADD-NEW-FIELD("Fuel","char").
TTMachines:TEMP-TABLE-PREPARE("TTMachines").
ASSIGN bh = TTMachines:DEFAULT-BUFFER-HANDLE.

FOR EACH QSPuntPerMach NO-LOCK WHERE
QSPuntPerMach.MachKode = iMachkode
BREAK BY QSPuntPerMach.MKode:
IF FIRST-OF(QSPuntPerMach.MKode) THEN DO:
FIND FIRST OptixMotor NO-LOCK WHERE
OptixMotor.MKode = QSPuntPerMach.MKode NO-ERROR.
IF AVAILABLE OptixMotor THEN DO: /* groen - rood */
bh:BUFFER-CREATE().
bh:BUFFER-COPY(BUFFER OptixMotor:HANDLE).
hBrand = bh:buffer-field("Merk").
hBrand:COLUMN-LABEL = "Brand".
hModel = bh:BUFFER-FIELD("Type").
hModel:COLUMN-LABEL = "Engine Model".
hFuel = bh:BUFFER-FIELD("Fuel").
IF hFuel:BUFFER-VALUE = "D" THEN
hFuel:BUFFER-VALUE = "Diesel".
IF hFuel:BUFFER-VALUE = "B" THEN
hFuel:BUFFER-VALUE = "Benzine - lpg".
END.
END.
END.
FOR EACH QSMachMot NO-LOCK WHERE
QSMachMot.MachKode = iMachkode
BREAK BY QSMachMot.MKode:
IF FIRST-OF(QSMachMot.MKode) THEN DO:
FIND FIRST OptixMotor NO-LOCK WHERE
OptixMotor.MKode = QSMachMot.MKode NO-ERROR.
IF NOT AVAILABLE OptixMotor THEN DO: /* oranje */
bh:BUFFER-CREATE().
bh:BUFFER-COPY(BUFFER QSMachMot:HANDLE).
hBrand = bh:buffer-field("Merk").
hBrand:COLUMN-LABEL = "Brand".
hModel = bh:BUFFER-FIELD("Type").
hModel:COLUMN-LABEL = "Engine Model".
hFuel = bh:BUFFER-FIELD("Fuel").
IF hFuel:BUFFER-VALUE = "D" THEN
hFuel:BUFFER-VALUE = "Diesel".
IF hFuel:BUFFER-VALUE = "B" THEN
hFuel:BUFFER-VALUE = "Benzine - lpg".
END.
END.
END.
END PROCEDURE.




Hope someone can help. ;)
 
Hi all.

i have a function that creates a query handle and buffer handle as output parameters and sends them to my window.

in that window i make a dynamic browser and fill it with the query.

then i fill my dynamic browser with the columns of my buffer. this all worked but know i need to run my procedure on the appserver and i get following errors:

1) add/set buffers argument 1 was invalid or not found
2) query prepare requires that set-buffers has been used to asign buffers to query
3) in add-columns-from: could not find table from handle in browsers query

This all worked when i didnt run them on appserver. this is my code:

DEFINE VARIABLE hAppserver AS HANDLE NO-UNDO.

connectie-appserver:
DO ON ERROR UNDO connectie-appserver, LEAVE connectie-appserver
ON STOP UNDO connectie-appserver, LEAVE connectie-appserver:
/* persistent runnen */
RUN quicksearch/pChangeBulk.p ON DYNAMIC-FUNCTION("getAppHandle":U, INPUT "TVH":U) PERSISTENT SET hAppserver.
RUN 'MaakEngine':U IN hAppserver
(INPUT iiMachkode,
OUTPUT qh,
OUTPUT bh ).

CREATE QUERY qh.
qh:SET-BUFFERS(bh).
qh:QUERY-PREPARE("for each TTMachines").
IF VALID-HANDLE(hbrw) THEN
DELETE WIDGET hbrw.

CREATE BROWSE hbrw NO-ERROR
ASSIGN FRAME = FRAME frmPossible:HANDLE
EXPANDABLE = FALSE
VISIBLE = TRUE
SENSITIVE = TRUE
SEPARATORS = TRUE
DOWN = 5
X = 40
Y = 6
WIDTH-CHARS = 80
HEIGHT-CHARS = 9
QUERY = qh
NO-VALIDATE = FALSE
TRIGGERS:
ON 'row-display':U PERSISTENT RUN kleurenEngine IN THIS-PROCEDURE.
ON 'value-changed':U PERSISTENT RUN KiesEngine IN THIS-PROCEDURE.
ON 'RIGHT-MOUSE-CLICK':U PERSISTENT RUN ToonMenuEngine IN THIS-PROCEDURE.
END TRIGGERS.
hbrw:ADD-COLUMNS-FROM(bh).
ASSIGN hbrw:EXPANDABLE = TRUE
hbrw:COLUMN-RESIZABLE = TRUE
hbrw:FIRST-COLUMN:WIDTH-PIXELS = 50
bchandle = hbrw:GET-BROWSE-COLUMN(1)
bchandle1 = hbrw:GET-BROWSE-COLUMN(2)
bchandle2 = hbrw:GET-BROWSE-COLUMN(3)
bchandle3 = hbrw:GET-BROWSE-COLUMN(4).
qh:QUERY-OPEN().
APPLY "value-changed" TO hbrw.

RUN ToonMenuEngine (OUTPUT menuHandle).
ASSIGN hbrw:POPUP-MENU = menuHandle.

LEAVE connectie-appserver.
END. /* connectie-appserver */
/* delete handle */
IF VALID-HANDLE(hAppserver) THEN
DELETE PROCEDURE hAppserver.
RETURN FALSE.

END FUNCTION.

.

procedure maakengine


/*------------------------------------------------------------------------------
Purpose:
Parameters: <none>
Notes:
------------------------------------------------------------------------------*/
DEFINE INPUT PARAMETER iMachkode AS INTEGER NO-UNDO.
DEFINE OUTPUT PARAMETER qh AS HANDLE NO-UNDO.
DEFINE OUTPUT PARAMETER bh AS HANDLE NO-UNDO.
DEFINE VARIABLE hBrand AS HANDLE NO-UNDO.
DEFINE VARIABLE hModel AS HANDLE NO-UNDO.
DEFINE VARIABLE hFuel AS HANDLE NO-UNDO.
CREATE TEMP-TABLE TTMachines.
TTMachines:ADD-LIKE-FIELD("Mkode","OptixMotor.MKode").
TTMachines:ADD-LIKE-FIELD("Merk","OptixMotor.merk").
TTMachines:ADD-LIKE-FIELD("Type","OptixMotor.type").
TTMachines:ADD-NEW-FIELD("Fuel","char").
TTMachines:TEMP-TABLE-PREPARE("TTMachines").
ASSIGN bh = TTMachines:DEFAULT-BUFFER-HANDLE.

FOR EACH QSPuntPerMach NO-LOCK WHERE
QSPuntPerMach.MachKode = iMachkode
BREAK BY QSPuntPerMach.MKode:
IF FIRST-OF(QSPuntPerMach.MKode) THEN DO:
FIND FIRST OptixMotor NO-LOCK WHERE
OptixMotor.MKode = QSPuntPerMach.MKode NO-ERROR.
IF AVAILABLE OptixMotor THEN DO: /* groen - rood */
bh:BUFFER-CREATE().
bh:BUFFER-COPY(BUFFER OptixMotor:HANDLE).
hBrand = bh:buffer-field("Merk").
hBrand:COLUMN-LABEL = "Brand".
hModel = bh:BUFFER-FIELD("Type").
hModel:COLUMN-LABEL = "Engine Model".
hFuel = bh:BUFFER-FIELD("Fuel").
IF hFuel:BUFFER-VALUE = "D" THEN
hFuel:BUFFER-VALUE = "Diesel".
IF hFuel:BUFFER-VALUE = "B" THEN
hFuel:BUFFER-VALUE = "Benzine - lpg".
END.
END.
END.
FOR EACH QSMachMot NO-LOCK WHERE
QSMachMot.MachKode = iMachkode
BREAK BY QSMachMot.MKode:
IF FIRST-OF(QSMachMot.MKode) THEN DO:
FIND FIRST OptixMotor NO-LOCK WHERE
OptixMotor.MKode = QSMachMot.MKode NO-ERROR.
IF NOT AVAILABLE OptixMotor THEN DO: /* oranje */
bh:BUFFER-CREATE().
bh:BUFFER-COPY(BUFFER QSMachMot:HANDLE).
hBrand = bh:buffer-field("Merk").
hBrand:COLUMN-LABEL = "Brand".
hModel = bh:BUFFER-FIELD("Type").
hModel:COLUMN-LABEL = "Engine Model".
hFuel = bh:BUFFER-FIELD("Fuel").
IF hFuel:BUFFER-VALUE = "D" THEN
hFuel:BUFFER-VALUE = "Diesel".
IF hFuel:BUFFER-VALUE = "B" THEN
hFuel:BUFFER-VALUE = "Benzine - lpg".
END.
END.
END.
END PROCEDURE.




Hope someone can help. ;)


Hi Kenny,

When you invoke a procedure on an appserver you are calling this procedure in another session. Sometimes this can be on the same machine, but usually it will be on an entirely different machine. Handles are only valid in one session because it is nothing more then a pointer to a widget created in that session. This handle does not have any meaning in another progress session. Because of this you cannot pass handles over the appserver boundary. The only way to get the information from the appserver to your windows application is sending the complete temp-table ttMachine using TABLE PARAMETERS.

Greetings,
RKR.
 
Thanks RKR.

but i have another problem now. how can you fill a dynamic browse with a temp-table?


Hi Kenny, in the Progress help there is a sample, r-dynbrw.p that creates a dynamic browse on a database table (customer). If you change the database table to you temp-table it should work without any problem.

You can find this help by typing CREATE BROWSE and highlight this statement and then press the <F1> help key. (if you are on a windows platform).
 
Back
Top