Форум программистов, компьютерный форум, киберфорум
Microsoft Access
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.86/29: Рейтинг темы: голосов - 29, средняя оценка - 4.86
0 / 0 / 0
Регистрация: 17.02.2020
Сообщений: 61
1

В поле Фамилия Имя Отчество вывести Фамилия И.О

04.09.2020, 11:46. Показов 5440. Ответов 9

Author24 — интернет-сервис помощи студентам
Всем привет!

Подскажите как в поле запроса с Фамилия Имя Отчество оставить Фамилия И.О.

Понимаю, что лучше если было бы три отдельных поля, но возможности разбить нет.

Смотрел разные варианты с Mid и Left, но они были со строкой.

Как записать с полем не знаю

До первого пробела слово целиком, затем взять 1 символ после пробела, и после двух пробелов взять 1 символ.
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
04.09.2020, 11:46
Ответы с готовыми решениями:

ФАМИЛИЯ ИМЯ ОТЧЕСТВО в отчете
Еще вопрос: Я изначально сделал неправильно, связав ФАМИЛИЯ из таблицы ДЕНЬГИ с ФАМИЛИЯ ИМЯ...

Работа с подстроками: разбить таблицу FIO, на таблицы: F -фамилия, I - имя, O - отчество
В общем имеется БД, в ней таблица с информацией о людях, и столбец/поле - FIO, где фамилия имя...

Необходимо сделать одним полем Фамилия полностью а имя и отчество только инициалы
Дан запрос в нем поля Фамилия, Имя, отчество. Необходимо сделать одним полем Фамилия полностью а...

Как сократить полное Фамилия Имя Отчество как Фамилия И.О. в t-sql
Как сократить полное "Фамилия Имя Отчество" как "Фамилия И.О." в SQL запросе Именно надо в SQL,...

9
10745 / 5585 / 1411
Регистрация: 05.10.2016
Сообщений: 15,794
04.09.2020, 11:59 2
Цитата Сообщение от Serg064 Посмотреть сообщение
но возможности разбить нет.
Как нет?
Кликните здесь для просмотра всего текста
Пример использования:
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
Private Sub test()
Dim str As String
Dim v As Variant
    
    str = "Сидоров Петр Иванович"
    v = "Пример работы функции cutStr():"
    v = v & vbCrLf & String(30, "-")
    v = v & vbCrLf & "Часть 2 = " & cutStr(str, 2)
    v = v & vbCrLf & "Часть 3 = " & cutStr(str, 3)
    v = v & vbCrLf & "Часть 8 = "
    If IsNull(cutStr(str, 8)) Then v = v & "Null" Else v = v & " ...  "
    Debug.Print v
 
End Sub
Напишет:
Visual Basic
1
2
3
4
5
Пример работы функции cutStr():
------------------------------
Часть 2 = Петр
Часть 3 = Иванович
Часть 8 = Null
Собственно функция:
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
Public Function cutStr(val As Variant, intPosition As Integer, _
            Optional strSeparator As String = " ") As Variant
Dim v As Integer
Dim i As Integer, x As Integer
'es 29.01.04
'Рубит строку переданную в аргументе: val на отдельные слова
'   и возвращает слово стоящее в позиции указанной в intPosition
'   ... или Null если в заданной позиции слова нет
'Аргумент: strSeparator = разделитель слов (по умолчанию=пробел " ")
'----------------------------------------------------------------
On Error GoTo cutStrErr
    val = val & strSeparator
    x = 1
    For i = 1 To intPosition
        v = InStr(x, val, strSeparator)
        If v = 0 Then cutStr = Null: Exit For
        If i = intPosition Then
            cutStr = Mid(val, x, v - x)
            Exit For
        Else
            x = CInt(v + 1)
        End If
    Next i
'На случай лишних пробелов
    cutStr = Trim(cutStr)
    If cutStr = "" Then cutStr = Null
    Exit Function
cutStrErr:
    cutStr = "#Error!#"
    Err.clear
End Function
Второй вариант того же самого но с использованием функции Split()
Строк меньше - но работает примерно на 20% медленнее

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Public Function cutStrSplit(val As Variant, intPosition As Integer, _
            Optional strSeparator As String = " ") As Variant
Dim v() As String
'----------------------------------------------------------------
On Error GoTo cutStrSplitErr
    If IsNull(val) Then cutStrSplit = Null: Exit Function
    v = Split(val, strSeparator, intPosition)
    cutStrSplit = v(intPosition - 1)
'На случай лишних пробелов
    cutStrSplit = Trim(cutStrSplit)
    If cutStrSplit = "" Then cutStrSplit = Null
    Exit Function
cutStrSplitErr:
    cutStrSplit = "#Error!#"
    Err.clear
End Function

Третий вариант того же

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
Public Function CutString(sString$, iPartNo As Integer) As Variant
'es - 23.06.2019
'----------------------------------------------------------------
'Разделение строки
'Например: Петрова Ирина Ваильевна на ФИО раздельно
'----------------------------------------------------------------
Dim s$, i%, iDateStart%
Dim vArr As Variant
On Error GoTo CutString_Error
    
  
    s = sString
    vArr = Split(s, " ") 'Разделитель
    CutString = vArr(iPartNo - 1)
 
CutString_End:
    On Error GoTo 0
    Exit Function
 
CutString_Error:
    MsgBox "Error " & Err.Number & " (" & Err.Description & ") in procedure CutString, line " & Erl & "."
    Err.Clear
    Resume CutString_End
End Function
2
126 / 96 / 33
Регистрация: 28.02.2017
Сообщений: 478
04.09.2020, 12:07 3
Лучший ответ Сообщение было отмечено Serg064 как решение

Решение

Цитата Сообщение от Serg064 Посмотреть сообщение
как в поле запроса с Фамилия Имя Отчество оставить Фамилия И.О.
SQL
1
=LEFT([Поле];InStr(1;[Поле];" ")-1) & " " & LEFT(Mid([Поле];InStr(1;[Поле];" ")+1;InStr(InStr(1;[Поле];" ")+1;[Поле];" ")-InStr(1;[Поле];" ")-1);1) & ". " & LEFT(RIGHT([Поле];Len([Поле])-InStrRev([Поле];" "));1) & "."
Замените "Поле" на название своего поля с с Фамилия Имя Отчество
1
10745 / 5585 / 1411
Регистрация: 05.10.2016
Сообщений: 15,794
04.09.2020, 12:09 4
Цитата Сообщение от pagpal Посмотреть сообщение
как в поле запроса с Фамилия Имя Отчество оставить Фамилия И.О.
Лучше разбить сначала - и всё станет проще.
Разве нет?
0
126 / 96 / 33
Регистрация: 28.02.2017
Сообщений: 478
04.09.2020, 12:13 5
Цитата Сообщение от Eugene-LS Посмотреть сообщение
Разве нет?
Согласен.
0
10745 / 5585 / 1411
Регистрация: 05.10.2016
Сообщений: 15,794
04.09.2020, 12:16 6
Цитата Сообщение от pagpal Посмотреть сообщение
Согласен.
Ну, а дальше можно так:
Кликните здесь для просмотра всего текста
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
Public Function GetFIO(vFamilia As Variant, vImja As Variant, vOtchestvo As Variant, _
    Optional bInLongFormat As Boolean) As Variant
'es 19.04.2018 - LE 10.10.2019
'Возвращает ФИО (Или ничего) по аргументам:
'   vFamilia      = Фамилия
'   vImja         = Имя
'   vOtchestvo    = Отчество
'   bInLongFormat = Краткий или длинный формат = По умолчанию краткий
'       Краткий формат = Пушкин А.С.
'       Длинный формат = Пушкин Александр Сергеевич
'--------------------------------------------------------------------------
Dim iLen%
On Error GoTo GetFIO_Err
 
'Фамилия
    iLen = Len(vFamilia & "")
    If iLen > 0 Then 'Фамилия указана
        'Простое составление с нормализацией строки
        GetFIO = UCase(Mid(vFamilia, 1, 1)) & LCase(Mid(vFamilia, 2))
    Else 'Фамилии нет и формат краткий- на выход!
        If bInLongFormat = False Then
            GetFIO = vImja & " " & vOtchestvo
            Exit Function
        End If
    End If
 
'Имя
    iLen = Len(vImja & "")
    If iLen > 0 Then 'Имя указано
        If bInLongFormat = False Then
            GetFIO = GetFIO & " " & UCase(Mid(vImja, 1, 1)) & "."
        Else 'Полностью с нормализацией строки
            GetFIO = GetFIO & " " & UCase(Mid(vImja, 1, 1)) & LCase(Mid(vImja, 2))
            'If iLen > 1 Then GetFIO = GetFIO
        End If
    Else
        If bInLongFormat = False Then Exit Function
    End If
 
'Отчество
    iLen = Len(vOtchestvo & "")
    If iLen > 0 Then 'Отчество указано
        If bInLongFormat = False Then
            GetFIO = GetFIO & UCase(Mid(vOtchestvo, 1, 1)) & "."
        Else 'Полностью с нормализацией строки
            GetFIO = GetFIO & " " & UCase(Mid(vOtchestvo, 1, 1)) & LCase(Mid(vOtchestvo, 2))
        End If
    End If
 
GetFIO_Bye:
    Exit Function
 
GetFIO_Err:
    Err.Clear
    Resume GetFIO_Bye
End Function


... а вообще:
Кликните здесь для просмотра всего текста
Преобразование длинного ФИО в краткий формат ("Пушкин А.С.")
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
Public Function FIOShort(vFIO As Variant) As Variant
'es 03.06.2019
'Преобразование длинного ФИО в краткий формат ("Пушкин А.С.")
'--------------------------------------------------------------------------
'?FIOShort("Пушкин Александр Сергеевич")
'--------------------------------------------------------------------------
Dim s As String
Dim sFam$, sImia$, sOth$
Dim i%, x%
On Error GoTo FIOShort_Err
    s = CStr(vFIO)
    s = Trim(Replace(s, "  ", " "))
    x = Len(s)
    i = InStr(1, s, " ")
    
    If i > 1 Then
        FIOShort = Mid(s, 1, i - 1)
    Else
        FIOShort = s
        Exit Function
    End If
   
    sImia = UCase(Mid(s, i + 1, 1)) & "."
    FIOShort = FIOShort & " " & sImia
    
    i = InStr(i + 2, s, " ")
    If i > 0 Then
        sOth = UCase(Mid(s, i + 1, 1)) & "."
        FIOShort = FIOShort & sOth
    End If
 
 
FIOShort_End:
    On Error Resume Next
    Err.Clear
    Exit Function
 
FIOShort_Err:
    'MsgBox "Error: " & Err.Number & vbCrLf & Err.Description & vbCrLf & _
    "in Function: FIOShort in module: modTools", vbCritical, "Error in Application"
    Err.Clear
    Resume FIOShort_End
End Function
Выражение на эту же тему:

Visual Basic
1
=IIf(InStr(InStr([ФИО];" ")+1;[ФИО];" ")>0;Mid([ФИО];1;InStr([ФИО];" ")-1) & (" "+Mid([ФИО];InStr([ФИО];" ")+1;1)+".") & (" "+Mid([ФИО];InStrRev([ФИО];" ")+1;1)+".");Mid([ФИО];1;InStr([ФИО];" ")-1) & (" "+Mid([ФИО];InStr([ФИО];" ")+1;1)+"."))
2
126 / 96 / 33
Регистрация: 28.02.2017
Сообщений: 478
04.09.2020, 12:31 7
Цитата Сообщение от Eugene-LS Посмотреть сообщение
... а вообще:
Это то да, смотря для каких целей- учебная, то быстрее в запросе, а если рабочая, тогда уже можно и заморочится.
0
10745 / 5585 / 1411
Регистрация: 05.10.2016
Сообщений: 15,794
04.09.2020, 13:59 8
Уважаемый Serg064, как вы там?
Помогло - нет?
... а то мы тут с ув. pagpal в коде изощряемся, а от вас "ни слуху - ни духу"
1
0 / 0 / 0
Регистрация: 17.02.2020
Сообщений: 61
04.09.2020, 14:27  [ТС] 9
Цитата Сообщение от Eugene-LS Посмотреть сообщение
как вы там?
Все хорошо.

Спасибо большое!

Помогло.

Цитата Сообщение от pagpal Посмотреть сообщение

SQL
1
LEFT([Поле];InStr(1;[Поле];" ")-1) & " " & LEFT(Mid([Поле];InStr(1;[Поле];" ")+1;InStr(InStr(1;[Поле];" ")+1;[Поле];" ")-InStr(1;[Поле];" ")-1);1) & ". " & LEFT(RIGHT([Поле];Len([Поле])-InStrRev([Поле];" "));1) & "."
Замените "Поле" на название своего поля с с Фамилия Имя Отчество
Спасибо большое!

Помогло.
0
10745 / 5585 / 1411
Регистрация: 05.10.2016
Сообщений: 15,794
04.09.2020, 14:31 10
Цитата Сообщение от Serg064 Посмотреть сообщение
Помогло.
Вот и славно!
1
04.09.2020, 14:31
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
04.09.2020, 14:31
Помогаю со студенческими работами здесь

Объединение столбцов Фамилия, Имя, Отчество в ФИО для сохранения данных в ФИО
Здравствуйте, столкнулся с проблемой в нехватке опыта. Прошу помочь объединить данные столбцов...

В строке s1 записаны фамилия имя отчество. Необходимо вывести фамилия и инициалы
в строке s1 записаны фамилия имя отчество. Необходимо вывести фамилия и инициалы. Как это можно...

С клавиатуры вводится строка "Фамилия Имя Отчество". Изменить вывод строки на "Имя Отчество Фамилия"
С клавиатуры вводится строка "Фамилия Имя Отчество". Изменить вывод строки на "Имя Отчество...

Строку в формате "фамилия, имя, отчество" преобразовать в формат "имя, отчество, фамилия"
последовательность содержит Ваша фамилия, имя, отчество. Превратить ее таким образом, чтобы сначала...

Ввести в одной строке фамилию, имя и отчество. Вывести, где останутся имя и фамилия
Пример: Введите ФИО: Пупкин Василий Иванович ...

Вывести записи файла на экран в виде: Имя Отчество Фамилия
в каждой строке текстового файла STUDENTS.DAT записаны через пробел Фамилия,Имя и Отчество...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru