как назначить значение для каждой строки в муле 4 - PullRequest
1 голос
/ 16 января 2020
<?xml version="1.0"?>
<tXML>
<Header>
    <Source>J1_RETAIL</Source>
    <Action_Type>Update</Action_Type>
    <Sequence_Number>0</Sequence_Number>
    <Batch_ID>4383352</Batch_ID>
    <Reference_ID>04381645</Reference_ID>
    <User_ID>SAP</User_ID>
    <Password>password</Password>
    <Message_Type>SAP_DO</Message_Type>
    <Company_ID>J1</Company_ID>
    <Msg_Locale>English (United States)</Msg_Locale>
    <Msg_Time_Zone>Eastern Standard Time</Msg_Time_Zone>
    <Version></Version>
    <Internal_Reference_ID></Internal_Reference_ID>
    <Internal_Date_Time_Stamp></Internal_Date_Time_Stamp>
    <External_Reference_ID></External_Reference_ID>
    <External_Date_Time_Stamp></External_Date_Time_Stamp>
  </Header>
  <Message>
    <DistributionOrder>
        <ProcessInfo>
            <RefTextField1></RefTextField1>
            <RefTextField2></RefTextField2>
            <RefTextField3>S082</RefTextField3>
            <RefTextField4></RefTextField4>
            <RefTextField5></RefTextField5>
            <RefTextField6></RefTextField6>
            <RefTextField7>J1</RefTextField7>
            <RefTextField8>[0001333006_SAPTOMIF]</RefTextField8>
            <RefTextField9></RefTextField9>
            <RefTextField10>[ _20191223]</RefTextField10>
            <RefNumberField1>20191220</RefNumberField1>
            <RefNumberField2>34621</RefNumberField2>
            <RefNumberField3></RefNumberField3>
            <RefNumberField4>53</RefNumberField4>
            <RefNumberField5>13</RefNumberField5>
        </ProcessInfo>
        <Comment>
            <NoteType>MB</NoteType>
            <NoteCode>05</NoteCode>
            <CommentText>[00000_8769_741_82_093_965_987_456]</CommentText>
            <Visibility>0</Visibility>
          </Comment>
          <CustomFieldList>
            <CustomField>
              <Name>SiteID</Name>
              <Value></Value>
            </CustomField>
        <LineItem>
            <DoLineNbr>1</DoLineNbr>
            <ItemName>135465</ItemName>
            <Description>A</Description>
            <UpdateActionType></UpdateActionType>
            <PackageType></PackageType>
            <DoLineStatus>Released</DoLineStatus>
            <InventoryAttributes>
              <InventoryType>F</InventoryType>
              <ProductStatus></ProductStatus>
              <BatchNbr></BatchNbr>
              <CountryOfOrigin></CountryOfOrigin>
              <ItemAttribute1>R</ItemAttribute1>
              <ItemAttribute2></ItemAttribute2>
              <ItemAttribute3></ItemAttribute3>
              <ItemAttribute4></ItemAttribute4>
              <ItemAttribute5></ItemAttribute5>
            </InventoryAttributes>
        </LineItem>
    </DistributionOrder>
  </Message>
</tXML> 

Мой код выглядит следующим образом

%dw 2.0
output application/csv header = false , separator = "|" , quoteValues = false 
var count = 0
fun outputMap (index, comment="") = 
    {
            column_1: "000000003", 
            column_2: (payload.tXML.Message.DistributionOrder.ProcessInfo.RefTextField8 splitBy "_")[0] replace "[" with "" ,  
            column_3: if(payload.tXML.Message.DistributionOrder.ProcessInfo.RefNumberField1 != null) (payload.tXML.Message.DistributionOrder.ProcessInfo.RefNumberField1) else "0",
            column_4: if(payload.tXML.Message.DistributionOrder.ProcessInfo.RefNumberField2 != null) (payload.tXML.Message.DistributionOrder.ProcessInfo.RefNumberField2) else "0",
            column_5: "SAPTOMIF",
            column_6: payload.tXML.Message.DistributionOrder.SalesOrderNbr default "",
    column_7: if(payload.tXML.Message.DistributionOrder.Comment.NoteType == 'MB' and payload.tXML.Message.DistributionOrder.Comment.NoteCode == '05')"00000" else "",
    column_8: ???,
    column_9: "ST",
    column_10: "0" ++ index,
            column_11: (comment replace "[" with ""  replace "]" with ""default "") , 
            column_12: payload.tXML.Message.DistributionOrder.ReferenceField7 default "",
            column_13: payload.tXML.Message.DistributionOrder.SalesOrderNbr default "",

    }

---
payload.tXML.Message.*DistributionOrder flatMap (DistributionOrder) -> 
    using (filteredComment = DistributionOrder.*Comment[?($.NoteType == "MB" and $.NoteCode == "05")])
    if (filteredComment != null and filteredComment !="") 
        filteredComment flatMap(commentObject) -> 
            using (splitCommentText = commentObject.CommentText splitBy /_/)
            splitCommentText map outputMap($$,$) filter $$ > 0 and trim($[10]) !=""
    else 
        outputMap(DistributionOrder)

Вот как выглядит мой вывод

000000003|0001333006|20191220|34621|SAPTOMIF|6500054123|00000||ST|01|8769|J1|6500054123
000000003|0001333006|20191220|34621|SAPTOMIF|6500054123|00000||ST|02|741|J1|6500054123
000000003|0001333006|20191220|34621|SAPTOMIF|6500054123|00000||ST|03|82|J1|6500054123
000000003|0001333006|20191220|34621|SAPTOMIF|6500054123|00000||ST|06|987|J1|6500054123
000000003|0001333006|20191220|34621|SAPTOMIF|6500054123|00000||ST|07|456|J1|6500054123

Мне нужно значение для column_8: следует назначать значения начиная с 1,2 .... 9 для каждой строки, т.е. 1 для строки 1, 2 строки 2 ....

Мой вывод должен выглядеть следующим образом

000000003|0001333006|20191220|34621|SAPTOMIF|6500054123|00000|1|ST|01|8769|J1|6500054123
000000003|0001333006|20191220|34621|SAPTOMIF|6500054123|00000|2|ST|02|741|J1|6500054123
000000003|0001333006|20191220|34621|SAPTOMIF|6500054123|00000|3|ST|03|82|J1|6500054123
000000003|0001333006|20191220|34621|SAPTOMIF|6500054123|00000|4|ST|06|987|J1|6500054123
000000003|0001333006|20191220|34621|SAPTOMIF|6500054123|00000|5|ST|07|456|J1|6500054123

мой новый код

% dw 2.0 import java! java :: util :: concurrent :: atomi c :: AtomicInteger var counter = AtomicInteger :: new (0) fun increment () = Java :: invoke (' java .util.concurrent.atomi c .AtomicInteger ',' incrementAndGet () ', counter, {})

выходное приложение / заголовок csv = false, разделитель = "|" , quoteValues ​​= false

flatten (payload.t XML .Message.DistributionOrder. * Карта LineItem (LineItem) -> LineItem. * Фильтр комментариев ($. NoteType == 'I3' и $ .NoteCode = = 'I3') map (Комментарий) -> {column_1: "000000003", column_2: (payload.t XML .Message.DistributionOrder.ProcessInfo.RefTextField8 splitBy "_") [0] заменить "[" на "" ,
column_3: if (payload.t XML .Message.DistributionOrder.ProcessInfo.RefNumberField1! = Null) (payload.t XML .Message.DistributionOrder.ProcessInfo.RefNumberField1) else "0", column_4: if (payload.t XML .Message.DistributionOrder.ProcessInfo.RefNumberField2! = null) (payload.t XML .Message.DistributionOrder.ProcessInfo.RefNumberField2) else "0", column_5: "SAPTOMIF", column_6: payload. t XML .Message.DistributionOrder.SalesOrderNbr default "", column_7: Comment.CommentText, column_8: increment (), column_9: "PT", column_10: Comment.CommentText, column_11: Comment.CommentText, column_12: ", column_13 : ""})

1 Ответ

1 голос
/ 16 января 2020

Вы должны выполнить автоинкремент, как показано ниже

      import java!java::util::concurrent::atomic::AtomicInteger      
      var counter = AtomicInteger::new(0)
       fun increment() = 
      Java::invoke('java.util.concurrent.atomic.AtomicInteger',  
      'incrementAndGet()', counter, {})

Для получения более подробной информации см. Страницу ниже

https://dzone.com/articles/implement-a-counter-in-dataweave-2x-and-above

...