Search code examples
groovy

Groovy interator getNext if value equals 'X'


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>

Solution

  • 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()
            ...
          }
        }
      }
    }