Имейте в виду, что независимо от сценария причина всегда одинакова в .NET:
Вы пытаетесь использовать ссылочную переменную, значение которой
Nothing
/null
. Если для ссылочной переменной значениеNothing
/null
, это означает, что на самом деле оно не содержит ссылку на экземпляр любого объекта, который существует в куче.Вы либо никогда не присваивали какую-либо переменную, никогда не создавали экземпляр значения, присвоенного переменной, или вы вручную устанавливали переменную, равную
blockquote>Nothing
/null
, или вы вызывали функцию, которая установите для этой переменной значениеNothing
/null
.
Вам нужна функция для выполнения конкатенации.
Microsoft Access конденсирует несколько строк в таблице
Пример использования ваших данных:
Select T.ColumnA
, GetList("Select ColumnB From Table1 As T1 Where T1.ColumnA = " & [T].[ColumnA],"",", ") AS ColumnBItems
From Table1 AS T
Group By T.ColumnA;
Вот отличная ссылка re: как это сделать из SQL, вызывая функцию. Инструкции являются исключительно четкими и, функция написана для вас, поэтому вы можете просто скопировать, вставить & amp; идти. Даже тот, кто не знает VB, может легко реализовать его: Объединить значения из связанных записей
это может быть очень трудно получить. Если вы ДОЛЖНЫ сделать это в запросе, а не в функции, проблема, с которой вы столкнетесь, - это предел количества строк, которые вы можете объединить в один столбец. Пока единственный способ, который я нашел для этого, - через инструкции iif.
SELECT
test1.ColumnA AS ColumnA,
First([test1].[ColumnB]) & IIf(Count([test1].[ColumnB])>1,"," & Last([test1].[ColumnB])) AS ColumnB
FROM test1
GROUP BY test1.ColumnA;
возвращает:
ColumnA ColumnB
1 abc,xyz
2 efg,hij
3 asd
Это вернет только первое и последнее, но Я уверен, что с небольшой работой вы могли бы выработать функцию «Выбрать», но, как я уже сказал, вам придется добавить несколько инструкций iif для каждого дополнительного элемента, который вы хотите добавить, следовательно, ограничение.
В таблице может быть столбец последовательностей, который дает ему уникальный первичный ключ последовательности ColumnA:
table: t1
ColumnA sequence ColumnB
1 1 abc
1 2 pqr
1 3 xyz
2 1 efg
2 2 hij
3 1 asd
И может быть создан Crosstab:
query: x1
TRANSFORM Min([columnB] & ", ") AS Expr1
SELECT t1.columnA
FROM t1
GROUP BY t1.columnA
PIVOT t1.sequence;
columnA 1 2 3
1 abc, pqr, xyz,
2 efg, hij,
3 asd,
Затем окончательный запрос может объединить столбцы и удалить последнюю запятую:
SELECT x1.columnA, Left([1] & [2] & [3],Len([1] & [2] & [3])-2) AS columnB FROM x1;
columnA columnB
1 abc, pqr, xyz
2 efg, hij
3 asd
Чтобы автоматизировать заполнение последовательности, можно использовать следующий код VBA:
Sub fill_sequence_t1()
Dim i: i = 1
Do While DCount("*", "t1", "sequence IS NULL") > 0
DoCmd.RunSQL "SELECT t1.columnA, Min(t1.columnB) AS columnB_min INTO t2" & _
" FROM t1 WHERE t1.sequence IS NULL GROUP BY t1.columnA;"
DoCmd.RunSQL "UPDATE t1 INNER JOIN t2 ON (t1.columnA = t2.columnA)" & _
" AND (t1.columnB = t2.columnB_min) SET t1.sequence=" & i
CurrentDb.TableDefs.Delete "t2"
i = i + 1
Loop
End Sub