lovetest6 发表于 2005-6-22 13:14:15

关于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 ]

lovetest6 发表于 2005-6-22 13:15:33

我刚刚上传了一个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 ]

QA_BAY 发表于 2005-6-22 13:41:46

根据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
以上四行数据都可以依次取到!

lovetest6 发表于 2005-6-22 14:00:15

下面我给出所有的代码和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 ]

QA_BAY 发表于 2005-6-22 14:09:02

这个例子比较完整
我的那个例子,是建在Gobal上运行才正常!
不错!

lovetest6 发表于 2005-6-22 14:27:23

Gobal上的能建几个?
会不会每次再弄新的,就把以前的冲掉啊?

换句话说,象全局变量一样?

我对MI的dtGobalSheet,dtLocalSheet理解不清楚。

Gobal Sheet 似乎应该是和MySheet对应的啊
或者mySheet就应该是localSheet的一种。

另外,我想dtGobalSheet前面的dt不会是DataTable的缩写吧?
呵呵,应该是DTSheet这个对象的缩写。

dataTable对象和dtSheet对象都有SetCurrentRow方法。

作用应该在某种情况下也是一样的,但是在某些情况下,如果不注意,就会得到意想不到的结果。

michelle_happy 发表于 2005-6-23 14:21:38

我认为Global只有一个,其他都算作Localsheet,名字可以随便起。就像全程变量和局部变量一样

lovetest6 发表于 2005-6-23 14:56:01

为了讲清楚,我截了一个图,如果还说不明白,我再想办法。

lovetest6 发表于 2005-6-23 15:10:16

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.那么就比较容易乱套了。

呵呵,说了这么多。其实用处也不大。
各位在工作中能用就行了。不理解的也没必要死扣。

我理解的也不一定正确。各位见笑了:)


如果不是,

michelle_happy 发表于 2005-6-23 16:24:22

讲的很有道理,index那个又学到一点,呵呵

lovetest6 发表于 2005-6-23 18:30:38

学到了,就要讲给更多的人听哦:)

呵呵。做一个知识的传播者:)
呵呵。

[ Last edited by lovetest6 on 2005-6-23 at 18:31 ]

ceshi 发表于 2005-7-1 10:18:42

受益匪浅
有个问题请教:是不是这样写脚本,每次运行时才去读test.xls,也就是如果修改了测试数据文件,也不用修改测试脚本了?

lovetest6 发表于 2005-7-1 10:53:38

如果修改了测试数据,就这个例子而言,不用改什么了,
具体问题还要具体分析哦,:)呵呵。

如果有时间,脚本还是应该写的强壮一些的。

Sophie.zhang.cs 发表于 2007-4-16 18:20:55

楼主讲的很详细了,可是因为一点基础都没有,我还想问一下写了这段程序以后在参数对话框里怎么设的阿?

Sophie.zhang.cs 发表于 2007-4-16 18:38:24

还有,为什么我导入表的值只出现在了msgbox 里面没有添加到webedit里面阿?

yuanxinyi16rain 发表于 2007-4-18 09:34:11

回复 #1 lovetest6 的帖子

ok

wish_luckyman 发表于 2007-6-22 18:41:15

我输入datatable.addsheet("51testing")后运行怎么datatable里没有看到这个新建的东西啊

wish_luckyman 发表于 2007-6-25 09:38:31

只能在result里的run-time datatable里面可以看到新增了一个sheet

julialove 发表于 2007-7-20 14:41:06

谢谢。

vaguely 发表于 2007-8-17 11:25:45

Thanks
页: [1] 2
查看完整版本: 关于datatable和dtsheet对象,SetCurrentRow不明白的也近来看看。