Вопрос Microsoft относительно оператора IIf или лучшего решения

Я работаю над отчетом, для которого нужны международные адреса, соответствующие стандартам страны, куда отправляется почта.

В некоторых странах почтовый индекс должен стоять перед городом, в других нет, в некоторых есть регионы/штаты, а в других нет.

У меня есть такое выражение: =IIf(Eval([страна] In ("Италия","Чехия","Аргентина","Австрия","Бельгия","Китай")),([zip] & " " & [город]), ([город] & ", " & [регион] & " " & [zip]))

Возможно, мне придется добавить еще 5-10 стран. Есть ли лучший способ справиться с этим в построителе выражений, например, с помощью поиска или чего-то еще? Я не знал, существует ли ограничение на продолжительность хранения выражения в Access.

Спасибо за любой вклад.

Сейчас он работает, но ищет лучшее решение.

ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
1
0
56
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Рассмотрите возможность создания функции. Эта функция принимает в качестве параметров страну, город, регион и почтовый индекс. Внутри функции используйте оператор 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])

Где в MS Access вы это делаете?

Chuck S 28.08.2024 21:48

Инструменты базы данных — Visual Basic — Вставка — Модуль

Bart McEndree 28.08.2024 21:53

Спасибо! Как мне это вызвать из отчета MS Access?

Chuck S 28.08.2024 22:01

Добавлено необязательное ключевое слово, поэтому функция ведет себя должным образом, даже если передается нулевое значение.

Bart McEndree 28.08.2024 22:01

Когда я добавляю этот код в MS Access 365, общедоступная функция становится красной, snipboard.io/kEI8P9.jpg

Chuck S 28.08.2024 22:19

@ChuckS, ты пропустил символ _ в конце строк

4dmonster 29.08.2024 12:20

Заранее извиняюсь... никогда раньше этого не делал: при запуске я получаю всплывающее окно со значением этого параметра: snipboard.io/fdHiAR.jpg Это код в поле: =CityZip([country],[city ],[zip],[регион])

Chuck S 29.08.2024 15:48

А вот код модуля VB, который теперь хорош: snipboard.io/IHc4lx.jpg

Chuck S 29.08.2024 15:57

Как называется ваш модуль? возможно, попробуйте =Module1.CityZip([страна],[город],[zip],[регион])

Bart McEndree 29.08.2024 16:19

Таким образом, функция case для этой строки функции возвращает в отчете следующее: #Type! Но линия, отличная от «Италия..», работает правильно. Как показано здесь: snipboard.io/89Jh5E.jpg

Chuck S 29.08.2024 17:17

Я обновил функцию, включив в нее значения по умолчанию. Все 4 параметра [страна],[город],[почтовый индекс],[регион] имеют один и тот же тип данных?

Bart McEndree 29.08.2024 17:51

Да, есть... все текстовые поля snipboard.io/6PyJsu.jpg

Chuck S 29.08.2024 18:06

Вот скриншот данных в одном из них, который выдает ошибку #Type snipboard.io/2uQnTz.jpg

Chuck S 29.08.2024 18:11

Это может помочь stackoverflow.com/questions/19710398/…

Bart McEndree 29.08.2024 19:04

Еще раз спасибо, что довели меня до этого места, очень ценю!

Chuck S 29.08.2024 19:20

Рассмотрите возможность использования таблицы поиска, которая помечает предпочтения порядка почтовых индексов и стран. Вы можете построить такую ​​таблицу на основе существующих данных (в идеале, используя идентификатор страны):

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]

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