如何以编程方式从 sql 查询中获取字段的值?

问题描述

我正在编写一个脚本来查询 t_object 和 t_objectproperties 表并迭代结果元素。 这实际上相当简单。我正在使用这个:

function find_model_doc() {
var query = "select o.Object_ID,o.Name,op.Value from t_objectproperties op inner join (select * from t_object where stereotype = 'model document') o on o.Object_ID = op.Object_ID where op.Property = 'RTFTemplate'"
var all_modeldocs = Repository.GetElementSet(query,2);
for (var o = 0; o < all_modeldocs.Count; o++) {
    elem_name = all_modeldocs.GetAt(o).Name;
    elem_value = all_modeldocs.GetAt(o).Value;
    Session.Output("name|value: " + elem_name + " | " + elem_value)
}}

如果我在“sql 便笺簿”中使用此查询,我会得到:

enter image description here

但是,使用脚本我似乎无法从“值”字段中获取字符串。 关于我如何做到这一点的任何建议?

解决方法

方法 EA.Repository.GetElementSet(query,2) 返回一个 EA.Collection,其中包含类型为 EA.Element 的项目。它根据查询返回的 Object_ID 执行此操作。所有其他返回值都将被忽略。

这些对象没有 Value 属性。

您似乎在寻找的是元素上定义的名称为“RTFTemplate”的标记值的值。

你可以通过两种方式做到这一点

迭代GetElementSet返回的元素的标记值

这样的东西(vbscript)

for each element in all_modeldocs
    elem_name = element.Name
    for each tag in element.TaggedValues
        if tag.Name = "RTFTemplate" then
            elem_value : tag.Value
        end if
    next
next

使用 Repository.SQLQuery 并解析生成的 xml 字符串

这样的东西(vbscript)

function getArrayListFromQuery(sqlQuery)
    dim xmlResult
    xmlResult = Repository.SQLQuery(sqlQuery)
    set getArrayListFromQuery = convertQueryResultToArrayList(xmlResult)
end function

Function convertQueryResultToArrayList(xmlQueryResult)
    Dim result
    set result = CreateObject("System.Collections.ArrayList")
    Dim xDoc 
    Set xDoc = CreateObject( "MSXML2.DOMDocument" )
    'load the resultset in the xml document
    If xDoc.LoadXML(xmlQueryResult) Then        
        'select the rows
        Dim rowList
        Set rowList = xDoc.SelectNodes("//Row")
        Dim rowNode 
        Dim fieldNode
        'loop rows and find fields
        For Each rowNode In rowList
            dim rowArrayList
            set rowArrayList = CreateObject("System.Collections.ArrayList")
            'loop the field nodes
            For Each fieldNode In rowNode.ChildNodes
                'add the contents
                rowArrayList.Add fieldNode.Text
            Next
            'add the row the the general list
            result.Add rowArrayList
        Next
    end if
    set convertQueryResultToArrayList = result
end function