插入一个新的列宏

2020-08-26 08:42发布

         点击此处--->   EasySAP.com群内免费提供SAP练习系统(在群公告中)

加入QQ群:457200227(SAP S4 HANA技术交流) 群内免费提供SAP练习系统(在群公告中)


你好

我需要在每个非关键列之后插入一个后缀__BI(在iage之前)的新列。 该列和相应的__BI列需要在一起。 我对Powerdesigner宏比较陌生。 我尝试了以下代码,但在末尾插入了__BI列。 此外,它还会为键列创建__BI。

有什么建议吗?

谢谢。

[代码]

dim mdl,col,ggCol,选项卡集mdl = ActiveModel设置选项卡= ActiveSelection.Item(0)(tab)列'1)复制列集ggCol = tab.Columns.CreateNew ggCol.Code = col .Code&" __BI" ggCol.Name ="图像之前"和col.Name ggCol.DataType = col.DataType ggCol.Mandatory = col.Mandatory ggCol.Comment = col。在tab.Columns列中注释下一个'col

[/code]

Sunil

         点击此处--->   EasySAP.com群内免费提供SAP练习系统(在群公告中)

加入QQ群:457200227(SAP S4 HANA技术交流) 群内免费提供SAP练习系统(在群公告中)


你好

我需要在每个非关键列之后插入一个后缀__BI(在iage之前)的新列。 该列和相应的__BI列需要在一起。 我对Powerdesigner宏比较陌生。 我尝试了以下代码,但在末尾插入了__BI列。 此外,它还会为键列创建__BI。

有什么建议吗?

谢谢。

[代码]

dim mdl,col,ggCol,选项卡集mdl = ActiveModel设置选项卡= ActiveSelection.Item(0)(tab)列'1)复制列集ggCol = tab.Columns.CreateNew ggCol.Code = col .Code&" __BI" ggCol.Name ="图像之前"和col.Name ggCol.DataType = col.DataType ggCol.Mandatory = col.Mandatory ggCol.Comment = col。在tab.Columns列中注释下一个'col

[/code]

Sunil

付费偷看设置
发送
3条回答
暮风yp
1楼 · 2020-08-26 09:07.采纳回答

您可能有几种方法可以做不同的事情。

  • 在要复制的每一列之后立即使用
< pre> set NewCol = tab.Columns.CreateNewAt(i + 1)
  • 而不是创建新列,而是创建副本-它们将在末尾创建,因此您必须 移动它们。 该副本将与原始副本相同,并且您可以根据需要中断复制。 我不会这样做-您可以使用复制链接在各列之间循环并将副本移动到适当位置。
 dim repl
 设置repl = col.CreateReplica(tab)
 repl.Name = col.Name&" _BI" 
昵称总是被占用
2楼-- · 2020-08-26 09:15

嗨苏尼尔,


此问题有两个部分。 您显然设法完成了第一个步骤,即创建了列。 您只需要避免键列。 您将在下面的示例脚本中找到操作方法。


第二部分是对列进行排序。 因此,一旦在表末尾插入了所有带有" __BI"后缀的列,就需要将这些列移到每个表的Columns集合中的适当位置/索引。 索引以0开头,因此具有5列的表的索引范围为0..4。 您可以使用下面随附的示例脚本。 问题在于,在同时浏览此集合的同时更改Columns集合成员(即Columns)的位置不是很好。 这意味着,仅当所有__BI列都位于每个表的最后时(如果使用当前脚本),才可以使用我的脚本。 如果您的__BI列分散在整个表中,则需要在每次移动后添加一些逻辑或破坏循环,然后一次又一次地运行直到所有列都被排序为止。

对于i = 0到tab.Columns.Count-1
   输出" -------"
   设置col = tab.Columns.Item(i)
   如果Right(col.Code,4)<>" __BI"且col.Primary = false,则
     对于j = 0到tab.Columns.Count-1
       设置col2 = tab.Columns.Item(j)
       如果Right(col2.Code,4)=" __BI",而Left(col2.Code,Len(col2.Code)-4)= col.Code,则
         如果i + 1 <> j
           tab.Columns.Move i + 1,j
           输出"列从:+ CStr(j)+移至:+ CStr(i + 1)"
           退出
         万一
       万一
     下一个
   万一
 下一个

HTH,

Ondrej

shere_lin
3楼-- · 2020-08-26 09:04

您好 OndrejDiviš乔治·麦基奇(George McGeachie)

感谢您的回复。 很高兴得知已经内置了诸如CreateNewAt等功能。!

使用您两个逻辑的片段,我能够构建一个初稿,该初稿跳过了PK和一些标准的SCD Type列,并进行了快速测试,发现它在首次创建时效果很好。 我的下一个目标是将来为任何新添加的列调整脚本,以便仅那些新列添加了__BI而不是已经添加__BI的那些。 如果您知道脚本编写中的NOT IN(list)等效项,这样我也可以在下面的代码中代替uCase(col.code)NOT IN(....)

(顺便说一句,您如何以格式化的方式粘贴代码?)

dim mdl,col,BICol,tab,j set mdl = ActiveModel
set tab = ActiveSelection.Item(0)j = 0
对于i = 0到tab.Columns.Count-1
输出" -------"
设置col = tab.Columns.Item(j)
'跳过为PK列和标准SCD类型列添加__BI列
如果col.Primary = false,并且uCase(col.code)<>" ROW_ACTIVE_IND"和uCase(col.code)<>" ROW_EFFECTIVE_DT"和uCase(col.code)<>" ROW_EXPIRATION_DT"然后'是否存在NOT IN(列表)等价于
设置BICol = tab.Columns.CreateNewAt(j + 1)
BICol.Code = col.Code和" __BI"
BICol.Name ="图像之前"&col.Name
BICol.DataType = col.DataType
BICol.Comment = col.Comment
'跳过刚刚添加的__BI列,否则它将为下一次迭代选择__BI j = j + 2
else < br>'无需跳过,因为未添加任何内容
j = j + 1
如果
next

结束

感谢您的帮助!

致谢

Sunil

一周热门 更多>