AXForum  
Вернуться   AXForum > Microsoft Dynamics NAV > NAV: Программирование
All
Забыли пароль?
Зарегистрироваться Правила Справка Пользователи Сообщения за день Поиск

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 14.03.2007, 15:38   #1  
Iskatel is offline
Iskatel
Участник
 
86 / 10 (1) +
Регистрация: 18.09.2006
Проблема вот в чем.

Есть сотрудник Петров Петр Петрович. А нужно получить, к примеру: Принять на работу Петрова Петра Петровича.

Есть, что-нибудь стандартное для склонения? Уже готовое?
Старый 14.03.2007, 16:00   #2  
TERRA is offline
TERRA
Участник
 
59 / 10 (1) +
Регистрация: 05.05.2005
Адрес: Moscow
Я делала выносом доп. поля в карточку сотрудника.
Потому как разность фамилий всех мастей и национальностей была ТАКАЯ, что ни о каком общем алгоритме - говорить не приходилось.
Так что под полей ФИО - сразу заполнялось поле "ФИО род.п."
Проще и с мЕньшими трудозатратами сделать, ИМХО, нельзя...
Старый 14.03.2007, 16:12   #3  
Corleone is offline
Corleone
Участник
 
355 / 10 (1) +
Регистрация: 27.05.2004
Адрес: London
Цитата:
Сообщение от Programmer Посмотреть сообщение
Проблема вот в чем.

Есть сотрудник Петров Петр Петрович. А нужно получить, к примеру: Принять на работу Петрова Петра Петровича.

Есть, что-нибудь стандартное для склонения? Уже готовое?
Стандартного нет даже в 1С. Формально склонять не надо.

Вход: Padezh R или D, соответственно родительный или дательный, остальное понятно.

[codebox]

Параметры
LastName Text 50
FirstName Text 50
MiddleName Text 50
Sex Option
Padezh Char
VAR ReturnLastName Text 50
VAR ReturnFirstName Text 50
VAR ReturnMiddleName Text 50

Переменные
L Text 32
Last1 Text 1
Last2 Text 2
Last3 Text 3
i Integer
Flag Boolean
LetterType Option
Roditel Text 50
Datel Text 50
RoditelName Text 50
DatelName Text 50
RoditelMiddle Text 50
DatelMiddle Text 50

L[1] := 'Б';
L[2] := 'В';
L[3] := 'Г';
L[4] := 'Д';
L[5] := 'Ж';
L[6] := 'З';
L[7] := 'К';
L[8] := 'Л';
L[9] := 'М';
L[10] := 'Н';
L[11] := 'П';
L[12] := 'Р';
L[13] := 'С';
L[14] := 'Т';
L[15] := 'Ф';
L[16] := 'Х';
L[17] := 'Ц';
L[18] := 'Ч';
L[19] := 'Ш';
L[20] := 'Щ';

//Гласные
L[21] := 'А';
L[22] := 'Е';
L[23] := 'И';
L[24] := 'Й';
L[25] := 'О';
L[26] := 'У';
L[27] := 'Ы';
L[28] := 'Э';
L[29] := 'Ю';
L[30] := 'Я';
L[31] := 'Ь';
L[32] := 'Ъ';

// Sex is not defined
IF (Sex <> 1) AND (Sex <> 2) THEN
EXIT(ReturnFIO);

// Padezh is not defined
IF (Padezh <> 'R') AND (Padezh <> 'D') THEN
EXIT(ReturnFIO);

LastName := UPPERCASE(LastName);

Last1 := COPYSTR(LastName, STRLEN(LastName), 1);
Last2 := COPYSTR(LastName, STRLEN(LastName)-1, 2);
Last3 := COPYSTR(LastName, STRLEN(LastName)-2, 3);

Flag := FALSE;

FOR i := 1 TO 32 DO
BEGIN
IF L[i] = Last1 THEN
BEGIN
IF i <= 20 THEN
LetterType := LetterType::SoGlas
ELSE
LetterType := LetterType::Glas;
END;
END;

// Исключения
IF STRLEN(LastName) <= 2 THEN //фамилии типа Ге, Че
BEGIN
Roditel := LastName;
Datel := LastName;
END;

//фамилии типа Туташхиа, Стуруа, украинские фамилии, сибирские фамилии
IF ((Last2 = 'ИХ') OR (Last2 = 'ЫХ') OR (Last2 = 'УА') OR (Last2 = 'ИА')) OR (Last1 = 'О') THEN
BEGIN
Roditel := LastName;
Datel := LastName;
END;

// женские фамилии типа Ганжа
IF (Last2 = 'ЖА') AND (Sex = Sex::Female) THEN
BEGIN
Roditel := LastName;
Datel := LastName;
END;

//грузинские фамилии типа Гогадзе, Габошвили
IF (Last3 = 'ДЗЕ') OR (Last3 = 'ИЛИ') THEN
BEGIN
Roditel := LastName;
Datel := LastName;
END;

//фамилии типа Цой
IF (Last2 = 'ОЙ') AND (Sex = Sex::Male) AND (STRLEN(LastName) = 3) THEN
BEGIN
Roditel := COPYSTR(LastName,1,STRLEN(LastName)-1) + 'я';
Datel := COPYSTR(LastName,1,STRLEN(LastName)-1) + 'ю';
Flag := TRUE;
END;

IF (Last2 = 'ОЙ') AND (Sex = Sex::Female) AND (STRLEN(LastName) = 3) THEN
BEGIN
Roditel := LastName;
Datel := LastName;
END;

IF (LetterType = LetterType::SoGlas) AND (Sex = Sex::Male) THEN
BEGIN
Roditel := LastName + 'а';
Datel := LastName + 'у';
Flag := TRUE;
END;
IF (LetterType = LetterType::SoGlas) AND (Sex = Sex::Female) THEN
BEGIN
Roditel := LastName;
Datel := LastName;
END;

IF (Sex = Sex::Female) AND (Last1 = 'А') THEN
BEGIN
Roditel := COPYSTR(LastName,1,STRLEN(LastName)-1) + 'у';
Datel := COPYSTR(LastName,1,STRLEN(LastName)-1) + 'ой';
Flag := TRUE;
END;

IF (Sex = Sex::Male) AND (Last1 = 'А') THEN //фам. типа Соткилава
BEGIN
Roditel := COPYSTR(LastName,1,STRLEN(LastName)-1) + 'у';
Datel := COPYSTR(LastName,1,STRLEN(LastName)-1) + 'е';
Flag := TRUE;
END;

IF (Sex = Sex::Male) AND (Last2 = 'ОЙ') AND (STRLEN(LastName) > 3) THEN
BEGIN
Roditel := COPYSTR(LastName,1,STRLEN(LastName)-1) + 'го';
Datel := COPYSTR(LastName,1,STRLEN(LastName)-1) + 'му';
Flag := TRUE;
END;

IF (Sex = Sex::Female) AND (Last2 = 'АЯ') AND (STRLEN(LastName) > 3) THEN
BEGIN
Roditel := COPYSTR(LastName,1,STRLEN(LastName)-1) + 'ую';
Datel := COPYSTR(LastName,1,STRLEN(LastName)-1) + 'ой';
Flag := TRUE;
END;

//если не сработало ни одно условие
IF NOT Flag THEN
BEGIN
Roditel := LastName;
Datel := LastName;
END;

//////////////склонение имени////////

FirstName := UPPERCASE(FirstName);
Last1 := COPYSTR(FirstName, STRLEN(FirstName), 1);
Last2 := COPYSTR(FirstName, STRLEN(FirstName)-1, 2);
Last3 := COPYSTR(FirstName, STRLEN(FirstName)-2, 3);

FOR i := 1 TO 32 DO
BEGIN
IF L[i] = Last1 THEN
BEGIN
IF i <= 20 THEN
LetterType := LetterType::SoGlas
ELSE
LetterType := LetterType::Glas;
END;
END;

Flag := FALSE;

IF (Sex = Sex::Male) AND (LetterType = LetterType::SoGlas) THEN //Иван, Петр и т.д.
BEGIN
RoditelName := FirstName + 'а';
DatelName := FirstName + 'у';
Flag := TRUE;
END;

IF (Sex = Sex::Male) AND (Last1 = 'Й') THEN //Сергей, Дмитрий и т.д.
BEGIN
RoditelName := COPYSTR(FirstName,1,STRLEN(FirstName)-1) + 'я';
DatelName := COPYSTR(FirstName,1,STRLEN(FirstName)-1) + 'ю';
Flag := TRUE;
END;

IF (Sex = Sex::Male) AND (Last1 = 'А') THEN //Фома
BEGIN
RoditelName := COPYSTR(FirstName,1,STRLEN(FirstName)-1) + 'у';
DatelName := COPYSTR(FirstName,1,STRLEN(FirstName)-1) + 'е';
Flag := TRUE;
END;

IF (Sex = Sex::Male) AND (Last1 = 'Я') THEN //Илья
BEGIN
RoditelName := COPYSTR(FirstName,1,STRLEN(FirstName)-1) + 'ю';
DatelName := COPYSTR(FirstName,1,STRLEN(FirstName)-1) + 'е';
Flag := TRUE;
END;

IF (Sex = Sex::Male) AND (Last1 = 'Ь') THEN //Игорь
BEGIN
RoditelName := COPYSTR(FirstName,1,STRLEN(FirstName)-1) + 'я';
DatelName := COPYSTR(FirstName,1,STRLEN(FirstName)-1) + 'ю';
Flag := TRUE;
END;

IF (Sex = Sex::Female) AND (Last1 = 'А') THEN //Татьяна, Людмила и т.д.
BEGIN
RoditelName := COPYSTR(FirstName,1,STRLEN(FirstName)-1) + 'у';
DatelName := COPYSTR(FirstName,1,STRLEN(FirstName)-1) + 'е';
Flag := TRUE;
END;

IF (Sex = Sex::Female) AND (Last1 = 'Я') THEN //Зоя, Наталья и т.д.
BEGIN
RoditelName := COPYSTR(FirstName,1,STRLEN(FirstName)-1) + 'ю';
DatelName := COPYSTR(FirstName,1,STRLEN(FirstName)-1) + 'е';
Flag := TRUE;
END;

IF (Sex = Sex::Female) AND (Last2 = 'ИЯ') THEN //Наталия,Виктория и т.д.
BEGIN
RoditelName := COPYSTR(FirstName,1,STRLEN(FirstName)-1) + 'ю';
DatelName := COPYSTR(FirstName,1,STRLEN(FirstName)-1) + 'и';
Flag := TRUE;
END;

IF NOT Flag THEN
BEGIN
RoditelName := FirstName;
DatelName := FirstName;
END;

/////////склонение отчества///////
MiddleName := UPPERCASE(MiddleName);

IF (Sex = Sex::Male) THEN
BEGIN
RoditelMiddle := MiddleName + 'а';
DatelMiddle := MiddleName + 'у';
Flag := TRUE;
END;

IF (Sex = Sex::Female) THEN
BEGIN
RoditelMiddle := COPYSTR(MiddleName,1,STRLEN(MiddleName)-1) + 'у';
DatelMiddle := COPYSTR(MiddleName,1,STRLEN(MiddleName)-1) + 'е';
Flag := TRUE;
END;

IF Padezh = 'D' THEN
BEGIN
ReturnLastName := Datel;
ReturnFirstName := DatelName;
ReturnMiddleName := DatelMiddle;
END
ELSE IF Padezh = 'R' THEN
BEGIN
ReturnLastName := Roditel;
ReturnFirstName := RoditelName;
ReturnMiddleName := RoditelMiddle;
END;

ReturnLastName := UPPERCASE(FORMAT(ReturnLastName[1])) + COPYSTR(LOWERCASE(ReturnLastName),2, STRLEN(ReturnLastName)-1);
ReturnFirstName := UPPERCASE(FORMAT(ReturnFirstName[1])) + COPYSTR(LOWERCASE(ReturnFirstName),2, STRLEN(ReturnFirstName)-1);
ReturnMiddleName := UPPERCASE(FORMAT(ReturnMiddleName[1])) + COPYSTR(LOWERCASE(ReturnMiddleName),2, STRLEN(ReturnMiddleName)-1);
ReturnFIO := ReturnLastName + ' ' + ReturnFirstName + ' ' + ReturnMiddleName;
[/codebox]
Старый 14.03.2007, 17:02   #4  
Iskatel is offline
Iskatel
Участник
 
86 / 10 (1) +
Регистрация: 18.09.2006
Огромное спасибо за помощь! То что надо.
Старый 14.03.2007, 17:59   #5  
konrad_imported is offline
konrad_imported
Участник
 
183 / 10 (1) +
Регистрация: 25.11.2004
Был или на этом форуме, или на мебузе кодеюнит. Года полтора назад.
Там пара функций. Передаешь в одну слово и падеж какой нужен. Возвращает склоненное слово. А в другую функцию сразу ФИО подаешь и склоненное получаешь.
Если не найдете - поищу у себя в заначке и выложу.
Старый 29.03.2007, 10:36   #6  
konrad_imported is offline
konrad_imported
Участник
 
183 / 10 (1) +
Регистрация: 25.11.2004
Вот он - искомый кодеюнит.
Вложения
Тип файла: rar padej.rar (5.6 Кб, 62 просмотров)
Старый 13.12.2007, 13:10   #7  
smoyk is offline
smoyk
Участник
 
188 / 13 (1) ++
Регистрация: 20.04.2007
Искомый кодеюнит оказался таким глючным, как будто его писала команда микрософта... После получаса юзания и попыток победить многочисленные ошибки и неровности в работе пришел к выводу, что проще написать самому. Может быть такой же глючный, зато свой
Старый 13.12.2007, 13:14   #8  
romeo is offline
romeo
Участник
Аватар для romeo
 
564 / 10 (2) +
Регистрация: 31.03.2004
А у нас по старинке склоняют ручками в карточке .. Алгоритм надежный.
 


Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 21:29.