darklumen

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

Как разделить одно поле на несколько в Microsoft Access

Всем привет! Первый пост, не судите строго.

Расскажу и пошагово покажу, как разделить одно поле на несколько полей, используя встроенные функции Microsoft Access.

Возьмем для примера поле "ФИО". Задача будет следующая: раскидать отдельно по полям фамилию, имя и отчество.

Как разделить одно поле на несколько в Microsoft Access Microsoft Access, Запросы, Mid, База данных, Видео, Длиннопост

Для решения поставленной задачи нам понадобятся функции: Left, Mid, InStr и IIF. Никакого VBA использовать не будем. Только конструктор, только хардкор)))

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

Соответственно, чтобы вытащить фамилию, нам надо взять определенное количество знаков с левой части строки "ФИО". Здесь нам поможет функция LEFT.


У функции LEFT очень простой синтаксис.

LEFT([Строка];Число). [Строка] - это поле, с которым мы работаем. В нашем примере - поле "ФИО". Число - количество знаков, которое вытащит функция, с левой части поля "ФИО". Но проблема в том, что мы не знаем сколько символов указывать с левой стороны строки ФИО, так как у каждой персоны количество символов в фамилии разное.

Как разделить одно поле на несколько в Microsoft Access Microsoft Access, Запросы, Mid, База данных, Видео, Длиннопост

Соответственно, нам нужна позиция первого пробела в поле "ФИО" между фамилией и именем. и здесь нам на помощь приходит функция InStr. Данная функция ищет позицию вхождения указанного символа в строке. InStr([Строка];Символ). [Строка] - это поле, в котором мы будем искать символ или группу символов. Символ - это то, что мы ищем.

В нашем случае получается: InStr([ФИО];" "). Далее данное выражение мы помещаем во второй параметр функции LEFT. Чтобы в поле "Фамилия" у нас не было лишнего пробела, для функции LEFT мы количество знаков во втором параметры уменьшаем на единицу.

Как разделить одно поле на несколько в Microsoft Access Microsoft Access, Запросы, Mid, База данных, Видео, Длиннопост

Проверяем. Фамилия есть.

Как разделить одно поле на несколько в Microsoft Access Microsoft Access, Запросы, Mid, База данных, Видео, Длиннопост

Далее нам необходимо найти позицию второго пробела в поле "ФИО" между именем и отчеством. Но для начала, мы вы вытащим из поля "ФИО" только имя и отчество. Здесь нам поможет функция Mid. Данная функция возвращает указанное количество знаков, начиная с указанного места строки.  Mid([Строка];Старт;Длина). [Строка] - это поле, с которым мы работаем, Старт - позиция в строке, с которой мы будем вытаскивать символы, Длина - сколько символов мы будем вытаскивать. Если Длина не указана, функция Mid берет символы с позиции Старт и до конца строки.

В нашем примере в качестве второго параметра функции Mid будет использована функция InStr, которая в свою очередь ищет первый пробел в поле ФИО. Соответственно, InStr([ФИО];" ") - это позиция Старт для функции Mid. Получаем: Mid([ФИО];InStr([ФИО];" "))

Как разделить одно поле на несколько в Microsoft Access Microsoft Access, Запросы, Mid, База данных, Видео, Длиннопост

Чтобы не было лишнего пробела, позицию Старт увеличиваем на 1 символ.

Как разделить одно поле на несколько в Microsoft Access Microsoft Access, Запросы, Mid, База данных, Видео, Длиннопост

Запоминаем, что 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 - второй параметр (сколько символов мы берем с начала ИО и до пробела).

Как разделить одно поле на несколько в Microsoft Access Microsoft Access, Запросы, Mid, База данных, Видео, Длиннопост

В примере, есть записи без отчества, в таких случаях мы получим ошибку #Функ!. Пока не обращаем внимания, вернемся к этому моменту чуть позже.

Как разделить одно поле на несколько в Microsoft Access Microsoft Access, Запросы, Mid, База данных, Видео, Длиннопост

Фамилию и имя получили, осталось отчество.

Здесь напишем: Mid(Mid([ФИО];InStr([ФИО];" ")+1);InStr(Mid([ФИО];InStr([ФИО];" ")+1);" ")+1), где

Mid([ФИО];InStr([ФИО];" ")+1) - 1 параметр функции Mid, который указывает, что мы работаем с полем ИО. InStr(Mid([ФИО];InStr([ФИО];" ")+1);" ")+1 - второй параметр, позиция, с которой мы начинаем вытаскивать отчество, т.е с первого символа сразу после пробела.

Как разделить одно поле на несколько в Microsoft Access Microsoft Access, Запросы, Mid, База данных, Видео, Длиннопост

Отчество выводится отдельно, но только в тех случаях, когда у нас хранится полное ФИО.

Как разделить одно поле на несколько в Microsoft Access Microsoft Access, Запросы, Mid, База данных, Видео, Длиннопост

Вернемся к полю "Имя". Исправим ошибку #Функ! Воспользуемся функцией IIF. Синтаксис: IIF(Условие;ДА;НЕТ). Условие - это выражение, которое мы будем использовать в качестве проверки, ДА - выражение, которое вернется если условие ДА, НЕТ - выражение, которое вернется если условие НЕТ.


Соответственно, нам надо проверить равна ли 0 позиция пробела между именем и отчеством. У 8 и 9 записи пробела после имени нет, следовательно позиция равна 0.

Как разделить одно поле на несколько в Microsoft Access Microsoft Access, Запросы, Mid, База данных, Видео, Длиннопост

Если позиция ровна 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))

Как разделить одно поле на несколько в Microsoft Access Microsoft Access, Запросы, Mid, База данных, Видео, Длиннопост

Аналогично с отчеством.

Если позиция ровна 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))

Как разделить одно поле на несколько в Microsoft Access Microsoft Access, Запросы, Mid, База данных, Видео, Длиннопост
Как разделить одно поле на несколько в Microsoft Access Microsoft Access, Запросы, Mid, База данных, Видео, Длиннопост
Как разделить одно поле на несколько в Microsoft Access Microsoft Access, Запросы, Mid, База данных, Видео, Длиннопост

Таким образом мы можем разделить поле MS Access на несколько полей. Если что-то осталось непонятным, ниже оставлю ссылку на видео, где более подробно разобрал данный пример.

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

Всем Удачи!

Показать полностью 14 1

В свете последних событий

Ира, давай!
В свете последних событий Ира, давай!

Где-то в инфекционке в Москве

Где-то в инфекционке в Москве

А вы нас еще помните?

А вы нас еще помните?

Про хрен

Про хрен

А вы говорите сумерки

Калининградская романтика Ответ на http://pikabu.ru/story/volgograd_takoy_volgograd_816087
А вы говорите сумерки Калининградская романтика  Ответ на http://pikabu.ru/story/volgograd_takoy_volgograd_816087

А вы говорите Челябинск

Люблю свой город! )))
А вы говорите Челябинск Люблю свой город! )))

Доктор, такой доктор

Доктор, такой доктор
Отличная работа, все прочитано!