Я работаю над отчетом, для которого нужны международные адреса, соответствующие стандартам страны, куда отправляется почта.
В некоторых странах почтовый индекс должен стоять перед городом, в других нет, в некоторых есть регионы/штаты, а в других нет.
У меня есть такое выражение: =IIf(Eval([страна] In ("Италия","Чехия","Аргентина","Австрия","Бельгия","Китай")),([zip] & " " & [город]), ([город] & ", " & [регион] & " " & [zip]))
Возможно, мне придется добавить еще 5-10 стран. Есть ли лучший способ справиться с этим в построителе выражений, например, с помощью поиска или чего-то еще? Я не знал, существует ли ограничение на продолжительность хранения выражения в Access.
Спасибо за любой вклад.
Сейчас он работает, но ищет лучшее решение.
Рассмотрите возможность создания функции. Эта функция принимает в качестве параметров страну, город, регион и почтовый индекс. Внутри функции используйте оператор SELECT CASE для страны и возвращайте соответствующую отформатированную строку для каждого случая.
В МОДУЛЕ добавьте:
Public Function CityZip(Optional strCountry As String = "",Optional strCity As String = "",Optional strZip As String = "",Optional strRegion As String = "") As String
Select Case strCountry
Case "Italy", "Czech Republic", "Argentina", "Austria", "Belgium", "China"
CityZip = strZip & " " & strCity
Case Else
CityZip = strCity & " " & strRegion & " " & strZip
End Select
End Function
Затем вы можете использовать функцию как выражение вместо IIf:
=CityZip([country],[city],[zip],[region])
Инструменты базы данных — Visual Basic — Вставка — Модуль
Спасибо! Как мне это вызвать из отчета MS Access?
Добавлено необязательное ключевое слово, поэтому функция ведет себя должным образом, даже если передается нулевое значение.
Когда я добавляю этот код в MS Access 365, общедоступная функция становится красной, snipboard.io/kEI8P9.jpg
@ChuckS, ты пропустил символ _
в конце строк
Заранее извиняюсь... никогда раньше этого не делал: при запуске я получаю всплывающее окно со значением этого параметра: snipboard.io/fdHiAR.jpg Это код в поле: =CityZip([country],[city ],[zip],[регион])
А вот код модуля VB, который теперь хорош: snipboard.io/IHc4lx.jpg
Как называется ваш модуль? возможно, попробуйте =Module1.CityZip([страна],[город],[zip],[регион])
Таким образом, функция case для этой строки функции возвращает в отчете следующее: #Type! Но линия, отличная от «Италия..», работает правильно. Как показано здесь: snipboard.io/89Jh5E.jpg
Я обновил функцию, включив в нее значения по умолчанию. Все 4 параметра [страна],[город],[почтовый индекс],[регион] имеют один и тот же тип данных?
Да, есть... все текстовые поля snipboard.io/6PyJsu.jpg
Вот скриншот данных в одном из них, который выдает ошибку #Type snipboard.io/2uQnTz.jpg
Это может помочь stackoverflow.com/questions/19710398/…
Еще раз спасибо, что довели меня до этого места, очень ценю!
Рассмотрите возможность использования таблицы поиска, которая помечает предпочтения порядка почтовых индексов и стран. Вы можете построить такую таблицу на основе существующих данных (в идеале, используя идентификатор страны):
SELECT DISTINCT country, 0 AS zip_first
INTO country_preferences
FROM myTable
Затем настройте значение по умолчанию с помощью запросов UPDATE
или в пользовательском интерфейсе таблицы:
UPDATE country_preferences
SET zip_first = 1
WHERE country IN (
'Italy',
'Czech Republic',
'Argentina',
'Austria',
'Belgium',
'China'
);
Наконец, присоедините новую таблицу поиска к исходной таблице, чтобы получить более простое, эффективное и масштабируемое выражение IIF
:
SELECT
t.[country],
IIF(
c.[zip_first] = 1,
t.[zip] & ' ' & t.[country],
t.[city] & ', ' & t.[region] & ' ' & t.[zip]
) AS location
FROM myTable t
INNER JOIN country_preferences c
ON t.[country] = c.[country]
Где в MS Access вы это делаете?