Склонение фамилии основного контакта в отчете 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, который будет содержать условие:

IF UPDATE(Name) OR UPDATE(GenderID)
BEGIN
...
END

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

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

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

Я очень плохо знаком с созданием триггеров. Помогите сориентироваться

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 

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

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

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

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

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

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

Извиняюсь, попробуйте так:

UPDATE tbl_Contact SET NameGen = @res
FROM [Inserted]
WHERE tbl_Contact.ID = [Inserted].[ID]

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

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

Да, будет не лишней :). Либо можно обрабатывать пустой пол как мужской. Но для этого придётся заменить строки

IF @GenderID = '{<Здесь вставить ID для мужского пола>}' SET @GenderNum = 1
    ELSE SET @GenderNum = 2

на такие:

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

Все разобрался. нужно за место

declare @Name nvarchar(250)

написать

declare @Name varchar(250)

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

А можно выбирать значения с присоединенной таблицы?? мне еще же нужно должность просклонять а название должности находиться в справочники tbl_Job

SET @Name = (SELECT j.Name FROM [Inserted]
             left outer join
             tbl_Job as j on j.ID = [Inserted].JobID   )

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

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

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

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

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

Небольшой 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

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