我在使用 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)
我已经仔细检查了脚本的语法和上下文,但无法查明此错误的原因。任何有关解决此问题的见解或帮助将不胜感激。谢谢您的帮助!
语法错误相当简单。第 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)
。