unbounded array inside an unbounded array

I have an issue where I have an unbounded array (Array 1) inside of another unbounded array (Array 2).

Array 1 is fine in every scenario. And as long as every item in Array 1 has the exact same number of items inside of Array 2 I am also ok.
Example of one that works fine

John555555554444444
Jane6666666677777777

My problem comes when items in array 1 have differing numbers of items in array 2. For example see below where only one person is array as 2 phones and the other has 1 phone.

John555555554444444
Jane66666666

Again Array 1 is fine but Array 2 is where is breaks. I can see the issue in my Integration Server logs and it appears in this case the EntireX data marshaller is not sure how to react and sees the phonelist as being NULL for each Person in Array 1.

I am still reading through some documentation to try and find an answer but we are in a hurry to get this resolved so I thought I would ask for help as well.

I am on Integration Server 8.2.1 Fix 4. EntireX adapter version 8.2.1.0.79.

Thanks

Joe

  1. can you post your IDL?
  2. what error are you getting?
  3. did you modify any of the XML Mapping options?
  4. who’s calling what? That is, is the mainframe (Natural? COBOL??) calling IS or is IS calling mainframe RPC service? if so, what are the versions of the mainframe components (RPC server, Natural)?

I went with a more simple example for explanation purposes above but to answer some of your questions I am going to have to revert back to using the real transactions.

Natural and RPC Server info
In one environment we are running NAT V8231, Natural RPC Server V8231 on MVS/ESA
In one environment we are running NAT V4263, Natural RPC Server V633 on MVS/ESA
Both environment have the same issue.

IDL from transaction
1 I00080N1-IN
2 EOB-INFORMATION
3 CLAIM-NUM (A10)
3 POL-NUM (A10)
3 USER-ID (A3)
3 LINE-INFORMATION-CNT (I4)
3 LINE-INFORMATION (/1:V)
4 FROM-DATE (D)
4 TO-DATE (D)
4 OTHER-INCOME-CNT (I4)
4 OTHER-INCOME (/1:V)
5 OTHER-INCOME-SOURCE-CODE (A4)
5 OTHER-INCOME-AMT (N9.2)

Using this transaction LINE-INFORMATION is always ok. OTHER-INCOME is the one that gets nulled when there is not a consistent number of them on each instance of LINE-INFORMATION. (If there are 2 OTHER-INCOME’s on every LINE-INFORMATION then we are ok. If there are 2 OTHER-INCOME’s on one LINE-INFORMATION and 1 OTHER-INCOME’s on the rest of the LINE-INFORMATIONs, then we get null in all OTHER-INCOME elements.)

There is no error. I can just see in the logs that the values that were passed in are being seen/interpreted as null.
Log examples can been viewed below this message.

Have not modified any XML mapping. IS is calling the mainframe (Natural). When I debug I can see the values being mapped properly from Flow input to the adapter input but can see the null occuring in the logs. There is not an error thrown during execution only noticed due to missing data on the mainframe. Then came to the logs to track the data and noticed this issue. I have also found other transaction that have the same structure of a dynamic array inside a dynamic array and ran tests on them. They are also experiencing it so it is more than just this one instance of the problem.

Let me know if I can provide anything else or if you have any ideas. Appreciate any time you have for me on this. Thank you.

Joe

Failed example:
2014-01-06 10:14:18 [ADA.0800.0444I] WmEntireX: IDataMarshaller: getValue(>>>BasicData:FROM-DATE=Jul 31, 2013,TO-DATE=Aug 20, 2013, OTHER-INCOME-CNT=2<<<, OTHER-INCOME) = null

2014-01-06 10:14:18 [ADA.0800.0444I] WmEntireX: IDataMarshaller: createValue(>>>BasicData:FROM-DATE=Jun 29, 2013,TO-DATE=Jul 5, 2013<<<, OTHER-INCOME-CNT, 2
2014-01-06 10:14:18 [ADA.0800.0444I] WmEntireX: IDataMarshaller: createStructureHandle()
2014-01-06 10:14:18 [ADA.0800.0444I] WmEntireX: IDataMarshaller: createValue(>>>BasicData:<<<, OTHER-INCOME-SOURCE-CODE,
2014-01-06 10:14:18 [ADA.0800.0444I] WmEntireX: IDataMarshaller: createValue(>>>BasicData:OTHER-INCOME-SOURCE-CODE=<<<, OTHER-INCOME-AMT, 0.00
2014-01-06 10:14:18 [ADA.0800.0444I] WmEntireX: IDataMarshaller: createStructureHandle()
2014-01-06 10:14:18 [ADA.0800.0444I] WmEntireX: IDataMarshaller: createValue(>>>BasicData:<<<, OTHER-INCOME-SOURCE-CODE,
2014-01-06 10:14:18 [ADA.0800.0444I] WmEntireX: IDataMarshaller: createValue(>>>BasicData:OTHER-INCOME-SOURCE-CODE=<<<, OTHER-INCOME-AMT, 0.00

Good Example
2014-01-06 10:13:47 [ADA.0800.0444I] WmEntireX: IDataMarshaller: getValue(>>>BasicData:FROM-DATE=Jul 31, 2013,TO-DATE=Aug 20, 2013,OTHER-INCOME-CNT=2,OTHER-INCOME=[0]>>>BasicData:OTHER-INCOME-SOURCE-CODE=UI,OTHER-INCOME-AMT=1000<<<,[1]>>>BasicData:OTHER-INCOME-SOURCE-CODE=OD,OTHER-INCOME-AMT=800<<<<<<, OTHER-INCOME) = [Lcom.wm.data.IData;@6a57183c
2014-01-06 10:13:47 [ADA.0800.0444I] WmEntireX: IDataMarshaller: getValue(>>>BasicData:OTHER-INCOME-SOURCE-CODE=UI,OTHER-INCOME-AMT=1000<<<, OTHER-INCOME-SOURCE-CODE) = UI
2014-01-06 10:13:47 [ADA.0800.0444I] WmEntireX: IDataMarshaller: getValue(>>>BasicData:OTHER-INCOME-SOURCE-CODE=UI,OTHER-INCOME-AMT=1000<<<, OTHER-INCOME-AMT) = 1000
2014-01-06 10:13:47 [ADA.0800.0444I] WmEntireX: IDataMarshaller: getValue(>>>BasicData:OTHER-INCOME-SOURCE-CODE=OD,OTHER-INCOME-AMT=800<<<, OTHER-INCOME-SOURCE-CODE) = OD
2014-01-06 10:13:47 [ADA.0800.0444I] WmEntireX: IDataMarshaller: getValue(>>>BasicData:OTHER-INCOME-SOURCE-CODE=OD,OTHER-INCOME-AMT=800<<<, OTHER-INCOME-AMT) = 800
2014-01-06 10:13:47 [ADA.0800.0444I] WmEntireX: IDataMarshaller: createValue(>>>BasicData:FROM-DATE=Jul 31, 2013,TO-DATE=Aug 20, 2013<<<, OTHER-INCOME-CNT, 2
2014-01-06 10:13:47 [ADA.0800.0444I] WmEntireX: IDataMarshaller: createStructureHandle()
2014-01-06 10:13:47 [ADA.0800.0444I] WmEntireX: IDataMarshaller: createValue(>>>BasicData:<<<, OTHER-INCOME-SOURCE-CODE, UI
2014-01-06 10:13:47 [ADA.0800.0444I] WmEntireX: IDataMarshaller: createValue(>>>BasicData:OTHER-INCOME-SOURCE-CODE=UI<<<, OTHER-INCOME-AMT, 1000.00
2014-01-06 10:13:47 [ADA.0800.0444I] WmEntireX: IDataMarshaller: createStructureHandle()
2014-01-06 10:13:47 [ADA.0800.0444I] WmEntireX: IDataMarshaller: createValue(>>>BasicData:<<<, OTHER-INCOME-SOURCE-CODE, OD
2014-01-06 10:13:47 [ADA.0800.0444I] WmEntireX: IDataMarshaller: createValue(>>>BasicData:OTHER-INCOME-SOURCE-CODE=OD<<<, OTHER-INCOME-AMT, 800.00

Hello Joe,

according to the log the IS flow simply does not pass any value for OTHER-INCOME. That’s the reason why it is null:

getValue(>>>BasicData:FROM-DATE=Jul 31, 2013,TO-DATE=Aug 20, 2013, OTHER-INCOME-CNT=2<<<, OTHER-INCOME)

But the value is there and it is being passed. I can see it in the web service call I am performing, in the SOAP log entry (if I select SOAP as logging option), and in flow debug mode I can see it properly written to the input document of the adapter. The first location where I can see that something has not occurred as expected is in the WmEntireX: IDataMarshaller: log entries.

The only thing that is different on my good example and bad example is the fact that on the good examples there were always 2 OTHER-INCOME for each LINE-INFORMATION…On the bad there is a random number of OTHER-INCOME for each LINE-INFORMATION.

This works:


			<EOBInformation>
				<ClaimNumber>3333333</ClaimNumber>
				<PolicyNumber>444444</PolicyNumber>
				<UserId>1</UserId>
				<LineInformationCount>3</LineInformationCount>
				<DisabilityLineInformationList>
					<DisabilityLineInformation>
						<FromDate>2013-06-29T00:00:00</FromDate>
						<ToDate>2013-07-05T00:00:00</ToDate>
						<OtherIncomeCount>2</OtherIncomeCount>
						<OtherIncomeList>
							<OtherIncome>
								<OtherIncomeSourceCode>12</OtherIncomeSourceCode>
								<OtherIncomeAmount>800</OtherIncomeAmount>
							</OtherIncome>
							<OtherIncome>
								<OtherIncomeSourceCode>12</OtherIncomeSourceCode>
								<OtherIncomeAmount>800</OtherIncomeAmount>
							</OtherIncome>
						</OtherIncomeList>
					</DisabilityLineInformation>
					<DisabilityLineInformation>
						<FromDate>2013-07-06T00:00:00</FromDate>
						<ToDate>2013-07-07T00:00:00</ToDate>
						<OtherIncomeCount>2</OtherIncomeCount>
						<OtherIncomeList>
							<OtherIncome>
								<OtherIncomeSourceCode>12</OtherIncomeSourceCode>
								<OtherIncomeAmount>800</OtherIncomeAmount>
							</OtherIncome>
							<OtherIncome>
								<OtherIncomeSourceCode>12</OtherIncomeSourceCode>
								<OtherIncomeAmount>800</OtherIncomeAmount>
							</OtherIncome>
						</OtherIncomeList>
					</DisabilityLineInformation>
					<DisabilityLineInformation>
						<FromDate>2013-07-06T00:00:00</FromDate>
						<ToDate>2013-07-07T00:00:00</ToDate>
						<OtherIncomeCount>2</OtherIncomeCount>
						<OtherIncomeList>
							<OtherIncome>
								<OtherIncomeSourceCode>12</OtherIncomeSourceCode>
								<OtherIncomeAmount>800</OtherIncomeAmount>
							</OtherIncome>
							<OtherIncome>
								<OtherIncomeSourceCode>12</OtherIncomeSourceCode>
								<OtherIncomeAmount>800</OtherIncomeAmount>
							</OtherIncome>
						</OtherIncomeList>
					</DisabilityLineInformation>
			</EOBInformation>

This produces the issue:


<EOBInformation>
				<ClaimNumber>3333333</ClaimNumber>
				<PolicyNumber>444444</PolicyNumber>
				<UserId>1</UserId>
				<LineInformationCount>3</LineInformationCount>
				<DisabilityLineInformationList>
					<DisabilityLineInformation>
						<FromDate>2013-06-29T00:00:00</FromDate>
						<ToDate>2013-07-05T00:00:00</ToDate>
						<OtherIncomeCount>1</OtherIncomeCount>
						<OtherIncomeList>
							<OtherIncome>
								<OtherIncomeSourceCode>12</OtherIncomeSourceCode>
								<OtherIncomeAmount>800</OtherIncomeAmount>
							</OtherIncome>
						</OtherIncomeList>
					</DisabilityLineInformation>
					<DisabilityLineInformation>
						<FromDate>2013-07-06T00:00:00</FromDate>
						<ToDate>2013-07-07T00:00:00</ToDate>
						<OtherIncomeCount>2</OtherIncomeCount>
						<OtherIncomeList>
							<OtherIncome>
								<OtherIncomeSourceCode>12</OtherIncomeSourceCode>
								<OtherIncomeAmount>800</OtherIncomeAmount>
							</OtherIncome>
							<OtherIncome>
								<OtherIncomeSourceCode>12</OtherIncomeSourceCode>
								<OtherIncomeAmount>800</OtherIncomeAmount>
							</OtherIncome>
						</OtherIncomeList>
					</DisabilityLineInformation>
					<DisabilityLineInformation>
						<FromDate>2013-07-06T00:00:00</FromDate>
						<ToDate>2013-07-07T00:00:00</ToDate>
						<OtherIncomeCount>1</OtherIncomeCount>
						<OtherIncomeList>
							<OtherIncome>
								<OtherIncomeSourceCode>12</OtherIncomeSourceCode>
								<OtherIncomeAmount>800</OtherIncomeAmount>
							</OtherIncome>
						</OtherIncomeList>
					</DisabilityLineInformation>
			</EOBInformation>

You should invoke pub.flow:savePipelineToFile before calling the adapter service to check the pipeline which is passed to the adapter service.

BTW you mention that you are using version 8.2.1.0.79 of the EntireX Adapter which is a very old unsupported version. You should upgrade to a more recent version.

Thanks for the advice Rolf…

I checked the pipeline and I can still see the data, and I can see it when I debug being copied properly to the adapter. If there was a pipeline issue I would think my problem would exist in all scenarios not just when I have a non-constant number of elements in the interior array.

We are in the beginning stages of moving to 9 but I do have a test 8.2.2 version (which we have now decided to skip) still stood up here so I started it up to test and it is running EntireX 8.2.2.3.94 4 Jul 2012 14:19:00 . It has the same issue.

I have found that if I send the same number of OtherIncome tags using empty tags on the ones that have less elements then I can make it work (example below). Would prefer to not have to do that though.


<EOBInformation>  
                <ClaimNumber>3333333</ClaimNumber>  
                <PolicyNumber>444444</PolicyNumber>  
                <UserId>1</UserId>  
                <LineInformationCount>3</LineInformationCount>  
                <DisabilityLineInformationList>  
                    <DisabilityLineInformation>  
                        <FromDate>2013-06-29T00:00:00</FromDate>  
                        <ToDate>2013-07-05T00:00:00</ToDate>  
                        <OtherIncomeCount>1</OtherIncomeCount>  
                        <OtherIncomeList>  
                            <OtherIncome>  
                                <OtherIncomeSourceCode>12</OtherIncomeSourceCode>  
                                <OtherIncomeAmount>800</OtherIncomeAmount>  
                            </OtherIncome>  
                            <OtherIncome>  
                                <OtherIncomeSourceCode></OtherIncomeSourceCode>  
                                <OtherIncomeAmount></OtherIncomeAmount>  
                            </OtherIncome>  
                        </OtherIncomeList>  
                    </DisabilityLineInformation>  
                    <DisabilityLineInformation>  
                        <FromDate>2013-07-06T00:00:00</FromDate>  
                        <ToDate>2013-07-07T00:00:00</ToDate>  
                        <OtherIncomeCount>2</OtherIncomeCount>  
                        <OtherIncomeList>  
                            <OtherIncome>  
                                <OtherIncomeSourceCode>12</OtherIncomeSourceCode>  
                                <OtherIncomeAmount>800</OtherIncomeAmount>  
                            </OtherIncome>  
                            <OtherIncome>  
                                <OtherIncomeSourceCode>12</OtherIncomeSourceCode>  
                                <OtherIncomeAmount>800</OtherIncomeAmount>  
                            </OtherIncome>  
                        </OtherIncomeList>  
                    </DisabilityLineInformation>  
                    <DisabilityLineInformation>  
                        <FromDate>2013-07-06T00:00:00</FromDate>  
                        <ToDate>2013-07-07T00:00:00</ToDate>  
                        <OtherIncomeCount>1</OtherIncomeCount>  
                        <OtherIncomeList>  
                            <OtherIncome>  
                                <OtherIncomeSourceCode>12</OtherIncomeSourceCode>  
                                <OtherIncomeAmount>800</OtherIncomeAmount>  
                            </OtherIncome>  
                            <OtherIncome>  
                                <OtherIncomeSourceCode></OtherIncomeSourceCode>  
                                <OtherIncomeAmount></OtherIncomeAmount>  
                            </OtherIncome>  
                        </OtherIncomeList>  
                    </DisabilityLineInformation>  
            </EOBInformation>  

This might also be something unexpected (or something going wrong) on the Natural side.
If you need further assistance I suggest to open a support request.