darklumen

На Пикабу
1608 рейтинг 1 подписчик 1 подписка 12 постов 2 в горячем
Награды:
10 лет на Пикабу
83

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

Надеюсь помог! Это первый длиннопост, поэтому не судите строго!

Всем Удачи!

Показать полностью 14 1
Отличная работа, все прочитано!

Темы

Политика

Теги

Популярные авторы

Сообщества

18+

Теги

Популярные авторы

Сообщества

Игры

Теги

Популярные авторы

Сообщества

Юмор

Теги

Популярные авторы

Сообщества

Отношения

Теги

Популярные авторы

Сообщества

Здоровье

Теги

Популярные авторы

Сообщества

Путешествия

Теги

Популярные авторы

Сообщества

Спорт

Теги

Популярные авторы

Сообщества

Хобби

Теги

Популярные авторы

Сообщества

Сервис

Теги

Популярные авторы

Сообщества

Природа

Теги

Популярные авторы

Сообщества

Бизнес

Теги

Популярные авторы

Сообщества

Транспорт

Теги

Популярные авторы

Сообщества

Общение

Теги

Популярные авторы

Сообщества

Юриспруденция

Теги

Популярные авторы

Сообщества

Наука

Теги

Популярные авторы

Сообщества

IT

Теги

Популярные авторы

Сообщества

Животные

Теги

Популярные авторы

Сообщества

Кино и сериалы

Теги

Популярные авторы

Сообщества

Экономика

Теги

Популярные авторы

Сообщества

Кулинария

Теги

Популярные авторы

Сообщества

История

Теги

Популярные авторы

Сообщества