【问题标题】:How to modify the name of an ad-hoc Stereotype in Sparx EA如何在 Sparx EA 中修改 ad-hoc Stereotype 的名称
【发布时间】:2015-11-06 20:30:25
【问题描述】:

我在 Sparx EA 模型中有许多“特别”的刻板印象。也就是说,我只是在元素属性中键入了一个原型名称,然后在它所应用的其他元素中使用了相同的名称......而不使用配置文件。

然后这些中的每一个都出现在Project --> Settings --> UML Types --> Stereotypes

最后,我添加了 Shape Script 图标等。

但是,我对一个 Stereotype 名称造成了一些混淆。我用“表空间”作为设计概念来表示“一组相关的数据库表”。由于 Oracle 中“表空间”的物理概念,我们的数据库团队对此感到困惑。

所以,我想重命名。

如果我从UML Types --> Stereotypes 执行此操作,所有现有元素都会保留原始名称(例如,表空间)并恢复到它们的无 Shape Script 外观。如果我访问一个元素并更改为新名称,就会出现形状脚本等。

我并不热衷于找到每个具有原型的元素并手动应用新名称。

是时候学习 EA 脚本还是有其他方法?

【问题讨论】:

    标签: uml enterprise-architect stereotype


    【解决方案1】:

    您唯一的逃避是使用自动化(或本机数据库访问)。如果您的刻板印象仅在对象中使用,您可以迭代

    的结果

    Repository.SQLQuery("SELECT object_id FROM t_object WHERE stereotype='oldStereo'")

    获取所有对象ID。然后你需要

    elem = Repository.GetElementByID(theId)

    检索单个元素。最后,您可以使用

    更改刻板印象
    elem.stereotype = "newStereo"
    elem.update()
    

    你也可以直接运行 SQL

    Repository.Execute("UPDATE t_object SET stereotype='new' WHERE stereotype='old'")
    

    请注意,后者使用了一种不受官方支持的地雷功能。

    编辑:您还可以在本机 RDBMS 客户端中运行最后一条 SQL。使用 EAP 时,您可能需要将其临时重命名为 .mdb 以假装它是一个 MS Access 数据库(实际上是)。

    【讨论】:

    • 按照您的建议进行操作,并在单独的答案中发布了我的(JScript,使用 EA Lib DB 脚本)代码。接受您的回答,因为它使我找到了解决方案。但是......当我使用新的 Stereotype 名称重新查询时,我找到了 Objects。但是,当我打印他们的.stereotype 时,会出现旧名称。如果我双击现有图表中的一个,则类似。该图显示旧名称,双击,文本在属性中显示新的 Stereotype 名称,但单击旁边的“...”会选择旧的 Stereotype 名称,而不是新的。好像更新不够“深入”。想法?
    • 推迟接受,直到完全解决...用 RTFM 找到了它的底部,导致了 stereotypeEx 属性,这似乎是缺少的链接。
    • 接受了答案,因为真正的问题是“我需要为此编写脚本吗”并且您回答了这个问题。提供“如何”是一种奖励。我只是不确定如何处理这个问题,因为在我的stereotypeEx 中给出了最好的“如何”答案......所以必须希望任何来到这里遇到同样问题的人都会阅读所有 cmets 并了解这一点。
    【解决方案2】:

    您可以使用此 VBScript 重命名 EA 中的构造型。

    已经在.eap文件上测试过,之所以这么复杂,是因为MS Access SQL语法中缺少replace()

    只需转到脚本视图,添加一个新的 VBScript 并将此代码粘贴到您的新脚本中。然后修改它以指示 from 和 to 构造型。

    option explicit
    
    !INC Local Scripts.EAConstants-VBScript
    
    '
    ' Script Name: Rename Stereotypes
    ' Author: Geert Bellekens
    ' Purpose: Rename stereotypes on all types of elements 
    ' Environment: Tested on .eap file.
    ' Date: 13/10/2015
    '
    sub main
        renameElementStereotypes "FromStereo", "ToStereo"
        renameAttributeStereotypes "FromStereo", "ToStereo"
        renameConnectorStereotypes "FromStereo", "ToStereo"
        renameOperationStereotypes "FromStereo", "ToStereo"
        renameDiagramStereotypes "FromStereo", "ToStereo"
        Repository.RefreshModelView(0)
        msgbox "Finished renaming stereotypes"
    end sub
    
    sub renameElementStereotypes(fromStereo, toStereo)
        renameStereotypes "t_object", fromStereo, toStereo
    end sub
    sub renameAttributeStereotypes(fromStereo, toStereo)
        renameStereotypes "t_attribute", fromStereo, toStereo
    end sub
    sub renameConnectorStereotypes(fromStereo, toStereo)
        renameStereotypes "t_connector", fromStereo, toStereo
    end sub
    sub renameOperationStereotypes(fromStereo, toStereo)
        renameStereotypes "t_operation", fromStereo, toStereo
    end sub
    sub renameDiagramStereotypes(fromStereo, toStereo)
        renameStereotypes "t_diagram", fromStereo, toStereo
    end sub
    
    sub renameStereotypes (baseTable, fromStereo, toStereo)
        dim updateSQL
        'first the second part of of t_xref description
        updateSQL = "update (" & baseTable & " o inner join t_xref x on o.[ea_guid] = x.[Client]) "&_
                   " set x.Description = MID( x.Description, 1, INSTR(  x.Description, ':" & fromStereo & "') - 1) "&_
                             " + ':" & toStereo & "' "&_
                             " + MID(x.Description,INSTR(  x.Description, ':" & fromStereo & "') "&_ 
                                  " + LEN(':" & fromStereo & "'), LEN(x.Description)  "&_
                                  " - INSTR(  x.Description, ':" & fromStereo & "') "&_
                                  " - LEN(':" & fromStereo & "')+ 1) "&_
                   " where o.Stereotype = '" & fromStereo & "' "&_
                   "  and x.Name = 'Stereotypes' "&_
                   " and INSTR(  x.Description, ':" & fromStereo & "') > 0  "              
        Repository.Execute updateSQL
        'then the first part of t_xref description
        updateSQL = "update (" & baseTable & " o inner join t_xref x on o.[ea_guid] = x.[Client]) "&_
                   " set x.Description = MID( x.Description, 1, INSTR(  x.Description, '=" & fromStereo & "') - 1) "&_
                             " + '=" & toStereo & "' "&_
                             " + MID(x.Description,INSTR(  x.Description, '=" & fromStereo & "') "&_ 
                                  " + LEN('=" & fromStereo & "'), LEN(x.Description)  "&_
                                  " - INSTR(  x.Description, '=" & fromStereo & "') "&_
                                  " - LEN('=" & fromStereo & "')+ 1) "&_
                   " where o.Stereotype = '" & fromStereo & "' "&_
                   "  and x.Name = 'Stereotypes' "&_               
                   " and INSTR(  x.Description, '=" & fromStereo & "') > 0  "
        Repository.Execute updateSQL                
        'then the stereotype itself
        updateSQL = " update " & baseTable & " o "&_
                    " set o.[Stereotype] = '" & toStereo & "' "&_
                    " where o.Stereotype = '" & fromStereo & "' "
        Repository.Execute updateSQL
    end sub
    
    main
    

    【讨论】:

    • 我喜欢这个答案更全面,包括所有类型。作为 EA Scripting 的新手,我发现直接从模型中工作的挑战有利于学习,这就是我接受@Thomas Killian 回答的原因。同时,请注意我对他的回答的评论中的问题。这种直接 SQL 是否避免了这些问题?
    • 它可能会,但您应该重新加载模型以确保在运行脚本后仍然存在构造型问题。
    • 我已经更新了我的答案 re/StereotypeEx。不确定这是否需要反映在直接 SQL 中。
    【解决方案3】:

    这是我根据@Thomas Killian 的回答创建的脚本。

    改进:

    1. 使用 EAScriptLib 数据库函数获取结果。
    2. Update() 方法的正确案例(但似乎不是必需的)
    3. 还在对象/元素上设置 StereotypeEx 属性。 这似乎很关键......否则,更改要么被忽略,要么新的原型被简单地添加到对象的原型列表中

    另外,不确定它有多重要,但在最终测试期间运行脚本之前没有通过项目浏览器打开组件。这感觉就像巫术一样。

    !INC Local Scripts.EAConstants-JScript
    !INC EAScriptLib.JScript-Database
    
    function RenameStereotypes()
    {
        Repository.EnsureOutputVisible( "Script" );
    
        var objectIDs = DBGetFieldValueArrayString( "object_id" /* : String */, "t_object" /* : String */,  "stereotype='DBTables'" /* : String */ ); /* : Array */
    
        Session.Output( objectIDs );
    
        for ( var i = 0; i < objectIDs.length; i++ ) {
            var theId = objectIDs[i];
            var elem = Repository.GetElementByID(theId);
            Session.Output( "Id: " + theId + " Name: " + elem.name + " Stereotype: " + elem.stereotype );
            elem.stereotype = "DBTables";    /* FIRST VISIBLE STEREOTYPE */
            elem.stereotypeEx = "DBTables";  /* CRITICAL - DEEPER LIST OF STEREOTYPES */
            elem.Update();  /* CASE CHANGED, NOT SURE IT MATTERS */
            elem.Refresh(); /* JUST IN CASE */
        }
    }
    
    RenameStereotypes();
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-08-23
      • 1970-01-01
      • 1970-01-01
      • 2019-03-10
      • 1970-01-01
      • 1970-01-01
      • 2014-12-16
      • 1970-01-01
      相关资源
      最近更新 更多