The online community for software testing & quality assurance professionals
 
 
Calendar   Today's Topics
Sponsors:




Lost Password?

Home
BetaSoft
Blogs
Jobs
Training
News
Links
Downloads



Testing Tools >> Micro Focus/Borland/Segue SilkPerformer

Pages: 1
jamessoModerator
Moderator


Reged: 07/31/01
Posts: 1891
Loc: Earth
Share you Performer code here
      #560710 - 04/03/09 04:33 AM

This area is for people to post functions that other might find useful.

Post Extras: Print Post   Remind Me!   Notify Moderator  
Zenpadre
Advanced Member


Reged: 06/20/02
Posts: 468
Loc: NYC area
Re: Share you Performer code here [Re: jamesso]
      #563289 - 04/16/09 01:07 PM

I thought I'd get this started off with a function I've found useful. However it's not my function, it's actually an undocumented function in kernel.bdh called fStrReplace. This will take a string and replace all instances of a particular character with another. For instance, if you want to strip out any spaces in a parameter/variable, you could do it with this function, such as:
Code:
sOutPut  :=  FStrReplace(sInput," ","",false,false);


FYI, here's the function declaration from kernel.bdh
Code:

/**
* String helping functions
*/

// replaces all occurrences of sSearch by sReplace in sSource
// Note: sSource will be modified too!
function FStrReplace(sSource : string;
sSearch : string;
sReplace : string;
bMatchCase : boolean optional;
bWholeWordOnly: boolean optional): string


Also FYI, I haven't had much luck replacing more than one character. Replacing strings may or may not work.

--------------------
Yes, it really IS rocket science!
http://www.linkedin.com/in/doncobos


Post Extras: Print Post   Remind Me!   Notify Moderator  
Zenpadre
Advanced Member


Reged: 06/20/02
Posts: 468
Loc: NYC area
Re: Share you Performer code here [Re: Zenpadre]
      #563586 - 04/17/09 10:54 AM

Here's a repost of a previously posted function I use to populate some global variables I've found useful to always have available to my VUs/scripts. FYI, all the variables are declared in a seperate file called constants.bdh whereas this one I keep in a file called commonfunctions.bdh. The key here is that in the script, "use constants.bdh;" needs to be declared before "use commonfunctions.bdh;"
Code:

function PopulateTestVariables
var
begin
gnLoadTest := GetLoadtest();
gnUserID :=GetUserId();
gnUserIDonAgent := GetUserIdOnAgent();
gsUserID := GetUser();
gsAgentName :=GetAgent();
gsUserGroup :=GetUsergroup();
gsWorkLoad := GetWorkload();
gsProject :=GetProject();
gsScriptName := GetScriptName(FILENAME_SIMPLE);
end PopulateTestVariables;



--------------------
Yes, it really IS rocket science!
http://www.linkedin.com/in/doncobos


Post Extras: Print Post   Remind Me!   Notify Moderator  
Zenpadre
Advanced Member


Reged: 06/20/02
Posts: 468
Loc: NYC area
Maintain login file pointer across multiple agents [Re: Zenpadre]
      #563949 - 04/20/09 11:09 AM

This is a workaround I developed for the fact that Silk Performer does not maintain the file pointer to a login file across multiple agents. Where this might cause you a problem is if two or more VUs running a particular script using the same login file are operating on multiple agents, the users on each agent will grab the same row of the data file if you just use
"FileGetNextRow(hLoginFile,"filename.csv");
First, I have to include another function I use to populate a number of globally declared variables I've found it useful to have available in my scripts. So first step is I invoke this in tInit:
Code:

function PopulateTestVariables : boolean
var
begin
gnLoadTest := GetLoadtest();
gnUserID :=GetUserId();
gnUserIDonAgent := GetUserIdOnAgent();
gsUserID := GetUser();
gsAgentName :=GetAgent();
gsUserGroup :=GetUsergroup();
gsWorkLoad := GetWorkload();
gsProject :=GetProject();
gsScriptName := GetScriptName(FILENAME_SIMPLE);
end PopulateTestVariables;


FYI, all the variables are declared in the same file I keep these functions in - commonfunctions.bdh
Note that the output is the row pointer used on each invocation so you can use that return value in another filegetrow and filegetcolumn call to maintain your row pointer if you have more unique data than just username and password you want to load. This also assumes that your username and password are in column 1 and column 2 respectively.
Code:


function GlobalLoginInc(fsResourceName: string;fsGVarName: string;hFilePointer: number): number
// Place this line in the tInit section of each calling script
// FileCSVLoadGlobal(hLoginFile, "filename.csv",",");
// Place this line in the tMain section of each calling script
// gnRow := GlobalLoginInc(gsScriptName,"LoginID",hLoginFile);
var fnMaxRows,fnRowPointer: number;
begin
GlobalResourceEnter(fsResourceName);
fnMaxRows := FileGetNumRows(hFilePointer); //Increment globalVar "Row Pointer" (global across agents)
GlobalVarInc(fsGVarName, 1, fnRowPointer); // Set the Row index in the CSV file
//If statement checks if we've reached the max rows in the csv file and reset the pointer to 1 if we have
if fnRowPointer <= fnMaxRows then
FileGetRow(hFilePointer, fnRowPointer);
else
GlobalVarSet(fsGVarName, 1);
GlobalVarGet(fsGVarName, fnRowPointer);
FileGetRow(hFilePointer, fnRowPointer);
end;
GlobalLoginInc := fnRowPointer;
// Get the user from the CSV file This assumes the user is
// in column 1 and the password is in column 2
gsUsername := FileGetCol(hFilePointer, 1, STRING_COMPLETE);
gsPasswrd := FileGetCol(hFilePointer, 2, STRING_COMPLETE);
GlobalResourceRelease(fsResourceName);
end GlobalLoginInc;


FYI, if you have two scripts that use the same data file and you don't want either script to use the same user(s) concurrently you can invoke this function using just the filename in both parameters so that the resource constraint and global variable are the same for each script, such as:
gnRow := GlobalLoginInc(Data_FileName,Data_FileName,hLoginFile);
where Data_FileName is a constant in the top of the script, such as:
Const
Data_FileName := "loginfile.csv";

--------------------
Yes, it really IS rocket science!
http://www.linkedin.com/in/doncobos


Post Extras: Print Post   Remind Me!   Notify Moderator  
Zenpadre
Advanced Member


Reged: 06/20/02
Posts: 468
Loc: NYC area
stop users after last line in data file used [Re: Zenpadre]
      #563968 - 04/20/09 12:08 PM

Ok, so with the previous function as my basis I went off to create another function so that I could use as many VUs as I felt I needed and the app could handle and validate any size data/login file(s) yet only iterate through each file once without having to calculate how many iterations to set the script(s) for. This also allows me to run multiple scripts with multiple data files yet only iterate through each data file once.
Code:

function GlobalLoginOnce(fsResourceName: string;fsGVarName: string;hFilePointer: number): number
// Place this line in the tInit section of each calling script
// FileCSVLoadGlobal(nLoginFile, "filename.csv",",");
// Place this section in the tMain section of each calling script
// nCurrentRow := GlobalLoginOnce("Global_Login","LoginID",hFileUsers);
var fnUserHalt,fnMaxRows,fnRowPointer: number;
begin
GlobalResourceEnter(gsScriptName+fsResourceName);
fnMaxRows := FileGetNumRows(hFilePointer);
//Increment globalVar "Row Pointer" (global across agents)
GlobalVarInc(gsScriptName+fsGVarName, 1, fnRowPointer);
// Set the Row index in the CSV file
//If statement checks if we've reached the max rows in the csv file and sets the global exceed variable to 1 if we have
if fnRowPointer <= fnMaxRows then
FileGetRow(hFilePointer, fnRowPointer);
else
GlobalVarSet(gsScriptName+fsGVarName+"Reached", 1);
end;
GlobalVarGet(gsScriptName+fsGVarName+"Reached",fnUserHalt);
if fnUserHalt = 1 then
Print("End of file reached for script " + gsScriptName+". Halting User: "+ gsUserID);
halt;
end;
// Get the user from the CSV file This assumes the user is
// in column 1 and the password is in column 2
gsUsername := FileGetCol(hFilePointer, 1, STRING_COMPLETE);
gsPasswrd := FileGetCol(hFilePointer, 2, STRING_COMPLETE);
GlobalLoginOnce := fnRowPointer;
GlobalResourceRelease(gsScriptName+fsResourceName);
end GlobalLoginOnce;



Ok, now we're not done yet. What I do is create duplicates of my existing scripts by appending 'datacheck' to the script name. So I'll use the GlobalLogin function in my 'real' scripts, and the GlobalLoginOnce function in my 'datacheck' scripts. In my datacheck scripts I set the tMain iterations to some number greater than the # of data lines in the files, usually 100000. I then setup a workload with each datacheck script set to however many users I think the app can safely handle and set all the times to ZERO and use the Queueing model. This is critical to this because with the times set to zero in queueing mode the test will run for as long as the # of iterations has not been reached, or my halt statement has been reached for all users.
FYI, I'll also often put some more intense validations than I might normally to ensure all the logins work and the dataset I've been given functions for the given user(s). After each validation I write any failures out to custom files and include the row # I was using so I can easily remove/modify the offending/failing data. Again I've got a common function that allows me to write to multiple files from multiple users, but however you want to do that is your business.
FYI, this code is given freely for anyone's use, just please share any improvements and give me credit if you think it's due. Happy scripting!

--------------------
Yes, it really IS rocket science!
http://www.linkedin.com/in/doncobos


Post Extras: Print Post   Remind Me!   Notify Moderator  
Jennifervn
Newbie


Reged: 07/01/09
Posts: 1
Re: stop users after last line in data file used [Re: Zenpadre]
      #577776 - 07/01/09 09:00 PM

Thanks for your posts. They are really very cool, very wonderful.
[color=#F9F9F9]simulationcredit


Post Extras: Print Post   Remind Me!   Notify Moderator  
David_T
Newbie


Reged: 06/05/07
Posts: 22
Re: Share you Performer code here [Re: Zenpadre]
      #581737 - 07/23/09 06:19 AM

Following discussion in the forum, I opened a case to the support concerning the function fstrreplace.

This function is now visible in the help of SilkPerformer 2009.


Post Extras: Print Post   Remind Me!   Notify Moderator  
beam
Member


Reged: 06/25/07
Posts: 82
Loc: Sweden
Parsing XML CDATA [Re: jamesso]
      #587792 - 08/27/09 12:39 AM Attachment (257 downloads)

Hi, copied this from one of my previous posts. Here's the link to it (didn't get the indentation right in this post...): Original post

Problem
I needed to parse XML CDATA from a datapool and found this in the SP2008 User Guide:

Quote:

With the XML format, the actual XML content must be XML-encoded. Due to a limitation with SilkPerformer's XML parser, it is currently not possible to use XML CDATA sections to notate such data.




I thought I might as well share it with you guys. Maybe someone will find this useful.

Workaround
I've created a Java wrapper class (included in the attached zip file) and a couple of convenience functions in the BDL language. The wrapper uses the Xerces DOM parser included with the Silk installation (..\ClassFiles\xercesImpl.jar). Copy the jar file into your Data directory and include it in your Silk project as a Data file.

Functions section
Code:

dclfunc
function FgetElementValue( parser : number; xpath : string ) : string
var
element : number;
value : string;
errorMessage : string;
begin
JavaSetString( parser, xpath );
if not JavaCallMethod( parser, "getElement" ) then
JavaGetLastException( parser, errorMessage );
RaiseError( CUSTOM_ERROR, "Exception in silkxml.DomParser.getElement: " + errorMessage );
halt;
end;
element := JavaGetObject( parser );
JavaCastObject( element, "org/w3c/dom/Node" );
if not JavaCallMethod( element, "getTextContent" ) then
JavaGetLastException( element, errorMessage );
RaiseError( CUSTOM_ERROR, "Exception in org.w3c.dom.Node.getTextContent: " + errorMessage );
halt;
end;
JavaGetString( element, value );
FgetElementValue := value;
end FgetElementValue;

function FcountElements( parser : number; xpath : string ) : number
var
elementList : number;
errorMessage : string;
begin
JavaSetString( parser, xpath );
if not JavaCallMethod( parser, "getElements" ) then
JavaGetLastException( parser, errorMessage );
RaiseError( CUSTOM_ERROR, "Exception in silkxml.DomParser.getElement: " + errorMessage );
halt;
end;
elementList := JavaGetObject( parser );
JavaCastObject( elementList, "org/w3c/dom/NodeList" );
if not JavaCallMethod( elementList, "getLength" ) then
JavaGetLastException( elementList, errorMessage );
RaiseError( CUSTOM_ERROR, "Exception in org.w3c.dom.NodeList.getLength: " + errorMessage );
halt;
end;
FcountElements := JavaGetNumber( elementList );
end FcountElements;



Transaction TInit
Code:

JavaCreateJavaVM();
parser := JavaLoadObject( "silkxml/DomParser" );
JavaSetString( parser, xmlString );
if not JavaCallMethod( parser, "parseXml" ) then
JavaGetLastException( parser, errorMessage );
RaiseError( CUSTOM_ERROR, "Exception in silkxml.DomParser.parseXml: " + errorMessage );
halt;
end;



Examples
Code:

service := FgetElementValue( parser, "/service-call/fml-service/name" );
Print( "Service: " + service );
elementCount := FcountElements( parser, "/service-call/fml-service/fml-parameters/parameter" );
for elementIterator := 0 to elementCount - 1 do
name := FgetElementValue( parser, "/service-call/fml-service/fml-parameters/parameter[" + string(elementIterator + 1) + "]/name" );
Print( "Name: " + name );
type := FgetElementValue( parser, "/service-call/fml-service/fml-parameters/parameter[" + string(elementIterator + 1) + "]/type" );
Print( "Type: " + type );
value := FgetElementValue( parser, "/service-call/fml-service/fml-parameters/parameter[" + string(elementIterator + 1) + "]/value" );
Print( "Value: " + value );
// Do the rest, whatever it is...
end;



Post Extras: Print Post   Remind Me!   Notify Moderator  
Zenpadre
Advanced Member


Reged: 06/20/02
Posts: 468
Loc: NYC area
Generate Random Dates that fall on the same day [Re: jamesso]
      #589268 - 09/03/09 01:46 PM

Have a search pattern that always uses the following friday no matter what day the user clicks on so I built this function called "GetDecrementedFriday". Included is another function that I've used for years for creating a date in any format I want and incrementing or decrementing that date. FYI, this is not cleaned up or annotated and most of the print functions were just there for me to check my logic/results.

Code:

//-------------------------------------------------------------------
// Benchmark Script Template
//-------------------------------------------------------------------
// Author : Don Cobos
// Date : 9-4-2009
// History:
//-------------------------------------------------------------------
// Benchmark Description: Generate a random date in the past that always
// falls on a specific day. In this case Friday
//-------------------------------------------------------------------

benchmark BenchmarkName

use "WebAPI.bdh"

// Definition of global variables: string, number, float, boolean, array
var
nDateDecrement,nDateDecrement2 : number;
// Random Variables Section
dclrand

// Workload Section
dcluser
user
VirtUser
transactions
TInit : begin; // Initialization
TmyTrans1 : 100; // Transactions
TEnd : end; // Termination


dclFunc
/***************************************************************************/
// Generates a date and/or time in the specified format
/***************************************************************************/
// Inputs:
// bTime is a boolean where True generates a data AND time and False generates just a date
// sFormat is the string format for the output. Leaving this null will result in the default format.
// nDInc is a number variable to tell how many days to increment the output from the current day. For instance
// 1 will increment generated date by 1 day, etc.
/*
%a. Abbreviated weekday name
%A. Full weekday name
%b. Abbreviated month name
%B. Full month name
%c. Locally appropriate date and time representation
%d. Day of month as decimal number (01 - 31)
%H. Hour in 24-hour format (00 - 23)
%I. Hour in 12-hour format (01 - 12)
%j. Day of year as decimal number (001 - 366)
%m. Month as decimal number (01 - 12)
%M. Minute as decimal number (00 - 59)
%p. Current locales A.M./P.M. indicator for 12-hour clock
%S. Second as decimal number (00 - 59)
%U. Week of year as decimal number, with Sunday as first day of week (00 - 51)
%w. Weekday as decimal number (0 - 6; Sunday is 0)
%W. Week of year as decimal number, with Monday as first day of week (00 - 51)
%x. Date representation for current locale
%X. Time representation for current locale
%y. Year without century, as decimal number (00 - 99)
%Y. Year with century, as decimal number
%z, %Z. Time-zone name or abbreviation; no characters if time zone is unknown
*/

function GD(bTime: boolean;sFormat : string allownull; nDInc : number optional): string
var
nTime,nNewDate, nDate : number;
sDateString : string;

begin
nDate := GetCurrentDate();
nTime := GetCurrentTime();
if sFormat <> "" then
// print("Format: "+sFormat);
end;
//print("Date is "+ string(nDate));
//print("Time is "+string(nTime));
if nDInc <>0 then
nNewDate := IncDate(nDate, nDInc);
nDate := nNewDate;
//print("Incremented Date is "+ string(nDate));
end;
if (bTime = False) and (sFormat ="")then
sDateString := FormatDate(nDate, DATE_DEFAULT);
// Print("dateonly with default format = "+ string(nDate));
elseif (bTime = False) and (sFormat <>"")then
sDateString := FormatDate(nDate, sFormat);
// Print("dateonly with format = "+ string(nDate));
elseif (bTime = True) and (sFormat <>"")then
FormatDateTime(nDate,nTime,sFormat,sDateString);
// Print("date and time with format = "+ sDateString);

end;

GD :=sDateString;
end GD;
function GetDecrementedFriday(fnDateDecrement: number; fnVariableNumber: number): string
var
fDay,fDateFull : string;
begin
fDay:= GD(false,"%A",fnDateDecrement);
fDateFull:= GD(false,"%A, %m/%d/%Y",fnDateDecrement);
// Print("fDay: "+fDay);
// Print("fDateFull: "+fDateFull,NULL,Text_Gray);
While fDay <> "Friday" do
fnDateDecrement := fnDateDecrement+1;
fDay:= GD(false,"%A",fnDateDecrement);
// Print("fDay: "+fDay+" and fnDateDecrement = "+string(fnDateDecrement));
End;
fDay := GD(false,"%m/%d/%Y",fnDateDecrement);
fDateFull:= GD(false,"%A, %m/%d/%Y",fnDateDecrement);
// Print("fDay: "+fDay);
Print("fDateFull: "+fDateFull,NULL,Text_Green);
GetDecrementedFriday :=fDay;
if fnVariableNumber = 1 then
nDateDecrement := fnDateDecrement;
else
nDateDecrement2 := fnDateDecrement;
end;

end GetDecrementedFriday;

// Transactions Section
dcltrans
transaction TInit
begin
// Insert here the initial statements
end TInit;

transaction TmyTrans1
var
stxtWeekending_Dt,stxtWeekending_Dt2 : string;
begin
nDateDecrement := RndUniN(-88..-28);
nDateDecrement2:= RndUniN(-78..-10);
While nDateDecrement2 < (nDateDecrement+14) do
nDateDecrement2:= RndUniN(-78..-10);
End;
stxtWeekending_Dt := GetDecrementedFriday(nDateDecrement,1);
stxtWeekending_Dt2 := GetDecrementedFriday(nDateDecrement2,2);
// Print("nDateDecrement = "+string(nDateDecrement));
// Print("nDateDecrement2 = "+string(nDateDecrement2));
Print("Date differential is "+ string((nDateDecrement-nDateDecrement2)/7)+" weeks",NULL,Text_Blue);

end TmyTrans1;

transaction TEnd
begin
// Terminate the user
end TEnd;




--------------------
Yes, it really IS rocket science!
http://www.linkedin.com/in/doncobos


Post Extras: Print Post   Remind Me!   Notify Moderator  
Gyami
Member


Reged: 04/16/06
Posts: 250
Uploading a File [Re: Zenpadre]
      #598272 - 10/26/09 06:27 AM

If you want to upload a file and if you want to upload a new file everytime, then here is tip how this can be achieved using SP.

First Use FOpen Function to open the file needed to uploaded and then use FRead function to read its content.
Comment out the content of the file appearing in WebPageSubmit and replace it with sData variable obtainined FRead.
Add FClose function in TEnd to close the file.
Please check the syntax of all the functions.


Post Extras: Print Post   Remind Me!   Notify Moderator  
Sayantani
Junior Member


Reged: 07/18/05
Posts: 52
Loc: Kolkata, India
Customize cursor position in Mainframe script [Re: Gyami]
      #607207 - 12/22/09 11:26 PM

Hi,

I came across this problem while doing mainframe scripting. (Terminal Emulator protocol)
The user writes something in field(s) and presses enter. - This whole thing is recorded as hex values (for the cursor position and "enter" keypress.)
E.g. WebTelnetSendRecord(hWeb0, "\h00000000057DC2D311C24A" + StrToHostCP("oe9v") + "\h11C24F" + StrToHostCP("sb;1-6677001____"));
1. The \h in the beginning is a special character meaning that the following characters are in hexadecimal.
2. Instruction Sequence number - 0000000005
3. Action ID (Otherwise known as Attn ID) 7D (In this case the Enter Action key was pressed. If we press F10, then the Attn ID for that is 7A. (Refer table below for more Attn IDs)
4. Cursor position at the time of pressing the Action Key C2D3 is the Buffer Address of the cursor position. There is a mapping file for the cursor position (col, row) and the corresponding buffer address. This mapping file can be downloaded from http://www.tommysprinkle.com/mvs/P3270/bufaddr.htm
5. Fields which were modified on the screen prior to pressing the Action Key. Every individual field modified is delimited by the hexadecimal value of \h11. After each \h11 follows the buffer address of the field which was modified and the new value to be sent to the server for that field. User the Buffer address translation table for getting to know which Row and Column needs to be sent to the server. Put this table in a csv file for easy reading and translation.
6. In the above example there are two fields which were modified. The first field to be modified was the field where we entered oe9v text
7. Second field which was modified was the field where we enter the sb 1-667701 or whatever the order number is.
8. So, the whole string means essentially, write sb;1-667701 at cursor position C24F, write OE9V at cursor position C24A, and then press Enter(7D) and after pressing Enter, the cursor is at C2D3.

Now, say in row nRow and Column nCol, we have to write oe9v. That is, we need to customize the cursor position where OE9V is written.

For successfully customizing the cursor position, we need a special function called Get3270CursorPos() from Borlands function library. - It is not available in Silk help files. It takes as input handle of a TN3270 connection, original (recorded) cursor position (2 bytes), new Column and new Row. So for the above example we need to send the request as follows:
WebTelnetSendRecord(hWeb0, "\h00000000057DC2D311" + Get3270CursorPos(hWeb0, \hC24A, nCol, nRow) + StrToHostCP("oe9v");
==========================================================
Attn IDs:
Attn ID Meaning
7D Enter
F1-F9 PF1 - PF9
7A-7C PF10 - PF12
C1-C9 PF13 - PF21
4A-4C PF22 - PF24
6C PA1
6E PA2
6B PA3
6D Clear
60 No AID
========================================================

Function for Concatenating Buffer Address
/********************************************************/
// Function : Get3270CursorPos
// Parameters:
// hWeb : handle of a TN3270 connection
// sTemplate : original (recorded) cursor position (2 bytes)
// nCol : new Column
// nRow : new Row
//
// returns : 2-byte string representing the new cursor position,
// to be used instead of the original recorded cursor position string

function Get3270CursorPos(hWeb : number; sTemplate : string; nCol : number; nRow : number) : string
var
nScreenCols : number;
nScreenRows : number;
nAddress : number;
nScheme1 : number;
nScheme2 : number;
sRet : string(2);
begin

Get3270CursorPos := sTemplate;
WebTelnetScreenGetSize(hWeb, nScreenCols, nScreenRows);

if (nCol < 1) or (nRow < 1) or (nCol > nScreenCols) or (nRow > nScreenRows) then
RepMessage("Get3270CursorPos: invalid col/row specified: " + string(nCol) + "/" + string(nRow) +
"; screen size is: " + string(nScreenCols) + "/" + string(nScreenRows), SEVERITY_ERROR);

elseif BinLen(sTemplate) <> 2 then
RepMessage("Get3270CursorPos: invalid template specified, need both bytes of original cursor position", SEVERITY_ERROR);
Get3270CursorPos := sTemplate;

else
nAddress := nScreenCols * (nRow - 1) + nCol - 1;
nScheme1 := ord(sTemplate[1]) & 0xC0;
nScheme2 := ord(sTemplate[2]) & 0xC0;
BinSetLen(sRet, 2);

if nScheme1 = 0 then
sRet[1] := chr(nAddress / 256);
sRet[2] := chr(nAddress & 0xFF);
else
sRet[1] := chr(nScheme1 | (nAddress / 64));
sRet[2] := chr(nScheme2 | (nAddress & 0x3F));
end;
Get3270CursorPos := sRet;
end;
end Get3270CursorPos;
/********************************************************/

===================================================
Buffer Address Values
The buffer address table can be downloaded from:
http://www.tommysprinkle.com/mvs/P3270/bufaddr.htm
===================================================

--------------------
thanks,
Sayantani from India


Post Extras: Print Post   Remind Me!   Notify Moderator  
bhuvivenu
Newbie


Reged: 09/03/10
Posts: 11
Re: Uploading a File [Re: Gyami]
      #649898 - 11/24/10 03:31 AM

hi can u tell me how to upload different file for each time(Each VUser) in web application . My web application is having submit option which will take different xmls each time. I want to customize the file name of the xml. But if i select the name its customizing all other options in the web form which results in doing nothing.

Post Extras: Print Post   Remind Me!   Notify Moderator  
Pages: 1



Extra information
0 registered and 2 anonymous users are browsing this forum.

Moderator:  AJ, jamesso 

Print Topic

Forum Permissions
      You cannot start new topics
      You cannot reply to topics
      HTML is disabled
      UBBCode is enabled

Rating: *****
Topic views: 12522

Rate this topic

Jump to

Contact Us | Privacy statement SQAForums

Powered by UBB.threads™ 6.5.5