Sandeep,

You did not provide me with a complete STAX job as I had requested.  You 
again only provided snippets of your STAX job.  I put together the 
following STAX job with the snippets that you provided and using your 
AD.csv file and it ran fine.  However, it appears you have some errors in 
your logic (especially in how you are using a <loop> to iterate thru d and 
are not using the "var=i" attribute for the loop element). 

So, my guess is still that in your real STAX job you are defining the List 
variable in a scope that is not assessable from your DCP_Auto function (as 
I talked about in my previous note).  Until you provide a complete STAX 
job that I can run to recreate the problem you're seeing, that's my best 
guess.  Also, please provide the complete error message that STAX is 
logging.

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE stax SYSTEM "stax.dtd">

<stax>

  <defaultcall function="DCP_Auto"/>

  <script>
    import csv
 
    class RecordDetails:
      Token = ""
      Records = []
 
    csv_file = 'C:\\stax\\AD.csv'
    testList = list(csv.reader(open(csv_file, 'r')))
    curToken = "null"

    recordDetails = RecordDetails()
    recordDetails = None
    records = [RecordDetails]

    for index, line in enumerate(testList):
      token = "null"
      token = testList[index][4]
 
      if token == "null":
        continue
      if curToken != token:
        curToken = token
        recordDetails = RecordDetails()
        recordDetails.Token = curToken
        recordDetails.Records = []
        records.append(recordDetails)

        if recordDetails != None:
          recordDetails.Records.append(line)

    d = {}
    CountSequence = 1
 
    for i, obj in enumerate(records):
      if records[i].Token == "Sequence":
        d[CountSequence] = records[i].Records
        CountSequence += 1
      if records[i].Token == "Parallel":
        d[CountSequence] = records[i].Records
        CountSequence += 1

    machineList = [ '10.211.105.108', '10,211.105.109', '10.211.105.110' ]
    Lists = len(records)
  </script>

  <function name="DCP_Auto">
    <sequence>

      <log message="1">'type(Lists)=%s  type(records)=%s' % (type(Lists), 
type(records))</log>
      <log message="1">'Lists=%s' % (Lists)</log>

      <script>i = 1</script>
      <loop from="i" to="Lists">
        <log message="1">'i=%s  d[%s][0][4]=%s' % (i, i, d[i][0][4])</log>
      </loop>

    </sequence>
  </function>

</stax>


Here's are the messages logged when running this STAX job

C:\>STAF local LOG QUERY MACHINE {STAF/Config/MachineNickname} LOGNAME 
STAX_Job_19_User
Response
--------
Date-Time         Level Message
----------------- ----- 
-----------------------------------------------------
20130820-14:47:52 Info  type(Lists)=<type 'int'>  type(records)=<type 
'list'>
20130820-14:47:52 Info  Lists=4
20130820-14:47:52 Info  i=1  d[1][0][4]=Sequence
20130820-14:47:52 Info  i=1  d[1][0][4]=Sequence
20130820-14:47:52 Info  i=1  d[1][0][4]=Sequence
20130820-14:47:52 Info  i=1  d[1][0][4]=Sequence

--------------------------------------------------------------
Sharon Lucas
IBM Austin,   luc...@us.ibm.com
(512) 286-7313 or Tieline 363-7313




From:   sandeep bhosale <sandeep.bhos...@gmail.com>
To:     Sharon Lucas/Austin/IBM@IBMUS, 
Cc:     staf-users@lists.sourceforge.net
Date:   08/19/2013 10:54 PM
Subject:        Re: [staf-users] Gettitng error in loop



Yes Sharon, This was a typo. Below is my script function. I am attaching 
the CSV file used in the script with this email. Below function gives me 
three lists. Which is working fine when i am running this script using 
python. I am also able to get the value of Lists variable when I run this 
script using python. But when I am using it in stax I am getting the 
error. Please refer below script tag and the calling function.

<script>
    import csv

    class RecordDetails:
      Token = ""
      Records = []

    csv_file = 'E:\\Automation_STAF\\AD.csv'
    testList = list(csv.reader(open(csv_file, 'r')))
    curToken = "null"

    recordDetails = RecordDetails()
    recordDetails=None
    records = [RecordDetails]

    for index, line in enumerate(testList):
      token="null"
      token = testList[index][4]

      if token=="null":
        continue
      if curToken !=token:
        curToken =token
        recordDetails = RecordDetails()
        recordDetails.Token = curToken
        recordDetails.Records=[]
        records.append(recordDetails)
      if recordDetails!=None:
        recordDetails.Records.append(line)

    d={}
    CountSequence=1
    for i, obj in enumerate(records):
      if records[i].Token=="Sequence":
        d[CountSequence] =records[i].Records
        CountSequence +=1
      if records[i].Token=="Parallel":
        d[CountSequence] =records[i].Records
        CountSequence +=1

    machineList = ['10.211.105.108','10.211.105.109' , '10.211.105.110' ]
    Lists = len(records)
    
       
  </script>

---------------------------------------

And below is my main function from where I am accessing the Lists 
variable.


<function name="DCP_Auto">
<sequence>

    <script>print "Getting the Job ID"</script>
    <call function="'WriteMachineName'"/>
    
     
    <script>i=1</script>
    <log message="1">'Lists'</log>
        <loop from ="i" to = "Lists" >
          <if expr ="d[i][0][4]='Sequence'">
            <call function="'SequentialDriverFunction'"/>
            <elseif expr ="d[i][0][4]='Parallel'">
              <call function="'ParallelDriverFunction'"/>
            </elseif>
          </if>          
        </loop>

</sequence>
</function>


Please help me identifying the issue. 

Thanks,
Sandeep


On Mon, Aug 19, 2013 at 9:06 PM, Sharon Lucas <luc...@us.ibm.com> wrote:
In your example, you showed that you assigned a variable named "List" the 
length of a list.  However, then you tried to use a variable named "Lists" 
instead of "List".  Since no variable exists called "Lists", you would get 
an error that this variable is not defined.  So, is this the cause of the 
problem, or did you have a typo in your note and did you really attempt to 
use a variable called "List" instead of "Lists"? 

If this was a typo and you really tried to access the variable using the 
same name you had assigned, then another possibility is that you assigned 
the "Lists" variable in a scope that is not accessible via the function 
from which you are trying to use the "Lists" variable.  Since you did not 
provide a complete STAX job that demonstrates the problem, I can only 
guess that this is what is happening.  Please provide a complete STAX job 
that demonstrates the problem.  Here's more information about scope: 

As talked about in section "function: Define a Named Task" in the STAX 
User's Guide at 
http://staf.sourceforge.net/current/STAX/staxug.html#Header_Function"; 

- Scope determines how variables are to be assigned 
By default, all variables assigned in a function are global to the job's 
current STAX-Thread. However, you can assign a local scope to a function 
such that all names assigned in a function are local to that function and 
exist only while the function runs. Functions defined with a local scope 
provide a nested namespace, which contains a copy of variables in the 
caller's scope and which localizes any new variables created or changes to 
existing variables. 

- STAXGlobal class provides the ability to create truly global variables
An exception to the above scoping rules are variables that are instances 
of the STAXGlobal class. A STAXGlobal class is a Python class which STAX 
provides as a wrapper to provide for the creation of truly global 
variables, even across STAX-Threads and when used in functions declared 
with a local scope. See the STAXGlobal Class section for more information 
on how to create and use STAXGlobal variables. 

So, depending on where your variable containing a list's length was 
assigned, it may not be accessible from the function where you are trying 
to access it.  This can occur if the variable was created in a different 
STAX-Thread, or in a function whose scope is defined as "local", etc.   

Here's a STAX job that assigns a variable called myListLength in the same 
function from which it is being accessed by a <loop> element and it works 
fine. 

<?xml version="1.0" encoding="UTF-8" standalone="no"?> 
<!DOCTYPE stax SYSTEM "stax.dtd"> 

<stax> 

  <defaultcall function="Main"/> 

  <function name="Main"> 
    <sequence> 

      <script> 
        myList = ['first', 'second', 'third'] 
        myListLength = len(myList) 
      </script> 

      <log message="1">'List length: %s   records=%s' % (myListLength, 
myList)</log> 

      <loop var="i" from="1" to="myListLength"> 
        <sequence> 
          <log message="1">'i=%s' % (i)</log> 
        </sequence> 
      </loop> 
      
    </sequence> 
  </function> 

</stax> 

So, if instead your STAX job did something like the following where the 
myListLength variable was assigned in a function with a local scope, it 
would then not be accessible via function RunLoop: 

<?xml version="1.0" encoding="UTF-8" standalone="no"?> 
<!DOCTYPE stax SYSTEM "stax.dtd"> 

<stax> 

  <defaultcall function="Main"/> 

  <function name="Main"> 
    <sequence> 
      <call function="'AssignVariable'"/> 
      <call function="'RunLoop'"/> 
    </sequence> 
  </function> 

  <function name="AssignVariable" scope="local"> 
    <sequence> 
      <script> 
        myList = ['first', 'second', 'third'] 
        myListLength = len(myList) 
      </script> 
    </sequence> 
  </function> 

  <function name="RunLoop"> 
    <sequence> 

      <log message="1">'List length: %s   records=%s' % (myListLength, 
myList)</log> 

      <loop var="i" from="1" to="myListLength"> 
        <sequence> 
          <log message="1">'i=%s' % (i)</log> 
        </sequence> 
      </loop> 
      
    </sequence> 
  </function> 

</stax> 

If you ran this STAX job, you would get Python error "NameError: name 
'myListLength' is not defined" as follows: 

C:\>STAF local STAX EXECUTE FILE "C:/stax/sandeep.xml" RETURNRESULT WAIT 
Response 
-------- 
{ 
  Job ID         : 30 
  Start Date-Time: 20130819-10:30:56 
  End Date-Time  : 20130819-10:30:56 
  Status         : Terminated 
  Result         : None 
  Job Log Errors : [ 
    { 
      Date-Time: 20130819-10:30:56 
      Level    : Error 
      Message  : STAXPythonEvaluationError signal raised. Terminating job. 


===== XML Information ===== 

File: c:\stax\sandeep.xml, Machine: local://local 
Line 27: Error in element type "log". 

===== Python Error Information ===== 

com.ibm.staf.service.stax.STAXPythonEvaluationException: 

Python string evaluation failed for: 
'List length: %s   records=%s' % (myListLength, myList) 

Traceback (most recent call last): 
  File "<pyEval string>", line 1, in <module> 
NameError: name 'myListLength' is not defined 

===== Call Stack for STAX Thread 1 ===== 

[ 
  function: Main (Line: 8, File: c:\stax\sandeep.xml, Machine: 
local://local) 
  sequence: 2/2 (Line: 9, File: c:\stax\sandeep.xml, Machine: 
local://local) 
  function: RunLoop (Line: 24, File: c:\stax\sandeep.xml, Machine: 
local://local 
) 
  sequence: 1/2 (Line: 25, File: c:\stax\sandeep.xml, Machine: 
local://local) 
] 
    } 
  ] 
  Testcase Totals: { 
    Tests : 0 
    Passes: 0 
    Fails : 0 
  } 
} 

C:\> 

--------------------------------------------------------------
Sharon Lucas
IBM Austin,   luc...@us.ibm.com
(512) 286-7313 or Tieline 363-7313




From:        Sandeep <sandeep.bhos...@gmail.com> 
To:        staf-users@lists.sourceforge.net, 
Date:        08/19/2013 06:20 AM 
Subject:        [staf-users] Gettitng error in loop 




Hi 

I am using the STAX XML for my project. I am using script tag to run my 
python script. In the script itselef I have declared some variable which I 

am using in the loop. But I am getting error in the loop. I am not able to 

access the script variable. Below refer below for the problem statement

Below code is in my STAX xml. 

<script>
Python code here. I have a variable declared as List. 
List = len(records)
I have verified the List variable by running the python script and I am 
getting its value.

</script>

Now when I use this variable in the loop below i am not getting the value 
to 
my variable of the script tag. 
Below is my loop 


<script>i=1</script>
   <log message="1">"Lists"</log>
       <loop from ="i" to = "Lists" >
         <if expr ="d[i][0][4]='Sequence'">
           <call function="'SequentialDriverFunction'"/>
           <elseif expr ="d[i][0][4]='Parallel'">
             <call function="'ParallelDriverFunction'"/>
           </elseif>
         </if>          
       </loop>


Here I am getting error as "Error in attribute "to" associated with 
element 
type "loop"."

For this I have checked the List variable from the log message and I found 

that I am not getting the value of variable(which is defined in the above 
script tag)

Can you please tell me how can I access the value of the variable from the 

script tag?

Thank you

Regards,
Sandeep




------------------------------------------------------------------------------
Get 100% visibility into Java/.NET code with AppDynamics Lite!
It's a free troubleshooting tool designed for production.
Get down to code-level detail for bottlenecks, with <2% overhead. 
Download for free and get started troubleshooting in minutes. 
http://pubads.g.doubleclick.net/gampad/clk?id=48897031&iu=/4140/ostg.clktrk

_______________________________________________
staf-users mailing list
staf-users@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/staf-users


[attachment "AD.csv" deleted by Sharon Lucas/Austin/IBM] 
------------------------------------------------------------------------------
Introducing Performance Central, a new site from SourceForge and 
AppDynamics. Performance Central is your source for news, insights, 
analysis and resources for efficient Application Performance Management. 
Visit us today!
http://pubads.g.doubleclick.net/gampad/clk?id=48897511&iu=/4140/ostg.clktrk
_______________________________________________
staf-users mailing list
staf-users@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/staf-users

Reply via email to