Синяя призма код этапа для извлечения данных сбора - PullRequest
0 голосов
/ 07 апреля 2019

У меня есть коллекция, которая заполняется во время выполнения и, следовательно, не имеет объявленных полей. Мне нужно извлечь значения последнего столбца, а количество столбцов является динамическим, и я не могу это сделать. Как я могу сделать это с или без использования стадии кода? (Код: только VB, так как у меня есть другие блоки кода, работающие на VB)

Я пытался заменить значение другой переменной на этапе вычисления, например: [my_collection. [Column_name]]. Выдает ошибку, когда я нажимаю на выражение проверки.

Ответы [ 2 ]

2 голосов
/ 08 апреля 2019

Ну, это действительно открытый вопрос.

Прежде всего, синтаксис типа «[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 = th, и действие, которое будет переименовывать столбец. Небольшой совет - вы можете найти количество столбцов, используя действие «считать столбцы» из стандартного объекта «Коллекции».

//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 голос
/ 09 апреля 2019

Честно говоря, немного излишне использовать пользовательские этапы кода для чего-то такого простого, особенно если учесть, что компромисс с удобством обслуживания почти всегда не будет стоить этого в долгосрочной перспективе.

Использование Utility - Collection Manipulation VBO, вы можете связать следующие действия вместе для достижения желаемой функциональности:

  1. Действие : Получить имена столбцов

    • Объект: Utility - Collection Manipulation
    • Ввод: My_Collection
    • Выход: Column Names - My_Collection (сборник)
  2. Loop Start

    • Коллекция: Column Names - My_Collection
  3. Действие : Количество столбцов

    • Объект:Внутренний -> Collections
    • Вход: "My_Collection"
    • Выход: Count of Columns - My_Collection (Число)
  4. Решение: Это последний столбец?

    • Выражение: [Count of Columns - My_Collection] <= 1
    • Yes путь: # 7
    • No путь: # 5
  5. Действие : Удалить столбец

    • Объект: Utility - Collection Manipulation
    • Input (Input Collection): [My_Collection]
    • Вход (имя столбца): [Column Names - My_Collection.Field Name]
    • Выход (коллекция выходных данных): [My_Collection]
  6. Конец цикла

  7. Действие : переименовать поле

    • Объект: Utility - Collection Manipulation
    • Ввод (сборник): My_Collection
    • Ввод (имя поля): [Column Names - My_Collection.Field Name]
    • Ввод (новое имя): "Result" (или имя по вашему выбору)
    • Выход (коллекция выходных данных):[My_Collection]
  8. Loop Start

    • Коллекция: My_Collection
  9. Логика обработки

    • Используйте выражение [My_Collection.Result] для ссылки на значение в текущей строке
  10. Конец петли

...