Как оценить имя поля, содержащегося в другом поле в запросе доступа?

Мне нужно создать длинный список сложных строк, содержащий данные разных полей в разных местах для создания пояснительных отчетов. Единственный способ, которым я задумал в Access 2010, - это сохранить текстовые части в таблице вместе с именами полей, которые будут использоваться для составления отображаемой строки (см. Выражение line1 на рисунке). Кратко:

//field A contain a string with a field name:
A = "[Quantity]"
//query expression:
=EVAL(A) 
//return error instead the number contained in field [Quantity], present in the query dataset

Я подумал сделать EVAL для поля (A), чтобы получить значение поля (B), имя которого содержится в поле A. Но, похоже, не работает. Любой способ существует?

Пример (очень упрощенный): пример запроса, который EVAL поле, содержащее другие имена полей, чтобы получить значение полей

Любая идея? PS: Извините за мой английский, а не за мой родной язык.

1 ответ

Я нашел интересный обходной путь на другом форуме. У других людей была такая же проблема при использовании EVAL, но они обнаружили, что можно заменить строку содержимым поля, используя функцию REPLACE.

REPLACE("The value of field Quantity is {Quantity}";"{Quantity}";[Quantity])

({} используются только для ясности, не нужны, если известно, что слова, которые нужно заменить, не сравниваются в строке). Используя этот код в запросе, вложив столько REPLACE, сколько нужно использовать различных полей:

REPLACE(REPLACE("<Salutation> <Name>";"<Salutation>";[Salutation]);"<Name>";[Name])

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

REPLACE(REPLACE([DescriptiveString];"[Salutation]";[Salutation]);"[Name]";[Name])

Кроме того, можно создавать сложные строки на основе контекста:

REPLACE(REPLACE(REPLACE("{Salutation} {Name} {MaidenName}";"{Salutation}";[Salutation]);"{Name}";[Name]);"{MaidenName}";IIF(Isnull([MaidenName]);"";[MaidenName]))

Сложная часть состоит в том, чтобы перечислить все заполнители поля, которые нужно вставить в строку (например, {Количество},{Приветствие},{Имя}, {MaidenName}) в вызове REPLACE, в то время как с EVAL можно было бы избежать этой скучной части, если бы только это работало.

Не так аккуратно, как хотелось бы, но работает.

Другие вопросы по тегам