AXForum  
Zurück   AXForum > Microsoft Dynamics NAV > NAV: Программирование
All
Kennwort vergessen?
Registrieren Forum Rules Hilfe Benutzerliste Heutige Beiträge Suchen Alle Foren als gelesen markieren

 
 
Themen-Optionen Thema durchsuchen Ansicht
Alt 14.03.2007, 15:38   #1  
Iskatel ist offline
Iskatel
Участник
 
86 / 10 (1) +
Registriert seit: 18.09.2006
Проблема вот в чем.

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

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

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

Есть, что-нибудь стандартное для склонения? Уже готовое?
Стандартного нет даже в 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]
Alt 14.03.2007, 17:02   #4  
Iskatel ist offline
Iskatel
Участник
 
86 / 10 (1) +
Registriert seit: 18.09.2006
Огромное спасибо за помощь! То что надо.
Alt 14.03.2007, 17:59   #5  
konrad_imported ist offline
konrad_imported
Участник
 
183 / 10 (1) +
Registriert seit: 25.11.2004
Был или на этом форуме, или на мебузе кодеюнит. Года полтора назад.
Там пара функций. Передаешь в одну слово и падеж какой нужен. Возвращает склоненное слово. А в другую функцию сразу ФИО подаешь и склоненное получаешь.
Если не найдете - поищу у себя в заначке и выложу.
Alt 29.03.2007, 10:36   #6  
konrad_imported ist offline
konrad_imported
Участник
 
183 / 10 (1) +
Registriert seit: 25.11.2004
Вот он - искомый кодеюнит.
Angehängte Dateien
Dateityp: rar padej.rar (5,6 KB, 75x aufgerufen)
Alt 13.12.2007, 13:10   #7  
smoyk ist offline
smoyk
Участник
 
188 / 13 (1) ++
Registriert seit: 20.04.2007
Искомый кодеюнит оказался таким глючным, как будто его писала команда микрософта... После получаса юзания и попыток победить многочисленные ошибки и неровности в работе пришел к выводу, что проще написать самому. Может быть такой же глючный, зато свой
Alt 13.12.2007, 13:14   #8  
romeo ist offline
romeo
Участник
Benutzerbild von romeo
 
564 / 10 (2) +
Registriert seit: 31.03.2004
А у нас по старинке склоняют ручками в карточке .. Алгоритм надежный.
 

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Gehe zu

Рейтинг@Mail.ru
Alle Zeitangaben in WEZ +3. Es ist jetzt 17:27 Uhr.
Powered by vBulletin® Version 3.8.5 (Deutsch)
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.