分类: 项目管理
2009-01-17 22:32:54
Rational ClearQuest 是重要的变更管理工具,Rational ClearQuest 更能让客户根据自己的具体需求,灵活的设计变更管理流程。除此之外,Rational ClearQuest 还提供了一套编程接口,即 Rational ClearQuest API,让用户和开发人员可以根据需要通过编程来实现 Rational ClearQuest 的相关功能,同时还可以通过编程来实现模式中 Hook 脚本的开发和定制,从而使整个 Rational ClearQuest 产品的功能更加灵活和强大。
通过CQ的二次开发接口,我们可以更灵活的定义自己的统计,或是使用脚本来批量修改CQ中的MR。
ClearQuest API 提供了VBS实现和Perl实现。也就是说可以使用VBS或Perl进行CQ的二次开发,两种开发方式提供了完全一致的开发接口。同时由于VBS是用过调用COM来使用CQ接口,理论上可以使用其他开发语言通过直接调用COM的方式来使用CQ的API。
由于VBS和COM都为MS的专有技术,VBS的脚本只能在windows平台上执行,Perl脚本则可以实现跨平台。 相比VBS,Perl的使用面更广,功能也更为强大,且考虑到Perl的跨平台性,使用Perl进行CQ的二次开发会是一个比较好的选择。
需要使用CQ的API需要先安装CQ的客户端。CQ的客户端有带一个专供CQ使用的perl引擎,cqperl,在运行perl脚本时候直接使用cqperl xx.pl运行。
考虑到熟悉Perl的用户并不多,在介绍CQ API前先对Perl的相关语法等做个简单的介绍。这里只提供基础的入门介绍,以便perl程序的阅读,如需要更深入的了解请阅读参考中的相关文档。
perl里面语句也是用“;”来分开的。注释使用“#”。
数组定义,以@开头,如:@array = (1,2,3);
数组元素调用 @array[index],其中index表示数组下标,如上例,@array[0]的值是1
散列定义,以%开头,如:%hash=("a",1,"b",2);
散列调用 %hash,其中key表示键值,如上例,%hash{"b"}的值是1
sub FunctionName
{
local ($a,$b)=@_;
return “”;
}
注意: 函数后便没有(),也没有参数列表定义。也就是说,他接受任何形式的参数,以数组的方式传递过来。所以内部使用的话,就用@_这个默认当前参数来取之。
使用foreach进行遍历。
foreach $user (@users) {
do something...
}
perl包含文件。具体说明参考Perl中的文件包含(do, require, use)
CQ的数据存储在数据库(用户数据库)中,我们公司使用的是SQL Server。虽然可以通过直接访问SQL Server数据库的方式获取MR信息,但由于数据库的表结构复杂且受权限的约束(没有开放写权限),很多时候直接访问数据库并不是一个好主意。
在使用CQ API时,首先要做的是和CQ建立session,连接上CQ的库(模式库)。主要步骤为:
创建session对象
my $session = CQSession::Build();
登陆CQ库
$session->UserLogon(login_name, password, database_name, database_set);
操作完成后关闭session。
CQSession::Unbuild($session);
在成功建立session后就可以对CQ库进行操作了。
创建查询的主要步骤如下。
创建Query对象。
my $queryDef = $session->BuildQuery(entitydef_name);
设定需要返回的字段(同CQ客户端上选择的输出字段)。
$queryDef->BuildField("id");#id
$queryDef->BuildField("Headline");#标题
......
创建查询条件对象。
my $operator = $querydef->BuildFilterOperator(bool_operator);
为查询对象,设置过滤条件。
$operator->BuildFilter(field_name, comparison_operator, value);
创建结果集
my $resultSet = $session->BuildResultSet($queryDef);
执行查询
$resultSet->Execute();
遍历,获取查询的结果集的值。
while (($resultSet->MoveNext()) == 1)
{
my $mr_id=$resultSet->GetColumnValue(1);
}
使用$resultset->GetColumnValue(columnNum);获取字段的返回结果,其中columnNum为返回字段的序列,由1开始。
除获取MR外,对MR进行一些编辑也是常用的操作。编辑MR主要需要以下操作。
获取需要编辑的MR对象
$session->GetEntity(entity def_name, display_name);
def_name 这里同BuildQuery的参数类似
编辑对象
$session->EditEntity(entity, edit_action_name);
设定字段的值
$entity->SetFieldValue(field_name, new_value);
提交 $entity->Commit();
回滚 $entity->Revert();
在这个范例中,将查找出在dbname里Product为prd10000且Verified的MR,并将其Close。
use CQPerlExt;
###连接CQ###
my $loginName = "loginName";
my $loginPassword = "loginPassword";
my $databaseName = "dbname";
my $databaseSet = "dbset";
my $session = CQSession::Build();
$session->UserLogon($loginName, $loginPassword, $databaseName, $databaseSet);
###创建查询,查询出需要close的MR###
my $queryDef = $session->BuildQuery("Dev_Defect");
$queryDef->BuildField("id");#id
my $operator1 = $queryDef->BuildFilterOperator($CQPerlExt::CQ_BOOL_OP_AND);
@Product = ("%prd10000%");
$operator1->BuildFilter("Product", $CQPerlExt::CQ_COMP_OP_LIKE, \@NE_Product);
@State = ("Verified");
$operator1->BuildFilter("State", $CQPerlExt::CQ_COMP_OP_EQ, \@State);
my $resultSet = $session->BuildResultSet($queryDef);
$resultSet->EnableRecordCount();
$resultSet->Execute();
my $count = $resultSet->GetRecordCount();#获取查询出的MR个数
print "count: $count\n";
###遍历查询出的MR,并进行Close操作###
while (($resultSet->MoveNext()) == 1)
{
$id = $resultSet->GetColumnValue(1);
print "$id\n";
###执行Close操作###
$entity = $session->GetEntity( "Dev_Defect", $id );
$session->EditEntity($entity,"close");
$entity->SetFieldValue("Closed_Information", "Close");
my $Status = $entity->Validate();
if($Status eq "")
{
# 提交数据记录
$entity->Commit();
}
else
{
# 打印错误信息
print $Status;
$entity->Revert();
}
}
CQSession::Unbuild($session);
转自:!96F003C204150CFE!810.entry
ClearQuest API Reference
ClearQuest API使用手册,安装CQ客户端附带。