Hello everyone,
In the below code snippet, is it possible to typecast the different type of fields in single statement?
DEFINE VARIABLE hRecordBufferHandle AS HANDLE NO-UNDO.
DEFINE VARIABLE hFieldBufferHandle AS HANDLE NO-UNDO.
DEFINE VARIABLE iFieldCounter AS INTEGER NO-UNDO.
DEFINE VARIABLE vchFieldDataType AS CHARACTER NO-UNDO.
ASSIGN
hRecordBufferHandle = BUFFER customer:HANDLE.
FOR EACH Customer WHERE custnum = 1 :
DO iFieldCounter = 1 TO hRecordBufferHandle:NUM-FIELDS:
hFieldBufferHandle = hRecordBufferHandle:BUFFER-FIELD(iFieldCounter).
DO TRANSACTION:
vchFieldDataType = hFieldBufferHandle:DATA-TYPE.
CASE vchFieldDataType :
WHEN "CHARACTER" THEN
DO:
hFieldBufferHandle:BUFFER-VALUE = STRING("SOME VALUE") NO-ERROR.
END.
WHEN "INTEGER" THEN
DO:
hFieldBufferHandle:BUFFER-VALUE = INTEGER("123") NO-ERROR.
END.
WHEN "INT64" THEN
DO:
hFieldBufferHandle:BUFFER-VALUE = INT64("123") NO-ERROR.
END.
WHEN "LOGICAL" THEN
DO:
hFieldBufferHandle:BUFFER-VALUE = LOGICAL("YES") NO-ERROR.
END.
WHEN "DATE" THEN
DO:
hFieldBufferHandle:BUFFER-VALUE = DATE("12/31/2018") NO-ERROR.
END.
WHEN "DATETIME-TZ" THEN
DO:
hFieldBufferHandle:BUFFER-VALUE = DATETIME-TZ(TODAY) NO-ERROR.
END.
WHEN "DECIMAL" THEN
DO:
hFieldBufferHandle:BUFFER-VALUE = DECIMAL("123") NO-ERROR.
END.
END CASE.
END.
END.
END.
------------------------------------------------------------------------------------------------------------------------------------------
( i.e. Can i use something similar to this instead of assigning each field using case statement
hFieldBufferHandle:BUFFER-VALUE = DYNAMIC-CAST(vchFieldValue , vchFieldDataType ) NO-ERROR. )
--------------------------------------------------------------------------------------------------------------------------------------------
Thanks in advance.
[Shorthand to give you the point]
I am trying the same thing. But, I am wondering if we can do it in single statement. ( Dynamic-cast can be used to cast the object of similar types) . Is it possible for type casting the primitive data types dynamically ?
Take a look at BOX/UNBOX, maybe you can make something with this.
DEFINE TEMP-TABLE tt NO-UNDO FIELD Integ3r AS INT64 FIELD Ch4racter AS CHARACTER FIELD D4teTim AS DATETIME-TZ FIELD L0gical AS LOGICAL FIELD Dec1mal AS DECIMAL . DEFINE VARIABLE h AS HANDLE NO-UNDO. DEFINE VARIABLE oInteg3r AS CLASS System.Object NO-UNDO. DEFINE VARIABLE oCh4racter AS CLASS System.Object NO-UNDO. DEFINE VARIABLE oD4teTim AS CLASS System.Object NO-UNDO. DEFINE VARIABLE oL0gical AS CLASS System.Object NO-UNDO. DEFINE VARIABLE oDec1mal AS CLASS System.Object NO-UNDO. ASSIGN h = BUFFER tt:HANDLE oInteg3r = BOX(707) oCh4racter = BOX("Character") oD4teTim = BOX(NOW) oL0gical = BOX(TRUE) oDec1mal = BOX(123.456) . CREATE tt. RUN object2type (h:BUFFER-FIELD("Integ3r"), oInteg3r). RUN object2type (h:BUFFER-FIELD("Ch4racter"), oCh4racter). RUN object2type (h:BUFFER-FIELD("D4teTim"), oD4teTim). RUN object2type (h:BUFFER-FIELD("L0gical"), oL0gical). RUN object2type (h:BUFFER-FIELD("Dec1mal"), oDec1mal). MESSAGE tt.Integ3r SKIP tt.Ch4racter SKIP tt.D4teTim SKIP tt.L0gical SKIP tt.Dec1mal SKIP VIEW-AS ALERT-BOX INFORMATION BUTTONS OK. /****/ PROCEDURE object2type: DEFINE INPUT PARAMETER phField AS HANDLE NO-UNDO. DEFINE INPUT PARAMETER poObject AS System.Object NO-UNDO. ASSIGN phField:BUFFER-VALUE = UNBOX(poObject). END PROCEDURE.
Sure, I will try it and let you know. Thanks a lot !!!
Too bad this won't work on Unix...
For that to work we would need BOX/UNBOX to/from Progress.Lang.Object...
You can add your vote for that feature request here: community.progress.com/.../boxingunboxing_of_abl_datatypes_tofrom_progresslangobject