Thursday, October 3, 2013

N1 Loop Mapping

Introduction


It is very common scenario to map values from a loop in the applications where EDI X12 schemas are used and one of them is N1 Loop. Loops are nothing but blocks of repeating data. And N1 loop is such block which has address related data (Party Identification).  

It is not mandatory and in the schema which ships with BizTalk, allows it to repeat up-to 200 times (EDI schema  are shipped in as a self-extracting executable and when extracted, schemas can be found at drive:\Program Files\Microsoft BizTalk Server 2010\XSD_Schema\EDI.)

But it can vary and totally depends upon the requirement. 

And from the multiple data, specific data is to be mapped to a particular node.

In this article, BillTo and ShipTo nodes are used as an example to which data is to be mapped from repeating data (N1Loop).

n1 loop properties



Input file

ST*850*0001~
BEG*00*DS*45000007**20131002~
CUR*BY*USD~
REF*KK*STANDARD~
REF*BAI*8000~
REF*AAT*80206234~
REF*BLT*INVOICE~
REF*VR*1~
PER*BD*Collin Wag*TE*610-386-1189*FX*610-728-2210*EM*collin_wag@someemail.com~
N9*ZZ**REFERENCE NOTES~
N1*BT*Demo International*91*1100~
N2*WAN MIN-SV~
N3*PO Box 158~
N4*Secaus*NJ*07096*US~
PER*PR**TE*1110001111***EM*mahesht@ivisionsoftware.com~
N1*ST*BMS MEDEREX*91*00000~
N2*WAN MIN-SV~
N3*700  RD~
N4*RED CITY*CA*940632477*US~
PER*SH**TE*1110001111***EM*maheshstiwari@gmail.com~
N1*VN*Demo BIOSCIENCES*91*6868~
REF*PO*0043331289~
PO1*00001*2*PK*175.95*DI*VC*28-9165-37*CB*95056-246***PL*000040~
PO1*00001*2*PK*175.95*DI*VC*28-9165-37*CB*95056-246***PL*000040~
PID*F**ZZ*C*HITRAP CAPTO DEAE 1ML PK5 HITRAP CAPTO D~
PO4*1*1*PK~
REF*AAS*8013170709~
REF*BV*00004~
REF*PRT*2~
REF*LT*N~
DTM*002*20130828~
CTT*1~
SE*33*0001~


Mapping N1 loop to BillTo

N1 Loop to Billto mapping



Below are the steps to map values from N1Loop to BillTo Node (non repeating):
Step 1: Drag a link from N1 Loop1 and connect it to BillTo Node.
Step 2: Drop a Equal functoid on map grid.
Step 3: Link N101 node (it holds the Party identifier value, BT) to Equal Functoid, this will be the first input.
Step 4: Double click the  Equal Functoid and set the value of the second input parameter as BT.

Billto equal functoid


Step 5: Link the output of Equal functoid to BillTo Node. Thus if value of N101 matches then the output of this functoid will be true and BillTo Node will be created.

Step 6: Now link the others as shown in  figure 2.


Mapping N1 loop to ShipTo

N1 Loop to Shipto mapping


Below are the steps to map values from N1Loop to ShipTo Node (non repeating):
Step 1: Drag a link from N1 Loop1 and connect it to ShipTo Node.
Step 2: Drop a Equal functoid on map grid.
Step 3: Link N101 node (it holds the Party identifier value, ST) to Equal Functoid, this will be the first input.
Step 4: Double click the  Equal Functoid and set the value of the second input parameter as ST.

ST equal functoid



Step 5: Link the output of Equal functoid to ShipTo Node. Thus if value of N101 matches then the output of this functoid will be true and ShipTo Node will be created.

Step 6: Now link the others as shown in figure 4.


XSLT code section of N1Loop


<xsl:for-each select="s0:N1Loop1">
  <xsl:for-each select="s0:N2">
    <xsl:variable name="var:v2" select="userCSharp:LogicalEq(string(../s0:N1/N101/text()) , "ST=""")" />
    <xsl:if test="$var:v2">
      <ShipTo>
        <xsl:if test="../s0:N1/N104">
          <ID>
            <xsl:value-of select="../s0:N1/N104/text()" />
          </ID>
        </xsl:if>
        <xsl:if test="../s0:N1/N102">
          <Name>
            <xsl:value-of select="../s0:N1/N102/text()" />
          </Name>
        </xsl:if>
        <AddressLine1>
          <xsl:value-of select="N201/text()" />
        </AddressLine1>
        <AddressLine2>
          <xsl:value-of select="../s0:N3/N301/text()" />
        </AddressLine2>
        <xsl:if test="../s0:N4/N401">
          <City>
            <xsl:value-of select="../s0:N4/N401/text()" />
          </City>
        </xsl:if>
        <xsl:if test="../s0:N4/N402">
          <State>
            <xsl:value-of select="../s0:N4/N402/text()" />
          </State>
        </xsl:if>
        <xsl:if test="../s0:N4/N403">
          <PostalCode>
            <xsl:value-of select="../s0:N4/N403/text()" />
          </PostalCode>
        </xsl:if>
        <xsl:if test="../s0:N4/N404">
          <Country>
            <xsl:value-of select="../s0:N4/N404/text()" />
          </Country>
        </xsl:if>
        <xsl:if test="../s0:PER_2/PER04">
          <TelephoneNumber>
            <xsl:value-of select="../s0:PER_2/PER04/text()" />
          </TelephoneNumber>
        </xsl:if>
        <xsl:if test="../s0:PER_2/PER08">
          <EmailAddress>
            <xsl:value-of select="../s0:PER_2/PER08/text()" />
          </EmailAddress>
        </xsl:if>
        <xsl:if test="..">
          <xsl:value-of select="../text()" />
        </xsl:if>
      </ShipTo>
    </xsl:if>
  </xsl:for-each>
</xsl:for-each>
<xsl:for-each select="s0:N1Loop1">
  <xsl:for-each select="s0:N2">
    <xsl:variable name="var:v3" select="string(../s0:N1/N101/text())" />
    <xsl:variable name="var:v4" select="userCSharp:LogicalEq($var:v3 , "BT=""")" />
    <xsl:if test="$var:v4">
      <BillTo>
        <xsl:if test="../s0:N1/N103">
          <ID>
            <xsl:value-of select="../s0:N1/N103/text()" />
          </ID>
        </xsl:if>
        <xsl:if test="../s0:N1/N102">
          <Name>
            <xsl:value-of select="../s0:N1/N102/text()" />
          </Name>
        </xsl:if>
        <AddressLine1>
          <xsl:value-of select="N201/text()" />
        </AddressLine1>
        <AddressLine2>
          <xsl:value-of select="../s0:N3/N301/text()" />
        </AddressLine2>
        <xsl:if test="../s0:N4/N401">
          <City>
            <xsl:value-of select="../s0:N4/N401/text()" />
          </City>
        </xsl:if>
        <xsl:if test="../s0:N4/N402">
          <State>
            <xsl:value-of select="../s0:N4/N402/text()" />
          </State>
        </xsl:if>
        <xsl:if test="../s0:N4/N403">
          <PostalCode>
            <xsl:value-of select="../s0:N4/N403/text()" />
          </PostalCode>
        </xsl:if>
        <xsl:if test="../s0:N4/N404">
          <Country>
            <xsl:value-of select="../s0:N4/N404/text()" />
          </Country>
        </xsl:if>
        <xsl:if test="../s0:PER_2/PER04">
          <TelephoneNumber>
            <xsl:value-of select="../s0:PER_2/PER04/text()" />
          </TelephoneNumber>
        </xsl:if>
        <xsl:if test="../s0:PER_2/PER08">
          <EmailAddress>
            <xsl:value-of select="../s0:PER_2/PER08/text()" />
          </EmailAddress>
        </xsl:if>
        <xsl:if test="..">
          <xsl:value-of select="../text()" />
        </xsl:if>
      </BillTo>
    </xsl:if>
  </xsl:for-each>
</xsl:for-each>


Output


<Header>
  <OrderId>45000007</OrderId>
  <OrderDate>2013-10-02</OrderDate>
  <Currency>USD</Currency>
  <ShipTo>
    <ID>00000</ID>
    <Name>BMS MEDEREX</Name>
    <AddressLine1>WAN MIN-SV</AddressLine1>
    <AddressLine2>700 RD</AddressLine2>
    <City>RED CITY</City>
    <State>CA</State>
    <PostalCode>940632477</PostalCode>
    <Country>US</Country>
    <TelephoneNumber>1110001111</TelephoneNumber>
    <EmailAddress>maheshstiwari@gmail.com</EmailAddress>
  </ShipTo>
  <BillTo>
    <ID>91</ID>
    <Name>Demo International</Name>
    <AddressLine1>WAN MIN-SV</AddressLine1>
    <AddressLine2>PO Box 158</AddressLine2>
    <City>Secaus</City>
    <State>NJ</State>
    <PostalCode>07096</PostalCode>
    <Country>US</Country>
    <TelephoneNumber>1110001111</TelephoneNumber>
    <EmailAddress>mahesht@ivisionsoftware.com</EmailAddress>
  </BillTo>
  <HeaderComment>This is Header Comment</HeaderComment>
</Header>
<Details>
  <Item>
    <ItemId>28-9165-37</ItemId>
    <ItemDescription>C</ItemDescription>
    <Quantity>2</Quantity>
    <UnitPrice>175.95</UnitPrice>
    <LineNumber>00001</LineNumber>
    <UOM>PK</UOM>
    <RequestedDeliveryDate>2013-10-02</RequestedDeliveryDate>
    <LineComment>This is line comment</LineComment>
  </Item>
</Details>


Related Post 


No comments:

Post a Comment