Отчёты
Разработка

Склонение фамилии основного контакта в отчете Word??

Добрый день! подскажите создал отчет с шаблоном в Word нужно просклонять в родительный падеж ФИО и должность руководителя. Видел есть библиотека склонения в каком то посте на Community но не знаю как сделать именно для отчета Word???

Нравится

26 комментариев

Иван, отчёт строится на основании пользовательского запроса?

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

1) Создать в таблице контактов дополнительные поля для родительного падежа ФИО и должности.
2) Перед сохранением записи (например, в обработчике dlDataOnDatasetBeforePost) заполнять эти поля, используя функцию склонения.
3) Для уже существующих записей создать действие в Terrasoft или MS SQL, заполняющее эти поля для каждого контакта, и разово его выполнить.
4) Использовать эти поля в пользовательском запросе для отчёта.

Если Вы строите отчёт с помощью другого механизма (например, полностью формируете его в своём скрипте), можно использовать функции склонения непосредственно перед записью в соответствующее поле отчёта.

Олег я тоже думал по поводу дополнительных полей. Буду делать тогда так. просто я думал можно где то в скрипте формирования отчета в Word что нибудь изменить.

Единственная проблема что всем пользователям на разных машинах придется библиотеку ставить.

Добрый день, Иван.
Ставить библиотеку каждому пользователю не так уж сложно. Помещаете ее в папку Bin, указываете ее в файле RunSettings.xml, и при регистрации библиотек данная библиотека будет так же зарегистрирована. Подробно процедура описана по ссылке выше.

А можно ли данную библиотеку каким нибудь образом прикрутить к самому MS SQL Server и в триггере или с помощью какого либо другого механизма вставлять значения в поле??

"Мещеринов Иван Александрович" написал:А можно ли данную библиотеку каким нибудь образом прикрутить к самому MS SQL Server и в триггере или с помощью какого либо другого механизма вставлять значения в поле??

погуглив http://technet.microsoft.com/ru-ru/library/ms164653.aspx
надо только библиотеку свою видимо сделать, которая обращалась бы к Padeg.dll... а потом ее и вызывать

я нашел как это сделать. уже есть готовая библиотека
вот ссылка кому может пригодиться http://www.delphikingdom.com/zip/pd_Sample.zip

Осталось придумать как сделать триггер который бы вставлял значение в зависимости от введенного ФИО и пола?

"Мещеринов Иван Александрович" написал:Осталось придумать как сделать триггер который бы вставлял значение в зависимости от введенного ФИО и пола?

Если делать доп. поле то можно и триггер на Update и Insert в tbl_Contact, или ХП, вызываемую при сохранении карточки контакта.
"Мещеринов Иван Александрович" написал:я нашел как это сделать. уже есть готовая библиотека

вот у меня пока обратиться к ней из ХП не получилось...

Можно создать триггер For Update для таблицы tbl_Contact, который будет содержать условие:

[sql]
IF UPDATE(Name) OR UPDATE(GenderID)
BEGIN
...
END
[/sql]

а внутри условия вызывать функции из библиотеки.

"Лабьяк Олег Игоревич" написал:вызывать функции из библиотеки

вот тут самое интересное:)

Я очень плохо знаком с созданием триггеров. Помогите сориентироваться
[sql]
CREATE TRIGGER UpdateNameGenetive
ON tbl_Contact
AFTER UPDATE
AS
BEGIN
SET NOCOUNT ON;
IF UPDATE(Name) OR UPDATE(GenderID)
/// здесь как то нужно получить если это Ж то 2 если М то 1
Exec [master].dbo.GetFIOPadegFS 'Значение поля ФИО', 1, 2, @res output
/// и как то присвоить занчение в новое поле
END
GO
[/sql]

данный триггер будет работать при добавлении и изменении данных? и как поправить триггер согласно комментариям??

Думаю, примерно так:

[sql]
CREATE TRIGGER UpdateNameGenetive
ON tbl_Contact
FOR UPDATE
AS
BEGIN
SET NOCOUNT ON;
IF UPDATE(Name) OR UPDATE(GenderID)
BEGIN
/// здесь как то нужно получить если это Ж то 2 если М то 1
declare @GenderNum int
declare @GenderID uniqueidentifier
declare @Name nvarchar(250)

SET @GenderID = (SELECT GenderID FROM [Inserted])
SET @Name = (SELECT Name FROM [Inserted])
IF @GenderID = '{<Здесь вставить ID для мужского пола>}' SET @GenderNum = 1
ELSE SET @GenderNum = 2
Exec [master].dbo.GetFIOPadegFS @Name, @GenderNum, 2, @res output
/// и как то присвоить занчение в новое поле
UPDATE tbl_Contact SET NameGen = @res
WHERE tbl_Contact.ID = [Inserted].[ID]
END
END
GO
[/sql]

Триггер точно будет работать при изменении данных. Думаю, для добавления можно создать такой же, только FOR INSERT и без условия IF UPDATE(...)

ругается на строку tbl_Contact.ID = [Inserted].[ID]

Сообщение 4104, уровень 16, состояние 1, процедура UpdateNameGenetive, строка 27
Не удалось привязать составной идентификатор "Inserted.ID".

Извиняюсь, попробуйте так:
[sql]
UPDATE tbl_Contact SET NameGen = @res
FROM [Inserted]
WHERE tbl_Contact.ID = [Inserted].[ID]
[/sql]

Спасибо Олег заработало. Я думаю еще нужно добавить проверку на пустые значения пола ?

Извиняюсь ошибочка вышла. триггер создался без ошибок но при обновлении записи пишет что первый параметр функции не является строкой??

Да, будет не лишней :). Либо можно обрабатывать пустой пол как мужской. Но для этого придётся заменить строки
[sql]
IF @GenderID = '{<Здесь вставить ID для мужского пола>}' SET @GenderNum = 1
ELSE SET @GenderNum = 2
[/sql]

на такие:
[sql]
IF @GenderID = '{<Здесь вставить ID для женского пола>}' SET @GenderNum = 2
ELSE SET @GenderNum = 1
[/sql]

Все разобрался. нужно за место
[sql]
declare @Name nvarchar(250)

[/sql]
написать
[sql]
declare @Name varchar(250)
[/sql]

всем спасибо:twisted:

А можно выбирать значения с присоединенной таблицы?? мне еще же нужно должность просклонять а название должности находиться в справочники tbl_Job
[sql]
SET @Name = (SELECT j.Name FROM [Inserted]
left outer join
tbl_Job as j on j.ID = [Inserted].JobID )
[/sql]

Да, Вы можете использовать любые другие таблицы системы и строить различные запросы, как обычно. Просто в триггере есть дополнительная возможность получать только что вставленные значения (из таблицы Inserted) и те, которые были до изменения (из таблицы Deleted).

Запустил триггер в рабочую базу. А нельзя ли изменить как нибудь старые значения которые уже были забиты в БД??

Можно курсором пройтись по всем записям в таблице и обновить значения в поле. Например, так:

[sql]
declare @ContactID uniqueidentifier
declare @ContactName varchar(250)
declare @GenderID uniqueidentifier
declare @GenderNum int
declare @res varchar(250)

declare c_Contact cursor for
select ID, Name, GenderID from tbl_Contact

open c_Contact
while 1 = 1
begin
fetch next from c_Contact into @ContactID, @ContactName, @GenderID
if @@fetch_status = -1 break
if @@fetch_status = -2 continue

if @GenderID = '{<Здесь вставить ID для женского пола>}' set @GenderNum = 2
else set @GenderNum = 1
Exec [master].dbo.GetFIOPadegFS @ContactName, @GenderNum, 2, @res output
update tbl_Contact set NameGen = @res
where tbl_Contact.ID = @ContactID

end
close c_Contact
deallocate c_Contact
[/sql]

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

Небольшой update темы. Данное решение не удалось запустить на Windows 2003 64 bit
Судя по странице авторов, нужно пересобирать padeg.dll и "обертку" xp_padeg.dll

[quote="Александр Кудряшов"] http://community.terrasoft.ua/developer/solutions/4800[/quote]

Обратите внимание - ссылка изменилась: http://www.community.terrasoft.ru/developer/faq/4800

Показать все комментарии