Consultor Eletrônico



Kbase P166123: ADM2: How to conditionally update a SmartDataViewer field when the user clicks the SAVE button of th
Autor   Progress Software Corporation - Progress
Acesso   Público
Publicação   17/05/2010
Status: Unverified

GOAL:

ADM2: How to conditionally update a SmartDataViewer field when the user clicks the SAVE button of the SmartToolBar?

GOAL:

How to update a SmartDataViewer ( SDV ) field on SAVE if another field was modified?

GOAL:

How to assign the Order.PromiseDate field of an Order SDV depending on whether the Order.OrderDate field of that SDV has changed or not the user clicks the SAVE button of the SmartToolBar?

FACT(s) (Environment):

Windows
Progress 9.x
OpenEdge 10.x

FIX:

One way to calculate and update the Order.PromiseDate field of an Order SDV if the Order.OrderDate field of that SDV has changed on the SAVE button of the SmartToolBar is override the updateRecord procedure in the SmartDataViewer. For example, the following Order SDV updateRecord procedure override sets the Order.PromiseDate to 60 days after the Order.OrderDate entered by the user:

PROCEDURE updateRecord :
/*------------------------------------------------------------------------------
Purpose: Super Override
Parameters:
Notes:
------------------------------------------------------------------------------*/
/* Code placed here will execute PRIOR to standard behavior. */
DEFINE VARIABLE cAllFieldsHandles AS CHARACTER NO-UNDO.
DEFINE VARIABLE cPromiseDateHandle AS HANDLE NO-UNDO.
DEFINE VARIABLE cDisplayedFields AS CHARACTER NO-UNDO.
DEFINE VARIABLE hOrderDateHandle AS HANDLE NO-UNDO.
DEFINE VARIABLE iCounter AS INTEGER NO-UNDO.

DEFINE VARIABLE charDate AS CHARACTER NO-UNDO.
DEFINE VARIABLE myDate AS DATE NO-UNDO.

ASSIGN
cDisplayedFields = DYNAMIC-FUNCTION('getDisplayedFields':U IN THIS-PROCEDURE)
cAllFieldsHandles = DYNAMIC-FUNCTION('getFieldHandles':U IN THIS-PROCEDURE)
iCounter = LOOKUP ( "promiseDate", cDisplayedFields )
cPromiseDateHandle = WIDGET-HANDLE(ENTRY(iCounter, cAllFieldsHandles))
iCounter = LOOKUP ( "OrderDate", cDisplayedFields )
hOrderDateHandle = WIDGET-HANDLE(ENTRY(iCounter, cAllFieldsHandles))
cPromiseDateHandle:SCREEN-VALUE = STRING(DATE(hOrderDateHandle:SCREEN-VALUE) + 60).

RUN SUPER.
/* Code placed here will execute AFTER standard behavior. */
END PROCEDURE.

Another way to calculate and assign the Order.PromiseDate field of an Order SDV when the user clicks the SAVE button of the SmartToolBar after having changed the Order.OrderDate field of that SDV is override the submitRow function in the Order SmartDataObjcet ( SDO ). For example, the following Order SDO submitRow function override sets the Order.PromiseDate to 90 days after the Order.OrderDate entered by the user:

FUNCTION submitRow RETURNS LOGICAL
( INPUT pcRowIdent AS CHARACTER,
INPUT pcFieldValueueList AS CHARACTER) :
/*------------------------------------------------------------------------------
Purpose: Super Override
Notes: &nb.sp; The override logic will ONLY execute if OrderDate has been modified
------------------------------------------------------------------------------*/
/* Code placed here will execute PRIOR to standard behavior. */
IF LOOKUP ( "OrderDate", pcFieldValueueList , CHR(1)) > 0 THEN DO:
DEFINE VARIABLE iOrderDatePosition AS INTEGER NO-UNDO.
DEFINE VARIABLE cOrderDate AS CHARACTER NO-UNDO.
DEFINE VARIABLE dPromiseDate AS DATE NO-UNDO.
DEFINE VARIABLE cPromiseDate AS CHARACTER NO-UNDO.

ASSIGN
iOrderDatePosition = LOOKUP ( "OrderDate", pcFieldValueueList , CHR(1)) + 1
cOrderDate = ENTRY (iOrderDatePosition, pcFieldValueueList, CHR(1))
dPromiseDate = DATE(cOrderDate) + 90
cPromiseDate = STRING(dPromiseDate)
pcFieldValueueList = pcFieldValueueList + CHR(1) + "PromiseDate" + CHR(1) + cPromiseDate.
END.
RETURN SUPER( INPUT pcRowIdent, INPUT pcFieldValueueList ).
END FUNCTION.
To give the user the freedom of modifying the Order.PromiseDate field manually, modify the above submitRow to execute the logic ONLY if the Order.OrderDate is modified but not the Order.PromiseDate. Thus if the user modified the Order.PromiseDate field only or both the Order.PromiseDate and the Order.OrderDate the logic will not execute as per the following submitRow function variation:
FUNCTION submitRow RETURNS LOGICAL
( INPUT pcRowIdent AS CHARACTER,
INPUT pcFieldValueList AS CHARACTER) :
/*------------------------------------------------------------------------------
Purpose: Super Override
Notes: The override logic will ONLY execute if OrderDate has been modified
------------------------------------------------------------------------------*/
/* Code placed here will execute PRIOR to standard behavior. */
IF LOOKUP ( "OrderDate", pcFieldValueList , CHR(1)) > 0 AND LOOKUP ( "PromiseDate", pcFieldValueList , CHR(1)) = 0 THEN DO:
DEFINE VARIABLE iOrderDatePosition AS INTEGER NO-UNDO.
DEFINE VARIABLE cOrderDate AS CHARACTER NO-UNDO.
DEFI.NE VARIABLE dPromiseDate AS DATE NO-UNDO.
DEFINE VARIABLE cPromiseDate AS CHARACTER NO-UNDO.

ASSIGN
iOrderDatePosition = LOOKUP ( "OrderDate", pcFieldValueList , CHR(1)) + 1
cOrderDate = ENTRY (iOrderDatePosition, pcFieldValueList, CHR(1))
dPromiseDate = DATE(cOrderDate) + 90
cPromiseDate = STRING(dPromiseDate)
pcFieldValueList = pcFieldValueList + CHR(1) + "PromiseDate" + CHR(1) + cPromiseDate.
END.
RETURN SUPER( INPUT pcRowIdent, INPUT pcFieldValueList ).
END FUNCTION..