################################################################################ # TSL-LIBRARY: EMOS_DDT_Lib ################################################################################ # Copyright (C) 2000 EMOS Computer Consulting GmbH # # This library is free software; you can redistribute it and/or # modify it under the terms of the GNU Lesser General Public # License as published by the Free Software Foundation; either # version 2.1 of the License, or (at your option) any later version. # # This library is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # Lesser General Public License for more details. # # You should have received a copy of the GNU Lesser General Public # License along with this library; if not, write to the Free Software # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA # # For further information please contact: # # Dean Rajovic # EMOS Computer Consulting GmbH # Oskar-Messter-Straße 25 # 85737 Ismaning # Germany # tel.: +49 89 608 765-0 # mailto:drajovic@emos.de # http://www.emos.de ################################################################################ # $Revision: 1.3 $ # $Author: drajovic $ # $Date: 2005/01/28 11:18:42 $ # $Source: C:/Archive/FRAMEWORK/EMOS_GPL/DDT/emos_ddt_lib/script,v $ # $NoKeywords: $ ################################################################################ #/** #* This library contains wrappers for some chosen ddt_functions with #* extended logging and some additional useful functions. #*<p>NOTE:<br> #* The interface to multiple Excel sheets is now supported. #* We kindly thank <a href="mailto:aanoop@covansys.com">Anoop Joy</a> #* for his <code>ExcelSheet.dll</code> which provides the basis for this implementation. #*/ static nameSep = "#"; #/** #* Setter function for sheet separator sign (default: #). #*/ public function ddt_set_name_sep ( in sep ) { nameSep = substr( sep, 1, 1 ); } #/** #* Getter function for sheet separator sign. #*/ public function ddt_get_name_sep () { return nameSep; } #/** #* Opens the given Excel table. This function supports access to multiple Excel #* sheets by appending "#<sheet_name>" to >table< name, e.g. #*<pre> #* DDT_open_table( "C:\\some_dir\\table.xls#sheet1" ); #*</pre> #* @param table (in) table name #* @param mode (in) (optional) DDT_MODE_READ or DDT_MODE_READWRITE [defult: DDT_MODE_READ] #* @return #* E_OK: operation successful #* !E_OK: operation failed #*/ public function DDT_open_table ( in table, in mode ) { auto rc, nameArr[], count; count = split( table, nameArr, nameSep ); switch ( count ) { case 1: break; case 2: rc = ddt_set_excel_sheet(nameArr[1], nameArr[2] ); if ( rc != E_OK ) { tl_step( "DDT_open_table()", rc, table & " [ rc=" & rc & "]" ); return rc; } break; default: rc = E_ILLEGAL_PARAMETER; tl_step( "DDT_open_table()", rc, table & " [ rc=" & rc & "]" ); return rc; } if ( mode == "" ) rc = ddt_open( nameArr[1] ); else rc = ddt_open( nameArr[1], mode ); if( rc == E_FILE_OPEN ) { ddt_close( nameArr[1] ); if ( mode == "" ) rc = ddt_open( nameArr[1] ); else rc = ddt_open( nameArr[1], mode ); } tl_step( "DDT_open_table()", rc, table & " [ rc=" & rc & "]" ); return rc; } #/** #* Closes the table. This routine now parses the table name and removes the #* sheet specification if present. This way we ensure that underlying ddt_close() #* will not fail due to multiple sheet support integrated in DDT_open_table(). #* @param table (in) table name #* @return #* E_OK: operation succeeded #* !E_OK: operation failed #*/ public function DDT_close_table ( in table ) { auto nameArr[], count; count = split( table, nameArr, nameSep ); return ddt_close( nameArr[1] ); } #/** #* Displays a dialog wher you can either choose the default table or display #* the file-browser and pick any file you want. #* @param def_path (in) name of the default table (full path!) #* @param dir (out) name of the chosen directory #* @param name (out) name of the chosen file #* @return #* E_OK: table chosen ( output variables filled ) #* E_BAD_PATH: oeration failed #*/ public function DDT_choose_table ( in def_path, out dir, out name ) { auto rc, table; rc = pause_test( "Should the following table be used?\n\n" & def_path, "&Yes", "&No" ); if ( rc == 0 ) table = def_path; else table = create_browse_file_dialog( "*.xls" ); rc = split_path( table, dir, name ); if ( rc != E_OK ) tl_step( "DDT_choose_table()", rc, table & " [BAD_PATH]" ); return rc; } #/** #* A special-purpose function. It wraps around a ddt_val function by parsing #* the retrieved value. If the value begins with the particular substring #* (default: ?), then a dialog is displayed where the retrieved value may #* be modified before being sent to further processing. #* @param table (in) table name (full path) #* @param param (in) column name #* @param msg (in) message to be displayed in case the substring is found #* @param flag (in) (optional) substring that triggers the dialog [default: ?] #* @return #* value (either modified or unmodified) which is to be further processed #*/ public function DDT_ask ( in table, in param, in msg, in flag ) { auto rc, val, len; if ( flag == "" ) flag = "?"; len = length( flag ); val = ddt_val( table, param ); if ( length( val ) < len ) return val; if ( substr( val, 1, len ) == flag ) { val = substr( val, len+1 ); rc = create_input_dialog( msg & ": " & val ); if ( rc == "" ) return val; return rc; } return val; } #------------------------------------------------------------------------- # The following functions build upon the work of # <a href="mailto:aanoop@covansys.com">Anoop Joy # and his/her ExcelSheet.dll. #------------------------------------------------------------------------- public const _initexsheet = load_dll( getvar("testname") & "\\ExcelSheet.dll" ); #/** #* Changes the active sheet in the given excel file. #* An Excel file contains number of worksheets. Only one among them will be active. #* Winrunner access only this active sheet. #* This function uses excel automation to implement the following algorithm: #* <pre> #* 1. Create an instance of Excel application #* 2. Open the given file in the application #* 3. Iterate through each worksheet in the file #* 4. If the worksheet name matches with the given Sheetname #* Then Set the sheet to Active #* 5. Save the excel file #* 6. Close Excel application #*</pre> #* Usage : SetExcelSheet ( "C:\sample.xls", "Sheet2"); #* @param table (in) table name/path #* @param sheet (in) sheet name #* @return #* -1 Couldn't Open Excel Application #* -2 File not found #* -4 UnExpected Error #* -3 Sheet not found #*/ extern int SetExcelSheet ( in string<1024>, in string<1024> ); public const E_NO_EXCEL = -20661; public const E_NO_EXCEL_FILE = -20662; public const E_NO_EXCEL_SHEET = -20663; public const E_EXCEL_ERROR = -20664; #/** #* Selects the specified sheet in the given Excel table. #* @param excel_filename (in) name/path of the Excel table #* @param excel_sheetname (in) name of the excel shhet to be selected #* @return #* E_OK (0) Operation succesfull #* E_FILE_OPEN (-10007) Cannot open file. File may already be open. #* E_SHARING_VIOLATION (-10041) Sharing violation (i.e. file opened by another app) #* E_FILE_NOT_FOUND (-10033) File not found. #* E_NO_EXCEL (-20661) Couldn't Open Excel Application #* E_NO_EXCEL_FILE (-20662) File not found or not an excel file #* E_NO_EXCEL_SHEET (-20663) Sheet not found #* E_EXCEL_ERROR (-20664) UnExpected Error #* other errors possible #*/ public function ddt_set_excel_sheet ( in excel_filename, in excel_sheetname ) { auto rc, line; # not sure this signature applies to all Excel files/versions static excel_signature = "ÐÏࡱ"; rc = file_open( excel_filename, FO_MODE_READ ); if ( rc != E_OK ) return rc; rc = file_getline ( excel_filename, line ); file_close( excel_filename ); if ( rc != E_OK || match( line, excel_signature ) != 1 ) return E_NO_EXCEL_FILE; rc = SetExcelSheet ( excel_filename, excel_sheetname ); return (rc) ? -20660+rc : E_OK; }