* CPYR TXT 5/03/10 23:38:56
PROCEDURE CPYR_NODE
RESET MSGCTL 2 SUB 5
Begin
$SetG('FILE', 'QAWORK')
End
CREATE (NOFORMAT) ?&FILE
END
OPENC ?&FILE
*
IN ?&FILE INITIALIZE
IN ?&FILE DEFINE FIELD FOO
IN ?&FILE Begin
*-----------------------------------------------------------------------*
* Accumulate multiple records in one XmlDoc *
*-----------------------------------------------------------------------*
%doc Object XmlDoc
%nod Object XmlNode
%r Float
Store Record
FOO = 'Info from first record'
End Store
%r = $CurRec
FRN %r
%doc = %doc:NewFromRecord
%nod = %doc:SelectSingleNode('*')
End For
Print '----- XmlDoc after load from first record: -----'
%doc:Print(, 'BothCompact')
Print ''
Store Record
FOO = 'Info from second record'
End Store
%r = $CurRec
FRN %r
%nod:LoadFromRecord
End For
Print '----- XmlDoc after load from second record: -----'
%doc:Print(, 'BothCompact')
Print ''
Store Record
End Store
%r = $CurRec
FRN %r
%doc:AddToRecord
Print '----- Record ' And $CurRec And '------'
PAI
End For
End
* Result is:
* ----- Record 2 ------
* FOO = Info from first record
* FOO = Info from second record
CLOSE ?&FILE
END PROC
********************************
PROCEDURE CPYR_ALTER1
RESET MSGCTL 2 SUB 5
Begin
$SetG('FILE', 'QAWORK')
End
CREATE (NOFORMAT) ?&FILE
END
*
OPENC ?&FILE
IN ?&FILE INITIALIZE
IN ?&FILE DEFINE FIELD SELECT
IN ?&FILE DEFINE FIELD FLD1
IN ?&FILE DEFINE FIELD FLD2
IN ?&FILE Begin
*-----------------------------------------------------------------------*
* De-select field occurrences to copy *
*-----------------------------------------------------------------------*
%nlis Object XmlNodelist
%del Object XmlNodelist
%doc Object XmlDoc
%i Float
%rn Float
%doc = New
Store Record
SELECT = 'true'
FLD1 = 'selValue1'
FLD2 = 'selValue2'
SELECT = 'false'
FLD1 = 'skipValue1'
FLD2 = 'skipValue2'
End Store
%rn = $CurRec
FRN %rn
%doc = %doc:NewFromRecord
End For
%nlis = %doc:SelectNodes(-
'*/field[@name = "SELECT"]')
%del = New(%doc)
For %i From 1 To %nlis:Count
If %nlis(%i):Value NE 'true' Then
%del = %del:UnionSelected(%nlis(%i))
%del = %del:UnionSelected(%doc, '*/field[@name = "FLD1"][' -
With %i With ']')
%del = %del:UnionSelected(%doc, '*/field[@name = "FLD2"][' -
With %i With ']')
End If
End For
For %i From 1 To %del:Count
%del(%i):DeleteSubtree
End For
Store Record
End Store
%rn = $CurRec
FRN %rn
%doc:AddToRecord
Print '----- Record ' And $CurRec And '------'
PAI
End For
End
* Result is:
* ----- Record 1 ------
* SELECT = true
* FLD1 = selValue1
* FLD2 = selValue2
CLOSE ?&FILE
END PROC
********************************
PROCEDURE CPYR_ALTER2
RESET MSGCTL 2 SUB 5
Begin
$SetG('FILE1', 'QAWORK')
$SetG('FILE2', 'QAWORK2')
End
CREATE (NOFORMAT) ?&FILE1
END
*
OPENC ?&FILE1
IN ?&FILE1 INITIALIZE
IN ?&FILE1 DEFINE FIELD CITY
IN ?&FILE1 DEFINE FIELD STATE
CREATE (NOFORMAT) ?&FILE2
END
*
OPENC ?&FILE2
IN ?&FILE2 INITIALIZE
IN ?&FILE2 DEFINE FIELD CITY
IN ?&FILE2 DEFINE FIELD STATE
IN ?&FILE2 DEFINE FIELD CITY.STATE WITH ORDERED INVISIBLE
Begin
*-----------------------------------------------------------------------*
* Create concatenated invisible key *
*-----------------------------------------------------------------------*
%recs Collection Arraylist of Object XmlDoc
%recNode Object XmlNode
%node Object XmlNode
%recs = New
%i Float
%rn Float
%citySt Unicode
IN ?&FILE1 Store Record
CITY = 'Springfield'
STATE = 'MA'
End Store
%rn = $CurRec
IN ?&FILE1 FRN %rn
%recs:Add(%(XmlDoc):NewFromRecord)
End For
IN ?&FILE1 Store Record
CITY = 'Springfield'
STATE = 'MO'
End Store
%rn = $CurRec
IN ?&FILE1 FRN %rn
%recs:Add(%(XmlDoc):NewFromRecord)
End For
For %i From 1 To %recs:Count
%recNode = %recs(%i):SelectSingleNode('Record')
%citySt = %recNode:Value('field[@name="CITY"]') With ',' -
With %recNode:Value('field[@name="STATE"]')
* Strictly speaking, previous two lines a little better as:
* %recNode:Value('field[@name="CITY"]'):UnicodeWith(',':U) -
* :UnicodeWith(%recNode:Value('field[@name="STATE"]'))
%node = %recNode:AddElement('field':U, %citySt)
%node:AddAttribute('name', 'CITY.STATE')
IN ?&FILE2 Store Record
End Store
%rn = $CurRec
IN ?&FILE2 FRN %rn
%recs(%i):AddToRecord
IN ?&FILE2 FR Where CITY.STATE EQ %citySt
Print 'Record' And *Record With ':'
PAI
End For
End For
End For
End
* Result is:
* Record 0:
* CITY = Springfield
* STATE = MA
* Record 1:
* CITY = Springfield
* STATE = MO
CLOSE ?&FILE1
CLOSE ?&FILE2
END PROC
********************************
PROCEDURE CPYR_TRANS3
RESET MSGCTL 2 SUB 5
Begin
$SetG('FILE', 'QAWORK')
End
CREATE (NOFORMAT) ?&FILE
END
OPENC ?&FILE
*
IN ?&FILE INITIALIZE
IN ?&FILE DEFINE FIELD FOO
*
* For example only ... UNICODE Table command should only be in CCAIN:
UNICODE Table Standard Base Codepage 0037
UNICODE Table Standard Trans E=AD To U=005B
IN ?&FILE Begin
*-----------------------------------------------------------------------*
* Show a pitfall of building XmlDoc by hand *
*-----------------------------------------------------------------------*
%doc Object XmlDoc
%rec Object XmlNode
%fgrp Object XmlNode
%fld Object XmlNode
%rn Float
%doc = New
%rec = %doc:AddElement('Record')
%i Float
%s String Len 1 Initial('AD':X)
%fld = %rec:AddElement('field', %s)
%fld:AddAttribute('name', 'FOO')
Store Record
End Store
%rn = $CurRec
FRN %rn
%doc:AddToRecord
Print '----- Record ' And $CurRec And '------'
PrintText Expecting {$C2X(%s)}: {$C2X(FOO(1))}
End For
End
* Result is:
* ----- Record 0 ------
* Expecting AD: BA
CLOSE ?&FILE
UNICODE Table Standard Base Codepage 1047
END PROC
********************************
PROCEDURE CPYR_BASE64
RESET MSGCTL 2 SUB 5
Begin
$SetG('FILE', 'QAWORK')
End
CREATE (NOFORMAT) ?&FILE
END
OPENC ?&FILE
*
IN ?&FILE INITIALIZE
IN ?&FILE DEFINE FIELD FOO
IN ?&FILE Begin
%doc Object XmlDoc
%doc = New
%u Unicode
%rn Float
Try %u = '08':X:EbcdicToUnicode
Catch CharacterTranslationException
Print 'EBCDIC X''08'' is not translatable to Unicode'
End Try
%s Longstring Initial('08':x)
Store Record
FOO = %s
End Store
%rn = $CurRec
FRN %rn
%doc:NewFromRecord:Print
End For
End
* Result is:
* EBCDIC X'08' is not translatable to Unicode
*
*
* CA==
*
*
CLOSE ?&FILE
END PROC
********************************
PROCEDURE CPYR_CONSTR
R MSGCTL 2
UTABLE LPDLST 12000
Begin
$SetG('FILE', 'QAWORK')
End
CREATE (NOFORMAT) ?&FILE
PARAMETER FILEORG X'100'
END
OPENC ?&FILE
*
IN ?&FILE INITIALIZE
IN ?&FILE DEFINE FIELD DTM WITH DATETIME
IN ?&FILE Begin
Store Record
DTM = 20090927
Then Continue
Print 'Original record:'
PAI
End Store
End
IN ?&FILE REDEFINE FIELD DTM WITH DATETIME-LE 18900101
IN ?&FILE Begin
%doc Object XmlDoc
Print ' - - - Now REDEFINE FIELD DTM WITH DATETIME-LE 18900101 - - -'
Print 'Copying record "into itself" with DisableFieldConstraints=True:'
FR
%doc = %doc:NewFromRecord
%doc:AddToRecord(DisableFieldConstraints=True)
PAI
End For
Print 'DisableFieldConstraints=False (default):'
On Error
$Close('QAWORK')
End On
FR
%doc:AddToRecord
PAI
End For
End
* Result is:
* Original record:
* DTM = 20090927000000000000
* - - - Now REDEFINE FIELD DTM WITH DATETIME-LE 18900101 - - -
* Copying record "into itself" with DisableFieldConstraints=True:
* DTM = 20090927000000000000
* DTM = 20090927000000000000
* DisableFieldConstraints=False (default):
* *** 1 CANCELLING REQUEST: M204.2874: ATTEMPT TO ADD A VALUE
* THAT'S AFTER THE MAXIMUM DATETIME: DTM = 20090927000000000000
CLOSE ?&FILE
END PROC
********************************
PROCEDURE CPYR_COPY
RESET MSGCTL 2 SUB 5
Begin
$SetG('FILE', 'QAWORK')
End
CREATE (NOFORMAT) ?&FILE
PARAMETER ESIZE=30
END
OPENC ?&FILE
*
IN ?&FILE INITIALIZE
IN ?&FILE DEFINE FIELD FOO
IN ?&FILE DEFINE FIELD LOB WITH BLOB
IN ?&FILE Begin
%doc Object XmlDoc
%rn Float
%doc = New
$Lstr_Set_UserBuffer('Value of LOB field, obviously can be very much longer' -
:Left(500))
Store Record
FOO = 'Value of FOO'
LOB = Buffer, 1, 500
End Store
%rn = $CurRec
FRN %rn
%doc:LoadFromRecord
%doc:Print
End For
Store Record
End Store
%rn = $CurRec
FRN %rn
%doc:AddToRecord
PAI
End For
End
* Result is:
*
*
* Value of FOO
*
*
* Value of LOB field, obviously could be much longer
*
*
* FOO = Value of FOO
* LOB = ? ? ? ? g
* Value of LOB field, obviously could be much longer
CLOSE ?&FILE
END PROC
********************************
PROCEDURE CPYR_DEBUG_DATA
RESET MSGCTL 2 SUB 5
Begin
$SetG('FILE', 'QAWORK')
End
CREATE (NOFORMAT) ?&FILE
END
OPENC ?&FILE
*
IN ?&FILE INITIALIZE
IN ?&FILE DEFINE FIELD JUNK
IN ?&FILE DEFINE FIELD JEWEL1
IN ?&FILE DEFINE FIELD JEWEL2
IN ?&FILE Begin
%doc Object XmlDoc
%doc = New
%i Float
%r Float
%s Longstring
Store Record
End Store
%r = $CurRec
FRN %r
For %i From 1 To 100
ADD JUNK = 'All work and no play makes Jack a dull boy'
If %i:Mod(7) EQ 0 Then
%s = 'Jewel one number ' With %i
ADD JEWEL1 = %s
End If
If %i:Mod(11) EQ 0 Then
%s = 'Jewel two number ' With %i
ADD JEWEL2 = %s
End If
End For
If $Upcase(%(System):Arguments:Unspace) NE 'NOPAI' Then
PAI
End If
Print ''
Print 'Displaying selected fields:'
Print ''
%doc:LoadFromRecord
%nl Object XmlNodelist
%nl = %doc:SelectNodes('*/*')
For %i From 1 To %nl:Count
If %nl(%i):Value('@name') NE 'JUNK' Then
%nl(%i):Print(, 'BothCompact')
End If
End For
End For
End
* Result is:
* JUNK = All work and no play makes Jack a dull boy
* JUNK = All work and no play makes Jack a dull boy
* JUNK = All work and no play makes Jack a dull boy
* JUNK = All work and no play makes Jack a dull boy
* JUNK = All work and no play makes Jack a dull boy
* JUNK = All work and no play makes Jack a dull boy
* JUNK = All work and no play makes Jack a dull boy
* JEWEL1 = Jewel one number 7
* JUNK = All work and no play makes Jack a dull boy
* JUNK = All work and no play makes Jack a dull boy
* JUNK = All work and no play makes Jack a dull boy
* JUNK = All work and no play makes Jack a dull boy
* JEWEL2 = Jewel two number 11
* ...
* JEWEL2 = Jewel two number 99
* JUNK = All work and no play makes Jack a dull boy
* Displaying selected fields:
* Jewel one number 7
* Jewel two number 11
* Jewel one number 14
* Jewel one number 21
* Jewel two number 22
* Jewel one number 28
* Jewel two number 33
* Jewel one number 35
* Jewel one number 42
* Jewel two number 44
* Jewel one number 49
* Jewel two number 55
* Jewel one number 56
* Jewel one number 63
* Jewel two number 66
* Jewel one number 70
* Jewel one number 77
* Jewel two number 77
* Jewel one number 84
* Jewel two number 88
* Jewel one number 91
* Jewel one number 98
* Jewel two number 99
CLOSE ?&FILE
END PROC
********************************
PROCEDURE CPYR_TRANS
Begin
%i Float
%d Object XmlDoc
%c String Len 1
%ok Float
%u Unicode
* For %i From 0 To 255
For %i From 5 To 5
%c = $D2C(%i)
%d = New
%d:AllowNull = True
%ok = 1
Try %u = %c:EbcdicToUnicode
Catch CharacterTranslationException
PrintText X'{$D2X(%i, 2)}' untranslatable to Unicode
%ok = 0
End Try
If %ok Then
%d:AddElement('c', %c):AddAttribute('hex', $D2X(%i, 2))
%d:Print(, 'BothCompact')
* Print '--' %c '--'
End If
Print ''
End For
End
* Result is:
*
END PROC