I need a tip how to make proper get next interator
Input XML, as you can see the element Header contains 'X' and in the next structure not.
I need create the structure "item" until get the next Header with value X.
<?xml version='1.0' encoding='UTF-8'?>
<ns0:XPTO">
<Entry>
<Header>X</Header>
<CompanyCode>SE01</CompanyCode>
<EntryType>TB</EntryType>
<JournalEntryDate>20220514</JournalEntryDate>
<PostingDate>20220514</PostingDate>
<DocumentHeaderText>AtlasFX Hedge</DocumentHeaderText>
<TransactionCurrency>SEK</TransactionCurrency>
<GLAccount>16191800</GLAccount>
<ItemText>AtlasFX Hedge</ItemText>
<DebitAmount>5000</DebitAmount>
<CreditAmount></CreditAmount>
<ProfitCentre>GOXX100000</ProfitCentre>
<AssignmentNumber>AtlasFX Hedge</AssignmentNumber>
<TradingPartner>SE02</TradingPartner>
</Entry>
<Entry>
<Header></Header>
<CompanyCode></CompanyCode>
<EntryType></EntryType>
<JournalEntryDate></JournalEntryDate>
<PostingDate></PostingDate>
<DocumentHeaderText></DocumentHeaderText>
<TransactionCurrency></TransactionCurrency>
<GLAccount>39637500</GLAccount>
<ItemText>AtlasFX Hedge</ItemText>
<DebitAmount></DebitAmount>
<CreditAmount>1000</CreditAmount>
<ProfitCentre>GOXX110000</ProfitCentre>
<AssignmentNumber>AtlasFX Hedge</AssignmentNumber>
<TradingPartner>SE02</TradingPartner>
</Entry>
<Entry>
<Header></Header>
<CompanyCode></CompanyCode>
<EntryType></EntryType>
<JournalEntryDate></JournalEntryDate>
<PostingDate></PostingDate>
<DocumentHeaderText></DocumentHeaderText>
<TransactionCurrency></TransactionCurrency>
<GLAccount>79637500</GLAccount>
<ItemText>AtlasFX Hedge</ItemText>
<DebitAmount>1000</DebitAmount>
<CreditAmount></CreditAmount>
<ProfitCentre>GOXX120000</ProfitCentre>
<AssignmentNumber>AtlasFX Hedge</AssignmentNumber>
<TradingPartner>SE02</TradingPartner>
</Entry>
<Entry>
<Header></Header>
<CompanyCode></CompanyCode>
<EntryType></EntryType>
<JournalEntryDate></JournalEntryDate>
<PostingDate></PostingDate>
<DocumentHeaderText></DocumentHeaderText>
<TransactionCurrency></TransactionCurrency>
<GLAccount>39647500</GLAccount>
<ItemText>AtlasFX Hedge</ItemText>
<DebitAmount></DebitAmount>
<CreditAmount>1000</CreditAmount>
<ProfitCentre>GOXX130000</ProfitCentre>
<AssignmentNumber>AtlasFX Hedge</AssignmentNumber>
<TradingPartner>SE02</TradingPartner>
</Entry>
<Entry>
<Header></Header>
<CompanyCode></CompanyCode>
<EntryType></EntryType>
<JournalEntryDate></JournalEntryDate>
<PostingDate></PostingDate>
<DocumentHeaderText></DocumentHeaderText>
<TransactionCurrency></TransactionCurrency>
<GLAccount>79647500</GLAccount>
<ItemText>AtlasFX Hedge</ItemText>
<DebitAmount>6000</DebitAmount>
<CreditAmount></CreditAmount>
<ProfitCentre>GOXX140000</ProfitCentre>
<AssignmentNumber>AtlasFX Hedge</AssignmentNumber>
<TradingPartner>SE02</TradingPartner>
</Entry>
<Entry>
<Header>X</Header>
<CompanyCode>FI01</CompanyCode>
<EntryType>TB</EntryType>
<JournalEntryDate>20220514</JournalEntryDate>
<PostingDate>20220514</PostingDate>
<DocumentHeaderText>AtlasFX Hedge</DocumentHeaderText>
<TransactionCurrency>EUR</TransactionCurrency>
<GLAccount>16191800</GLAccount>
<ItemText>AtlasFX Hedge</ItemText>
<DebitAmount>300</DebitAmount>
<CreditAmount></CreditAmount>
<ProfitCentre>GO01XX0000</ProfitCentre>
<AssignmentNumber>AtlasFX Hedge</AssignmentNumber>
<TradingPartner>SE02</TradingPartner>
</Entry>
<Entry>
<Header></Header>
<CompanyCode></CompanyCode>
<EntryType></EntryType>
<JournalEntryDate></JournalEntryDate>
<PostingDate></PostingDate>
<DocumentHeaderText></DocumentHeaderText>
<TransactionCurrency></TransactionCurrency>
<GLAccount>39637500</GLAccount>
<ItemText>AtlasFX Hedge</ItemText>
<DebitAmount></DebitAmount>
<CreditAmount>100</CreditAmount>
<ProfitCentre>GO01XX2000</ProfitCentre>
<AssignmentNumber>AtlasFX Hedge</AssignmentNumber>
<TradingPartner>SE02</TradingPartner>
</Entry>
<Entry>
<Header></Header>
<CompanyCode></CompanyCode>
<EntryType></EntryType>
<JournalEntryDate></JournalEntryDate>
<PostingDate></PostingDate>
<DocumentHeaderText></DocumentHeaderText>
<TransactionCurrency></TransactionCurrency>
<GLAccount>79637500</GLAccount>
<ItemText>AtlasFX Hedge</ItemText>
<DebitAmount>100</DebitAmount>
<CreditAmount></CreditAmount>
<ProfitCentre>GO02B00000</ProfitCentre>
<AssignmentNumber>AtlasFX Hedge</AssignmentNumber>
<TradingPartner>SE02</TradingPartner>
</Entry>
<Entry>
<Header></Header>
<CompanyCode></CompanyCode>
<EntryType></EntryType>
<JournalEntryDate></JournalEntryDate>
<PostingDate></PostingDate>
<DocumentHeaderText></DocumentHeaderText>
<TransactionCurrency></TransactionCurrency>
<GLAccount>39647500</GLAccount>
<ItemText>AtlasFX Hedge</ItemText>
<DebitAmount></DebitAmount>
<CreditAmount>300</CreditAmount>
<ProfitCentre>GO02P00000</ProfitCentre>
<AssignmentNumber>AtlasFX Hedge</AssignmentNumber>
<TradingPartner>SE02</TradingPartner>
</Entry>
<Entry>
<Header>X</Header>
<CompanyCode>EE02</CompanyCode>
<EntryType>TB</EntryType>
<JournalEntryDate>20220514</JournalEntryDate>
<PostingDate>20220514</PostingDate>
<DocumentHeaderText>AtlasFX Hedge</DocumentHeaderText>
<TransactionCurrency>EUR</TransactionCurrency>
<GLAccount>16191800</GLAccount>
<ItemText>AtlasFX Hedge</ItemText>
<DebitAmount>1000</DebitAmount>
<CreditAmount></CreditAmount>
<ProfitCentre>GS03P00000</ProfitCentre>
<AssignmentNumber>AtlasFX Hedge</AssignmentNumber>
<TradingPartner>SE02</TradingPartner>
</Entry>
<Entry>
<Header></Header>
<CompanyCode></CompanyCode>
<EntryType></EntryType>
<JournalEntryDate></JournalEntryDate>
<PostingDate></PostingDate>
<DocumentHeaderText></DocumentHeaderText>
<TransactionCurrency></TransactionCurrency>
<GLAccount>39637500</GLAccount>
<ItemText>AtlasFX Hedge</ItemText>
<DebitAmount></DebitAmount>
<CreditAmount>1000</CreditAmount>
<ProfitCentre>GS04B00000</ProfitCentre>
<AssignmentNumber>AtlasFX Hedge</AssignmentNumber>
<TradingPartner>SE02</TradingPartner>
</Entry>
</ns0:JournalEntryReportRequest>
I know that I need just add some interator check next Header as 'X' -1 before the 'Item' to generate the Header and items of the same product together but not sure how to make it.
Groovy:
import com.sap.gateway.ip.core.customdev.util.Message
import groovy.xml.*
import java.nio.charset.StandardCharsets
def Message processData(Message message) {
Reader reader = message.getBody(Reader)
def JEReport= new XmlParser().parse(reader)
Writer writer = new StringWriter()
def indentPrinter = new IndentPrinter(writer, ' ')
def builder = new MarkupBuilder(indentPrinter)
builder.'ns0:Messages'('xmlns:ns0': 'urn:eurofarma:nimbi:fornecedor') {
'ns0:Messages1'{
'ns1:AtlasFX_root'('xmlns:ns0': 'urn:eurofarma:nimbi:fornecedor'){
def arrayEntry = JEReport.Entry
arrayEntry.collect { item->
'AtlasFX_row'{
'Header'
{
'CompanyCode' item.CompanyCode.text()
'EntryType' item.EntryType.text()
'JournalEntryDate' item.JournalEntryDate.text()
'DocumentHeaderText' item.DocumentHeaderText.text()
'TransactionCurrency' item.TransactionCurrency.text()
}
'Item'
{
'GLAccount' item.GLAccount.text()
'ItemText' item.ItemText.text()
'DebitAmount' item.DebitAmount.text()
'CreditAmount' item.CreditAmount.text()
'ProfitCentre' item.ProfitCentre.text()
'AssignmentNumber' item.AssignmentNumber.text()
'TradingPartner' item.TradingPartner.text()
}
}
}
}
}
}
message.setBody(writer.toString())
return message
}
Wrong respose as you can see below, generating many Structures headers empty.
<ns0:Messages xmlns:ns0='urn:eurofarma:nimbi:fornecedor'>
<ns0:Messages1>
<ns1:AtlasFX_root xmlns:ns0='urn:eurofarma:nimbi:fornecedor'>
<AtlasFX_row>
<Header>
<CompanyCode>SE01</CompanyCode>
<EntryType>TB</EntryType>
<JournalEntryDate>20220514</JournalEntryDate>
<DocumentHeaderText>AtlasFX Hedge</DocumentHeaderText>
<TransactionCurrency>SEK</TransactionCurrency>
</Header>
<Item>
<GLAccount>16191800</GLAccount>
<ItemText>AtlasFX Hedge</ItemText>
<DebitAmount>5000</DebitAmount>
<CreditAmount></CreditAmount>
<ProfitCentre>GOXX100000</ProfitCentre>
<AssignmentNumber>AtlasFX Hedge</AssignmentNumber>
<TradingPartner>SE02</TradingPartner>
</Item>
</AtlasFX_row>
<AtlasFX_row>
<Header>
<CompanyCode></CompanyCode>
<EntryType></EntryType>
<JournalEntryDate></JournalEntryDate>
<DocumentHeaderText></DocumentHeaderText>
<TransactionCurrency></TransactionCurrency>
</Header>
<Item>
<GLAccount>39637500</GLAccount>
<ItemText>AtlasFX Hedge</ItemText>
<DebitAmount></DebitAmount>
<CreditAmount>1000</CreditAmount>
<ProfitCentre>GOXX110000</ProfitCentre>
<AssignmentNumber>AtlasFX Hedge</AssignmentNumber>
<TradingPartner>SE02</TradingPartner>
</Item>
</AtlasFX_row>
<AtlasFX_row>
<Header>
<CompanyCode></CompanyCode>
<EntryType></EntryType>
<JournalEntryDate></JournalEntryDate>
<DocumentHeaderText></DocumentHeaderText>
<TransactionCurrency></TransactionCurrency>
</Header>
<Item>
<GLAccount>79637500</GLAccount>
<ItemText>AtlasFX Hedge</ItemText>
<DebitAmount>1000</DebitAmount>
<CreditAmount></CreditAmount>
<ProfitCentre>GOXX120000</ProfitCentre>
<AssignmentNumber>AtlasFX Hedge</AssignmentNumber>
<TradingPartner>SE02</TradingPartner>
</Item>
</AtlasFX_row>
<AtlasFX_row>
<Header>
<CompanyCode></CompanyCode>
<EntryType></EntryType>
<JournalEntryDate></JournalEntryDate>
<DocumentHeaderText></DocumentHeaderText>
<TransactionCurrency></TransactionCurrency>
</Header>
<Item>
<GLAccount>39647500</GLAccount>
<ItemText>AtlasFX Hedge</ItemText>
<DebitAmount></DebitAmount>
<CreditAmount>1000</CreditAmount>
<ProfitCentre>GOXX130000</ProfitCentre>
<AssignmentNumber>AtlasFX Hedge</AssignmentNumber>
<TradingPartner>SE02</TradingPartner>
</Item>
</AtlasFX_row>
<AtlasFX_row>
<Header>
<CompanyCode></CompanyCode>
<EntryType></EntryType>
<JournalEntryDate></JournalEntryDate>
<DocumentHeaderText></DocumentHeaderText>
<TransactionCurrency></TransactionCurrency>
</Header>
<Item>
<GLAccount>79647500</GLAccount>
<ItemText>AtlasFX Hedge</ItemText>
<DebitAmount>6000</DebitAmount>
<CreditAmount></CreditAmount>
<ProfitCentre>GOXX140000</ProfitCentre>
<AssignmentNumber>AtlasFX Hedge</AssignmentNumber>
<TradingPartner>SE02</TradingPartner>
</Item>
</AtlasFX_row>
<AtlasFX_row>
<Header>
<CompanyCode>FI01</CompanyCode>
<EntryType>TB</EntryType>
<JournalEntryDate>20220514</JournalEntryDate>
<DocumentHeaderText>AtlasFX Hedge</DocumentHeaderText>
<TransactionCurrency>EUR</TransactionCurrency>
</Header>
<Item>
<GLAccount>16191800</GLAccount>
<ItemText>AtlasFX Hedge</ItemText>
<DebitAmount>300</DebitAmount>
<CreditAmount></CreditAmount>
<ProfitCentre>GO01XX0000</ProfitCentre>
<AssignmentNumber>AtlasFX Hedge</AssignmentNumber>
<TradingPartner>SE02</TradingPartner>
</Item>
</AtlasFX_row>
<AtlasFX_row>
<Header>
<CompanyCode></CompanyCode>
<EntryType></EntryType>
<JournalEntryDate></JournalEntryDate>
<DocumentHeaderText></DocumentHeaderText>
<TransactionCurrency></TransactionCurrency>
</Header>
<Item>
<GLAccount>39637500</GLAccount>
<ItemText>AtlasFX Hedge</ItemText>
<DebitAmount></DebitAmount>
<CreditAmount>100</CreditAmount>
<ProfitCentre>GO01XX2000</ProfitCentre>
<AssignmentNumber>AtlasFX Hedge</AssignmentNumber>
<TradingPartner>SE02</TradingPartner>
</Item>
</AtlasFX_row>
<AtlasFX_row>
<Header>
<CompanyCode></CompanyCode>
<EntryType></EntryType>
<JournalEntryDate></JournalEntryDate>
<DocumentHeaderText></DocumentHeaderText>
<TransactionCurrency></TransactionCurrency>
</Header>
<Item>
<GLAccount>79637500</GLAccount>
<ItemText>AtlasFX Hedge</ItemText>
<DebitAmount>100</DebitAmount>
<CreditAmount></CreditAmount>
<ProfitCentre>GO02B00000</ProfitCentre>
<AssignmentNumber>AtlasFX Hedge</AssignmentNumber>
<TradingPartner>SE02</TradingPartner>
</Item>
</AtlasFX_row>
<AtlasFX_row>
<Header>
<CompanyCode></CompanyCode>
<EntryType></EntryType>
<JournalEntryDate></JournalEntryDate>
<DocumentHeaderText></DocumentHeaderText>
<TransactionCurrency></TransactionCurrency>
</Header>
<Item>
<GLAccount>39647500</GLAccount>
<ItemText>AtlasFX Hedge</ItemText>
<DebitAmount></DebitAmount>
<CreditAmount>300</CreditAmount>
<ProfitCentre>GO02P00000</ProfitCentre>
<AssignmentNumber>AtlasFX Hedge</AssignmentNumber>
<TradingPartner>SE02</TradingPartner>
</Item>
</AtlasFX_row>
<AtlasFX_row>
<Header>
<CompanyCode>EE02</CompanyCode>
<EntryType>TB</EntryType>
<JournalEntryDate>20220514</JournalEntryDate>
<DocumentHeaderText>AtlasFX Hedge</DocumentHeaderText>
<TransactionCurrency>EUR</TransactionCurrency>
</Header>
<Item>
<GLAccount>16191800</GLAccount>
<ItemText>AtlasFX Hedge</ItemText>
<DebitAmount>1000</DebitAmount>
<CreditAmount></CreditAmount>
<ProfitCentre>GS03P00000</ProfitCentre>
<AssignmentNumber>AtlasFX Hedge</AssignmentNumber>
<TradingPartner>SE02</TradingPartner>
</Item>
</AtlasFX_row>
<AtlasFX_row>
<Header>
<CompanyCode></CompanyCode>
<EntryType></EntryType>
<JournalEntryDate></JournalEntryDate>
<DocumentHeaderText></DocumentHeaderText>
<TransactionCurrency></TransactionCurrency>
</Header>
<Item>
<GLAccount>39637500</GLAccount>
<ItemText>AtlasFX Hedge</ItemText>
<DebitAmount></DebitAmount>
<CreditAmount>1000</CreditAmount>
<ProfitCentre>GS04B00000</ProfitCentre>
<AssignmentNumber>AtlasFX Hedge</AssignmentNumber>
<TradingPartner>SE02</TradingPartner>
</Item>
</AtlasFX_row>
</ns1:AtlasFX_root>
</ns0:Messages1>
</ns0:Messages>
Thank you any help.
Expected Result:
<ns0:Messages xmlns:ns0='urn:eurofarma:nimbi:fornecedor'>
<ns0:Messages1>
<ns1:AtlasFX_root xmlns:ns0='urn:eurofarma:nimbi:fornecedor'>
<AtlasFX_row>
<Header>
<CompanyCode>SE01</CompanyCode>
<EntryType>TB</EntryType>
<JournalEntryDate>20220514</JournalEntryDate>
<DocumentHeaderText>AtlasFX Hedge</DocumentHeaderText>
<TransactionCurrency>SEK</TransactionCurrency>
</Header>
<Item>
<GLAccount>16191800</GLAccount>
<ItemText>AtlasFX Hedge</ItemText>
<DebitAmount>5000</DebitAmount>
<CreditAmount></CreditAmount>
<ProfitCentre>GOXX100000</ProfitCentre>
<AssignmentNumber>AtlasFX Hedge</AssignmentNumber>
<TradingPartner>SE02</TradingPartner>
</Item>
<Item>
<GLAccount>39637500</GLAccount>
<ItemText>AtlasFX Hedge</ItemText>
<DebitAmount></DebitAmount>
<CreditAmount>1000</CreditAmount>
<ProfitCentre>GOXX110000</ProfitCentre>
<AssignmentNumber>AtlasFX Hedge</AssignmentNumber>
<TradingPartner>SE02</TradingPartner>
</Item>
<Item>
<GLAccount>79637500</GLAccount>
<ItemText>AtlasFX Hedge</ItemText>
<DebitAmount>1000</DebitAmount>
<CreditAmount></CreditAmount>
<ProfitCentre>GOXX120000</ProfitCentre>
<AssignmentNumber>AtlasFX Hedge</AssignmentNumber>
<TradingPartner>SE02</TradingPartner>
</Item>
<Item>
<GLAccount>39647500</GLAccount>
<ItemText>AtlasFX Hedge</ItemText>
<DebitAmount></DebitAmount>
<CreditAmount>1000</CreditAmount>
<ProfitCentre>GOXX130000</ProfitCentre>
<AssignmentNumber>AtlasFX Hedge</AssignmentNumber>
<TradingPartner>SE02</TradingPartner>
</Item>
</AtlasFX_row>
<AtlasFX_row>
<Header>
<CompanyCode>FI01</CompanyCode>
<EntryType>TB</EntryType>
<JournalEntryDate>20220514</JournalEntryDate>
<DocumentHeaderText>AtlasFX Hedge</DocumentHeaderText>
<TransactionCurrency>EUR</TransactionCurrency>
</Header>
<Item>
<GLAccount>16191800</GLAccount>
<ItemText>AtlasFX Hedge</ItemText>
<DebitAmount>300</DebitAmount>
<CreditAmount></CreditAmount>
<ProfitCentre>GO01XX0000</ProfitCentre>
<AssignmentNumber>AtlasFX Hedge</AssignmentNumber>
<TradingPartner>SE02</TradingPartner>
</Item>
<Item>
<GLAccount>39637500</GLAccount>
<ItemText>AtlasFX Hedge</ItemText>
<DebitAmount></DebitAmount>
<CreditAmount>100</CreditAmount>
<ProfitCentre>GO01XX2000</ProfitCentre>
<AssignmentNumber>AtlasFX Hedge</AssignmentNumber>
<TradingPartner>SE02</TradingPartner>
</Item>
</AtlasFX_row>
<AtlasFX_row>
<Header>
<CompanyCode>EE02</CompanyCode>
<EntryType>TB</EntryType>
<JournalEntryDate>20220514</JournalEntryDate>
<DocumentHeaderText>AtlasFX Hedge</DocumentHeaderText>
<TransactionCurrency>EUR</TransactionCurrency>
</Header>
<Item>
<GLAccount>16191800</GLAccount>
<ItemText>AtlasFX Hedge</ItemText>
<DebitAmount>1000</DebitAmount>
<CreditAmount></CreditAmount>
<ProfitCentre>GS03P00000</ProfitCentre>
<AssignmentNumber>AtlasFX Hedge</AssignmentNumber>
<TradingPartner>SE02</TradingPartner>
</Item>
<Item>
<GLAccount>39637500</GLAccount>
<ItemText>AtlasFX Hedge</ItemText>
<DebitAmount></DebitAmount>
<CreditAmount>1000</CreditAmount>
<ProfitCentre>GS04B00000</ProfitCentre>
<AssignmentNumber>AtlasFX Hedge</AssignmentNumber>
<TradingPartner>SE02</TradingPartner>
</Item>
</AtlasFX_row>
</ns1:AtlasFX_root>
</ns0:Messages1>
</ns0:Messages>
simplified runable code that should give you an idea how to group data before iterating it
def entryList = [
[Header:'X',CompanyCode:'aaa',GLAccount:'aaa01'],
[Header:'', CompanyCode:'', GLAccount:'aaa02'],
[Header:'', CompanyCode:'', GLAccount:'aaa03'],
[Header:'', CompanyCode:'', GLAccount:'aaa04'],
[Header:'X',CompanyCode:'bbb',GLAccount:'bbb01'],
[Header:'', CompanyCode:'', GLAccount:'bbb02'],
[Header:'', CompanyCode:'', GLAccount:'bbb03'],
]
def groupKey = ''
def grouped = entryList.groupBy{groupKey = it.CompanyCode?:groupKey}
assert ['aaa','bbb'] == grouped.keySet().asList()
your transformation could look like this:
def arrayEntry = JEReport.Entry
def groupKey = '' //variable to use previous group key when current is empty
def groupedEntries = arrayEntry.groupBy{item-> groupKey = item.CompanyCode.text()?:groupKey}
groupedEntries.each{key,itemList->
'AtlasFX_row'{
'Header'{
'CompanyCode' itemList[0].CompanyCode.text()
'EntryType' itemList[0].EntryType.text()
...
}
itemList.each{item->
'Item' {
'GLAccount' item.GLAccount.text()
'ItemText' item.ItemText.text()
...
}
}
}
}