У меня есть коллекция, которая заполняется во время выполнения и, следовательно, не имеет объявленных полей. Мне нужно извлечь значения последнего столбца, а количество столбцов является динамическим, и я не могу этого сделать. Как я могу сделать это с использованием этапа кода или без него? (Код: только VB, так как у меня есть другие блоки кода, работающие на VB)
Я попытался заменить значение другой переменной на этапе расчета, например: [моя_коллекция.[имя_столбца]]. Он выдает ошибку, когда я нажимаю «Проверить выражение».
Ну, это действительно открытый вопрос.
Во-первых, синтаксис типа "[моя_коллекция.[имя_столбца]]" не будет работать - если вы хотите сделать что-то подобное, вам может понадобиться действие "Получить значение из коллекции по строке и столбцу".
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
Откровенно говоря, использование пользовательских стадий кода для чего-то такого простого несколько излишне, особенно если учесть, что компромисс с удобством сопровождения почти всегда не будет стоить того в долгосрочной перспективе.
Используя 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
путь: #7No
путь: #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]
для ссылки на значение в текущей строкеКонец цикла
Спасибо. Это работало как шарм, но с некоторыми изменениями, которые лучше всего подходят для моей проблемы. Мне просто нужно было получить значение последнего столбца. Я выполнил следующие действия: получить поля коллекции (шаг 1) -> перевернул его -> переименовал (шаг 7). И моя коллекция теперь переименована и запрос решен.