关于datatable和dtsheet对象,SetCurrentRow不明白的也近来看看。
首先,我们要弄清楚,datatable.ImportSheet的作用,以及一些注意事项。顾名思义,从名字上看,它的做用应该是Import了一个Sheet。
但是怎么Import的呢?
(sheet的概念不清楚的,请查看微软的帮助。)
我们建一个excel文件,默认的会有三个sheet,名称分别为sheet1,sheet2,sheet3
我们将sheet1改名为testsheet为了方便我们后面使用和理解。
我们在testsheet中加入若干数据,为了方便起见,
我们只加入一列。注意第一行第一列。
name
1
2
3
4
5
6
这里的第一行,第一列我用了name,第二行第一列开始我用了1。
这是因为QTP在Import的时候,很人性化,呵呵:)
它会用name作为testsheet的中第一个字段的字段名:)
有兴趣的朋友可以debug的时候看一下。
待续。。。。
[ Last edited by lovetest6 on 2005-6-22 at 13:32 ] 我刚刚上传了一个test.xls,大家可以download下来备用!:)
好了,明白了上个贴中所说的,我们就可以来写代码了,
我们一行一行写,不要着急。
首先:
datatable.AddSheet("51sheet")'这句话的意思是新增一个sheet,名字和我们excel中的不同,以示区别。
执行完上面这行了,我们的QTP中,有了一个sheet,叫做51sheet。
大家在debug的时候,可以看到。
datatable.ImportSheet "f:\test.xls","testsheet","51sheet"'这句话的意思是从指定的excel文件上import一个名字叫"testsheet"的sheet,到刚刚QTP中我们新增那个sheet中。也就是51sheet中。
执行完上面的两句话,我们在QTP中就有了一个sheet而且里面有了数据。
sheet的名字叫51sheet.这个51sheet中的数据和我们excel文件中的一样。
但是有个小区别。那就是51sheet中的数据比testsheet中的数据少一行。
这是为什么呢?没错,那个第一行的name没有了,它被QTP作为51sheet中的列名了。
同样,大家可以在debug的时候看到。
Dim i,RowCount '定义两个变量
i=0
RowCount=datatable.GetSheet("51sheet").GetRowCount '设置RowCount等于51sheet中的行数。
msgbox RowCount
上面的代码,没有什么好解释的了吧?我们继续下面的代码。
现在我们开是一个循环。i=0然后每次加一,直到i<rowcount不成立为止。
Do while i<rowcount
i=i+1 '第一次进入循环,执行这句后,i=1
'datatable.getsheet("51sheet").setcurrentrow(i)这句话被我注释掉了,正确的写法应该是下面这样,分开写。
datatable.getsheet("51sheet")
datatable.setcurrentrow(i)
'执行过上面两句后,CurrentRow是第一行。
tempData=DataTable.GetSheet("51sheet").GetParameter("Name").Value
'现在,我们调用msgbox看看下面这种调用方法得到的是什么值?没错,是第一行的值,下一次循环呢?
'得到的是第二行的值么?
msgbox tempData '这里弹出我们要看的值。
'下面我们用另外一种方法来得到。
msgbox DataTable.GetSheet("51sheet").GetParameter(1).Value '这里我用GetParameter(1)去得到sheet中第一列的值。
loop
大家考虑一下,为什么我要告诉大家可以用GetParameter(1)呢?
没错,很多同志不知道QTP的人性化,所以不在第一行上写column name
于是他用GetParameter("Name")就得不到值。
注意GetParameter("Name")中要区分大小写。
哈哈。
[ Last edited by lovetest6 on 2005-6-22 at 13:58 ] 根据LOVETEST6的说明作出一点修改!
改下例子除自己写的程序可以放到你们自己的脚本上面.其它都是QTP录制自带的例子可以得到的.
name
kkkk
llllll
ppppppp
eeeeee
我们将sheet1改名为Global
datatable.AddSheet("name")-----加一个SHEET
datatable.ImportSheet "C:\name.xls" ,1,Global------从外部导进4个数据
Dim i,rowcount '定义两个变量
i=0
rowcount=datatable.getrowcount
Do while i<rowcount
i=i+1
msgbox rowcount
reporter.ReportEvent 2,"统计NAME总行数 "&rowcount
Window("Flight Reservation").Activate
Window("Flight Reservation").WinButton("Button").Click
Window("Flight Reservation").WinObject("Date of Flight:").Type "062305"
Window("Flight Reservation").WinComboBox("Fly From:").Select "Denver"
Window("Flight Reservation").WinComboBox("Fly To:").Select "London"
Window("Flight Reservation").WinButton("FLIGHT").Click
Window("Flight Reservation").Dialog("Flights Table").WinButton("OK").Click
datatable.setcurrentrow(i)
Window("Flight Reservation").WinEdit("Name:").Set DataTable("name", dtGlobalSheet)
Window("Flight Reservation").WinEdit("Tickets:").SetSelection 0,1
Window("Flight Reservation").WinEdit("Tickets:").Set "2"
Window("Flight Reservation").WinRadioButton("Business").Set
Window("Flight Reservation").WinButton("Insert Order").Click
loop
以上四行数据都可以依次取到! 下面我给出所有的代码和excel文件。
有兴趣的朋友可以试试看。
datatable.AddSheet("51sheet")
datatable.ImportSheet "f:\test.xls","testsheet","51sheet"
Dim i,RowCount '定义两个变量
i=0
RowCount=datatable.GetSheet("51sheet").GetRowCount '设置RowCount等于51sheet中的行数。
msgbox RowCount
Do while i<rowcount
i=i+1 '第一次进入循环,执行这句后,i=1
'datatable.getsheet("51sheet").setcurrentrow(i)这句话被我注释掉了,正确的写法应该是下面这样,分开写。
datatable.getsheet("51sheet")
datatable.setcurrentrow(i)
'执行过上面两句后,CurrentRow是第一行。
tempData=DataTable.GetSheet("51sheet").GetParameter("Name").Value
'现在,我们调用msgbox看看下面这种调用方法得到的是什么值?没错,是第一行的值,下一次循环呢?
'得到的是第二行的值么?
msgbox "GetParameter-Name:"&tempData '这里弹出我们要看的值。
'下面我们用另外一种方法来得到。
msgbox "GetParameter-i:"&DataTable.GetSheet("51sheet").GetParameter(1).Value '这里我用GetParameter(1)去得到sheet中第一列的值。
loop
[ Last edited by lovetest6 on 2005-6-22 at 14:01 ] 这个例子比较完整
我的那个例子,是建在Gobal上运行才正常!
不错! Gobal上的能建几个?
会不会每次再弄新的,就把以前的冲掉啊?
换句话说,象全局变量一样?
我对MI的dtGobalSheet,dtLocalSheet理解不清楚。
Gobal Sheet 似乎应该是和MySheet对应的啊
或者mySheet就应该是localSheet的一种。
另外,我想dtGobalSheet前面的dt不会是DataTable的缩写吧?
呵呵,应该是DTSheet这个对象的缩写。
dataTable对象和dtSheet对象都有SetCurrentRow方法。
作用应该在某种情况下也是一样的,但是在某些情况下,如果不注意,就会得到意想不到的结果。 我认为Global只有一个,其他都算作Localsheet,名字可以随便起。就像全程变量和局部变量一样 为了讲清楚,我截了一个图,如果还说不明白,我再想办法。 dtGlobalsheet只有一个,它的index值比较特殊,它有两个index值,
一个是我们普遍认为了1还有一个是内置的默认的1000。
你可以用1或者1000去引用它都是正确的。当然了,如果你用dtGlobalsheet来引用它也是正确的。这个sheet的Name叫做"Global"。注意:SheetName是区分大小写的。
dtLocalsheet在我上传的例子中,你可以用index:1001来引用,当然,你也可以用2来引用。
至于51sheet嘛,你就只能用index:3来引用了。
它没有内置的默认的类似前两个那样的index值。
datatable这个对象只有一个。就是所有sheet的集合。或许你把它理解为excel文件比较好。
dtsheet呢?就是其中的每个sheet。所不同的就是MI为他们做了一些默认值。
在我们的应用中,可能会有多个action,如:actiion1,actiion2,actiion3
这些action也分别对应有各自默认的LoaclSheet.即:actiion1,actiion2,actiion3。
如果每个action中,我们都只用到一个sheet,那就好办了,在每个action中都可以用localsheet来引用,但是如果我们有两个及两个以上的sheet.那么就比较容易乱套了。
呵呵,说了这么多。其实用处也不大。
各位在工作中能用就行了。不理解的也没必要死扣。
我理解的也不一定正确。各位见笑了:)
如果不是, 讲的很有道理,index那个又学到一点,呵呵 学到了,就要讲给更多的人听哦:)
呵呵。做一个知识的传播者:)
呵呵。
[ Last edited by lovetest6 on 2005-6-23 at 18:31 ] 受益匪浅
有个问题请教:是不是这样写脚本,每次运行时才去读test.xls,也就是如果修改了测试数据文件,也不用修改测试脚本了? 如果修改了测试数据,就这个例子而言,不用改什么了,
具体问题还要具体分析哦,:)呵呵。
如果有时间,脚本还是应该写的强壮一些的。 楼主讲的很详细了,可是因为一点基础都没有,我还想问一下写了这段程序以后在参数对话框里怎么设的阿? 还有,为什么我导入表的值只出现在了msgbox 里面没有添加到webedit里面阿?
回复 #1 lovetest6 的帖子
ok 我输入datatable.addsheet("51testing")后运行怎么datatable里没有看到这个新建的东西啊 只能在result里的run-time datatable里面可以看到新增了一个sheet 谢谢。 Thanks
页:
[1]
2