Hi Martin,
As per your inputs i have changed my approach by creating two separate request for invoice and packing slip scenarios, but when am adding my values to Subcontract parm methods - the values are overridden with the new rather than storing them as list.
Service Request:
<?xml version="1.0"?>
<LoginResponse>
<CustId>1234ab5678</CustId>
<Date>10/10/2018</Date>
</LoginResponse>
Expected Response Schema:
<?xml version="1.0"?>
<CustomerInfoResponse>
<CustId>1234ab5678</CustId>
<Date>10/10/2018</Date>
<SalesOrder>
<SalesId>800000XXX1</SalesId>
<SaleTransDate>10/10/2018</SaleTransDate>
<Address>123 MG Road, 219435</Address>
<Invoice>
<InvoiceNumber>914200XXX1</InvoiceNumber>
<Amount>13434</Amount>
</Invoice>
<Invoice>
<InvoiceNumber>914200XXX2</InvoiceNumber>
<Amount>1200</Amount>
</Invoice>
<Invoice>
<InvoiceNumber>914200XXX3</InvoiceNumber>
<Amount>11453</Amount>
</Invoice>
</SalesOrder>
</CustomerInfoResponse>
Below are the classes that i have used to achieve the expected results,
InvoiceDataContract:
[
DataContractAttribute("Invoice")
]
class InvoiceContract
{
str InvoiceNumber;
AmountMST Amount;
}
[
DataMemberAttribute("InvoiceNumber")
]
public str parmInvoiceNumber(str _InvoiceNumber = InvoiceNumber)
{
InvoiceNumber = _InvoiceNumber ;
return InvoiceNumber ;
}
[
DataMemberAttribute("Amount")
]
public AmountMST parmAmount(AmountMST _Amount= Amount)
{
Amount= _Amount;
return Amount;
}
SalesOrderDataContract:
[
DataContractAttribute("SalesOrder")
]
class SalesOrderContract
{
str SalesId;
TransDate SaleTransDate;
LogisticsAddressing Address;
List Invoive;
}
[
DataMemberAttribute("SalesId")
]
public str parmSalesId(str _SalesId= SalesId)
{
SalesId= _SalesId;
return SalesId;
}
[
DataMemberAttribute("SaleTransDate")
]
public TransDate parmSaleTransDate(TransDate _SaleTransDate= SaleTransDate)
{
SaleTransDate= _SaleTransDate;
return SaleTransDate;
}
[
DataMemberAttribute("Address")
]
public LogisticsAddressing parmAddress(LogisticsAddressing _Address= Address)
{
Address= _Address;
return Address;
}
[
DataMemberAttribute("Invoice"),
AifCollectionTypeAttribute('return', Types::Class, classstr(InvoiceContract))
]
public List parmInvoice(List _Invoice= Invoice)
{
Invoice = _Invoice;
return Invoice;
}
CustomerInfoResponseContract:
[
DataContractAttribute("CustomerInfoResponse")
]
class CustomerInfoResponseContract
{
str CustId;
TransDate Date;
List SalesOrder;
}
[
DataMemberAttribute("CustId")
]
public str parmCustId(str _CustId= CustId)
{
CustId= _CustId;
return SalesId;
}
[
DataMemberAttribute("Date")
]
public TransDate parmDate(TransDate _Date= Date)
{
Date= _Date;
return Date;
}
[
DataMemberAttribute("SalesOrder"),
AifCollectionTypeAttribute('return', Types::Class, classstr(SalesOrderContract))
]
public List parmSalesOrder(List _SalesOrder= SalesOrder)
{
SalesOrder= _SalesOrder;
return SalesOrder;
}
Service Operation:
[
SysEntryPointAttribute(true),
AifCollectionTypeAttribute('return', Type::Class, classStr(CustomerInfoResponseContract))
]
public List customerInfo(str CustID, TransDate Date)
{
List _customerInfoList = new List(Types::Class);
List _salesorderList = new List(Types::Class);
List _invoiceList = new List(Types::Class);
customerInfoResponseContract = new CustomerInfoResponseContract();
salesOrderContract = new SalesOrderContract ();
invoiceContract= new InvoiceContract();
//After the filtration from Sales and Invoice tables
while select * from salesRecords
{
while select * from invoiceRecords
{
invoiceContract.parmInvoiceNumber(invoiceRecords.InvoiveId);
invoiceContract.parmAmount(invoiceRecords.Amount);
_invoiceList.addEnd(invoiceContract);
}
salesOrderContract.parmSalesId(salesRecords.SalesId);
salesOrderContract.parmSaleTransDate(salesRecord.TransDate);
salesOrderContract.parmAddress(salesRecord.Address);
salesOrderContrat.parmInvoice(_invoiceList);
_salesorderList.addEnd(salesOrderContrat);
}
customerInfoResponseContract .parmCustId(CustId);
customerInfoResponseContract .parmDate(Date);
_customerInfoList .addEnd(customerInfoResponseContract );
return _customerInfoList ;
}
Output:
<?xml version="1.0"?>
<CustomerInfoResponse>
<CustId>1234ab5678</CustId>
<Date>10/10/2018</Date>
<SalesOrder>
<SalesId>800000XXX1</SalesId>
<SaleTransDate>10/10/2018</SaleTransDate>
<Address>123 MG Road, 219435</Address>
<Invoice>
<InvoiceNumber>914200XXX3</InvoiceNumber>
<Amount>11453</Amount>
</Invoice>
<Invoice>
<InvoiceNumber>914200XXX3</InvoiceNumber>
<Amount>11453</Amount>
</Invoice>
<Invoice>
<InvoiceNumber>914200XXX3</InvoiceNumber>
<Amount>11453</Amount>
</Invoice>
</SalesOrder>
</CustomerInfoResponse>
When we are trying to add the new fetched value to parm methods of SubContract Class's(SalesOrder & Invoice), the old values that are already in the list are also overridden and that is why the last fetched value is looped in the list.
I believe that i should mark the parm methods of the subcontract as list as well which will then add the new values to it one by one, and to achieve that i have added AifCollectionTypeAttribute(), and List on the method signatures as shown below:
InvoiceDataContract:
[
DataContractAttribute("Invoice")
]
class InvoiceContract
{
List InvoiceNumber;
List Amount;
}
[
DataMemberAttribute("InvoiceNumber"),
AifCollectionTypeAttribute('return', Type::Class, classStr(InvoiceContract))
]
public List parmInvoiceNumber(List _InvoiceNumber = InvoiceNumber)
{
InvoiceNumber = _InvoiceNumber ;
return InvoiceNumber ;
}
[
DataMemberAttribute("Amount"),
AifCollectionTypeAttribute('return', Type::Class, classStr(InvoiceContract))
]
public List parmAmount(List_Amount= Amount)
{
Amount= _Amount;
return Amount;
}
But i am facing issue, as we have errors when consuming the Service through VS.
I request you to help me to add list of values to parm methods of a DataContract(Invoice Contract) class and adding that particular DataContract to another parm method of DataContract(SalesOrder Contract).
Thank you in advance!!