Как оценить имя поля, содержащегося в другом поле в запросе доступа?
Мне нужно создать длинный список сложных строк, содержащий данные разных полей в разных местах для создания пояснительных отчетов. Единственный способ, которым я задумал в 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 можно было бы избежать этой скучной части, если бы только это работало.
Не так аккуратно, как хотелось бы, но работает.