We've Moved! Please visit our new and improved forum over at our new portal: https://portal.plumvoice.com/hc/en-us/community/topics

<foreach> Loop not working

Questions and answers about IVR programming for Plum DEV

Moderators: admin, support

Post Reply
vikas
Posts: 53
Joined: Wed May 13, 2015 7:46 pm

<foreach> Loop not working

Post by vikas »

Hi

In my code I need to iterate through an Array for which I am using <foreach> tag but this doesn't seem to be working.
Not sure what I am missing.

I have verified that the array is not empty still the call doesn't enter the foreach loop.
I have pasted a section of my code below.

The only line that I see for <foreach> in log is pasted below. The code continues executing skipping <foreach> tag each time.

Code: Select all

<if cond="debug">
				<log expr="'**** sayTransactions Start - Index = '+index + ' Transactions Length = ' +transactions.length  " />
				<log expr="'**** sayTransactions Start - subArray length ' +subArray.length  " />
			</if>
<foreach item="tran" array="subArray">
				<if cond="debug">
					<log expr="'**** In inner foreach - amount '+index+' ' +tran.amount" />
					<log expr="'**** In inner foreach - date '+index+' '+tran.date" />
					<log expr="'**** In inner foreach - date substring '+index+' '+tr
Log::
LOCAL: **** sayTransactions Start - Index = 0 Transactions Length = 6
LOCAL: **** sayTransactions Start - subArray length 5
VXI::foreach_element()

support
Posts: 3632
Joined: Mon Jun 02, 2003 3:47 pm
Location: Boston, MA
Contact:

Re: <foreach> Loop not working

Post by support »

Hi Vikas,

The fact that you see: VXI::foreach_element() in your logs indicates that the foreach loop is being executed, however why those log elements aren't showing up is not immediately obvious. Have you tried removing the if statement from within your foreach loop to see if that makes any difference? Syntactically though, your script looks correct. Could you send us a copy of your array such that we can try and reproduce the issue with the same data?

Regards,
Plum Support

vikas
Posts: 53
Joined: Wed May 13, 2015 7:46 pm

Re: <foreach> Loop not working

Post by vikas »

Yes, I tried removing <if> condition; it still doesn't work.
I am sending the code - there are 3 parts
1) VXML code
2) Javascript which creates the array
3) The input to Javascript (<xml> data from an API)

VXML code

Code: Select all

<block name="sayTransactions" cond="index < transactions.length">
			<assign name="subArray" expr="transactions[index]"/>
			
			<if cond="debug">
				<log expr="'**** sayTransactions Start - Index = '+index + ' Transactions Length = ' +transactions.length  " />
				<log expr="'**** sayTransactions Start - subArray length ' + subArray.length  " />
			</if>
			
			<if cond="index == 0">
				<prompt  cond="isCultureEnUS(language, locale)"> <audio expr="Prompt18"> <speak xml:lang="en-US"> <voice name="Jennifer">  	<value expr="Verbiage18"/>  </voice> </speak> </audio> </prompt>
				<prompt  cond="isCultureEsEs(language, locale)"> <audio expr="Prompt18"> <speak xml:lang="es-ES"> <voice name="Isabel">		<value expr="Verbiage18"/>  </voice> </speak> </audio> </prompt>
				<prompt  cond="isCultureFrCa(language, locale)"> <audio expr="Prompt18"> <speak xml:lang="fr-CA"> <voice name="Julie">  	<value expr="Verbiage18"/>  </voice> </speak> </audio> </prompt>					    				
			</if>
			
			<foreach item="tran" array="subArray">
				<if cond="debug">
					<log expr="'**** In inner foreach - amount'+index+' '+tran.amount" />
					<log expr="'**** In inner foreach - date ' +index+' '+tran.date" />
					<log expr="'**** In inner foreach - day '  +index+' '+tran.day" />
					<log expr="'**** In inner foreach - type ' +index+' '+tran.type" />
					<log expr="'**** In inner foreach - desc ' +index+' '+tran.description" />					
				</if>
				
				
				<if cond="(tran.date.substr(8,2)).charAt(0) == '0'">
					<assign name="tranDay" expr="tran.date.substr(9,1)" />
				<else/>
					<assign name="tranDay" expr="tran.date.substr(8,2)" />
				</if>
				
				<if cond="(tran.amount).charAt(0) == '-'">
					<if cond="isCultureEnUS(language, locale)">
						<assign name="prefix" expr="'for minus'" />
					<elseif cond="isCultureEsEs(language, locale)"/>
						<assign name="prefix" expr="'por menos'" />
					<else/>
						<assign name="prefix" expr="'pour moins'" />
					</if>
					<assign name="amount" expr="tran.amount.substr(1)" />					
				<else/>
					<if cond="isCultureEnUS(language, locale)">
						<assign name="prefix" expr="'for'" />
					<elseif cond="isCultureEsEs(language, locale)"/>
						<assign name="prefix" expr="'por'" />
					<else/>
						<assign name="prefix" expr="'pour'" />
					</if>
					<assign name="amount" expr="tran.amount" />
				</if>
				
				<if cond="amount > 1 && currency=='POINT'">
					<if cond="isCultureEnUS(language, locale)">
						<assign name="suffix" expr="'points'" />
					<elseif cond="isCultureEsEs(language, locale)"/>
						<assign name="suffix" expr="'puntos'" />
					<else/>
						<assign name="suffix" expr="'points'" />
					</if>
				<else/>
					<if cond="isCultureEnUS(language, locale)">
						<assign name="suffix" expr="'point'" />
					<elseif cond="isCultureEsEs(language, locale)"/>
						<assign name="suffix" expr="'punto'" />
					<else/>
						<assign name="suffix" expr="'point'" />
					</if>					
				</if>
				
				<if cond="currency=='DOLLAR'">
					<assign name="amount" expr="'$' + amount" />
				</if>
				
				<log expr="'****Amount'+index+' '+ amount" />
				<log expr="'****Prefix'+index+' '+ prefix" />
				<log expr="'****Suffix'+index+' '+ suffix" />			
					
				<!-- English - Play Transaction -->
				<!-- POINT -->
				<prompt cond="isCultureEnUS(language, locale) && currency=='POINT'"> 
					<speak xml:lang="en-US"> 
						<voice name="Jennifer"> 
							<prosody volume="100.0" rate="default">
								A <value expr="tran.type"/> occured on <value expr="tran.day"/>
								<say-as type="date:m"> <value expr="getMonth(tran.date.substr(5,2))"/> </say-as>
								<say-as type="date:d"> <value expr="tranDay"/> </say-as>								
								<say-as type="date:y"> <value expr="tran.date.substr(0,4)"/> </say-as>
								<break time="250ms"/>
								<value expr="prefix"/>
								<break time="250ms"/>
								<say-as type="number: decimal"> <value expr="amount"/> </say-as>
								<break time="250ms"/>
								<value expr="suffix"/>
								<break time="1s"/>
							</prosody>
						</voice> 
					</speak>					
				</prompt>
				<!-- DOLLAR -->
				<prompt cond="isCultureEnUS(language, locale) && currency=='DOLLAR'"> 
					<speak xml:lang="en-US"> 
						<voice name="Jennifer"> 
							<prosody volume="100.0" rate="default">
								A <value expr="tran.type"/> occured on <value expr="tran.day"/>
								<say-as type="date:m"> <value expr="getMonth(tran.date.substr(5,2))"/> </say-as>
								<say-as type="date:d"> <value expr="tranDay"/> </say-as>								
								<say-as type="date:y"> <value expr="tran.date.substr(0,4)"/> </say-as>
								<break time="250ms"/>
								<value expr="prefix"/>
								<break time="250ms"/>
								<say-as type="currency"> <value expr="amount"/> </say-as>								
								<break time="1s"/>
							</prosody>
						</voice> 
					</speak>					
				</prompt>
				
				<!-- Spanish - Play Transaction -->
				<!-- POINT -->
				<prompt cond="isCultureEsEs(language, locale) && currency=='POINT'"> 
					<speak xml:lang="es-ES"> 
						<voice name="Isabel"> 
							<prosody volume="100.0" rate="default">
								un <value expr="tran.type"/> ocurrido en <value expr="tran.day"/>
								<say-as type="date:m"> <value expr="getMonthSpanish(tran.date.substr(5,2))"/> </say-as>
								<say-as type="date:d"> <value expr="tranDay"/> </say-as>								
								<say-as type="date:y"> <value expr="tran.date.substr(0,4)"/> </say-as>
								<break time="250ms"/>
								<value expr="prefix"/>
								<break time="250ms"/>
								<say-as type="number: decimal"> <value expr="amount"/> </say-as>
								<break time="250ms"/>
								<value expr="suffix"/>
								<break time="1s"/>
							</prosody>
						</voice> 
					</speak>					
				</prompt>
				<!-- DOLLAR -->
				<prompt cond="isCultureEsEs(language, locale) && currency=='DOLLAR'"> 
					<speak xml:lang="es-ES"> 
						<voice name="Isabel"> 
							<prosody volume="100.0" rate="default">
								un <value expr="tran.type"/> ocurrido en <value expr="tran.day"/>
								<say-as type="date:m"> <value expr="getMonthSpanish(tran.date.substr(5,2))"/> </say-as>
								<say-as type="date:d"> <value expr="tranDay"/> </say-as>								
								<say-as type="date:y"> <value expr="tran.date.substr(0,4)"/> </say-as>
								<break time="250ms"/>
								<value expr="prefix"/>
								<break time="250ms"/>
								<say-as type="currency"> <value expr="amount"/> </say-as>								
								<break time="1s"/>
							</prosody>
						</voice> 
					</speak>					
				</prompt>
				
				<!-- French - Play Transaction -->
				<!-- POINT -->
				<prompt cond="isCultureFrCa(language, locale) && currency=='POINT'"> 
					<speak xml:lang="fr-CA"> 
						<voice name="Julie"> 
							<prosody volume="100.0" rate="default">
								une <value expr="tran.type"/> survenu sur <value expr="tran.day"/>
								<say-as type="date:m"> <value expr="getMonthFrench(tran.date.substr(5,2))"/> </say-as>
								<say-as type="date:d"> <value expr="tranDay"/> </say-as>								
								<say-as type="date:y"> <value expr="tran.date.substr(0,4)"/> </say-as>
								<break time="250ms"/>
								<value expr="prefix"/>
								<break time="250ms"/>
								<say-as type="number: decimal"> <value expr="amount"/> </say-as>
								<break time="250ms"/>
								<value expr="suffix"/>
								<break time="1s"/>
							</prosody>
						</voice> 
					</speak>					
				</prompt>
				<!-- DOLLAR -->
				<prompt cond="isCultureFrCa(language, locale) && currency=='POINT'"> 
					<speak xml:lang="fr-CA"> 
						<voice name="Julie"> 
							<prosody volume="100.0" rate="default">
								une <value expr="tran.type"/> survenu sur <value expr="tran.day"/>
								<say-as type="date:m"> <value expr="getMonthFrench(tran.date.substr(5,2))"/> </say-as>
								<say-as type="date:d"> <value expr="tranDay"/> </say-as>								
								<say-as type="date:y"> <value expr="tran.date.substr(0,4)"/> </say-as>
								<break time="250ms"/>
								<value expr="prefix"/>
								<break time="250ms"/>
								<say-as type="currency"> <value expr="amount"/> </say-as>								
								<break time="1s"/>
							</prosody>
						</voice> 
					</speak>					
				</prompt>					
			</foreach>
			
			<if cond="debug">
				<log expr="'**** sayTransactions End - Index = '+index + ' Transactions Length = ' +transactions.length  "/>
			</if>
			
			<assign name="index" expr="index + 1"/>
			<log expr="'**** sayTransactions End - After Incrementing Index = '+index + ' Transactions Length = ' +transactions.length  "/>
			<if cond="index==transactions.length">
				<if cond="debug">
					<log expr="'**** sayTransactions End - No More Transactions'"/>
				</if>
				<!-- Resetting the value to 9 when there are no more transactions to be read --> 
				<assign name="check" expr="9"/>
				<goto nextitem="checkstep"/>
			<else/>
				<if cond="debug">
					<log expr="'**** sayTransactions End - More Transactions Available'"/>
				</if>
				<goto nextitem="check"/>
			</if>
		</block>
 
Javascript which creates the array

Code: Select all

function parseTransactionSet(transResponse, locale) {
	var transRoot = transResponse.documentElement;
	var transactionList = transRoot.getElementsByTagName("transaction");
	var subsetSize = 5;
	
	transactions = new Array();
	// Iterate through each transaction
	for(var i = 0; i < transactionList.length; i++)
	{
		var inner= i % subsetSize;
		if (inner === 0)
		{
			var subArray = new Array();
			transactions[Math.floor(i/5)] = subArray;
		}
		
		//Get Amount
		var amount = "0";
		if (transactionList.item(i).getElementsByTagName("Amount").item(0).childNodes.length == 1)
		{
			amount = transactionList.item(i).getElementsByTagName("Amount").item(0).childNodes.item(0).data.toString();
		}
		
		//Get Date		
		var str_date = transactionList.item(i).getElementsByTagName("TimeStamp").item(0).childNodes.item(0).data.toString();		
		
		//Get Type & description		       
		var type = "undefined";
		var description = "undefined";
		
		//Look at Affect to determine if it is CREDIT or DEBIT
		if (transactionList.item(i).getElementsByTagName("Affect").item(0).childNodes.length == 1)
		{	
			type = transactionList.item(i).getElementsByTagName("Affect").item(0).childNodes.item(0).data.toString();
		}
			
		if (transactionList.item(i).getElementsByTagName("Description").item(0).childNodes.length == 1)
		{
				description = transactionList.item(i).getElementsByTagName("Description").item(0).childNodes.item(0).data.toString();
		}
		
		//Get Day & type
		var day;
		var trxDate = new Date(str_date);
		var days_en = ["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"];
		var days_es = ["doh-MEEN-goh","LOOH-nayss","MAHR-tayss","mee-AIR-coh-layss","WHAY-vayss","vee-AIR-nayss","SAH-bah-doh"];
		var days_fr = ["dee-MAHNSH","luhn-DEE","mahr-DEE","mehr-kruh-DEE","juh-DEE","vahn-druh-DEE","sahm-DEE"];
		if (locale.toLowerCase()=='es')
		{
			day = days_es[trxDate.getDay()];
			if (type=='CREDIT')
				type = CRÉDITO;
			else
				type = DÉBITO;
		}
		else if (locale.toLowerCase()=='fr')
		{
			day = days_fr[trxDate.getDay()];
			if (type=='CREDIT')
				type = CRÉDIT;
			else
				type = DÉBIT;
		}
		else
			day = days_en[trxDate.getDay()];
			
				
		//Set Values in SubArray
		subArray[inner] = new Object();
		
		subArray[inner].amount = amount;
	  	subArray[inner].type = type;
		subArray[inner].date = str_date;
		subArray[inner].day = day;
		subArray[inner].description = description;		
	} //End Major For Loop
	return transactions;
} //End Function
Input to the Javascript function

Code: Select all

<Transactions>
         <transaction>
            <ID>CC003EBFD1F1</ID>
            <TimeStamp>2016-08-01T18:00:00Z</TimeStamp>
            <Affect>CREDIT</Affect>
            <Amount>10</Amount>
            <Description>Value Load</Description>
         </transaction>
         <transaction>
            <ID>CC004F2D1709</ID>
            <TimeStamp>2016-08-01T18:00:00Z</TimeStamp>
            <Affect>CREDIT</Affect>
            <Amount>10</Amount>
            <Description>Value Load</Description>
         </transaction>
         <transaction>
            <ID>CC00D4858041</ID>
            <TimeStamp>2016-08-01T18:00:00Z</TimeStamp>
            <Affect>CREDIT</Affect>
            <Amount>10</Amount>
            <Description>Value Load</Description>
         </transaction>
         <transaction>
            <ID>CC007CE7BCE9</ID>
            <TimeStamp>2016-08-01T18:00:00Z</TimeStamp>
            <Affect>CREDIT</Affect>
            <Amount>10</Amount>
            <Description>Value Load</Description>
         </transaction>
         <transaction>
            <ID>CC00F5FDC5C3</ID>
            <TimeStamp>2016-08-01T18:00:00Z</TimeStamp>
            <Affect>CREDIT</Affect>
            <Amount>10</Amount>
            <Description>Value Load</Description>
         </transaction>
         <transaction>
            <ID>CC00C86A7847</ID>
            <TimeStamp>2016-08-01T18:00:00Z</TimeStamp>
            <Affect>CREDIT</Affect>
            <Amount>10</Amount>
            <Description>Value Load</Description>
         </transaction>
         <transaction>
            <ID>CC00DA0585D9</ID>
            <TimeStamp>2016-08-01T18:00:00Z</TimeStamp>
            <Affect>CREDIT</Affect>
            <Amount>10</Amount>
            <Description>Value Load</Description>
         </transaction>
         <transaction>
            <ID>CC00FF482EFC</ID>
            <TimeStamp>2016-08-01T18:00:00Z</TimeStamp>
            <Affect>CREDIT</Affect>
            <Amount>10</Amount>
            <Description>Value Load</Description>
         </transaction>
         <transaction>
            <ID>CC0025265BE2</ID>
            <TimeStamp>2016-08-01T18:00:00Z</TimeStamp>
            <Affect>CREDIT</Affect>
            <Amount>10</Amount>
            <Description>Value Load</Description>
         </transaction>
         <transaction>
            <ID>CC008C15E0C0</ID>
            <TimeStamp>2016-08-01T18:00:00Z</TimeStamp>
            <Affect>CREDIT</Affect>
            <Amount>10</Amount>
            <Description>Value Load</Description>
         </transaction>
         <transaction>
            <ID>CC002328AEBF</ID>
            <TimeStamp>2016-08-01T18:00:00Z</TimeStamp>
            <Affect>CREDIT</Affect>
            <Amount>10</Amount>
            <Description>Value Load</Description>
         </transaction>
         <transaction>
            <ID>CC0052E1DD2F</ID>
            <TimeStamp>2016-08-01T18:00:00Z</TimeStamp>
            <Affect>CREDIT</Affect>
            <Amount>10</Amount>
            <Description>Value Load</Description>
         </transaction>
         <transaction>
            <ID>CC005AD3810E</ID>
            <TimeStamp>2016-08-01T18:00:00Z</TimeStamp>
            <Affect>CREDIT</Affect>
            <Amount>10</Amount>
            <Description>Value Load</Description>
         </transaction>
         <transaction>
            <ID>CC0022920C5E</ID>
            <TimeStamp>2016-08-01T18:00:00Z</TimeStamp>
            <Affect>CREDIT</Affect>
            <Amount>10</Amount>
            <Description>Value Load</Description>
         </transaction>
         <transaction>
            <ID>CC002ECC6676</ID>
            <TimeStamp>2016-08-01T18:00:00Z</TimeStamp>
            <Affect>CREDIT</Affect>
            <Amount>10</Amount>
            <Description>Value Load</Description>
         </transaction>
         <transaction>
            <ID>CC002E98CF7B</ID>
            <TimeStamp>2016-08-01T18:00:00Z</TimeStamp>
            <Affect>CREDIT</Affect>
            <Amount>10</Amount>
            <Description>Value Load</Description>
         </transaction>
         <transaction>
            <ID>CC009FEA3C63</ID>
            <TimeStamp>2016-08-01T18:00:00Z</TimeStamp>
            <Affect>CREDIT</Affect>
            <Amount>10</Amount>
            <Description>Value Load</Description>
         </transaction>
         <transaction>
            <ID>CC003D5DB960</ID>
            <TimeStamp>2016-08-01T18:00:00Z</TimeStamp>
            <Affect>CREDIT</Affect>
            <Amount>10</Amount>
            <Description>Value Load</Description>
         </transaction>
         <transaction>
            <ID>CC00FD54CE6A</ID>
            <TimeStamp>2016-08-01T18:00:00Z</TimeStamp>
            <Affect>CREDIT</Affect>
            <Amount>10</Amount>
            <Description>Value Load</Description>
         </transaction>
         <transaction>
            <ID>CC00951D8669</ID>
            <TimeStamp>2016-08-01T18:00:00Z</TimeStamp>
            <Affect>CREDIT</Affect>
            <Amount>10</Amount>
            <Description>Value Load</Description>
         </transaction>
         <transaction>
            <ID>CC0013FD3BC1</ID>
            <TimeStamp>2016-08-01T18:00:00Z</TimeStamp>
            <Affect>CREDIT</Affect>
            <Amount>10</Amount>
            <Description>Value Load</Description>
         </transaction>
         <transaction>
            <ID>CC00D2CC620E</ID>
            <TimeStamp>2016-08-01T18:00:00Z</TimeStamp>
            <Affect>CREDIT</Affect>
            <Amount>10</Amount>
            <Description>Value Load</Description>
         </transaction>
         <transaction>
            <ID>CC006927C929</ID>
            <TimeStamp>2016-08-01T18:00:00Z</TimeStamp>
            <Affect>CREDIT</Affect>
            <Amount>10</Amount>
            <Description>Value Load</Description>
         </transaction>
         <transaction>
            <ID>CC006224F92E</ID>
            <TimeStamp>2016-08-01T18:00:00Z</TimeStamp>
            <Affect>CREDIT</Affect>
            <Amount>10</Amount>
            <Description>Value Load</Description>
         </transaction>
         <transaction>
            <ID>CC0077D2CD05</ID>
            <TimeStamp>2016-08-01T18:00:00Z</TimeStamp>
            <Affect>CREDIT</Affect>
            <Amount>10</Amount>
            <Description>Value Load</Description>
         </transaction>
         <transaction>
            <ID>CC00E6011BDD</ID>
            <TimeStamp>2016-08-01T18:00:00Z</TimeStamp>
            <Affect>CREDIT</Affect>
            <Amount>10</Amount>
            <Description>Value Load</Description>
         </transaction>
         <transaction>
            <ID>CC00BA450F33</ID>
            <TimeStamp>2016-08-01T18:00:00Z</TimeStamp>
            <Affect>CREDIT</Affect>
            <Amount>10</Amount>
            <Description>Value Load</Description>
         </transaction>
         <transaction>
            <ID>CC00A2BF4269</ID>
            <TimeStamp>2016-08-01T18:00:00Z</TimeStamp>
            <Affect>CREDIT</Affect>
            <Amount>10</Amount>
            <Description>Value Load</Description>
         </transaction>
         <transaction>
            <ID>CC0056F85426</ID>
            <TimeStamp>2016-08-01T18:00:00Z</TimeStamp>
            <Affect>CREDIT</Affect>
            <Amount>10</Amount>
            <Description>Value Load</Description>
         </transaction>
         <transaction>
            <ID>CC00B2D36D17</ID>
            <TimeStamp>2016-07-29T18:00:00Z</TimeStamp>
            <Affect>CREDIT</Affect>
            <Amount>10</Amount>
            <Description>Value Load</Description>
         </transaction>
      </Transactions>

vikas
Posts: 53
Joined: Wed May 13, 2015 7:46 pm

Re: <foreach> Loop not working

Post by vikas »

did anyone got a chance to look into it? Thanks.

support
Posts: 3632
Joined: Mon Jun 02, 2003 3:47 pm
Location: Boston, MA
Contact:

Re: <foreach> Loop not working

Post by support »

Hi Vikas,

We used your parse javascript function and xml data to produce a portion of the array structure, which we used to make a simple script to test this issue. However, we do see each log tag being executed within the foreach loop. We tested with the below script:

Code: Select all

<?xml version="1.0"?>
<vxml version="2.1">
  <form>
  <script>
    var transactions = [
      [
      {amount:"10",date:"2016-08-01T18:00:00Z",day:"Monday",description:"Value Load",type:"CREDIT"},
      {amount:"10",date:"2016-08-01T18:00:00Z",day:"Monday",description:"Value Load",type:"CREDIT"},
      {amount:"10",date:"2016-08-01T18:00:00Z",day:"Monday",description:"Value Load",type:"CREDIT"},
      {amount:"10",date:"2016-08-01T18:00:00Z",day:"Monday",description:"Value Load",type:"CREDIT"},
      ],
      [
      {amount:"10",date:"2016-08-01T18:00:00Z",day:"Monday",description:"Value Load",type:"CREDIT"},
      {amount:"10",date:"2016-08-01T18:00:00Z",day:"Monday",description:"Value Load",type:"CREDIT"},
      {amount:"10",date:"2016-08-01T18:00:00Z",day:"Monday",description:"Value Load",type:"CREDIT"},
      {amount:"10",date:"2016-08-01T18:00:00Z",day:"Monday",description:"Value Load",type:"CREDIT"},
      ],
    ];
  </script>
  <var name="debug" expr="true"/>
  <var name="index" expr="0"/>
  <block name="sayTransactions" cond="index < transactions.length">
     <assign name="subArray" expr="transactions[index]"/>
     
     <if cond="debug">
        <log expr="'**** sayTransactions Start - Index = '+index + ' Transactions Length = ' +transactions.length  " />
        <log expr="'**** sayTransactions Start - subArray length ' + subArray.length  " />
     </if>
     
     <foreach item="tran" array="subArray">
        <if cond="debug">
           <log expr="'**** In inner foreach - amount'+index+' '+tran.amount" />
           <log expr="'**** In inner foreach - date ' +index+' '+tran.date" />
           <log expr="'**** In inner foreach - day '  +index+' '+tran.day" />
           <log expr="'**** In inner foreach - type ' +index+' '+tran.type" />
           <log expr="'**** In inner foreach - desc ' +index+' '+tran.description" />               
        </if>
      </foreach>
     
     <if cond="debug">
        <log expr="'**** sayTransactions End - Index = '+index + ' Transactions Length = ' +transactions.length  "/>
     </if>
     
     <assign name="index" expr="index + 1"/>
     <log expr="'**** sayTransactions End - After Incrementing Index = '+index + ' Transactions Length = ' +transactions.length  "/>
     <if cond="index==transactions.length">
        <if cond="debug">
           <log expr="'**** sayTransactions End - No More Transactions'"/>
        </if>
        <!-- Resetting the value to 9 when there are no more transactions to be read --> 
        <assign name="check" expr="9"/>
        <goto nextitem="checkstep"/>
     <else/>
        <if cond="debug">
           <log expr="'**** sayTransactions End - More Transactions Available'"/>
        </if>
        <goto nextitem="check"/>
     </if>
    </block>
  </form>
</vxml>
and we see the following in the call logs:

Code: Select all

Entering form = '$_internalName_1578520' form item = 'sayTransactions'
VXI::assign_element(name="subArray" expr = "transactions[index]")
LOCAL: **** sayTransactions Start - Index = 0 Transactions Length = 2
LOCAL: **** sayTransactions Start - subArray length 4
VXI::foreach_element()
LOCAL: **** In inner foreach - amount0 10
LOCAL: **** In inner foreach - date 0 2016-08-01T18:00:00Z
LOCAL: **** In inner foreach - day 0 Monday
LOCAL: **** In inner foreach - type 0 CREDIT
LOCAL: **** In inner foreach - desc 0 Value Load
LOCAL: **** In inner foreach - amount0 10
LOCAL: **** In inner foreach - date 0 2016-08-01T18:00:00Z
LOCAL: **** In inner foreach - day 0 Monday
LOCAL: **** In inner foreach - type 0 CREDIT
LOCAL: **** In inner foreach - desc 0 Value Load
LOCAL: **** In inner foreach - amount0 10
LOCAL: **** In inner foreach - date 0 2016-08-01T18:00:00Z
LOCAL: **** In inner foreach - day 0 Monday
LOCAL: **** In inner foreach - type 0 CREDIT
LOCAL: **** In inner foreach - desc 0 Value Load
LOCAL: **** In inner foreach - amount0 10
LOCAL: **** In inner foreach - date 0 2016-08-01T18:00:00Z
LOCAL: **** In inner foreach - day 0 Monday
LOCAL: **** In inner foreach - type 0 CREDIT
LOCAL: **** In inner foreach - desc 0 Value Load
LOCAL: **** sayTransactions End - Index = 0 Transactions Length = 2
VXI::assign_element(name="index" expr = "index + 1")
LOCAL: **** sayTransactions End - After Incrementing Index = 1 Transactions Length = 2
LOCAL: **** sayTransactions End - More Transactions Available
Since this is a closed script without any external parsing or data input, we're inclined to believe the reason your foreach is not executing might have to do with external factors, parsing, format of the transactions array, etc. If you could provide more details we'd be happy to help, but it does not appear to be the foreach code itself that's causing the issues.

Regards,
Plum Support

vikas
Posts: 53
Joined: Wed May 13, 2015 7:46 pm

Re: <foreach> Loop not working

Post by vikas »

It works if I use the "transactions" array provided by you so that means there is something wrong with the input data which is causing <foreach> to skip. However it is still not clear what is wrong with the Array data.

In the same code I have added below debug statements.
Now I can see that the "subArray" element has data still <foreach> is not getting executed.

Do you see anything wrong with the Array content that could cause <foreach> to not execute?

Code: Select all

<block name="sayTransactions" cond="index < transactions.length">
			<assign name="subArray" expr="transactions[index]"/>
			
			<if cond="debug">
				<assign name="subArray" expr="transactions[0]"/>
			
				<log expr="'**** sayTransactions Start - Index = '+index + ' Transactions Length = ' +transactions.length  " />
				<log expr="'**** sayTransactions Start - subArray length ' + subArray.length  " />
				<log expr="'**** Display 1st subArray:: ' + transactions[0]" />
				<log expr="'**** 1st subArray 1st Element:: ' + subArray[0]" />
				<log expr="'**** 1st subArray 2nd Element:: ' + subArray[1]" />
				<log expr="'**** 1st subArray 3rd Element:: ' + subArray[1]" />
				<log expr="'**** 1st subArray 4th Element:: ' + subArray[3]" />
				<log expr="'**** 1st subArray 5th Element:: ' + subArray[4]" />
				<log expr="'**** 1st subArray 1st Element contents:: ' + subArray[0].amount + ',' + subArray[0].date + ',' + subArray[0].day + ',' + subArray[0].type + ',' + subArray[0].description" />
				<log expr="'**** 1st subArray 2nd Element contents:: ' + subArray[1].amount + ',' + subArray[1].date + ',' + subArray[1].day + ',' + subArray[1].type + ',' + subArray[1].description" />
				<log expr="'**** 1st subArray 3rd Element contents:: ' + subArray[2].amount + ',' + subArray[2].date + ',' + subArray[2].day + ',' + subArray[2].type + ',' + subArray[2].description" />
				<log expr="'**** 1st subArray 4th Element contents:: ' + subArray[3].amount + ',' + subArray[3].date + ',' + subArray[3].day + ',' + subArray[3].type + ',' + subArray[3].description" />
				<log expr="'**** 1st subArray 5th Element contents:: ' + subArray[4].amount + ',' + subArray[4].date + ',' + subArray[4].day + ',' + subArray[4].type + ',' + subArray[4].description" />
			
				<assign name="subArray" expr="transactions[1]"/>
			
				<log expr="'**** Display 2nd subArray:: ' + transactions[1]" />
				<log expr="'**** 2nd subArray 1st Element:: ' + subArray[0]" />
				<log expr="'**** 2nd subArray 2nd Element:: ' + subArray[1]" />
				<log expr="'**** 2nd subArray 3rd Element:: ' + subArray[1]" />
				<log expr="'**** 2nd subArray 4th Element:: ' + subArray[3]" />
				<log expr="'**** 2nd subArray 5th Element:: ' + subArray[4]" />
				<log expr="'**** 2nd subArray 1st Element contents:: ' + subArray[0].amount + ',' + subArray[0].date + ',' + subArray[0].day + ',' + subArray[0].type + ',' + subArray[0].description" />
				<log expr="'**** 2nd subArray 2nd Element contents:: ' + subArray[1].amount + ',' + subArray[1].date + ',' + subArray[1].day + ',' + subArray[1].type + ',' + subArray[1].description" />
				<log expr="'**** 2nd subArray 3rd Element contents:: ' + subArray[2].amount + ',' + subArray[2].date + ',' + subArray[2].day + ',' + subArray[2].type + ',' + subArray[2].description" />
				<log expr="'**** 2nd subArray 4th Element contents:: ' + subArray[3].amount + ',' + subArray[3].date + ',' + subArray[3].day + ',' + subArray[3].type + ',' + subArray[3].description" />
				<log expr="'**** 2nd subArray 5th Element contents:: ' + subArray[4].amount + ',' + subArray[4].date + ',' + subArray[4].day + ',' + subArray[4].type + ',' + subArray[4].description" />
			</if>
			
			<if cond="index == 0">
				<prompt  cond="isCultureEnUS(language, locale)"> <audio expr="Prompt18"> <speak xml:lang="en-US"> <voice name="Jennifer">  	<value expr="Verbiage18"/>  </voice> </speak> </audio> </prompt>
				<prompt  cond="isCultureEsEs(language, locale)"> <audio expr="Prompt18"> <speak xml:lang="es-ES"> <voice name="Isabel">		<value expr="Verbiage18"/>  </voice> </speak> </audio> </prompt>
				<prompt  cond="isCultureFrCa(language, locale)"> <audio expr="Prompt18"> <speak xml:lang="fr-CA"> <voice name="Julie">  	<value expr="Verbiage18"/>  </voice> </speak> </audio> </prompt>					    				
			</if>
			
			<foreach item="tran" array="subArray">
				<if cond="debug">
					<log expr="'**** In inner foreach - amount'+index+' '+tran.amount" />
					<log expr="'**** In inner foreach - date ' +index+' '+tran.date" />
					<log expr="'**** In inner foreach - day '  +index+' '+tran.day" />
					<log expr="'**** In inner foreach - type ' +index+' '+tran.type" />
In the logs below you can see that the subArray does has 5 elements and each element has the required fields namely amount, date,day,type & description. Therefore I am still confused why call is not entering the <foreach> loop

Code: Select all

Entering form = 'getTransactions' form item = '$_internalName_3810005'
LOCAL: *****In Get Transactions*****
Entering form = 'getTransactions' form item = '$_internalName_3810006'
LOCAL: **** #transactions 6
Entering form = 'getTransactions' form item = 'sayTransactions'
VXI::assign_element(name="subArray" expr = "transactions[index]")
VXI::assign_element(name="subArray" expr = "transactions[0]")
LOCAL: **** sayTransactions Start - Index = 0 Transactions Length = 6
LOCAL: **** sayTransactions Start - subArray length 5
LOCAL: **** Display 1st subArray:: [object Object],[object Object],[object Object],[object Object],[object Object]
LOCAL: **** 1st subArray 1st Element:: [object Object]
LOCAL: **** 1st subArray 2nd Element:: [object Object]
LOCAL: **** 1st subArray 3rd Element:: [object Object]
LOCAL: **** 1st subArray 4th Element:: [object Object]
LOCAL: **** 1st subArray 5th Element:: [object Object]
LOCAL: **** 1st subArray 1st Element contents:: 10,2016-08-01T18:00:00Z,undefined,CREDIT,Value Load
LOCAL: **** 1st subArray 2nd Element contents:: 10,2016-08-01T18:00:00Z,undefined,CREDIT,Value Load
LOCAL: **** 1st subArray 3rd Element contents:: 10,2016-08-01T18:00:00Z,undefined,CREDIT,Value Load
LOCAL: **** 1st subArray 4th Element contents:: 10,2016-08-01T18:00:00Z,undefined,CREDIT,Value Load
LOCAL: **** 1st subArray 5th Element contents:: 10,2016-08-01T18:00:00Z,undefined,CREDIT,Value Load
VXI::assign_element(name="subArray" expr = "transactions[1]")
LOCAL: **** Display 2nd subArray:: [object Object],[object Object],[object Object],[object Object],[object Object]
LOCAL: **** 2nd subArray 1st Element:: [object Object]
LOCAL: **** 2nd subArray 2nd Element:: [object Object]
LOCAL: **** 2nd subArray 3rd Element:: [object Object]
LOCAL: **** 2nd subArray 4th Element:: [object Object]
LOCAL: **** 2nd subArray 5th Element:: [object Object]
LOCAL: **** 2nd subArray 1st Element contents:: 10,2016-08-01T18:00:00Z,undefined,CREDIT,Value Load
LOCAL: **** 2nd subArray 2nd Element contents:: 10,2016-08-01T18:00:00Z,undefined,CREDIT,Value Load
LOCAL: **** 2nd subArray 3rd Element contents:: 10,2016-08-01T18:00:00Z,undefined,CREDIT,Value Load
LOCAL: **** 2nd subArray 4th Element contents:: 10,2016-08-01T18:00:00Z,undefined,CREDIT,Value Load
LOCAL: **** 2nd subArray 5th Element contents:: 10,2016-08-01T18:00:00Z,undefined,CREDIT,Value Load
bargein set to true
INPUTMODES set to "DTMF"
Cache Miss: http://ivrpv-vppp.blackhawk-net.com/BES/audio/en_us/Prompt18.wav
Attempting to fetch http://ivrpv-vppp.blackhawk-net.com/BES/audio/en_us/Prompt18.wav
HTTP/1.1 404 Not Found - http://ivrpv-vppp.blackhawk-net.com/BES/audio/en_us/Prompt18.wav
Audio segment from the URL http://ivrpv-vppp.blackhawk-net.com/BES/audio/en_us/Prompt18.wav added to prompt queue
Unrecognized format in pvxPromptConvertCopySource
Failure during pvxPromptConvertCopySource
bargein set to true
INPUTMODES set to "DTMF"
Audio segment added to prompt queue from TTS application/synthesis+ssml for:
---------
<?xml version='1.0'?><speak><voice gender="female"><speak xml:lang="en-US"><voice name="Jennifer"><speak> Your last five transactions were </speak></voice></speak></voice></speak>
---------
VXI::foreach_element()
LOCAL: **** sayTransactions End - Index = 0 Transactions Length = 6
VXI::assign_element(name="index" expr = "index + 1")
LOCAL: **** sayTransactions End - After Incrementing Index = 1 Transactions Length = 6
LOCAL: **** sayTransactions End - More Transactions Available
Entering form = 'getTransactions' form item = 'check'
VXI::queue_prompts()

vikas
Posts: 53
Joined: Wed May 13, 2015 7:46 pm

Re: <foreach> Loop not working

Post by vikas »

I was able to fix it finally by removing below section of code from my Javascript which was creating Array

Code: Select all

var trxDate = new Date(str_date);
		var days_en = ["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"];
		var days_es = ["doh-MEEN-goh","LOOH-nayss","MAHR-tayss","mee-AIR-coh-layss","WHAY-vayss","vee-AIR-nayss","SAH-bah-doh"];
		var days_fr = ["dee-MAHNSH","luhn-DEE","mahr-DEE","mehr-kruh-DEE","juh-DEE","vahn-druh-DEE","sahm-DEE"];
		if (locale.toLowerCase()=='es')
		{
			day = days_es[trxDate.getDay()];
			if (type=='CREDIT')
				type = CRÉDITO;
			else
				type = DÉBITO;
		}
		else if (locale.toLowerCase()=='fr')
		{
			day = days_fr[trxDate.getDay()];
			if (type=='CREDIT')
				type = CRÉDIT;
			else
				type = DÉBIT;
		}
		else
			day = days_en[trxDate.getDay()];

Post Reply