51Testing软件测试论坛

标题: pls hellp me,不能正确读取数据表中的内容 [打印本页]

作者: lzz    时间: 2005-6-21 11:59
标题: pls hellp me,不能正确读取数据表中的内容
请大家帮我解决一下下面的问题.
我要新增一项资料,把新增资料中要用到的数据放在一个excel表中,然后在运行的时候导入该execl表。然后用一个循环分别读取excel表中的数据。为什么我运行的时候只能读取第一行的数据,后面的数据不能正确读取呢。研究了好久,估计是Browser("::::School Sports Programe").Page("::.SSP System.::").WebEdit("noOfRegister").Set DataTable("noOfRegister", dtsportCaptionSheet) 这地方有问题,但不知道怎么解决。
大伙帮我看看吧。

相关的代码copy如下:

datatable.AddSheet("sportCaption")
datatable.ImportSheet "E:\sportCaption.xls","sportCaption","sportCaption"
Dim i,rowcount
i=0
rowcount=datatable.GetSheet("sportCaption").getrowcount
reporter.ReportEvent 2,"there are "&rowcount,"row in this data table"
Do while i<rowcount
i=i+1
datatable.getsheet("sportCaption").setcurrentrow(i)
Browser("::::School Sports Programe").Page("::::School Sports Programe_2").Image("mnu01").Click
Browser("::::School Sports Programe").Page("::::School Sports Programe_2").WebButton("新增資料").Click
Browser("::::School Sports Programe").Page("::::School Sports Programe_2").WebButton("運動領袖").Click
Browser("::::School Sports Programe").Page("::.SSP System.::").WebList("activityType").Select DataTable("activityType", dtsportCaptionSheet)
Browser("::::School Sports Programe").Page("::.SSP System.::").WebList("activityName").Select DataTable("activityName", dtsportCaptionSheet)
Browser("::::School Sports Programe").Page("::.SSP System.::").WebEdit("startDateString").Set DataTable("startDateString", dtsportCaptionSheet)
Browser("::::School Sports Programe").Page("::.SSP System.::").WebEdit("endDateString").Set DataTable("endDateString", dtsportCaptionSheet)
Browser("::::School Sports Programe").Page("::.SSP System.::").WebEdit("activityDate1").Set DataTable("activityDate1", dtsportCaptionSheet)
Browser("::::School Sports Programe").Page("::.SSP System.::").WebEdit("time1").Set DataTable("time1", dtsportCaptionSheet)
Browser("::::School Sports Programe").Page("::.SSP System.::").WebEdit("noOfRegister").Set DataTable("noOfRegister", dtsportCaptionSheet)
Browser("::::School Sports Programe").Page("::.SSP System.::").WebEdit("venue").Set DataTable("venue", dtsportCaptionSheet)
Browser("::::School Sports Programe").Page("::.SSP System.::").WebEdit("status").Set DataTable("status", dtsportCaptionSheet)
Browser("::::School Sports Programe").Page("::.SSP System.::").WebEdit("remark").Set DataTable("remark", dtsportCaptionSheet)
Browser("::::School Sports Programe").Page("::.SSP System.::").WebButton("儲存").Click
Browser("::::School Sports Programe").Dialog("Microsoft Internet Explorer").WinButton("確定").Click
Browser("::::School Sports Programe").Dialog("Microsoft Internet Explorer").WinButton("確定").Click
Browser("::::School Sports Programe").Page("::.SSP System.::_2").WebEdit("applicationNo").Output CheckPoint("applicationNo_2")
Browser("::::School Sports Programe").Page("::.SSP System.::_2").WebEdit("fee").Output CheckPoint("fee")
'Browser("::::School Sports Programe").Page("::.SSP System.::_2").WebButton("更新資料").Check CheckPoint("更新資料_2")
Browser("::::School Sports Programe").Page("::.SSP System.::_2").WebButton("離開")
Loop
作者: lovetest6    时间: 2005-6-21 13:58
SetNextRow 试试看。

[ Last edited by lovetest6 on 2005-6-21 at 14:12 ]
作者: lzz    时间: 2005-6-21 14:08
补充一下:
datatable.getsheet("sportCaption").setcurrentrow(i)
这地方没有问题,已经试过了,可以正确指向当前行数
但是取到的是总是第一行的数据。
不知道是不是QTP本身的问题不
作者: lovetest6    时间: 2005-6-21 14:53
不愿意用SetNextRow
就用
DataTable.GetSheet("sportCaption").GetParameter(1).Value

想必不是QTP本身的问题,而是我们的理解不正确:)
呵呵。
作者: lovetest6    时间: 2005-6-21 14:56
应该是因为我们没弄清楚
DataTable.Value(ParameterID [, SheetID]) 和
DataTable.GetSheet("sportCaption").GetParameter(1).Value

的区别。

btw:楼主的写法实际上是一种省略写法,省略了DataTable.value中的value


有明白的,给讲讲啊:)呵呵。

[ Last edited by lovetest6 on 2005-6-21 at 15:03 ]
作者: lovetest6    时间: 2005-6-21 15:33
或者把你那个分开写。

datatable.getsheet("sportCaption")
datatable.setcurrentrow(i)


  1. The following example uses the SetCurrentRow method to change the active row to the second row in the MySheet run-time data sheet.

  2. DataTable.GetSheet("MySheet").SetCurrentRow(2)

  3. *******************************************************
  4. Example
  5. The following example uses the SetCurrentRow method to change the active row to the second row in the global run-time Data Table.

  6. DataTable.SetCurrentRow (2)
复制代码


看到了么?返回的不一样。

[ Last edited by lovetest6 on 2005-6-21 at 15:36 ]
作者: michelle_happy    时间: 2005-6-21 17:41
你是放在gobal中还是local sheet中?我看你的脚本显示,似乎是local sheet
如果是local sheet中,需要在action上单击右键,action call properties
选择run on all rows。

[ Last edited by lovetest6 on 2005-6-21 at 18:41 ]
作者: lovetest6    时间: 2005-6-21 17:42
是啊,就脚本实现而言,上面的三种办法可以解决了么?
作者: lzz    时间: 2005-6-21 17:58
非常感谢Lovetest6对
DataTable.SetCurrentRow (2)
DataTable.GetSheet("MySheet").SetCurrentRow(2)
详细解释,我已经明白他们之间的区别。
我现在的问题是:运行脚本的时候,设置的当前行是第二行、第三行。。。(说明一下:经验证,设置的行数语句是有效的),但读取到的仍然是第一行的數據。

Lovetest6, 提供了三种解决办法:
1)        将SetCurrentRow改为SetNextRow,这两种方法的效果是一样的,但读取到的数据不正确
2)        DataTable.GetSheet("sportCaption").GetParameter(1).Value 这是获取sportCaption sheet 中第一个参数的值 我这里可以正确得到某个参数的值,只不过本应该获取的是第二行的某个参数值,得到的是第一行该参数的值
3)        将datatable.getsheet("sportCaption")
datatable.setcurrentrow(i)  分开写
a)        datatable.getsheet("sportCaption") //不清楚这行有什么作用
b)        datatable.setcurrentrow(i) // 这是将当前行设置为第i行在global运行数据表中,而我这里希望的并不是这样。
作者: lzz    时间: 2005-6-21 18:13
Originally posted by michelle_happy at 2005-6-21 05:41 PM:
你是放在gobal中还是local sheet中?我看你的脚本显示,似乎是local sheet
如果是local sheet中,需要在action上单击右键,action call properties
选择run on all rows。

选择的是local sheet,已经选择了run on all rows
作者: QA_BAY    时间: 2005-6-21 18:22
这个好像是QTP的问题.
你不要放到excel表中,而放到本地上做呢?
我试了放到EXECL表中,也是读取第一行,下来就读取不了!
作者: lovetest6    时间: 2005-6-21 18:34
不是说了上面的三种方法么?
都不行么???

不知道怎么讲了,不行就不行吧。

改天有时间,我再看看吧。
作者: lzz    时间: 2005-6-21 18:39
Originally posted by QA_BAY at 2005-6-21 06:22 PM:
这个好像是QTP的问题.
你不要放到excel表中,而放到本地上做呢?
我试了放到EXECL表中,也是读取第一行,下来就读取不了!

重新试过了,跟你说的一样,放在本地也存在这样的问题。看来很可能是qtp本身的问题了。
作者: lovetest6    时间: 2005-6-21 18:41
Originally posted by michelle_happy at 2005-6-21 05:41 PM:
你是放在gobal中还是local sheet中?我看你的脚本显示,似乎是local sheet
如果是local sheet中,需要在action上单击右键,action call properties
选择run on all rows。

[ Last edited by lovetest6 on  ...


  1. Example
  2. The following example uses the AddSheet method to create the new sheet, "MySheet" in the run-time Data Table and then adds a parameter to the new sheet.
复制代码


我不知道是local sheet还是什么,反正在这例中,
提到的是"MySheet".

总之,不管你是设置当前第几行,还是移动到下一行。
只要取值的配套使用就行了。这是我的理解,不知道对不对。
作者: QA_BAY    时间: 2005-6-22 10:26
Originally posted by lovetest6 at 2005-6-21 06:41 PM:



  1. 我不知道是local sheet还是什么,反正在这例中,
  2. 提到的是"MySheet".

  3. 总之,不管你是设置当前第几行,还是移动到下一行。
  4. 只要取值的配套使用就行了。这是我的理解,不知道对不对。
复制代码


我 ...

我觉不太对.这个好像就是QTP的问题!
我试了一个简单的例子,
自带的飞机订单来说吧.

for i=1 to 4
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 "Frankfurt"
Window("Flight Reservation").WinComboBox("Fly To:").Select "London"
Window("Flight Reservation").WinButton("FLIGHT").Click
Window("Flight Reservation").Dialog("Flights Table").WinButton("OK").Click
datatable.AddSheet("name")----增加一个SHEET
datatable.ImportSheet "C:\name.xls" ,1,Global-----从EXECL表中导进NAME字段里面的数据,有4行
Window("Flight Reservation").WinEdit("Name:").Set DataTable("name", dtGlobalSheet)
datatable.SetNextRow-------加这一行,是想看一下有没有取到下一行的数据,结果没有
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
next
运行结果都是读取第一行的数据,取不了其它行的数据.
所以这可能是QTP的问题或者其它方面的问题!

[ Last edited by QA_BAY on 2005-6-22 at 14:01 ]
作者: lovetest6    时间: 2005-6-22 12:28
QA_BAY:

datatable.AddSheet("name")----增加一个字段'name'

很明显,你对这句话的理解试不正确的。

方法的名字明明叫AddSheet,我上面页贴了MI的解释,再好好看看吧。

我也不是很清楚,但是我知道这句话你的解释肯定不对,呵呵:)

明明是加了一个sheet嘛,怎么能说是加了一个字段呢?

面向对象我也不是理解的很多。:)

但是datatable和DTsheet这两个肯定是两个不同的对象嘛:)

[ Last edited by lovetest6 on 2005-6-22 at 12:33 ]
作者: QA_BAY    时间: 2005-6-22 12:46
可能是叫法上的问题吧.
我把EXECL表里面新加的SHEET叫做字段.
如果有人看不清楚的可以去查,
但我的脚本运行是没有错的!
谢谢你的提醒!我知道你的意思!

[ Last edited by QA_BAY on 2005-6-22 at 12:52 ]
作者: lovetest6    时间: 2005-6-22 12:55
正是由于你前面的错误理解,所以导致你得不到正确的结果:)

呵呵。
按照你的叫法,SHEET里面的每个column叫什么呢?:)
作者: QA_BAY    时间: 2005-6-22 12:59
那你认为我的程序出错了吗?
指出程序错在哪里吧.
注释我可以改过来.
不要咬文嚼字!
作者: QA_BAY    时间: 2005-6-22 13:43
把程序再作修改,可以依次取到EXECL表里面的数据!
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
以上四行数据都可以依次取到!
作者: lzz    时间: 2005-6-22 13:57
我仔细分析了一下,发现其实大家都没错,只是用的方法不同,导致的结果也不一样。
Window("Flight Reservation").WinEdit("Name:").Set DataTable("name", dttestSheet)
Window("Flight Reservation").WinEdit("Name:").Set DataTable("name", dtGlobalSheet)
// 我相信在global工作表中可以正确执行,但换在test工作表中就不行
tempData=DataTable.GetSheet("51sheet").GetParameter("name").Value //用这种方法是可以正确读取某行某个参数的值
作者: lovetest6    时间: 2005-6-22 14:20
概念不清楚的、我还是建议最好不要用
dttestSheet
dtGlobalSheet
而且,最好不要用Global的sheet。

其实,呵呵,能永就行了,能达到你的使用目的就行了。
这个东西做的可能就问题,所以理解起来也难免有问题。还是别理解了。呵呵。
作者: lovetest6    时间: 2005-6-22 14:28
lzz:
分开写。
a)        datatable.getsheet("sportCaption") //不清楚这行有什么作用
b)        datatable.setcurrentrow(i) // 这是将当前行设置为第i行在global运行数据表中,而我这里希望的并不是这样。


其实我也不知道为什么这样写就对。呵呵

按我的理解,datatable就好像你打开的excel文件。默认的是打开第一个sheet的
你可以做datatable.setcurrentrow(i)
而你datatable.getsheet("sportCaption") 以后,
你就能选到这个sheet上,并且对它进行操作。比如setcurrentrow

不知道这么理解对不对,
如果这么理解正确的话,呵呵,那可真要小心哦。

连起来的按说应该也对的啊。不知道你的怎么不对了。

现在对了么??能取下面行的值么?

[ Last edited by lovetest6 on 2005-6-22 at 14:32 ]
作者: michelle_happy    时间: 2005-6-24 10:44
这个问题到底解决了没有呢,我按照这样做也出现只执行1行的现象呢
作者: lovetest6    时间: 2005-6-24 13:11
问问楼主不就知道是否解决了嘛。呵呵:)
还不清楚的去别的贴上找吧。
作者: lzz    时间: 2005-6-24 16:34
在大家的热心帮助下,按照lovetest6所说的方法,问题已经解决了.
作者: michelle_happy    时间: 2005-6-24 17:09
datatable.getsheet("sportCaption")
datatable.setcurrentrow(i)

分开写的这种方法么??怎么我的还是不行,再试试
作者: lovetest6    时间: 2005-6-24 17:48
呵呵,谢谢各位哦。
michelle_happy:如果还不行,就加我msn吧,或者站内短信也行:)
作者: dfinger    时间: 2005-6-25 10:21
Originally posted by michelle_happy at 2005-6-24 05:09 PM:
datatable.getsheet("sportCaption")
datatable.setcurrentrow(i)

分开写的这种方法么??怎么我的还是不行,再试试

我看了一圈。。怎么看不明白。。。
为什么要搞这么复杂呢。。。
如果只是为了取表。。
我是用类似下面的方法。。

DataTable.AddSheet("name")
DataTable.ImportSheet "C:\name.xls" ,1 ,"name"
msgbox DataTable.GetSheet ("name").GetCurrentRow
DataTable.GetSheet("name").SetNextRow
msgbox DataTable.GetSheet ("name").GetCurrentRow
DataTable.GetSheet("name").SetCurrentRow(3)
msgbox DataTable.GetSheet ("name").GetCurrentRow

有什么不好呢?
=_=b
作者: dfinger    时间: 2005-6-25 10:33
Originally posted by lzz at 2005-6-21 11:59 AM:
请大家帮我解决一下下面的问题.
我要新增一项资料,把新增资料中要用到的数据放在一个excel表中,然后在运行的时候导入该execl表。然后用一个循环分别读取excel表中的数据。为什么我运行的时候只能读取第一行的数 ...

看了不太明白
dtsportCaptionSheet
这个id从哪里得到的?
dtGlobalSheet 是全局表的默认id把?
自己添加表的id也是这个格式么/
Originally posted by QA_BAY at 2005-6-21 11:59 AM:
datatable.SetNextRow-------加这一行,是想看一下有没有取到下一行的数据,结果没有

这句还是有问题的
我觉得你应该用
datatable.GlobalSheet.SetNextRow
虽然我没有试过。。但是我觉得你这里不应该这样写的

即使默认中间没有制定sheet。。就会指到GlobalSheet。你也应该写上这么一句。。
另外
datatable.ImportSheet "C:\name.xls" ,1,Global
这里后面用到的是表名。。事实上后面你又用到dtGlobalSheet。。
起码从看上面。。实在挺混乱的。为什么不用一样的呢。。。
我总是觉得。简单就是最好。。。
能统一就统一。。包括格式。变量。能写清楚就写清楚地好。。
比如
datatable.getsheet("sportCaption")
datatable.setcurrentrow(i)
这种用法。。。能避免最好还是少用的八。。。

[ Last edited by dfinger on 2005-6-25 at 10:39 ]
作者: lovetest6    时间: 2005-6-25 22:46
不怕用错,怕的是概念不正确,如果概念不正确,那么不出错也只是暂时的。呵呵:)

我在datatable和dtsheet 的帖中详细的写了一下,你看看有什么不正确的,或者要补充的,帮忙加一下哦:)
作者: QA_BAY    时间: 2005-6-27 10:11
dfinger分析得很正确
现在已经更正过来了.
真是受益非浅
作者: michelle_happy    时间: 2005-6-27 10:48
偶弄成功了,那天不成功估计是录制的问题,但是直接就是写的datatable.GetSheet("temp").SetCurrentRow(i)
没有分为2行写啊。

偶查了一下帮助,dtsportCaptionSheet这种写法好像不对头,只有dtLocalSheet和dtGlobalSheet. 其他名字的Sheet用index,或者直接用 “sheet名”
作者: lily_mu75    时间: 2007-1-13 19:41
标题: 回复 #33 michelle_happy 的帖子
你说的很对,为避免大家看的晕头转向,我把自己做的例子贴出来,方便大家查看。

SystemUtil.Run "C:\Program Files\Mercury Interactive\QuickTest Professional\samples\flight\app\flight4a.exe","","C:\Program Files\Mercury Interactive\QuickTest Professional\samples\flight\app\","open"
Dialog("Login").WinEdit("Agent Name:").Set "lily"
Dialog("Login").WinEdit("Password:").SetSecure "45a8b17dacf40124f0d69b9493df0dd3adff1d48"
Dialog("Login").WinButton("OK").Click


Datatable.AddSheet("TicketName")
Datatable.ImportSheet "C:\ticket_name.xls",1,"TicketName"
Dim i,rowcount
i=0
rowcount=Datatable.GetSheet("TicketName").getrowcount
reporter.ReportEvent 2,"there are "&rowcount,"row in this data table"
Do while i<rowcount
i=i+1
Datatable.Getsheet("TicketName").setcurrentrow(i)
Window("Flight Reservation").WinButton("Button").Click
Window("Flight Reservation").ActiveX("MaskEdBox").Type "011907"
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").WinList("From").Select "20260   DEN   08:12 AM   LON   03:23 PM   AA     $112.20"
Window("Flight Reservation").Dialog("Flights Table").WinButton("OK").Click
Window("Flight Reservation").WinEdit("Name:").Set DataTable("Name", 3)   
Window("Flight Reservation").WinEdit("Tickets:").SetSelection 0,1
Window("Flight Reservation").WinEdit("Tickets:").Set DataTable("Tickets", 3)
Window("Flight Reservation").WinRadioButton("Business").Set
Window("Flight Reservation").WinButton("Insert Order").Click
Loop

注释:Window("Flight Reservation").WinEdit("Name:").Set DataTable("Name", 3)  
         Window("Flight Reservation").WinEdit("Tickets:").Set DataTable("Tickets", 3)
         '其中的3是指表单的index,即新建的标单TicketName
这两行语句也可以这样写:
         Window("Flight Reservation").WinEdit("Name:").Set DataTable("Name", "TicketName")  
         Window("Flight Reservation").WinEdit("Tickets:").Set DataTable("Tickets", "TicketName")
如果还有疑问,请查看贴子:
http://bbs.51testing.com/thread-56424-1-1.html
作者: lantianwei    时间: 2007-4-24 00:45
马上要学qtp了,看看满难的,一定要好好学!以后我想就在自动化测试发展了。
作者: machao514    时间: 2008-3-28 13:12
我认为“Browser("::::School Sports Programe").Page("::.SSP System.::").WebEdit("noOfRegister").Set DataTable("noOfRegister", dtsportCaptionSheet)“这行中dtsportCaptionSheet的用法是错误的,QTP中没有这种用法,只有
dtglobalsheet和dtlocalsheet这两种用法;
应把dtsportCaptionSheet改为“SportCaption",我想就可以了
作者: 过客一个    时间: 2009-6-3 15:02
标题: 在QTp中怎样将运行数据表中的数据返回到Excel表中
采用数据驱动的方法现将Excel表中的数据导出来,然后对数据进行修改,在导回去,这样应该怎样做啊?谢谢各位大侠给于指教
作者: kou_dou    时间: 2009-6-4 20:58
rowCount=DataTable().getrowcount
for i =1 to rowCount
   DataTable.setcurrentrow(i)
next
作者: vernzhang1980    时间: 2009-7-8 18:05
看了半天,终于有人点出问题的重点了:

machao514: 应把dtsportCaptionSheet改为“SportCaption",

既然导入的时候命名的LocalSheet是“SportCaption", 为什么后面要去用“dtsportCaptionSheet”呢???

[ 本帖最后由 vernzhang1980 于 2009-7-8 18:08 编辑 ]
作者: sunnyswu    时间: 2010-11-21 00:22
Set wshshell = createobject("wscript.shell")
datatable.AddSheet("51test")
datatable.GetSheet("51test").AddParameter "newvalue", "row1value"
rowcur = datatable.GetSheet("51test").GetRowCount()

For i = 1 + rowcur to 10
    DataTable.SetCurrentRow(i)
    DataTable.Value("newvalue", "51test") = "row1value" & i
        'datatable.GetSheet("51test").AddParameter "newvalue", "rowvalue" & i
    'datatable.GetSheet("Global").AddParameter "newvalue", "rowvalue" & i
Next
rownum = datatable.GetSheet("51test").GetRowCount()
wshshell.Popup rownum, 1, "title"

For i = 1 to rownum
    DataTable.SetCurrentRow(i)
        datatable.GetSheet("51test").GetParameter( "newvalue")
        Set wshshell = createobject("wscript.shell")
        wshshell.Popup datatable.GetSheet("51test").GetParameter("newvalue"), 1, "title"
'        datatable.GetSheet("Global").AddParameter "newvalue", "rowvalue" & i
Next
大家试一下这段代码,




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