Rational RequisitePro可扩展性概述

RequisitePro能够很容易地被扩展以协助支持你的项目过程。本文将展示如何使用脚本快速地开始工作,这个脚本用来自定义需求管理工具。

RequisitePro能够很容易地被扩展以协助支持你的项目过程。本文将展示如何使用脚本快速地开始工作,脚本用来自定义需求管理工具。这些脚本可以用来收集度量、自动化日常的活动,或者同其它应用程序交换信息,等等。

可扩展架构概述
有两个部件用来扩展 RequisitePro。第一个是 RequisitePro Extensibility server ,RPX。RPX用来访问工程、包、需求和用户等。

第二个是RqGUIApp library 。它用来控制RequisitePro用户界面,它也可以提供对Microsoft Word文档的一些控制功能。

图 1: 可扩展性架构

 

RPX
RPX是RequisitePro的可扩展性接口。它的核心组件为 ReqPro.dll,这个dll可以通过COM接口访问。RPX包含用来读取或者修改已存在的RequisitePro工程的类。

要想看关于RPX对象模型 ,包括类图等的信息,参见RequisitePro Extensibility Interface Help,它已经随着RequisitePro安装。

下面是一些可以通过RPX访问的内容的例子:

  • 需求模型的语义,如应用、工程、包、需求、文档、关系、讨论、属性值等。
  • 管理项,如用户和用户组。
  • 视图
  • Meta-data,如属性类型,需求类型、文档类型。这些项不能 通过RPX访问
  • 文档内容(看RqGUIApp节有关如何处理文档的内容)
  • 工程创建

 

开始
一旦你安装了RequisitePro,你就可以开始使用RPX写代码。所有提供的例子都使用Microsoft Visual Basic 6语法。如果你使用Visual Basic,你需要添加RPX (RequisitePro Extensibility Interface)到你的工程引用中。

你也需要一个RequisitePro工程以便用它工作。你可以创建一个新的工程进行试验,也可以使用samples文件夹中提供的工程。

如果你通过RPX修改了对象,确保在关闭工程前使用了你调用的对象的Save方法。这将永久把你的改变保存到数据库中。

使用RPX打开工程
打开工程需要两步。第一步是创建一个新的Application对象的实例。第二步是调用Application.OpenProject。OpenProject方法用来打开它的文件路径中的工程:

'open a project 
Private Sub OpenProject()

Dim a_oReqPro As ReqPro40.Application
Dim a_oProject As ReqPro40.Project
Dim a_sProjectName As String

'start the server
Set a_oReqPro = New ReqPro40.Application

If Not a_oReqPro Is Nothing Then

'open a learning project by filename
a_sProjectName = a_oReqPro.ServerInformation.Path & _
"/../samples/Learning_Project-Traditional/LEARNING - TRADITIONAL.rqs"

'a user id is required
Set a_oProject = a_oReqPro.OpenProject( _
a_sProjectName, _
eOpenProjOpt_RQSFile, _
"AnyUserID", _
"")

'close the project
a_oReqPro.CloseProject a_oProject, eProjLookup_Object
End If

Set a_oProject = Nothing
Set a_oReqPro = Nothing

End Sub
清单 1: 通过文件名打开工程

每个用户都有一个最近打开工程的列表。工程也可以从这个列表中打开:

'open a project from the catalog 
Private Sub OpenProjectFromCatalog()

Dim a_oReqPro As ReqPro40.Application
Dim a_oProject As ReqPro40.Project
Dim a_oCatalog As ReqPro40.Catalog
Dim a_oCatalogItem As ReqPro40.CatalogItem
Dim a_sProjectName As String

'start the server
Set a_oReqPro = New ReqPro40.Application

If Not a_oReqPro Is Nothing Then

Set a_oCatalog = a_oReqPro.PersonalCatalog

If Not a_oCatalog Is Nothing Then

'look up the first project in the catalog
Set a_oCatalogItem = a_oCatalog.Item(1, eCatLookup_Index)

'a user id is required
Set a_oProject = a_oReqPro.OpenProject( _
a_oCatalogItem, _
eOpenProjOpt_Object, _
"AnyUserID", _
"")

'close the project
a_oReqPro.CloseProject a_oProject, eProjLookup_Object
End If
End If

Set a_oCatalog = Nothing
Set a_oCatalogItem = Nothing
Set a_oReqPro = Nothing

End Sub
清单 2: 从最近工程列表中打开工程

注意 :一旦一个工程被打开,在访问它的数据时它就必须保持打开状态。当你的脚本完成后,可以保存和关闭工程。

在工程中访问需求
一旦打开了工程,其中的需求就可以被访问。如果你想要产生一份报告或者把信息导出到其它应用中时,这一点非常有用。下面的清单展示了如何从一个已经打开的工程中找到需求:

'print all requirements 
Sub PrintAllRequirements(oProject As ReqPro40.Project)

Dim a_oReqs As ReqPro40.Requirements
Dim a_oReq As ReqPro40.Requirement

'retrieve all requirements
Set a_oReqs = oProject.GetRequirements("", eReqsLookup_All)

'iterate through requirements
While Not a_oReqs.IsEOF
Set a_oReq = a_oReqs.ItemCurrent

'print out tag and text to the debug window
Debug.Print a_oReq.Tag & " " & a_oReq.Text

a_oReqs.MoveNext
Wend

Set a_oReq = Nothing
Set a_oReqs = Nothing
End Sub
清单 3: 打印需求信息

下面的例子演示了一种导出信息到另一个应用程序方法:

'print requirements to Microsoft Excel 
Sub PrintAllRequirementsToExcel(oProject As ReqPro40.Project)

Dim a_oReqs As ReqPro40.Requirements
Dim a_oReq As ReqPro40.Requirement
Dim a_oExcelApp As Object
Dim a_oWorkbook As Object ' Excel.Workbook
Dim a_oSheet As Object ' Excel.Worksheet
Dim a_lRow As Long

Set a_oExcelApp = CreateObject("Excel.Application")
Set a_oWorkbook = a_oExcelApp.Workbooks.Add
a_oExcelApp.Visible = True

Set a_oSheet = a_oWorkbook.ActiveSheet

a_oSheet.Name = "ReqPro"
a_oSheet.Cells(1, 1).Value = "Tag"
a_oSheet.Cells(1, 2).Value = "Requirement"
a_lRow = 2

'retrieve all requirements
Set a_oReqs = oProject.GetRequirements("", eReqsLookup_All)

'iterate through requirements
While Not a_oReqs.IsEOF
Set a_oReq = a_oReqs.ItemCurrent

a_oSheet.Cells(a_lRow, 1).Value = a_oReq.Tag
a_oSheet.Cells(a_lRow, 2).Value = a_oReq.Text

a_lRow = a_lRow + 1
a_oReqs.MoveNext
Wend

Set a_oReq = Nothing
Set a_oReqs = Nothing
End Sub
清单 4: 导出需求到Microsoft Excel

需求也可以通过RPX创建。下面是一个如何自动化一个日常活动的例子。它在完成从其它来源导入需求信息的工作时非常有用。

下面的例子演示如何创建一个新的需求。需求类型必须首先定义。

'create a requirement 
Private Sub CreateRequirement(oProject As ReqPro40.Project)

Dim a_oReqs As ReqPro40.Requirements
Dim a_oReq As ReqPro40.Requirement

'get all requirements of type "PR"
Set a_oReqs = oProject.GetRequirements("PR", eReqsLookup_TagPrefix)

'add a requirement to the collection of PR requirements
Set a_oReq = a_oReqs.Add( _
"requirement_name", _
"This is a root PR requirement.", _
"PR", eReqTypesLookups_Prefix)

'commit this to the database by doing a save on the requirement
a_oReq.Save

Set a_oReq = Nothing
Set a_oReqs = Nothing
End Sub
清单 5: 通过RPX创建新的需求

RPX也能够用来维护需求之间的可跟踪性。你可以访问关系的集合,也可以创建新的关系。下面的例子演示如何创建一个新的跟踪关系。

'create a trace-to relationship 
Private Sub CreateTraceRelationship(oProject As ReqPro40.Project)

Dim a_oReqs As ReqPro40.Requirements
Dim a_oReq1 As ReqPro40.Requirement
Dim a_oReq2 As ReqPro40.Requirement
Dim a_oRel As ReqPro40.Relationship

'get all requirements
Set a_oReqs = oProject.GetRequirements("", eReqsLookup_All)

'lookup the requirements that you would like
'to be a part of the relationship
Set a_oReq1 = a_oReqs.Item("PR1", eReqLookup_Tag)
Set a_oReq2 = a_oReqs.Item("SR1.6", eReqLookup_Tag)

If Not a_oReq1 Is Nothing Then
Set a_oRel = a_oReq1.TracesTo.Add(a_oReq2, eReqLookup_Object)
End If

'commit this to the database by doing a save on the requirement
a_oReq1.Save

Set a_oReq1 = Nothing
Set a_oReq2 = Nothing
Set a_oRel = Nothing
Set a_oReqs = Nothing
End Sub
清单 6: 创建跟踪关系

RequisitePro也可以被扩展以访问需求的属性信息。可以创建新的属性,也可以更新属性值。一个属性的值甚至可以从其它属性的值计算出来。

'modify requirement attribute values 
Private Sub ModifyAttributeValue(oProject As ReqPro40.Project)

Dim a_oReqs As ReqPro40.Requirements
Dim a_oReq As ReqPro40.Requirement
Dim a_oAttrValues As ReqPro40.AttrValues
Dim a_oAttrValue As ReqPro40.AttrValue

'get all requirements
Set a_oReqs = oProject.GetRequirements("", eReqsLookup_All)

Set a_oReq = a_oReqs.Item("PR1", eReqLookup_Tag)

If Not a_oReq Is Nothing Then
Set a_oAttrValues = a_oReq.AttrValues

If Not a_oAttrValues Is Nothing Then

'cycle through each AttrValue object and modify the value
'based on the attribute's specific data type.
For Each a_oAttrValue In a_oAttrValues

Select Case a_oAttrValue.DataType
Case ReqPro40.eAttrDataTypes_Text
a_oAttrValue.Text = "RequisitePro Example"
Case ReqPro40.eAttrDataTypes_List
'Rather than using the Value property of a List
'Attr, we need to use the ListItemValues
'property, which returns a collection of
'ListItemValue objects.
'Once we have a ListItemValue object reference,
'we can then query its Text property,
'and set its Selected property.
Dim a_oListItemValues As ListItemValues
Dim a_oListItem As ListItemValue

Set a_oListItemValues = a_oAttrValue.ListItemValues
For Each a_oListItem In a_oListItemValues
If a_oListItem.Text = "Low" Then
a_oListItem.Selected = True
End If
Next a_oListItem
End Select
Next a_oAttrValue
End If 'Not a_oAttrValues Is Nothing
End If 'Not a_oReq Is Nothing

' Commit this to the database by doing a save on the requirement
a_oReq.Save

Set a_oReq = Nothing
Set a_oAttrValues = Nothing
Set a_oAttrValue = Nothing
Set a_oListItemValues = Nothing
Set a_oListItem = Nothing
Set a_oReqs = Nothing
End Sub
清单 7: 更新一个属性的值

 

使用包
项目的包结构可以协助保持需求、文档和视图的组织化。当创建一个新的单元时,通常需要把它们从缺省位置--根包--移动到其它位置。下面的例子演示了如何创建一个新的包。

'create a package 
Sub CreatePackage(oProject As ReqPro40.Project)

Dim a_oRootPackage As ReqPro40.RootPackage
Dim a_oPackage As ReqPro40.Package

'retrieve the root package
Set a_oRootPackage = oProject.GetRootPackage

'create a package at the root level (Don't need to call save.
CreatePackage will persist the package)
Set a_oPackage = a_oRootPackage.CreatePackage("Package Name1", _
"My Package")

Set a_oRootPackage = Nothing
Set a_oPackage = Nothing
End Sub
清单 8: 创建一个新的包

下面的例子给出了一个例子,它在一个包中而不是在根包中创建一个新的需求。

'move a requirement 
Sub MoveRequirement(oProject As ReqPro40.Project)

Dim a_oReqs As ReqPro40.Requirements
Dim a_oReq As ReqPro40.Requirement
Dim a_oRootPackage As ReqPro40.RootPackage
Dim a_oPackage As ReqPro40.Package

'get all requirements of type "PR"
Set a_oReqs = oProject.GetRequirements("PR", _
eReqsLookup_TagPrefix)

'add a requirement to the collection of PR requirements
Set a_oReq = a_oReqs.Add( _
"requirement_name", _
"This is a root PR requirement.", _
"PR", eReqTypesLookups_Prefix)

'commit this to the database by doing a save on the requirement
a_oReq.Save

'retrieve the root package
Set a_oRootPackage = oProject.GetRootPackage

'create a package at the root level
'Don't need to call save, CreatePackage will persist the package
Set a_oPackage = a_oRootPackage.CreatePackage("Package Name1", _
"My Package")

a_oPackage.AddElement a_oReq, _
ePackageLookup_Object, _
eElemType_Requirement

Set a_oReqs = Nothing
Set a_oReq = Nothing
Set a_oRootPackage = Nothing
Set a_oPackage = Nothing
End Sub
清单 9: 在包之间移动需求

 

访问文档
尽管文档的内容不能通过RPX进行访问,仍然有一些信息对于进行报告是有用的。下面的例子显示如何在RPX中访问文档,打印这些文档中包含的需求的名字和标签。

'print all requirements in each document 
Sub PrintAllDocBasedRequirements(oProject As ReqPro40.Project)

Dim a_oDocs As ReqPro40.Documents
Dim a_oDoc As ReqPro40.Document
Dim a_oReqs As ReqPro40.Requirements
Dim a_oReq As ReqPro40.Requirement

'retrieve all documents
Set a_oDocs = oProject.Documents

For Each a_oDoc In a_oDocs
'print out document path and name
Debug.Print a_oDoc.Name & ": " & a_oDoc.FullPath

'retrieve all requirements in this document
Set a_oReqs = a_oDoc.Requirements

'iterate through requirements
If Not a_oReqs Is Nothing Then
While Not a_oReqs.IsEOF
Set a_oReq = a_oReqs.ItemCurrent

'print out tag and text to the debug window
Debug.Print vbTab & a_oReq.Tag & " " & a_oReq.Text

a_oReqs.MoveNext
Wend
End If
Next a_oDoc

Set a_oDocs = Nothing
Set a_oDoc = Nothing
Set a_oReq = Nothing
Set a_oReqs = Nothing
End Sub
清单 10: 打印文档中的需求

 

RqGuiApp
RqGuiApp是 RequisitePro的 GUI应用程序接口。它的核心组件为RqGuiApp.tlb。这个库允许一些对RequisitePro应用的控制,也可以控制在Microsoft Word打开的RequisitePro文档。

这些接口在RequisitePro Extensibility Interface Help中详细描述,它随着RequisitePro一起安装。

下面是一些可以通过RqGuiApp使用的操作:

  • 打开和关闭工程
  • 打开、关闭、创建、保存、定位选择文档
  • 创建和更新基于文档的需求
  • 打开视图和找到当前选择的需求
  • 刷新工程浏览器

 

开始
为了与RequisitePro配合使用RqGuiApp,RequisitePro必须运行。下面的例子显示如何找到RequisitePro的运行实例:

Dim a_oRqGuiApp As Object 

'get the current running instance of RequisitePro from Windows
On Error Resume Next
Set a_oRqGuiApp = GetObject(, "ReqPro40.GUIApp")
On Error GoTo 0

' if not open
If a_oRqGuiApp Is Nothing Then
MsgBox "Please open RequisitePro"
End If
清单 11: 使用RqGuiApp和RequisitePro一起工作

RqGuiApp也可以用来打开RequisitePro应用程序:

Dim a_oRqGuiApp As Object 

'get the current running instance of RequisitePro from Windows
Set a_oRqGuiApp = CreateObject("ReqPro40.GUIApp")
清单 12: 使用RqGuiApp打开RequisitePro

回调对象
很多在RqGuiApp中提供的方法需要使用回调对象。回调对象是一个类的实例,它拥有一些对外的预定义的方法。这些方法在RequisitePro Extensibility Interface help中有详细的定义。需要把定义了这些方法的类编译成一个 .dll,然后把这个类的实例放到RqGuiApp中。在 RequisitePro 2003中,提供了一个用来封装回调对象的 .dll。

当RqGuiApp操作完成时(例如,工程打开,文档已经创建等),回调对象将收到通知。

使用工程工作
为了打开一个工程,必须使用回调对象。可以从RqGuiApp库中使用回调对象获得工程对象的实例。

' If another project is open, RequisitePro closes the project 
'(and the appropriate dialog boxes) and opens the specified project.
Function OpenProjectInGui(oRqGuiApp As Object, _
sPath As String, _
sUser As String, _
sPwd As String) As ReqPro40.Project
Dim a_bRet As Boolean
Dim a_oCallback As RqCallback.Callback

'need to instantiate callback object
Set a_oCallback = New Callback

'tell the RequisitePro application to open a project
a_bRet = oRqGuiApp.OpenProject(sPath, _
eOpenProjOpt_RQSFile, _
sUser, sPwd, _
eProjFlag_Normal, _
a_oCallback)

If a_bRet Then
'wait until the operation is complete
While Not a_oCallback.IsDone
DoEvents
Wend

'retrieve the project object
Set OpenProjectInGui = a_oCallback.GetObject
End If

Set a_oCallback = Nothing
End Function
清单 13: 使用RqGuiApp打开工程

 

使用文档工作
RqGuiApp 允许控制RequisitePro文档。这些控制允许脚本请求RequisitePro创建、打开和关闭文档。另外,需求可以加到文档中,已经存在的基于需求的文档可以更新到文档中。

' Creates a RequisitePro document in the current project. 
' The new document is opened in Word, and becomes the active document.
Public Sub CreateDocument(oRqGuiApp As Object, _
sName As String, _
sPath As String, _
sDocTypeGUID As String, _
sDescription As String)
Dim a_bRet As Boolean
Dim a_oCallback As RqCallback.Callback

'need to instantiate callback object
Set a_oCallback = New Callback

'the path should be the project's path, including the
'filename with the proper document type extension
a_bRet = oRqGuiApp.CreateDocument(sName, _
sPath, _
sDocTypeGUID, _
sDescription, _
a_oCallback)

If a_bRet Then
'wait until the operation is complete
While Not a_oCallback.IsDone
DoEvents
Wend
End If

Set a_oCallback = Nothing

End Sub
清单 14: 创建新的文档

 

下面是更新文档中存在的需求的例子。

'Updates requirement text in a document. 
'The document must be saved for the change to take effect.
Public Sub UpdateRequirementInDocument(oRqGuiApp As Object, _
oReq As ReqPro40.Requirement, _
sNewText As String)
Dim a_bRet As Boolean
Dim a_oCallback As RqCallback.Callback

'need to instantiate callback object
Set a_oCallback = New Callback

a_bRet = oRqGuiApp.UpdateRequirementInDocument(oReq, _
sNewText, _
a_oCallback)

If a_bRet Then
'wait until the operation is complete
While Not a_oCallback.IsDone
DoEvents
Wend
End If

Set a_oCallback = Nothing
End Sub
清单 15: 创建新的基于文档的需求

 

相关读物

  • 要想得到更多的信息和例子,请参看随RequisitePro提供的RequisitePro Extensibility Interface Help。

参考资料

  • 您可以参阅本文在 developerWorks 全球站点上的 英文原文

关于作者
Mark Goossen自1996年起就在软件行业工作。在加入Rational Software和IBM之前,他使用Rational产品在机器视觉和广播软件行业工作。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值