加入收藏 | 设为首页 | Life家族 | SCMLife | RMLife | PMLife | SQALife | TESTLife | 企业VIP专区 | 中文化荣誉殿堂
 
 23 123
发新话题
打印

[已解决] 请问以故障ID为查询条件到CQ中查询其它信息,vbs如何编写,谢谢。( 此文章被查看:1721次,被回复:22篇!! )

请问以故障ID为查询条件到CQ中查询其它信息,vbs如何编写,谢谢。

请问以故障ID为查询条件到CQ中查询其它信息(如变更描述、状态等),
vbs如何编写,谢谢。


问题已经解决 [打开主题]
本主题的最佳答案为 [ 23 楼].



© 本文为 sandwichSCMLife 共同所有,未经同意,请勿转载 ©如该文侵犯了您的版权,请联系管理员

TOP

回复 #1 sandwich 的帖子

一个简单的例子:
set sessionObj = CreateObject("ClearQuest.SESSION")
sessionObj.UserLogon "admin", "", dbName, AD_PRIVATE_SESSION, ""

set queryDefObj = sessionObj.BuildQuery("defect")
queryDefObj.BuildField("id")
set operator = queryDefObj.BuildFilterOperator(AD_BOOL_OP_AND)
operator.BuildFilter "id", AD_COMP_OP_EQ, "defect00001"
set resultSetObj = sessionObj.BuildResultSet(queryDefObj)
resultSetObj.Execute



© 本文为 yunshanSCMLife 共同所有,未经同意,请勿转载 ©如该文侵犯了您的版权,请联系管理员

TOP

resultset.Execute
执行后产生错误
“The cursor is not positioned on a valid current row”



© 本文为 sandwichSCMLife 共同所有,未经同意,请勿转载 ©如该文侵犯了您的版权,请联系管理员

TOP

回复 #3 sandwich 的帖子

把你修改后的代码发出来看看

© 本文为 yunshan 所有,未经同意,请勿转载
©如该文侵犯了您的版权,请联系管理员

TOP

Public Const SUCCESS = 1
Public Const AD_BOOL_OP_AND = 1
Public Const AD_COMP_OP_EQ = 1
Public Const AD_COMP_OP_BETWEEN = 9


Dim xlsApp
Dim Book
Dim Sheet
Dim session
Dim qryObj
Dim filterObj
Dim resultset
dim BugCol
dim BugStr
dim node





on error resume next
err.clear

' Login to the destination database
Set session = CreateObject("CLEARQUEST.SESSION")
session.UserLogon "user", "password", "CQ", AD_PRIVATE_SESSION, "CQlink"

' Build Query On defect
Set qryObj = session.BuildQuery("变更单")

Set xlsApp = CreateObject("Excel.Application")
set wBook = xlsApp.Workbooks.Open("c:\testvbs.xls")
Set Sheet = wBook.Worksheets("故障单表")
Sheet.Activate
Sheet.Visible = True

'找到标题为故障单号的列,记录列号BugCol,计算sheet的总列号ColumnsCount,从CQ库中获取的信息新增到后续列中.
ColumnsCount = Sheet.UsedRange.Columns.Count
RowsCount = Sheet.UsedRange.rows.Count

For j = 1 To ColumnsCount
    If Sheet.Cells(1, j) = "故障单号" Then
        BugCol= j
        Exit For
    End If
Next

If BugCol= 0 Then
        msgbox("no find 故障单号列")       
        WScript.Quit
end if


'以BugStr为关键字从CQ库中获取需要的字段
for i=2 to  RowsCount
        BugStr = Sheet.Cells(i,BugCol).Value
        qryObj.BuildField("id")
        qryObj.BuildField("变更主题")
        qryObj.BuildField("State")
        Set node = qryObj.BuildFilterOperator(AD_BOOL_OP_AND)
        node.BuildFilter "id", AD_COMP_OP_EQ , BugStr
        Set resultset = session.BuildResultSet(qryObj)
       
resultset.Execute

' set values for destination cells
        Sheet.Cells(i,ColumnsCount+1).Value = resultset.GetColumnValue(2)
        Sheet.Cells(i,ColumnsCount+2).Value = resultset.GetColumnValue(3)
next

if err.Number <> 0 then
   msgbox err.Description
end if
msgbox("end")

Sheet.Columns.AutoFit
Book.Save
Book.Close
Set Book = Nothing
xlsApp.Quit
Set xlsApp = Nothing
Set resultset = Nothing
Set session = Nothing

© 本文为 sandwich 所有,未经同意,请勿转载
©如该文侵犯了您的版权,请联系管理员

TOP

这样写是不正确的,
因为记录集中第一天记录通常为空的,所以要跳过去,如下修改就可以了,
resultset.Execute
resultset.MoveNext
' set values for destination cells
        Sheet.Cells(i,ColumnsCount+1).Value = resultset.GetColumnValue(2)
        Sheet.Cells(i,ColumnsCount+2).Value = resultset.GetColumnValue(3)
next
最好再判断一下记录集是否为空,这样就更完善了~

© 本文为 yunshan 所有,未经同意,请勿转载
©如该文侵犯了您的版权,请联系管理员

TOP

还是不行,
如何判断记录集是否为空?

© 本文为 sandwich 所有,未经同意,请勿转载
©如该文侵犯了您的版权,请联系管理员

TOP

回复 #7 sandwich 的帖子

resultset.EnableRecordCount
resultset.Execute
resultset.MoveNext
if resultset.RecordCount = 0 then
  ' do something
else
  ' do something else
end if

© 本文为 yunshan 所有,未经同意,请勿转载
©如该文侵犯了您的版权,请联系管理员

TOP

把代码中的node.BuildFilter "id", AD_COMP_OP_EQ , BugStr
改成node.BuildFilter "id", AD_COMP_OP_EQ , "def00257154"就可以了
不知道什么原因???
使用msgbox("BugStr is " & BugStr )可以看到,BugStr 的实际值就是"def00257154"

© 本文为 sandwich 所有,未经同意,请勿转载
©如该文侵犯了您的版权,请联系管理员

TOP

回复 #9 sandwich 的帖子

你把BugStr写成Cstr(BugStr)试试,可能类型不匹配,

© 本文为 yunshan 所有,未经同意,请勿转载
©如该文侵犯了您的版权,请联系管理员

TOP

 23 123
发新话题