51Testing软件测试论坛

标题: 关于datatable和dtsheet对象,SetCurrentRow不明白的也近来看看。 [打印本页]

作者: lovetest6    时间: 2005-6-22 13:14
标题: 关于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
我刚刚上传了一个test.xls,大家可以download下来备用!:)

好了,明白了上个贴中所说的,我们就可以来写代码了,

我们一行一行写,不要着急。
首先:

  1. datatable.AddSheet("51sheet")'这句话的意思是新增一个sheet,名字和我们excel中的不同,以示区别。
复制代码

执行完上面这行了,我们的QTP中,有了一个sheet,叫做51sheet。
大家在debug的时候,可以看到。

  1. 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的时候看到。


  1. Dim i,RowCount '定义两个变量
  2. i=0
  3. RowCount=datatable.GetSheet("51sheet").GetRowCount '设置RowCount等于51sheet中的行数。

  4. msgbox RowCount
复制代码

上面的代码,没有什么好解释的了吧?我们继续下面的代码。

现在我们开是一个循环。i=0然后每次加一,直到i<rowcount不成立为止。

  1. Do while i<rowcount
  2. i=i+1 '第一次进入循环,执行这句后,i=1
  3. 'datatable.getsheet("51sheet").setcurrentrow(i)  这句话被我注释掉了,正确的写法应该是下面这样,分开写。

  4. datatable.getsheet("51sheet")
  5. datatable.setcurrentrow(i)

  6. '执行过上面两句后,CurrentRow是第一行。

  7. tempData=DataTable.GetSheet("51sheet").GetParameter("Name").Value
  8.                   
  9. '现在,我们调用msgbox看看下面这种调用方法得到的是什么值?没错,是第一行的值,下一次循环呢?
  10. '得到的是第二行的值么?
  11. msgbox tempData '这里弹出我们要看的值。
  12. '下面我们用另外一种方法来得到。
  13. msgbox DataTable.GetSheet("51sheet").GetParameter(1).Value '这里我用GetParameter(1)去得到sheet中第一列的值。
  14. 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
根据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
下面我给出所有的代码和excel文件。
有兴趣的朋友可以试试看。

  1. datatable.AddSheet("51sheet")
  2. datatable.ImportSheet "f:\test.xls","testsheet","51sheet"

  3. Dim i,RowCount '定义两个变量
  4. i=0
  5. RowCount=datatable.GetSheet("51sheet").GetRowCount '设置RowCount等于51sheet中的行数。
  6. msgbox RowCount
  7. Do while i<rowcount
  8. i=i+1 '第一次进入循环,执行这句后,i=1
  9. 'datatable.getsheet("51sheet").setcurrentrow(i)  这句话被我注释掉了,正确的写法应该是下面这样,分开写。

  10. datatable.getsheet("51sheet")
  11. datatable.setcurrentrow(i)

  12. '执行过上面两句后,CurrentRow是第一行。

  13. tempData=DataTable.GetSheet("51sheet").GetParameter("Name").Value
  14.                   
  15. '现在,我们调用msgbox看看下面这种调用方法得到的是什么值?没错,是第一行的值,下一次循环呢?
  16. '得到的是第二行的值么?
  17. msgbox "GetParameter-Name:"&tempData '这里弹出我们要看的值。
  18. '下面我们用另外一种方法来得到。
  19. msgbox "GetParameter-i:"&DataTable.GetSheet("51sheet").GetParameter(1).Value '这里我用GetParameter(1)去得到sheet中第一列的值。
  20. loop
复制代码

[ Last edited by lovetest6 on 2005-6-22 at 14:01 ]
作者: QA_BAY    时间: 2005-6-22 14:09
这个例子比较完整
我的那个例子,是建在Gobal上运行才正常!
不错!
作者: lovetest6    时间: 2005-6-22 14:27
Gobal上的能建几个?
会不会每次再弄新的,就把以前的冲掉啊?

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

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

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

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

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

作用应该在某种情况下也是一样的,但是在某些情况下,如果不注意,就会得到意想不到的结果。
作者: michelle_happy    时间: 2005-6-23 14:21
我认为Global只有一个,其他都算作Localsheet,名字可以随便起。就像全程变量和局部变量一样
作者: lovetest6    时间: 2005-6-23 14:56
为了讲清楚,我截了一个图,如果还说不明白,我再想办法。
作者: lovetest6    时间: 2005-6-23 15:10
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
讲的很有道理,index那个又学到一点,呵呵
作者: lovetest6    时间: 2005-6-23 18:30
学到了,就要讲给更多的人听哦:)

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

[ Last edited by lovetest6 on 2005-6-23 at 18:31 ]
作者: ceshi    时间: 2005-7-1 10:18
受益匪浅
有个问题请教:是不是这样写脚本,每次运行时才去读test.xls,也就是如果修改了测试数据文件,也不用修改测试脚本了?
作者: lovetest6    时间: 2005-7-1 10:53
如果修改了测试数据,就这个例子而言,不用改什么了,
具体问题还要具体分析哦,:)呵呵。

如果有时间,脚本还是应该写的强壮一些的。
作者: Sophie.zhang.cs    时间: 2007-4-16 18:20
楼主讲的很详细了,可是因为一点基础都没有,我还想问一下写了这段程序以后在参数对话框里怎么设的阿?
作者: Sophie.zhang.cs    时间: 2007-4-16 18:38
还有,为什么我导入表的值只出现在了msgbox 里面没有添加到webedit里面阿?
作者: yuanxinyi16rain    时间: 2007-4-18 09:34
标题: 回复 #1 lovetest6 的帖子
ok
作者: wish_luckyman    时间: 2007-6-22 18:41
我输入datatable.addsheet("51testing")后运行怎么datatable里没有看到这个新建的东西啊
作者: wish_luckyman    时间: 2007-6-25 09:38
只能在result里的run-time datatable里面可以看到新增了一个sheet
作者: julialove    时间: 2007-7-20 14:41
谢谢。
作者: vaguely    时间: 2007-8-17 11:25
Thanks
作者: yqx    时间: 2007-9-11 18:24
十分感谢楼主。。这两天正为dtGlobasheet,dtLocalsheet犯迷糊呢。。。
作者: linnawang    时间: 2007-9-13 11:42
路过看过 sdlkfj2
作者: toyfrog    时间: 2007-10-16 22:21
学习学习
作者: toyfrog    时间: 2007-10-16 22:21
学习学习
作者: toyfrog    时间: 2007-10-16 22:57
学习学习
作者: toyfrog    时间: 2007-10-16 22:57
学习学习
作者: momang    时间: 2008-7-4 15:12
学习 学习
作者: lin85210    时间: 2008-7-11 16:09
标题: 回复 9# 的帖子
,在每个action中都可以用localsheet来引用,但是如果我们有两个及两个以上的sheet.那么就比较容易乱套了。


刚刚你说的这个是怎末个麻烦呢?
如果你有2个ACTIOn,而且用2不同的sheet来参数。在参数的时候你写的是dtlocalsheet呢还是用2个SHEET的不同名字呢?
  好像写不同的SHEET名字会出错吧,如果真要想用2 个不同的sheet的话,在脚本里如何实现呢?
作者: jian8940516    时间: 2009-7-10 00:31
标题: xuexi

作者: huiguiziran111    时间: 2010-8-5 14:36
很好。。发现精华帖。可以封签的
作者: zivieira    时间: 2010-10-28 15:12
学习了!谢谢分享!
作者: Longjiahuan    时间: 2011-6-22 10:41
很好




欢迎光临 51Testing软件测试论坛 (http://bbs.51testing.com/) Powered by Discuz! X3.2