51Testing软件测试论坛

 找回密码
 (注-册)加入51Testing

QQ登录

只需一步,快速开始

微信登录,快人一步

手机号码,快捷登录

查看: 16276|回复: 31
打印 上一主题 下一主题

关于datatable和dtsheet对象,SetCurrentRow不明白的也近来看看。

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2005-6-22 13:14:15 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
首先,我们要弄清楚,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 ]

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?(注-册)加入51Testing

x
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏
回复

使用道具 举报

该用户从未签到

2#
 楼主| 发表于 2005-6-22 13:15:33 | 只看该作者
我刚刚上传了一个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 ]
回复 支持 反对

使用道具 举报

该用户从未签到

3#
发表于 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
以上四行数据都可以依次取到!
回复 支持 反对

使用道具 举报

该用户从未签到

4#
 楼主| 发表于 2005-6-22 14:00:15 | 只看该作者
下面我给出所有的代码和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 ]

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?(注-册)加入51Testing

x
回复 支持 反对

使用道具 举报

该用户从未签到

5#
发表于 2005-6-22 14:09:02 | 只看该作者
这个例子比较完整
我的那个例子,是建在Gobal上运行才正常!
不错!
回复 支持 反对

使用道具 举报

该用户从未签到

6#
 楼主| 发表于 2005-6-22 14:27:23 | 只看该作者
Gobal上的能建几个?
会不会每次再弄新的,就把以前的冲掉啊?

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

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

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

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

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

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

使用道具 举报

该用户从未签到

7#
发表于 2005-6-23 14:21:38 | 只看该作者
我认为Global只有一个,其他都算作Localsheet,名字可以随便起。就像全程变量和局部变量一样
回复 支持 反对

使用道具 举报

该用户从未签到

8#
 楼主| 发表于 2005-6-23 14:56:01 | 只看该作者
为了讲清楚,我截了一个图,如果还说不明白,我再想办法。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?(注-册)加入51Testing

x
回复 支持 反对

使用道具 举报

该用户从未签到

9#
 楼主| 发表于 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.那么就比较容易乱套了。

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

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


如果不是,
回复 支持 反对

使用道具 举报

该用户从未签到

10#
发表于 2005-6-23 16:24:22 | 只看该作者
讲的很有道理,index那个又学到一点,呵呵
回复 支持 反对

使用道具 举报

该用户从未签到

11#
 楼主| 发表于 2005-6-23 18:30:38 | 只看该作者
学到了,就要讲给更多的人听哦:)

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

[ Last edited by lovetest6 on 2005-6-23 at 18:31 ]
回复 支持 反对

使用道具 举报

该用户从未签到

12#
发表于 2005-7-1 10:18:42 | 只看该作者
受益匪浅
有个问题请教:是不是这样写脚本,每次运行时才去读test.xls,也就是如果修改了测试数据文件,也不用修改测试脚本了?
回复 支持 反对

使用道具 举报

该用户从未签到

13#
 楼主| 发表于 2005-7-1 10:53:38 | 只看该作者
如果修改了测试数据,就这个例子而言,不用改什么了,
具体问题还要具体分析哦,:)呵呵。

如果有时间,脚本还是应该写的强壮一些的。
回复 支持 反对

使用道具 举报

该用户从未签到

14#
发表于 2007-4-16 18:20:55 | 只看该作者
楼主讲的很详细了,可是因为一点基础都没有,我还想问一下写了这段程序以后在参数对话框里怎么设的阿?
回复 支持 反对

使用道具 举报

该用户从未签到

15#
发表于 2007-4-16 18:38:24 | 只看该作者
还有,为什么我导入表的值只出现在了msgbox 里面没有添加到webedit里面阿?
回复 支持 反对

使用道具 举报

该用户从未签到

16#
发表于 2007-4-18 09:34:11 | 只看该作者

回复 #1 lovetest6 的帖子

ok
回复 支持 反对

使用道具 举报

该用户从未签到

17#
发表于 2007-6-22 18:41:15 | 只看该作者
我输入datatable.addsheet("51testing")后运行怎么datatable里没有看到这个新建的东西啊
回复 支持 反对

使用道具 举报

该用户从未签到

18#
发表于 2007-6-25 09:38:31 | 只看该作者
只能在result里的run-time datatable里面可以看到新增了一个sheet
回复 支持 反对

使用道具 举报

该用户从未签到

19#
发表于 2007-7-20 14:41:06 | 只看该作者
谢谢。
回复 支持 反对

使用道具 举报

该用户从未签到

20#
发表于 2007-8-17 11:25:45 | 只看该作者
Thanks
回复 支持 反对

使用道具 举报

本版积分规则

关闭

站长推荐上一条 /1 下一条

小黑屋|手机版|Archiver|51Testing软件测试网 ( 沪ICP备05003035号 关于我们

GMT+8, 2024-11-23 08:09 , Processed in 0.103030 second(s), 28 queries .

Powered by Discuz! X3.2

© 2001-2024 Comsenz Inc.

快速回复 返回顶部 返回列表