我有在执行期间填充的集合,因此没有声明任何字段。我需要提取最后一列的值,并且列数是动态的,并且无法这样做。无论使用或不使用代码阶段,如何做到这一点? (代码:仅VB,因为我还有其他运行VB的代码块)
在计算阶段,我试图用另一个变量替换该值:[my_collection。[column_name]]。当我按Validate表达式时,它会引发错误。
答案 0 :(得分:2)
嗯,这是一个开放式问题。
首先,“ [my_collection。[column_name]]”之类的语法将不起作用-如果您想执行类似的操作,则可能需要使用操作“从行和列中获取值”。
Dim Proper_Row As System.Data.DataRow
Dim i As Integer = Coll_in.Columns.IndexOf(Field_name)
Dim Rows_count as Integer = Coll_in.Rows.Count
if i = -1 Then Throw new Exception ("Field does not exist")
if Rows_count < Row_number Then Throw new Exception ("Row Number higher than actual row count")
Proper_Row = Coll_in.rows(Row_number - 1)
Result = Proper_Row(Field_name)
Proper_Row = nothing
i = nothing
Rows_Count = nothing
另一种方法是将最后一列重命名为已知名称。您可以执行一个操作,该操作将返回第n个列的名称,并执行一个操作,该操作将重命名该列。作为一个小技巧-您可以使用名为“集合”的标准对象中的“计数列”操作来找到许多列。
//Finding n-th column name
outname = in_coll.columns(column_index).name
//renaming column
Collection_Out = Collection_In.Copy
For Each c As DataColumn in Collection_Out.Columns
If c.ColumnName = Field_Name Then
c.ColumnName = New_Name
Exit For
End If
Next
另一种方法是删除除所需列之外的所有列。不幸的是,我周围没有可离开的代码。
最后,也许您可以使用仅从集合返回值列表的操作?
//Join field values to string
For Each dr As DataRow In DT.Rows
If dr(FieldName) <> "" Then
JoinedString = JoinedString & Separator + dr(FieldName)
End If
Next
If JoinedString <> "" Then
JoinedString = JoinedString.Substring(Separator.Length, JoinedString.Length - Separator.Length)
End If
OutString = JoinedString
答案 1 :(得分:1)
坦率地说,对于如此简单的事情使用自定义代码阶段可能会有些过头,尤其是考虑到从长远来看,在可维护性方面的权衡几乎总是不值得的。
使用Utility - Collection Manipulation
VBO,可以将以下操作组合在一起以实现所需的功能:
操作:获取列名
Utility - Collection Manipulation
My_Collection
Column Names - My_Collection
(集合) 循环启动
Column Names - My_Collection
操作:计数列
Collections
"My_Collection"
Count of Columns - My_Collection
(数字)决定:这是最后一列吗?
[Count of Columns - My_Collection] <= 1
Yes
路径:#7 No
路径:#5 操作:删除列
Utility - Collection Manipulation
[My_Collection]
[Column Names - My_Collection.Field Name]
[My_Collection]
循环结束
操作:重命名字段
Utility - Collection Manipulation
My_Collection
[Column Names - My_Collection.Field Name]
"Result"
(或您选择的名称)[My_Collection]
循环启动
My_Collection
处理逻辑
[My_Collection.Result]
引用当前行中的值 循环结束