Author |
Message
|
KIARA |
Posted: Fri May 14, 2004 7:08 am Post subject: cardinality of an XML document |
|
|
Newbie
Joined: 05 Mar 2004 Posts: 9
|
Hi ,
I am trying to loop in a msg flow using the cardinality of an XML message that has been exptracted from a SQL database and put to a queue using JDBC.
I AM REFERENCING THE CARDINALITY AS
declare i integer;
declare x integer;
set i = cardinality (InputRoot.XML.SQLMESSAGE.ROW[]);
set x=1;
while x <= i do
SET OutputRoot.XML.ACCOUNT_NO[x] = InputRoot.XML.SQLMESSAGE.ROW.account_no[x];
set x=x+1;
END WHILE;
set OutputRoot.XML.DATA = InputRoot.XML.SQLMESSAGE.DATA;
the code brings out only the first account code <ACCOUNT_NO>111111</ACCOUNT_NO>
, when I would expect it to bring out a list of the account codes
Has anyone any suggestions?
thanks
k. |
|
Back to top |
|
 |
Missam |
Posted: Fri May 14, 2004 7:13 am Post subject: |
|
|
Chevalier
Joined: 16 Oct 2003 Posts: 424
|
Code: |
set i = cardinality (InputRoot.XML.SQLMESSAGE.ROW[]);
|
i think cardinality should be on account_no than on ROW
Code: |
set i = cardinality (InputRoot.XML.SQLMESSAGE.ROW."acount_no"[]);
|
|
|
Back to top |
|
 |
KIARA |
Posted: Fri May 14, 2004 7:21 am Post subject: cardinality in XML |
|
|
Newbie
Joined: 05 Mar 2004 Posts: 9
|
hi missam
thanks for the reply
yes , I tried that originally but still get the output as <ACCOUNT_NO>111111</ACCOUNT_NO>
there are definitely 2 line coming back from the database as I have fixed it for this, alos if I set the variable = 2 rather that the cardinality of the xml doc the massage fails.
Have you any more suggestions please? |
|
Back to top |
|
 |
Missam |
Posted: Fri May 14, 2004 7:28 am Post subject: |
|
|
Chevalier
Joined: 16 Oct 2003 Posts: 424
|
Quote: |
alos if I set the variable = 2 rather that the cardinality of the xml doc the massage fails.
|
it fails because
Code: |
SET OutputRoot.XML.ACCOUNT_NO[x] = InputRoot.XML.SQLMESSAGE.ROW.account_no[x];
|
for the above statement it creates two root elements and becomes an Invalid XML |
|
Back to top |
|
 |
KIARA |
Posted: Fri May 14, 2004 7:38 am Post subject: |
|
|
Newbie
Joined: 05 Mar 2004 Posts: 9
|
thanks for explaining that - have you any ideas why the code wont loop though using the cardinality function?
k. |
|
Back to top |
|
 |
jefflowrey |
Posted: Fri May 14, 2004 7:48 am Post subject: |
|
|
Grand Poobah
Joined: 16 Oct 2002 Posts: 19981
|
KIARA wrote: |
thanks for explaining that - have you any ideas why the code wont loop though using the cardinality function?
k. |
Use Environment.Variables.x and Environment.Variables.i instead of local integers, and see for yourself what is going on with tracing. _________________ I am *not* the model of the modern major general. |
|
Back to top |
|
 |
JT |
Posted: Fri May 14, 2004 8:02 am Post subject: |
|
|
Padawan
Joined: 27 Mar 2003 Posts: 1564 Location: Hartford, CT.
|
KIARA,
I suggest you turn on a debug trace to see whether the ESQL code is invoking the while loop multiple times or the second occurrence of InputRoot.XML.SQLMESSAGE.ROW.account_no is actually NULL.
Based on your statement:
Quote: |
alos if I set the variable = 2 rather that the cardinality of the xml doc the message fails. |
my guess is the second occurrence of account_no is not there.
Quote: |
there are definitely 2 line coming back from the database as I have fixed it for this |
How do you know this is true? Did you display the cardinality value through a trace node or step through your program code with the debugger? |
|
Back to top |
|
 |
KIARA |
Posted: Mon May 17, 2004 1:16 am Post subject: |
|
|
Newbie
Joined: 05 Mar 2004 Posts: 9
|
hi
I know there are definitley 2 lines as when I bring the flow throught the debugger, I can see the 2 lines and all the values are correct for the 2 lines |
|
Back to top |
|
 |
fschofer |
Posted: Mon May 17, 2004 1:23 am Post subject: |
|
|
 Knight
Joined: 02 Jul 2001 Posts: 524 Location: Mainz, Germany
|
Hi,
how many ROW element do you have ?
Maybe this works:
Code: |
set i = cardinality (InputRoot.XML.SQLMESSAGE.ROW[]);
...
set OutputRoot.XML.ACCOUNT_NO[x] = InputRoot.XML.SQLMESSAGE.ROW[x].account_no; |
Otherwise please post a trace of your incomming XML tree.
Greetings Frank |
|
Back to top |
|
 |
KIARA |
Posted: Mon May 17, 2004 3:13 am Post subject: |
|
|
Newbie
Joined: 05 Mar 2004 Posts: 9
|
hi again,
When I try the following as you suggested the messsage fails
declare i integer;
declare x integer;
set i = cardinality (InputRoot.XML.SQLMESSAGE.ROW[]);
set x = 1;
while x <= i do
set OutputRoot.XML.ACCOUNT_NO[x] = InputRoot.XML.SQLMESSAGE.ROW[x].account_no;
set x = x+ 1;
end while;
__________________________________________________________
but when I use ...
declare i integer;
declare x integer;
set i = cardinality (InputRoot.XML.SQLMESSAGE.ROW[]);
set x=1;
while x <= i do
SET OutputRoot.XML.ACCOUNT_NO[x] = InputRoot.XML.SQLMESSAGE.ROW.account_no[x];
set x=x+1;
END WHILE;
I get an output, but only one line!!
--------------------------------------------------------------------------------
below is an extract from the output trace - it says my output does not exist, thuis it deletes it - I didnt think I had to define an output for XML
fROM THE TRACE YOU CAN SEE THAT IT DOES PICK UP THE CARDINALITY FO THE INPUT AS 2 - IT GOES ON THEN TO Assigning NULL to 'OutputRoot.XML.ACCOUNT_NO', thus deleting it. -
Could you please tell me how to resolve this one
many thanks
kiara
Executing statement 'DECLARE i INTEGER;' at (16, 1).
Executing statement 'DECLARE x INTEGER;' at (17, 1).
Executing statement 'SET i = CARDINALITY(InputRoot.XML.SQLMESSAGE.ROW[ ]);' at (19, 1).
Evaluating expression 'CARDINALITY(InputRoot.XML.SQLMESSAGE.ROW[ ])' at (19, 9).
Finished evaluating expression 'CARDINALITY(InputRoot.XML.SQLMESSAGE.ROW[ ])' at (19, 9). The result was '2'.
Executing statement 'SET x = 1;' at (21, 1).
Executing statement 'WHILE x <= i DO ... END WHILE;' at (23, 1).
Evaluating expression 'x <= i' at (23, 7).
Evaluating expression 'x' at (23, 7).
Evaluating expression 'i' at (23, 12).
Node 'SOLAR_MSGFLOW.Compute2': Finished evaluating expression 'x <= i' at (23, 7). This resolved to '1 <= 2'. The result was 'TRUE'.
Executing statement 'SET OutputRoot.XML.ACCOUNT_NO[x] = InputRoot.XML.SQLMESSAGE.ROW.account_no[x];' at (25, 1).
Evaluating expression 'InputRoot.XML.SQLMESSAGE.ROW.account_no[x]' at (25, 36).
Evaluating expression 'x' at (25, 76).
Evaluating expression 'x' at (25, 31).
'SOLAR_MSGFLOW.Compute2': Performing tree copy of '' to 'OutputRoot.XML.ACCOUNT_NO'.
Executing statement 'SET x = x + 1;' at (29, 1).
Evaluating expression 'x + 1' at (29, .
Evaluating expression 'x' at (29, 7).
Node 'SOLAR_MSGFLOW.Compute2': Finished evaluating expression 'x + 1' at (29, . This resolved to '1 + 1'. The result was '2'.
Evaluating expression 'x <= i' at (23, 7).
Evaluating expression 'x' at (23, 7).
Evaluating expression 'i' at (23, 12).
Node 'SOLAR_MSGFLOW.Compute2': Finished evaluating expression 'x <= i' at (23, 7). This resolved to '2 <= 2'. The result was 'TRUE'.
Executing statement 'SET OutputRoot.XML.ACCOUNT_NO[x] = InputRoot.XML.SQLMESSAGE.ROW.account_no[x];' at (25, 1).
Evaluating expression 'InputRoot.XML.SQLMESSAGE.ROW.account_no[x]' at (25, 36).
Evaluating expression 'x' at (25, 76).
'SOLAR_MSGFLOW.Compute2': (25, 65) : Failed to navigate to path element because it does not exist.
Evaluating expression 'x' at (25, 31).
Evaluating expression 'x' at (25, 31).
'SOLAR_MSGFLOW.Compute2': Assigning NULL to 'OutputRoot.XML.ACCOUNT_NO', thus deleting it.
Executing statement 'SET x = x + 1;' at (29, 1).
Evaluating expression 'x + 1' at (29, .
Evaluating expression 'x' at (29, 7).
Node 'SOLAR_MSGFLOW.Compute2': Finished evaluating expression 'x + 1' at (29, . This resolved to '2 + 1'. The result was '3'.
Evaluating expression 'x <= i' at (23, 7).
evaluating expression 'x' at (23, 7).
Evaluating expression 'i' at (23, 12).
Node 'SOLAR_MSGFLOW.Compute2': Finished evaluating expression 'x <= i' at (23, 7). This resolved to '3 <= 2'. The result was 'FALSE'.
Message propagated to 'out' terminal of compute node 'SOLAR_MSGFLOW.Compute2'.
The MQ output node 'SOLAR_MSGFLOW.SOLAR_DATA_OUT' attempted to write a message to the specified queue 'SOLAR_DATA_OUT_OUT' connected to queue manager ''. The MQCC was 0 and the MQRC was 0.
Message successfully output by MQ output node 'SOLAR_MSGFLOW.SOLAR_DATA_OUT' to queue 'SOLAR_DATA_OUT_OUT' on queue manager ''. |
|
Back to top |
|
 |
|