1

I have an eReceipt issue. I am able to get the nested loop to work to display the promo amounts and descriptions when there is only one promo per item purchased. Where I am stuck is trying to add a third loop to account for the scenario where there are multiple promos PER item. How and where would I add this additional loop? Here is an XML sample and below that is my current code. Thank you!

<eReceiptPOS xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <receiptHeader>
    <storeAddress>2901 W AGUA FRIA FWY</storeAddress>
    <storeCity>PHOENIX</storeCity>
    <storeState>AZ</storeState>
    <storePostalCode>85027</storePostalCode>
    <storePhoneNumber>6234929045</storePhoneNumber>
  </receiptHeader>
  <receiptLine>
    <transactionType>Sale</transactionType>
    <itemUPC>40051521661</itemUPC>
    <itemDescription>Top Dog PLUS</itemDescription>
    <itemQuantity>1</itemQuantity>
    <itemPriceCharged>0.00</itemPriceCharged>
    <itemRequiresReturnReceipt>false</itemRequiresReturnReceipt>
    <itemRegularPrice>23.00</itemRegularPrice>
    <itemPromo>
      <itemPromoDescription>10% Off Military Discount Tuesday</itemPromoDescription>
      <itemPromoAmount>2.30</itemPromoAmount>
    </itemPromo>
    <itemLoyaltyPoints>20.70</itemLoyaltyPoints>
    <itemAllPromosTotalAmout>23.00</itemAllPromosTotalAmout>
    <itemReturnPrice>0.0</itemReturnPrice>
    <isDonation>false</isDonation>
    <itemNonTaxable>true</itemNonTaxable>
    <itemReceiptedReturn>false</itemReceiptedReturn>
  </receiptLine>
  <receiptLine>
    <transactionType>Sale</transactionType>
    <itemUPC>40050137741</itemUPC>
    <itemDescription>Top Dog</itemDescription>
    <itemQuantity>1</itemQuantity>
    <itemPriceCharged>0.00</itemPriceCharged>
    <itemRequiresReturnReceipt>false</itemRequiresReturnReceipt>
    <itemRegularPrice>18.00</itemRegularPrice>
    <itemPromo>
      <itemPromoDescription>10% Off Military Discount Tuesday</itemPromoDescription>
      <itemPromoAmount>1.80</itemPromoAmount>
    </itemPromo>
    <itemLoyaltyPoints>16.20</itemLoyaltyPoints>
    <itemAllPromosTotalAmout>18.00</itemAllPromosTotalAmout>
    <itemReturnPrice>0.0</itemReturnPrice>
    <isDonation>false</isDonation>
    <itemNonTaxable>true</itemNonTaxable>
    <itemReceiptedReturn>false</itemReceiptedReturn>
  </receiptLine>
  <receiptLine>
    <transactionType>Sale</transactionType>
    <itemUPC>40050067261</itemUPC>
    <itemDescription>AUSTRALIAN CATTLE DOG B&amp;T</itemDescription>
    <itemQuantity>1</itemQuantity>
    <itemPriceCharged>0.00</itemPriceCharged>
    <itemRequiresReturnReceipt>false</itemRequiresReturnReceipt>
    <itemRegularPrice>44.00</itemRegularPrice>
    <itemPromo>
      <itemPromoDescription>Weekday Discount</itemPromoDescription>
      <itemPromoAmount>5.00</itemPromoAmount>
    </itemPromo>
    <itemPromo>
      <itemPromoDescription>10% Off Military Discount Tuesday</itemPromoDescription>
      <itemPromoAmount>3.90</itemPromoAmount>
    </itemPromo>
    <itemLoyaltyPoints>35.10</itemLoyaltyPoints>
    <itemAllPromosTotalAmout>44.00</itemAllPromosTotalAmout>
    <itemReturnPrice>0.0</itemReturnPrice>
    <isDonation>false</isDonation>
    <itemNonTaxable>true</itemNonTaxable>
    <itemReceiptedReturn>false</itemReceiptedReturn>
  </receiptLine>
  <receiptSummary>
    <subTotalAmount>0.00</subTotalAmount>
    <taxableAmount>0.0</taxableAmount>
    <nonTaxableAmount>0.0</nonTaxableAmount>
    <taxRate>0.0</taxRate>
    <taxUSAmount>0.0</taxUSAmount>
    <totalAmount>0.00</totalAmount>
    <tenderedAmount>0</tenderedAmount>
    <tenderType>Treats account</tenderType>
    <paymentCardNumberMasked>1344808369</paymentCardNumberMasked>
    <cashChangeDue>0</cashChangeDue>
    <totalItemsSold>3</totalItemsSold>
    <totalItemsReturned>0</totalItemsReturned>
    <feeCdafc>0</feeCdafc>
    <feePifRsf>0</feePifRsf>
  </receiptSummary>
  <receiptSaleDetails>
    <receiptValidFrom>2021-09-17T08:39:37.0741524</receiptValidFrom>
    <storeNumber>0133</storeNumber>
    <tillNumber>111</tillNumber>
    <transactionNumber>70026462</transactionNumber>
    <transactionDateTime>2021-07-19T08:39:37.0741524</transactionDateTime>
  </receiptSaleDetails>
  <receiptSavingDetails>
    <loyaltyPromoSavingsTotal>85.00</loyaltyPromoSavingsTotal>
    <treatPoints>70.00</treatPoints>
    <totalSavingsPercent>100.00 %</totalSavingsPercent>
    <totalSavingsAmount>85.00</totalSavingsAmount>
    <totalRedemptionValue>9925.00</totalRedemptionValue>
  </receiptSavingDetails>
  <receiptLoyaltyDetails>
    <loyaltyID>1344808369</loyaltyID>
    <basePointsEarned>0</basePointsEarned>
    <bonusPointsEarned>0</bonusPointsEarned>
    <pointsRedeemed>28800</pointsRedeemed>
    <pointsBalance>3970820</pointsBalance>
    <pointsExpirationDate xsi:nil="true" />
  </receiptLoyaltyDetails>
</eReceiptPOS>

Code:

%%[

  set @itemNodes = BuildRowsetFromXML(@xml,"eReceiptPOS/receiptLine",0)
  set @itemRowCount = rowcount(@itemNodes)

  
  if @itemRowCount > 0 THEN
  FOR @i = 1 to @itemRowCount DO
   set @itemNodePath = concat("/eReceiptPOS/receiptLine[",@i,"]/")
   
   IF rowCount(BuildRowsetFromXML(@xml,concat(@itemNodePath,'/itemUPC'),0)) > 0 then
    set @itemUPC = Field(Row(BuildRowsetFromXML(@xml,concat(@itemNodePath,"itemUPC"),0),1),'Value')
   ENDIF
   
   IF rowCount(BuildRowsetFromXML(@xml,concat(@itemNodePath,'/itemDescription'),0)) > 0 then
     set @itemDesc = Field(Row(BuildRowsetFromXML(@xml,concat(@itemNodePath,"itemDescription"),0),1),'Value')
   ENDIF 
   
   IF rowCount(BuildRowsetFromXML(@xml,concat(@itemNodePath,'/itemRegularPrice'),0)) > 0 then
     set @itemRegularPrice = FormatNumber(Field(Row(BuildRowsetFromXML(@xml,concat(@itemNodePath,"itemRegularPrice"),0),1),'Value'),'C2')
   ENDIF
   
   IF rowCount(BuildRowsetFromXML(@xml,concat(@itemNodePath,'/itemReturnPrice'),0)) > 0 then
     set @itemReturnPrice = FormatNumber(Field(Row(BuildRowsetFromXML(@xml,concat(@itemNodePath,"itemReturnPrice"),0),1),'Value'), 'C2')
   ENDIF
   IF rowCount(BuildRowsetFromXML(@xml,concat(@itemNodePath,'/itemPriceCharged'),0)) > 0 then
     set @itemPriceCharged = FormatNumber(Field(Row(BuildRowsetFromXML(@xml,concat(@itemNodePath,"itemPriceCharged"),0),1),'Value'), 'C2')
   ENDIF
   
   IF rowCount(BuildRowsetFromXML(@xml,concat(@itemNodePath,'/itemQuantity'),0)) > 0 then
     SET @itemQuantity = Field(Row(BuildRowsetFromXML(@xml,concat(@itemNodePath,"itemQuantity"),0),1),'Value')
   ENDIF
   
   IF rowCount(BuildRowsetFromXML(@xml,concat(@itemNodePath,'/itemRegularPrice'),0)) > 0 AND not empty(@itemQuantity) then
     SET @itemMultipliedPrice = Format(Multiply(@itemQuantity, Field(Row(BuildRowsetFromXML(@xml,concat(@itemNodePath,"itemRegularPrice"),0),1),'Value')), 'C2')
   ENDIF
   
   IF rowCount(BuildRowsetFromXML(@xml,concat(@itemNodePath,'/itemLoyaltySavings'), 0)) > 0 THEN
    SET @itemLoyaltySavings = Field(Row(BuildRowsetFromXML(@xml,concat(@itemNodePath,"itemLoyaltySavings"),0),1),'Value')
   ENDIF
   
   IF rowCount(BuildRowsetFromXML(@xml,concat(@itemNodePath,'/itemLoyaltyPoints'), 0)) > 0 THEN
    SET @treatsPointsDiscount = Field(Row(BuildRowsetFromXML(@xml,concat(@itemNodePath,"itemLoyaltyPoints"),0),1),'Value')
   ENDIF
   
   IF rowCount(BuildRowsetFromXML(@xml,concat(@itemNodePath,'/itemEmployeeDiscountAmount'), 0)) > 0 THEN
    SET @itemEmployeeDiscountAmount = Format(Field(Row(BuildRowsetFromXML(@xml,concat(@itemNodePath,"itemEmployeeDiscountAmount"),0),1),'Value'), 'C2')
   ENDIF
   
   IF rowCount(BuildRowsetFromXML(@xml,concat(@itemNodePath,'/itemCouponAmount'), 0)) > 0 THEN
    SET @itemCouponAmount = Format(Field(Row(BuildRowsetFromXML(@xml,concat(@itemNodePath,"itemCouponAmount"),0),1),'Value'),'C2')
   ENDIF
   
   IF rowCount(BuildRowsetFromXML(@xml,concat(@itemNodePath,'/itemDiscountReasonCode'), 0)) > 0 THEN
    SET @itemDiscountReasonCode = Field(Row(BuildRowsetFromXML(@xml,concat(@itemNodePath,"itemDiscountReasonCode"),0),1),'Value')
   ENDIF
   
   IF rowCount(BuildRowsetFromXML(@xml,concat(@itemNodePath,'/itemDiscountAmount'), 0)) > 0 THEN
    SET @itemDiscountAmount = Format(Field(Row(BuildRowsetFromXML(@xml,concat(@itemNodePath,"itemDiscountAmount"),0),1),'Value'),'C2')
   ENDIF
   
   IF rowCount(BuildRowsetFromXML(@xml,concat(@itemNodePath,'/itemGiftCardLast4Number'), 0)) > 0 THEN
    set @itemGiftCardLast4Number = Field(Row(BuildRowsetFromXML(@xml,concat(@itemNodePath,"itemGiftCardLast4Number"),0),1),'Value')
   ENDIF
   
   IF rowCount(BuildRowsetFromXML(@xml,concat(@itemNodePath,'/itemPrescriptionCardNumber'), 0)) > 0 THEN
    set @itemPrescriptionCardNumber = Field(Row(BuildRowsetFromXML(@xml,concat(@itemNodePath,"itemPrescriptionCardNumber"),0),1),'Value')
   ENDIF
   
   IF rowCount(BuildRowsetFromXML(@xml,concat(@itemNodePath,'/itemTrainingDate'), 0)) > 0 THEN
    set @itemTrainingDate = Format(Field(Row(BuildRowsetFromXML(@xml,concat(@itemNodePath,"itemTrainingDate"),0),1),'Value'),'MM/dd/yyyy')
   ENDIF
        ]%%

        
              %%[IF not empty(@itemUPC) or not empty(@itemDesc) or not empty(@itemPriceCharged) then]%%
                    %%[if not empty(@itemUPC) then]%%
                    %%=v(@itemUPC)=%%
                    %%[ENDIF]%%
                    %%[if not empty(@itemDesc) then]%%
                    <br> %%=v(@itemDesc)=%%
                    %%[endif]%%

                %%[IF not empty(@itemPriceCharged) then]%%
                  %%=v(@itemPriceCharged)=%%
                %%[endif]%% 

              %%[ENDIF]%%

                      %%[IF not empty(@itemQuantity) AND not empty(@itemRegularPrice) then]%%

                        reg. price (%%=v(@itemQuantity)=%% @ %%=v(@itemRegularPrice)=%%)
                        %%=v(@itemMultipliedPrice)=%%
                      %%[endif]%%
                      
   %%[IF not empty(@itemDiscountReasonCode) OR not empty(@itemDiscountAmount) THEN]%%]
                        %%=concat('(',Format(@itemDiscountAmount, 'C2'),')')=%%
                   
                      %%[ENDIF]%%
                      
                      
                      
                   
                      
                      %%[IF not empty(@itemLoyaltySavings) THEN]%%
                        treats savings
                        %%=concat('(',Format(@itemLoyaltySavings, 'C2'),')')=%%
                   
                      %%[ENDIF]%%
                      
                    %%[IF not empty(@treatsPointsDiscount) THEN]%%
                        treats points
                        %%=concat('(',Format(@treatsPointsDiscount, 'C2'),')')=%%                    
                      %%[ENDIF]%%
                      
                      %%[IF not empty(@itemEmployeeDiscountAmount) THEN]%%
                        associate discount
                        %%=concat('(',Format(@itemEmployeeDiscountAmount, 'C2'),')')=%%

                      %%[ENDIF]%%
                      
                         %%[IF not empty(@itemCouponAmount) THEN]%%
                        coupon amount]
                        %%=concat('(',Format(@itemCouponAmount, 'C2'),')')=%%
                      %%[ENDIF]%%
                      
                      
                      
   %%[
   
  set @itemPromoNodes = BuildRowsetFromXML(@xml,"eReceiptPOS/receiptLine/itemPromo",0)
  set @itemPromoRowCount = rowcount(@itemPromoNodes)
  
  if @itemPromoRowCount > 0 THEN
  FOR @j = 1 to @itemPromoRowCount DO
   set @itemPromoNodePath = concat("/eReceiptPOS/receiptLine[",@i,"]/itemPromo/")
   
   IF rowCount(BuildRowsetFromXML(@xml,concat(@itemPromoNodePath,'itemPromoAmount'), 0)) > 0 THEN
    SET @itemPromoAmount = Field(Row(BuildRowsetFromXML(@xml,concat(@itemPromoNodePath,"itemPromoAmount"),0),1),'Value')
   ENDIF
   
   IF rowCount(BuildRowsetFromXML(@xml,concat(@itemPromoNodePath,'itemPromoDescription'), 0)) > 0 THEN
    SET @itemPromoDescription = Field(Row(BuildRowsetFromXML(@xml,concat(@itemPromoNodePath,"itemPromoDescription"),0),1),'Value')
   ENDIF
   
next @j endif
   ]%%
   
   %%[IF not empty(@itemPromoAmount) AND not empty(@itemPromoDescription) THEN]%%         


                        %%=v(@itemPromoDescription)=%%
                        %%=concat('(',Format(@itemPromoAmount, 'C2'),')')=%%
            
%%[ENDIF]%%
                      
                              
                      
                      
                      %%[if not empty(@itemGiftCardLast4Number) then]%%
                        gift card
                        %%=v(@itemGiftCardLast4Number)=%%
                      %%[endif]%%
                      
                      
                       %%[if not empty(@itemPrescriptionCardNumber) then]%%
                        %%=v(@itemPrescriptionCardNumber)=%%

                      %%[endif]%%
                      
                      %%[if not empty(@itemTrainingDate) then]%%
                        training date
                        %%=v(@itemTrainingDate)=%%

                      %%[endif]%%

                %%[if not empty(@itemReturnprice) then]%%
                        return price
                        %%=v(@itemReturnPrice)=%% each
                      %%[endif]%%


        %%[next @i endif]%%

@adam-spriggs

1
  • @adamspriggs Please see my response.
    – J. Smith
    Aug 24, 2021 at 0:47

1 Answer 1

2

Your promo code output wasn't inside your secondary loop.

I'd suggest that you start simple and get your code indented. Makes it much easier to get your loops correct.

%%[

set @itemNodes = BuildRowsetFromXML(@xml,"eReceiptPOS/receiptLine",0)
set @itemRowCount = rowcount(@itemNodes)

if @itemRowCount > 0 THEN

    FOR @i = 1 to @itemRowCount DO

        set @itemNodePath = concat("/eReceiptPOS/receiptLine[",@i,"]/")

        IF rowCount(BuildRowsetFromXML(@xml,concat(@itemNodePath,'/itemUPC'),0)) > 0 then
            set @itemUPC = Field(Row(BuildRowsetFromXML(@xml,concat(@itemNodePath,"itemUPC"),0),1),'Value')
        ENDIF

        ]%%

            %%[ if not empty(@itemUPC) then ]%%
              <br>%%=v(@itemUPC)=%%
            %%[ ENDIF ]%%

        %%[

        set @itemPromoNodes = BuildRowsetFromXML(@xml,concat("eReceiptPOS/receiptLine[", @i, "]/itemPromo"),0)
        set @itemPromoRowCount = rowcount(@itemPromoNodes)

        if @itemPromoRowCount > 0 THEN

            FOR @j = 1 to @itemPromoRowCount DO

              set @itemPromoNodePath = concat("/eReceiptPOS/receiptLine[",@i,"]/itemPromo[", @j, "]/")

              IF rowCount(BuildRowsetFromXML(@xml,concat(@itemPromoNodePath,'itemPromoAmount'), 0)) > 0 THEN
                set @itemPromoAmount = Field(Row(BuildRowsetFromXML(@xml,concat(@itemPromoNodePath,"itemPromoAmount"),0),1),'Value')
              ENDIF

              ]%%

                  %%[ IF not empty(@itemPromoAmount)THEN ]%%         
                    <br>%%=concat('(',Format(@itemPromoAmount, 'C2'),')')=%%
                  %%[ ENDIF ]%%

              %%[
              
            next @j 

        endif
        ]%%


    %%[
    next @i
    ]%% 
%%[
endif
]%%

Once you've got your structure, add the additional variables and HTML.

loops

I'm using Sublime Text 4 as my editor and the AMPscript Syntax Highlighter extension.

Just pasting it back into Content Builder once it's indented.

3
  • I am now getting this error: The function call includes more parameters than the maximum allowed for the function Function Call: BuildRowsetFromXML(@xml,"eReceiptPOS/receiptLine[",@i,"]/itemPromo",0) @adam spriggs
    – J. Smith
    Aug 24, 2021 at 2:07
  • Updated. Forgot a concat on line 24 Aug 24, 2021 at 2:21
  • THANK YOU!!!! @adam
    – J. Smith
    Aug 24, 2021 at 2:38

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.