|
RSS Feed - WebSphere MQ Support
|
RSS Feed - Message Broker Support
|
 |
|
How do I do mapping for an element that's repeatable ? |
« View previous topic :: View next topic » |
Author |
Message
|
AlexeiSkate |
Posted: Thu May 23, 2002 3:40 pm Post subject: How do I do mapping for an element that's repeatable ? |
|
|
Centurion
Joined: 10 Apr 2002 Posts: 123
|
Hi,
I have a compound type 'HeaderLineType' defined that consists of two elements: 'HeaderElement' and 'LineElement'. The 'LineElement' has its repeatable flag set to yes and its min occurs set to 1 and max occurs set to 10.
When I map an icoming message with 10 lines to the 'HeaderLineType' message in the compute node, how can I iterate through the 10 'LineElement' ?
Thanks for any input,
Alex |
|
Back to top |
|
 |
kirani |
Posted: Thu May 23, 2002 5:14 pm Post subject: |
|
|
Jedi Knight
Joined: 05 Sep 2001 Posts: 3779 Location: Torrance, CA, USA
|
Alex,
here is pseudo code ...
totalcount = cardinality(input messaeg with 10 or less number of lines)
i = 1
SET OutputRoot.MRM."HeaderElement" = value from input data or constant.
while ( i < totalcount)
SET OutputRoot.MRM."LineElement"[i] = InputRoot.XXX.Line[i];
SET i = i+1;
END WHILE; _________________ Kiran
IBM Cert. Solution Designer & System Administrator - WBIMB V5
IBM Cert. Solutions Expert - WMQI
IBM Cert. Specialist - WMQI, MQSeries
IBM Cert. Developer - MQSeries
|
|
Back to top |
|
 |
AlexeiSkate |
Posted: Mon Jun 10, 2002 11:52 am Post subject: |
|
|
Centurion
Joined: 10 Apr 2002 Posts: 123
|
Kirani,
Should the inequality comparison in the while loop be less than or equal to, e.g. WHILE ( i <= totalcount ) ....
Let say you have a msg with a header and repeating lines, and there is only one line. You initialize i = 1. You set totalCount = cardinality(InputRoot.XML."lineElements"[]) which means that totalCount will also be set to 1. The while loop would then never execute if you test only for ' < totalCount ', correct ? You would have to use <= totalCount for the loop to execute at least once.
I'm having some trouble mapping a repeating line to a repeating line, getting an "XML Writing Errors have occurred. No valid body of the document could be found" but can't find what is wrong with the output XML msg being generated when viewed with the traceNode. I'm not sure if maybe using '<=' instead of only '<' in the while condition test might have something to do with it, though it seems unlikely. |
|
Back to top |
|
 |
kirani |
Posted: Mon Jun 10, 2002 12:10 pm Post subject: |
|
|
Jedi Knight
Joined: 05 Sep 2001 Posts: 3779 Location: Torrance, CA, USA
|
oops ... sorry I missed '=' in my post!
As you pointed out the while statement should be like this ..
Code: |
while ( i <= totalcount)
|
Quote: |
XML Writing Errors have occurred. No valid body of the document could be found. |
This error indicates that logical message tree is not matching with your message definition in MRM. Changes made in while loop should not cause this error. Could you post a sample input message and required output message format here? _________________ Kiran
IBM Cert. Solution Designer & System Administrator - WBIMB V5
IBM Cert. Solutions Expert - WMQI
IBM Cert. Specialist - WMQI, MQSeries
IBM Cert. Developer - MQSeries
|
|
Back to top |
|
 |
AlexeiSkate |
Posted: Mon Jun 10, 2002 12:37 pm Post subject: |
|
|
Centurion
Joined: 10 Apr 2002 Posts: 123
|
--- This is the Input msg dtd that was imported into WMQI
<!-- MellonDepositConfirmationFile Interface Message Definitions -->
<!-- Interface Control Data (shared) -->
<!ENTITY % controlData SYSTEM "MessageControlData.dtd">
%controlData;
<!-- Message Definitions -->
<!ELEMENT MellonDepositConfirmationTransaction (MessageControlData,(MD01,MD02,MellonDepositConfirmationLine+))>
<!ATTLIST MellonDepositConfirmationTransaction version CDATA #FIXED "1.0">
<!-- Record Definitions -->
<!ELEMENT MD01 (FILLER1,RECORDTYPE,RECORDSEQUENCE,BANKNUMBER,CHAINPARENT,DEPOSITSOURCE,TRANSMISSIONSITE,LETTERSERIALNUMBER,MERCHANTNUMBER,D7TRANSACTIONREFERENCENUMBER,AMOUNTDEPOSITREPRESENTED,SIGNOFDEPOSITAMOUNT,DEPOSITADJUSTMENTAMOUNT,SIGNOFDEPOSITADJUSTMENTAMOUNT,DATEDEPOSITPROCESSED,FUNDINGCBMETHOD,FUNDINGCBACCOUNTNUMBER,FUNDINGCBTRANSITROUTINGNUMBER,FUNDINGCBLISTPOSTIDENTIFIER,FUNDINGLEVELRELATIONSHIP,FUNDINGADJUSTMENTIDENTIFIER,DEPOSITSTATUS,MERCHANTSTATUS,FILLER2)>
<!ELEMENT MD02 (FILLER1,RECORDTYPE,RECORDSEQUENCE,MERCHANTDESCRIPTIVE,MERCHANTPHONENUMBER,MERCHANTFAXNUMBER,MERCHANTMCC,MERCHANT5DIGITZIP,MERCHANT4DIGITZIP,FILLER2)>
<!ELEMENT MellonDepositConfirmationLine (TD01, TD02)>
<!ELEMENT TD01 (FILLER1,RECORDTYPE,RECORDSEQUENCE,MTRANSACTIONTYPE,CARDHOLDERNUMBER,CARDTYPE,AUTHORIZATIONCODE,D7TRANSACTIONREFERENCENUMBER,INTERCHANGECLASS,DETAILSTATUSCODE,DATEOFTRANSACTION,MICROFILMNUMBER,TRANSACTIONAMOUNT,POSTERMINALCAPABILITY,POSENTRYMODE,AUTHSOURCE,CARDHOLDERIDMETHOD,SWITCHSETTLEMENTDATE,CREDITDEBITINDICATOR,PAYMENTSERVICEINDICATOR,TRANSACTIONIDENTIFIER,VALIDATIONCODE,AUTHRESPONSECODE,AUTHORIZEDAMOUNT,AUTHCURRENCYCODE,CREDITSETTLEMENTINDICATOR,FILLER2)>
<!ELEMENT TD02 (FILLER1,RECORDTYPE,RECORDSEQUENCE,FUNDINGDATE,FILLER2)>
<!-- Field Definitions -->
<!ELEMENT FILLER1 (#PCDATA)>
<!ELEMENT RECORDTYPE (#PCDATA)>
<!ELEMENT RECORDSEQUENCE (#PCDATA)>
<!ELEMENT BANKNUMBER (#PCDATA)>
<!ELEMENT CHAINPARENT (#PCDATA)>
<!ELEMENT DEPOSITSOURCE (#PCDATA)>
<!ELEMENT TRANSMISSIONSITE (#PCDATA)>
<!ELEMENT LETTERSERIALNUMBER (#PCDATA)>
<!ELEMENT MERCHANTNUMBER (#PCDATA)>
<!ELEMENT D7TRANSACTIONREFERENCENUMBER (#PCDATA)>
<!ELEMENT AMOUNTDEPOSITREPRESENTED (#PCDATA)>
<!ELEMENT SIGNOFDEPOSITAMOUNT (#PCDATA)>
<!ELEMENT DEPOSITADJUSTMENTAMOUNT (#PCDATA)>
<!ELEMENT SIGNOFDEPOSITADJUSTMENTAMOUNT (#PCDATA)>
<!ELEMENT DATEDEPOSITPROCESSED (#PCDATA)>
<!ELEMENT FUNDINGCBMETHOD (#PCDATA)>
<!ELEMENT FUNDINGCBACCOUNTNUMBER (#PCDATA)>
<!ELEMENT FUNDINGCBTRANSITROUTINGNUMBER (#PCDATA)>
<!ELEMENT FUNDINGCBLISTPOSTIDENTIFIER (#PCDATA)>
<!ELEMENT FUNDINGLEVELRELATIONSHIP (#PCDATA)>
<!ELEMENT FUNDINGADJUSTMENTIDENTIFIER (#PCDATA)>
<!ELEMENT DEPOSITSTATUS (#PCDATA)>
<!ELEMENT MERCHANTSTATUS (#PCDATA)>
<!ELEMENT FILLER2 (#PCDATA)>
<!ELEMENT MERCHANTDESCRIPTIVE (#PCDATA)>
<!ELEMENT MERCHANTPHONENUMBER (#PCDATA)>
<!ELEMENT MERCHANTFAXNUMBER (#PCDATA)>
<!ELEMENT MERCHANTMCC (#PCDATA)>
<!ELEMENT MERCHANT5DIGITZIP (#PCDATA)>
<!ELEMENT MERCHANT4DIGITZIP (#PCDATA)>
<!ELEMENT MTRANSACTIONTYPE (#PCDATA)>
<!ELEMENT CARDHOLDERNUMBER (#PCDATA)>
<!ELEMENT CARDTYPE (#PCDATA)>
<!ELEMENT AUTHORIZATIONCODE (#PCDATA)>
<!ELEMENT INTERCHANGECLASS (#PCDATA)>
<!ELEMENT DETAILSTATUSCODE (#PCDATA)>
<!ELEMENT DATEOFTRANSACTION (#PCDATA)>
<!ELEMENT MICROFILMNUMBER (#PCDATA)>
<!ELEMENT TRANSACTIONAMOUNT (#PCDATA)>
<!ELEMENT POSTERMINALCAPABILITY (#PCDATA)>
<!ELEMENT POSENTRYMODE (#PCDATA)>
<!ELEMENT AUTHSOURCE (#PCDATA)>
<!ELEMENT CARDHOLDERIDMETHOD (#PCDATA)>
<!ELEMENT SWITCHSETTLEMENTDATE (#PCDATA)>
<!ELEMENT CREDITDEBITINDICATOR (#PCDATA)>
<!ELEMENT PAYMENTSERVICEINDICATOR (#PCDATA)>
<!ELEMENT TRANSACTIONIDENTIFIER (#PCDATA)>
<!ELEMENT VALIDATIONCODE (#PCDATA)>
<!ELEMENT AUTHRESPONSECODE (#PCDATA)>
<!ELEMENT AUTHORIZEDAMOUNT (#PCDATA)>
<!ELEMENT AUTHCURRENCYCODE (#PCDATA)>
<!ELEMENT CREDITSETTLEMENTINDICATOR (#PCDATA)>
<!ELEMENT FUNDINGDATE (#PCDATA)>
**** This is the Ouput Msg dtd that was imported into WMQI
<!ELEMENT GeneralLedgerVoucherCanonical (HeaderElements,LineElements+)>
<!ATTLIST GeneralLedgerVoucherCanonical version CDATA #FIXED "1.0">
<!-- Record Definitions -->
<!ELEMENT HeaderElements (CEVENTCLASSIFICATION?,CEVENTDOCID?,CEVENTDATE?,CEVENTACTION?,CEVENTLINEID?,CSITEID?,CACCOUNTINGPERIOD?,CDESCRIPTION?,CDOCUMENTTYPE?,CREPORTINGACCOUNTINGPERIOD?)>
<!ELEMENT LineElements (CACTIVITY?,CBEGINNINGBFY?,CBUDGETOBJECT?,CCANCELEDBEGINNINGBFY?,CCANCELEDENDBFY?,CCANCELEDFUND?,CCOSTORGANIZATION?,CLEVEL1ORGANIZATION?,CLEVEL2ORGANIZATION?,CENDBFY?,CFUND?,CPROGRAM?,CPROJECT?,CSUBBUDGETOBJECT?,CSUBCOSTORGANIZATION?,CSUBORGANIZATION?,CSUBPROJECT?,CUSERDIMENSION1?,CUSERDIMENSION2?,CUSERDIMENSION3?,CUSERDIMENSION4?,CUSERDIMENSION5?,CACCOUNTINGTEMPLATEID?,CREIMBURSEMENTOBJECTCODE?,CREIMBURSEMENTSUBOBJECTCODE?,CREVENUESOURCE?,CAGREEMENTLINENUMBER?,CAGREEMENTNUMBER?,CREFERENCEDCOMMODITYLINENUMBER?,CREFERENCEDDOCUMENTNUMBER?,CREFERENCEDDOCUMENTTYPE?,CREFERENCEDACCOUNTINGLINENUMBER?,CACCOMPLISHEDDATE?,CACCOUNTINGPERIOD?,CDESCRIPTION?,CLINEAMOUNT?,CTRANSACTIONTYPE?,CVENDORCODE?,CPOSTINGEVENTIDENTIFIER?,CINCREASEDECREASEFLAG?)>
<!-- Field Definitions -->
<!ELEMENT CEVENTCLASSIFICATION (#PCDATA)>
<!ELEMENT CEVENTDOCID (#PCDATA)>
<!ELEMENT CEVENTDATE (#PCDATA)>
<!ELEMENT CEVENTACTION (#PCDATA)>
<!ELEMENT CEVENTLINEID (#PCDATA)>
<!ELEMENT CSITEID (#PCDATA)>
<!ELEMENT CACCOUNTINGPERIOD (#PCDATA)>
<!ELEMENT CDESCRIPTION (#PCDATA)>
<!ELEMENT CDOCUMENTTYPE (#PCDATA)>
<!ELEMENT CREPORTINGACCOUNTINGPERIOD (#PCDATA)>
<!ELEMENT CACTIVITY (#PCDATA)>
<!ELEMENT CBEGINNINGBFY (#PCDATA)>
<!ELEMENT CBUDGETOBJECT (#PCDATA)>
<!ELEMENT CCANCELEDBEGINNINGBFY (#PCDATA)>
<!ELEMENT CCANCELEDENDBFY (#PCDATA)>
<!ELEMENT CCANCELEDFUND (#PCDATA)>
<!ELEMENT CCOSTORGANIZATION (#PCDATA)>
<!ELEMENT CLEVEL1ORGANIZATION (#PCDATA)>
<!ELEMENT CLEVEL2ORGANIZATION (#PCDATA)>
<!ELEMENT CENDBFY (#PCDATA)>
<!ELEMENT CFUND (#PCDATA)>
<!ELEMENT CPROGRAM (#PCDATA)>
<!ELEMENT CPROJECT (#PCDATA)>
<!ELEMENT CSUBBUDGETOBJECT (#PCDATA)>
<!ELEMENT CSUBCOSTORGANIZATION (#PCDATA)>
<!ELEMENT CSUBORGANIZATION (#PCDATA)>
<!ELEMENT CSUBPROJECT (#PCDATA)>
<!ELEMENT CUSERDIMENSION1 (#PCDATA)>
<!ELEMENT CUSERDIMENSION2 (#PCDATA)>
<!ELEMENT CUSERDIMENSION3 (#PCDATA)>
<!ELEMENT CUSERDIMENSION4 (#PCDATA)>
<!ELEMENT CUSERDIMENSION5 (#PCDATA)>
<!ELEMENT CACCOUNTINGTEMPLATEID (#PCDATA)>
<!ELEMENT CREIMBURSEMENTOBJECTCODE (#PCDATA)>
<!ELEMENT CREIMBURSEMENTSUBOBJECTCODE (#PCDATA)>
<!ELEMENT CREVENUESOURCE (#PCDATA)>
<!ELEMENT CAGREEMENTLINENUMBER (#PCDATA)>
<!ELEMENT CAGREEMENTNUMBER (#PCDATA)>
<!ELEMENT CREFERENCEDCOMMODITYLINENUMBER (#PCDATA)>
<!ELEMENT CREFERENCEDDOCUMENTNUMBER (#PCDATA)>
<!ELEMENT CREFERENCEDDOCUMENTTYPE (#PCDATA)>
<!ELEMENT CREFERENCEDACCOUNTINGLINENUMBER (#PCDATA)>
<!ELEMENT CACCOMPLISHEDDATE (#PCDATA)>
<!ELEMENT CLINEAMOUNT (#PCDATA)>
<!ELEMENT CTRANSACTIONTYPE (#PCDATA)>
<!ELEMENT CVENDORCODE (#PCDATA)>
<!ELEMENT CPOSTINGEVENTIDENTIFIER (#PCDATA)>
<!ELEMENT CINCREASEDECREASEFLAG (#PCDATA)>
**** This is the Output XML Msg coming out of the Compute Node mapping
(
(0x1000000)Properties = (
(0x3000000)MessageSet = 'DP6FPGG088001'
(0x3000000)MessageType = 'm_GeneralLedgerVoucherCanonical'
(0x3000000)MessageFormat = ''
(0x3000000)Encoding = 273
(0x3000000)CodedCharSetId = 819
(0x3000000)Transactional = TRUE
(0x3000000)Persistence = FALSE
(0x3000000)CreationTime = GMTTIMESTAMP '2002-06-10 20:53:14.042'
(0x3000000)ExpirationTime = -1
(0x3000000)Priority = 0
(0x3000000)ReplyIdentifier = X'000000000000000000000000000000000000000000000000'
(0x3000000)ReplyProtocol = 'MQ'
(0x3000000)Topic = NULL
)
(0x1000000)MQMD = (
(0x3000000)SourceQueue = 'MELLONBANK_DEPOSITCONFIRMATION'
(0x3000000)Transactional = TRUE
(0x3000000)Encoding = 273
(0x3000000)CodedCharSetId = 819
(0x3000000)Format = 'MQSTR '
(0x3000000)Version = 2
(0x3000000)Report = 0
(0x3000000)MsgType = 8
(0x3000000)Expiry = -1
(0x3000000)Feedback = 0
(0x3000000)Priority = 0
(0x3000000)Persistence = 0
(0x3000000)MsgId = X'414d51204d5153495f53414d504c455fe9fc043d12a00100'
(0x3000000)CorrelId = X'000000000000000000000000000000000000000000000000'
(0x3000000)BackoutCount = 0
(0x3000000)ReplyToQ = ' '
(0x3000000)ReplyToQMgr = 'MQSI_SAMPLE_QM '
(0x3000000)UserIdentifier = 'aphan '
(0x3000000)AccountingToken = X'16010515000000828ba62842c77452235f636b3811000000000000000000000b'
(0x3000000)ApplIdentityData = ' '
(0x3000000)PutApplType = 11
(0x3000000)PutApplName = 'C:\winnt\system32\java.exe '
(0x3000000)PutDate = DATE '2002-06-10'
(0x3000000)PutTime = GMTTIME '20:53:29.470'
(0x3000000)ApplOriginData = ' '
(0x3000000)GroupId = X'000000000000000000000000000000000000000000000000'
(0x3000000)MsgSeqNumber = 1
(0x3000000)Offset = 0
(0x3000000)MsgFlags = 0
(0x3000000)OriginalLength = -1
)
(0x1000010)XML = (
(0x1000000)HeaderElements = (
(0x1000000)CDESCRIPTION = (
(0x2000000) = 'MellonBankInterface. Deposit Number: 458983 Deposit Date: 032202'
)
(0x1000000)CEVENTDOCID = (
(0x2000000) = 'XX_458983_032202_SSSS'
)
(0x1000000)CEVENTCLASSIFICATION = (
(0x2000000) = 'SV'
)
(0x1000000)CEVENTACTION = (
(0x2000000) = 'New'
)
(0x1000000)CSITEID = (
(0x2000000) = 'MELLON'
)
(0x1000000)CDOCUMENTTYPE = (
(0x2000000) = 'CC'
)
)
(0x1000000)LineElements = (
(0x1000000)CREFERENCEDACCOUNTINGLINENUMBER = (
(0x2000000) = '1'
)
(0x1000000)CTRANSACTIONTYPE = (
(0x2000000) = '01'
)
(0x1000000)CPOSTINGEVENTIDENTIFIER = (
(0x2000000) = 'glTransfer'
)
)
)
)
--- This is the ESQL mapping logic I used for the repeating lines mapping. If I only map the header then I don't get an exception.
DECLARE i INTEGER;
SET i = 1;
WHILE i <= CARDINALITY(InputRoot.XML."MellonDepositConfirmationTransaction"."MellonDepositConfirmationLine"[]) DO
SET "OutputRoot"."XML"."LineElements"[i]."CREFERENCEDACCOUNTINGLINENUMBER" = '1';
SET "OutputRoot"."XML"."LineElements"[i]."CTRANSACTIONTYPE" = '01';
SET "OutputRoot"."XML"."LineElements"[i]."CPOSTINGEVENTIDENTIFIER" = 'glTransfer';
SET i = i + 1;
END WHILE;
Thanks,
Alex |
|
Back to top |
|
 |
AlexeiSkate |
Posted: Mon Jun 10, 2002 2:22 pm Post subject: |
|
|
Centurion
Joined: 10 Apr 2002 Posts: 123
|
Kiran,
I got the line mapping to work by using the (XML.tag) qualifier in my reference to the LineElements mapping:
SET "OutputRoot".XML.(XML.tag)."LineElements"[i]."CREFERENCEDACCOUNTINGLINENUMBER" = '1';
It's stated in a Redbook that
Quote: |
it is a good practice to include the (XML.tag) qualifier, because in a well-formed XML document with an XML document header, the parser may misinterpret your XML message body tag references as being references to attributes of the XML document header. |
I guess it means that the XML parser thought that my references to the lineElements tags were for the XML document header when I didn't include the (XML.tag) qualifier.
- Alex |
|
Back to top |
|
 |
kirani |
Posted: Mon Jun 10, 2002 3:42 pm Post subject: |
|
|
Jedi Knight
Joined: 05 Sep 2001 Posts: 3779 Location: Torrance, CA, USA
|
That's great!
But, I don't think you are making use of DTD for output message here. In your compute node if you are write
OutputRoot.XML..... it will use self-defining XML instead of XML defined into MRM.
For making use of XML defined into MRM you should set appropriate values to Message properties by writing ..
SET OutputRoot.Properties.MessageDomain ='MRM';
SET OutputRoot.Properties.MessageSet = Your Messageset ID;
SET OutputRoot.Properties.MessageType = Your message ID;
SET OutputRoot.Properties.MessageFormat ='XML';
In your compute node, you should use something like ..
SET OutputRoot.MRM.HeaderElements.CEVENTCLASSIFICATION = 'A';
....
WHILE ...
SET OutputRoot.MRM.LineElements[i].CACTIVITY = something;
....
end while;
Hope this helps. _________________ Kiran
IBM Cert. Solution Designer & System Administrator - WBIMB V5
IBM Cert. Solutions Expert - WMQI
IBM Cert. Specialist - WMQI, MQSeries
IBM Cert. Developer - MQSeries
|
|
Back to top |
|
 |
|
|
 |
|
Page 1 of 1 |
|
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot vote in polls in this forum
|
|
|
|