DXL:浏览 DOORS 基础模块的视图

问题描述 投票:0回答:1

我在使用 DXL 脚本时遇到错误。该脚本旨在迭代数据库模块的所有视图,检查每个视图是否被列为通用视图(属于跳过列表),并相应地执行某些操作。具体来说,如果视图是通用的,则脚本应删除除“12_Admin”组之外的所有组的所有访问权限,然后向“12_Admin”组授予 RMCDA 权限,最后保存对模块所做的更改。

DXL 脚本:

pragma runLim, 0

Skip includedViews = create()

/************************************
addIncludedView
Ajouter une vue à la skiplist des vues incluses.
************************************/
void addIncludedView(Skip includeList, string ViewName)
{
    Skip sk = includeList
   // sk insert ViewName
   put(sk, ViewName, ViewName)
   
}



/************************************
processFormal
Do something with the given formal module.
************************************/
void processFormal(string mName)
{
    Skip includeList = includedViews
    string IncludedView
    string sView
    View v
    noError
    Module m = read(mName, false)
    lastError

    // Parcourir toutes les vues du module "itm"
    for sView in views(m) do
    {
        // Initialiser isIncluded à false pour chaque vue
        v = view sView
        bool isIncluded = false
        print fullName(m) ";   "
        
        // Vérifier si la vue actuelle est incluse dans la liste des vues incluses
        for IncludedView in includeList do
        {
            if (IncludedView == name(v))
            {
                isIncluded = true
                break
            }
        }
        
        // Si la vue est incluse
        if (isIncluded)
        {
            Group group
            noError
            m = edit(mName, false)
            lastError
            
            for g in groupList do {
            string gName = group.name
                if (gName != "12_Admin"){
                unsetAll(v)
                }
            }
            
            set (v, read|modify|create|delete|control, "12_Admin")
            save(m)
            print name(v) "; Vue générique\n"
        }
        else
        {
            print name(v) "; Vue non générique\n"
        }
    }
}

void scanFolder(Folder f)
{
    Item itm;
    if (f == null)
    {
        print("NULL Folder parameter passed\n");
        return;
    }

    for itm in all f do
    {
        if (itm == null) continue;

        if (type(itm) == "Project" || type(itm) == "Folder")
        {
            scanFolder(folder(itm));
        }
        else if (type(itm) == "Formal")
        {
            processFormal(fullName(itm))
        }
    }
}

/************************************
MAIN
************************************/
// Ajoutez les vues que vous souhaitez inclure de la modification à la skiplist

addIncludedView(includedViews, "Allocation Matrix")




scanFolder(current Folder);

尽管我付出了努力,但我始终面临以下 DXL 错误:

-E- DXL: <Line:59> Arguments incorrects pour (do)

我已经仔细检查了脚本的语法和上下文,但无法查明此错误的原因。任何有关解决此问题的见解或帮助将不胜感激。谢谢您的帮助!

view syntax-error ibm-doors
1个回答
0
投票

语法错误相当简单。第 59 行显示

for g in groupList do {

但是变量 g 没有定义。 我想你想写

for group in groupList do {

但是:

groupList
为您提供数据库中定义的每个组的列表(即,这是您调用“工具”->“管理用户”->“组”时获得的列表。)。因此,在当前代码中,当至少存在一个未称为 12_Admin 的组时,第 62 行中的
unsetAll(v)
将始终被调用。

我认为您想检查视图的访问权限

v
。请查看第 22 章“访问控制”,了解如何迭代视图的每个
AccessRec
(
for _ar_ in _type_ do {if username ar != "12_Admin" then ...
)(DOORS 不区分单个用户和组的访问记录,两者都存储在
username
中)。但请注意,
unsetAll
将清除视图的完整访问权限,而不仅仅是当前的AccessRec,您可能需要使用
unset
来代替。

此外,您可能想检查视图的访问权限是否是继承的,如果不是,请将其更改为特定的。

另外,请阅读“unset,unsetDef,unsetVal,unsetAll”定义中的注释,我认为您首先必须设置Admin组的访问权限,然后才能删除所有权限。在高效的数据库中运行此脚本之前,请彻底检查该脚本。

除此之外,我还注意到以下几点。

3号线:

Skip includedViews = create()

如果跳过列表的键是

string
类型,则需要使用

Skip includeViews = createString()

第 11 行:

    Skip sk = includeList
   // sk insert ViewName
   put(sk, ViewName, ViewName)

无需创建临时变量。只需使用

put (includeList, ViewName, ViewName)

© www.soinside.com 2019 - 2024. All rights reserved.