Как разделить одно поле на несколько в Microsoft Access
Всем привет! Первый пост, не судите строго.
Расскажу и пошагово покажу, как разделить одно поле на несколько полей, используя встроенные функции Microsoft Access.
Возьмем для примера поле "ФИО". Задача будет следующая: раскидать отдельно по полям фамилию, имя и отчество.
Для решения поставленной задачи нам понадобятся функции: Left, Mid, InStr и IIF. Никакого VBA использовать не будем. Только конструктор, только хардкор)))
Также отмечу, что в данном примере фамилия, имя и отчество разделены одиночными пробелами.
Соответственно, чтобы вытащить фамилию, нам надо взять определенное количество знаков с левой части строки "ФИО". Здесь нам поможет функция LEFT.
У функции LEFT очень простой синтаксис.
LEFT([Строка];Число). [Строка] - это поле, с которым мы работаем. В нашем примере - поле "ФИО". Число - количество знаков, которое вытащит функция, с левой части поля "ФИО". Но проблема в том, что мы не знаем сколько символов указывать с левой стороны строки ФИО, так как у каждой персоны количество символов в фамилии разное.
Соответственно, нам нужна позиция первого пробела в поле "ФИО" между фамилией и именем. и здесь нам на помощь приходит функция InStr. Данная функция ищет позицию вхождения указанного символа в строке. InStr([Строка];Символ). [Строка] - это поле, в котором мы будем искать символ или группу символов. Символ - это то, что мы ищем.
В нашем случае получается: InStr([ФИО];" "). Далее данное выражение мы помещаем во второй параметр функции LEFT. Чтобы в поле "Фамилия" у нас не было лишнего пробела, для функции LEFT мы количество знаков во втором параметры уменьшаем на единицу.
Проверяем. Фамилия есть.
Далее нам необходимо найти позицию второго пробела в поле "ФИО" между именем и отчеством. Но для начала, мы вы вытащим из поля "ФИО" только имя и отчество. Здесь нам поможет функция Mid. Данная функция возвращает указанное количество знаков, начиная с указанного места строки. Mid([Строка];Старт;Длина). [Строка] - это поле, с которым мы работаем, Старт - позиция в строке, с которой мы будем вытаскивать символы, Длина - сколько символов мы будем вытаскивать. Если Длина не указана, функция Mid берет символы с позиции Старт и до конца строки.
В нашем примере в качестве второго параметра функции Mid будет использована функция InStr, которая в свою очередь ищет первый пробел в поле ФИО. Соответственно, InStr([ФИО];" ") - это позиция Старт для функции Mid. Получаем: Mid([ФИО];InStr([ФИО];" "))
Чтобы не было лишнего пробела, позицию Старт увеличиваем на 1 символ.
Запоминаем, что Mid([ФИО];InStr([ФИО];" ")+1) выводит имя и отчество без фамилии.
И теперь здесь мы будем искать номер позиции пробела между именем и отчеством.
Напомню, за поиск символа отвечает InStr.
Позицию пробела находим так: InStr(Mid([ФИО];InStr([ФИО];" ")+1);" ")-1
Снова воспользуемся функцией LEFT. Получим, Left(Mid([ФИО];InStr([ФИО];" ")+1);InStr(Mid([ФИО];InStr([ФИО];" ")+1);" ")-1)
Чтобы не запутаться: Mid([ФИО];InStr([ФИО];" ")+1) - это первый параметр функции LEFT (строка ИО (имя и отчество), с которой мы работаем). InStr(Mid([ФИО];InStr([ФИО];" ")+1);" ")-1 - второй параметр (сколько символов мы берем с начала ИО и до пробела).
В примере, есть записи без отчества, в таких случаях мы получим ошибку #Функ!. Пока не обращаем внимания, вернемся к этому моменту чуть позже.
Фамилию и имя получили, осталось отчество.
Здесь напишем: Mid(Mid([ФИО];InStr([ФИО];" ")+1);InStr(Mid([ФИО];InStr([ФИО];" ")+1);" ")+1), где
Mid([ФИО];InStr([ФИО];" ")+1) - 1 параметр функции Mid, который указывает, что мы работаем с полем ИО. InStr(Mid([ФИО];InStr([ФИО];" ")+1);" ")+1 - второй параметр, позиция, с которой мы начинаем вытаскивать отчество, т.е с первого символа сразу после пробела.
Отчество выводится отдельно, но только в тех случаях, когда у нас хранится полное ФИО.
Вернемся к полю "Имя". Исправим ошибку #Функ! Воспользуемся функцией IIF. Синтаксис: IIF(Условие;ДА;НЕТ). Условие - это выражение, которое мы будем использовать в качестве проверки, ДА - выражение, которое вернется если условие ДА, НЕТ - выражение, которое вернется если условие НЕТ.
Соответственно, нам надо проверить равна ли 0 позиция пробела между именем и отчеством. У 8 и 9 записи пробела после имени нет, следовательно позиция равна 0.
Если позиция ровна 0: IIf(InStr(Mid([ФИО];InStr([ФИО];" ")+1);" ")=0;
тогда из ИО вытаскиваем имя, используя: Mid([ФИО];InStr([ФИО];" ")+1)
иначе Left(Mid([ФИО];InStr([ФИО];" ")+1);InStr(Mid([ФИО];InStr([ФИО];" ")+1);" ")-1))
Целиком получаем: IIf(InStr(Mid([ФИО];InStr([ФИО];" ")+1);" ")=0;Mid([ФИО];InStr([ФИО];" ")+1);Left(Mid([ФИО];InStr([ФИО];" ")+1);InStr(Mid([ФИО];InStr([ФИО];" ")+1);" ")-1))
Аналогично с отчеством.
Если позиция ровна 0: InStr(Mid([ФИО];InStr([ФИО];" ")+1);" ")=0
тогда в поле "Отчество" мы помещаем значение NULL (пусто),
иначе помещаем отчество: Mid(Mid([ФИО];InStr([ФИО];" ")+1);InStr(Mid([ФИО];InStr([ФИО];" ")+1);" ")+1)
Целиком получаем: Отчество: IIf(InStr(Mid([ФИО];InStr([ФИО];" ")+1);" ")=0;Null;Mid(Mid([ФИО];InStr([ФИО];" ")+1);InStr(Mid([ФИО];InStr([ФИО];" ")+1);" ")+1))
Таким образом мы можем разделить поле MS Access на несколько полей. Если что-то осталось непонятным, ниже оставлю ссылку на видео, где более подробно разобрал данный пример.
Надеюсь помог! Это первый длиннопост, поэтому не судите строго!
Всем Удачи!