Склонение ФИО

Программирование на Атлантисе (VIP, FCOM, ARD), FastReport

Модераторы: m0p3e, edward_K, Модераторы

Ответить
svetanch
Сообщения: 3
Зарегистрирован: 15 июн 2006, 16:10

Склонение ФИО

Сообщение svetanch »

Всем здравствуйте!

Возникла проблемка в модуле кадры.

В картотеке сотрудников можно указать склонение ФИО. Причем система сама делает первоначальное склонение по падежам, но можно задать и исключение. Исключения хранятся в таблице aboutfio, это мы нашли.
Непонятно, где хранятся сгенерированные системой склонения (которые мы не изменяли).

В отчете нам надо вытащить родительный падеж ФИО.

Кто нибудь подскажет, как можно это сделать?
edward_K
Заслуженный деятель интернет-сообщества
Сообщения: 5188
Зарегистрирован: 29 мар 2005, 17:49
Откуда: SPB galaxy spb

Сообщение edward_K »

odecl.vih
==========
#ifdef ComponentVersion
#component "z_Staff"
#end

objinterface odeclension;

//Склонение фамилии или ее части
//NCase- падеж /2- 6/
//NPart- часть фамилии 1- первая или фамилия целиком; 2- вторая часть
//gender- 0- род определен программой 1- женский 2- мужской
function SurNameDeclension(LName: string; gender: word; NCase: word; NPart: byte): string;

//Склонение имени
function NameDeclension(FName: string; gender: word; NCase: word): string;

//Склонение отчества
function PatronDeclension(PName: string; gender: word; NCase: word): string;

//Склонение ФИО целиком
function FIODeclension(cpersons: comp; Infinitive: string; NCase: word): string;

//Добавление записи в словарь исключений
//0 -удачное добавление
//1- есть дубликат
//2- произошли ошибки на этапе вставки
function AddSimpleException(Target: string; ExceptType: byte): word;

//Окно ввода параметров исключения
procedure RunSimpleExceptionWindow;

//Поиск исключения по персоне
function fndpersonsException(cpersons: comp; nCase: word): string;

//Добавление записи в словарь персональных исключений
//0 -удачное добавление
//1- есть дубликат
//2- произошли ошибки на этапе вставки
function AddPersonalException(cpersons: comp; Target: string; nCase: word): word;

//Удаление записи из словаря персональных исключений
//0 -удачное удаление
//1- нет такой записи
//2- произошли ошибки на этапе удаления
function DeletePersonalException(cpersons: comp; nCase: word): word;

//Корректировка записи в словаре персональных исключений
//0 -удачная корректировка
//1- нет такой записи
//2- произошли ошибки на этапе корректировки
function UpdatePersonalException(cpersons: comp; Target: string; nCase: word): word;
end;

objinterface odeclension1;

function VerifyGender(target: string): word;

end;

vipinterface declension implements odeclension, odeclension1


#ifdef ATL51
Licensed (free)
#end
edward_K
Заслуженный деятель интернет-сообщества
Сообщения: 5188
Зарегистрирован: 29 мар 2005, 17:49
Откуда: SPB galaxy spb

Сообщение edward_K »

пример
var iOdecl : declension; // Переменная типа интерфейс declension

iOdecl.FIODeclension(Persons.NRec, Persons.FIO, 3)
svetanch
Сообщения: 3
Зарегистрирован: 15 июн 2006, 16:10

Сообщение svetanch »

Спасибо большое, edward_K! :smile: Буду копаться.
svetanch
Сообщения: 3
Зарегистрирован: 15 июн 2006, 16:10

Сообщение svetanch »

edward_K, БОЛЬШОЕ-БОЛЬШОЕ СПАСИБО!!!
ВСЁ получилось!!!!!!!!!! :grin:
varvara
Постоянный обитатель
Сообщения: 130
Зарегистрирован: 21 дек 2005, 19:12

Сообщение varvara »

А в какой версии это работает? У меня (VIP – 3.03.22) при обращении к функции
iOdecl.FIODeclension(Persons.NRec, Persons.FIO, 3)
message(iOdecl)
выдается сообщение «Значение не определено».
edward_K
Заслуженный деятель интернет-сообщества
Сообщения: 5188
Зарегистрирован: 29 мар 2005, 17:49
Откуда: SPB galaxy spb

Сообщение edward_K »

а слабо доку почитать что такое объектный фейс ? или вспомнить вообще что такое объекты, типы данных и т.п.
iOdecl - это объект со своими функциями, а в message нужно переменную загонять c типом string . Так не пробовали
message(Persons.fio+'/'+iOdecl.FIODeclension(Persons.NRec, Persons.FIO, 3) )?
varvara
Постоянный обитатель
Сообщения: 130
Зарегистрирован: 21 дек 2005, 19:12

Сообщение varvara »

Спасибо, все получилось.Можно еще использовать промежуточную переменную типа string
Str_:=iOdecl.FIODeclension(Persons.NRec, Persons.FIO, 3)
message(str_)
Дока это, конечно, хорошо, но с вашей помощью гораздо быстрее .Спасибо!
Vlad
Постоянный обитатель
Сообщения: 101
Зарегистрирован: 29 мар 2005, 17:49
Откуда: Красноярск

Сообщение Vlad »

Здравствуйте, подскажите, что я не так делаю?
1) в файле проекта прописываю

Код: Выделить всё

#include odecl.vih 
#make "bankCardsxls.frm"
2) в фрмке

Код: Выделить всё

.var
  coFio:comp;
  iOdecl1:odeclension;
  sfio,sfio1:string;
.endvar
....
.begin
sFio1:=iOdecl1.FIODeclension(coFio,sfio,3);
end.
3) компилирую (все отлично)
4) при запуске отчета ошибка "Возникло необработанное исключение
ExObjIfcBadVar(ExVip) поле не является ссылкой требуемого класса"

P.S. Галактика 7.12, файл Olecl.vih создал сам, скопировав со второго поста (см. выше).
Screw
Слесарь-системщик
Сообщения: 304
Зарегистрирован: 29 мар 2005, 17:49
Откуда: р.Беларусь, Унитарное предприятие "ТОП СОФТ"
Контактная информация:

Сообщение Screw »

Инициализируй переменную iOdecl1 (например, при помощи вызова GetVipRef(iOdecl1, 'Declension');). Либо вместо ссылки на obj-интерфейс oDeclension используй ссылку на vip-интерфейс Declension.
Виталий
Vlad
Постоянный обитатель
Сообщения: 101
Зарегистрирован: 29 мар 2005, 17:49
Откуда: Красноярск

Сообщение Vlad »

Большое спасибо, очень выручили.
Ответить