0
Голосовать

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

Создано:
Метки записи:

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

Комментарии

Александр Кудряшов
Лабьяк Олег Игоревич

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

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

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

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

С уважением,

Олег Лабьяк,
инженер-программист,
группа компаний Terrasoft.

Мещеринов Иван Александрович

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

Конфигурация:
TSCRM 3.3.1.67
Microsoft SQL Server 2008 R2 (v.10.50.1600.1)
ClientOS: Windows XP
ServerOS: Windows 2008 Server

Мещеринов Иван Александрович

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

Конфигурация:
TSCRM 3.3.1.67
Microsoft SQL Server 2008 R2 (v.10.50.1600.1)
ClientOS: Windows XP
ServerOS: Windows 2008 Server

Гамора Дмитрий

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

Мещеринов Иван Александрович

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

Конфигурация:
TSCRM 3.3.1.67
Microsoft SQL Server 2008 R2 (v.10.50.1600.1)
ClientOS: Windows XP
ServerOS: Windows 2008 Server

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

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

Мещеринов Иван Александрович

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

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

Конфигурация:
TSCRM 3.3.1.67
Microsoft SQL Server 2008 R2 (v.10.50.1600.1)
ClientOS: Windows XP
ServerOS: Windows 2008 Server

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

Если делать доп. поле то можно и триггер на Update и Insert в tbl_Contact, или ХП, вызываемую при сохранении карточки контакта.

Мещеринов Иван Александрович пишет:
я нашел как это сделать. уже есть готовая библиотека

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

Лабьяк Олег Игоревич

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

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

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

С уважением,

Олег Лабьяк,
инженер-программист,
группа компаний Terrasoft.

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

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

Мещеринов Иван Александрович

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

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

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

Конфигурация:
TSCRM 3.3.1.67
Microsoft SQL Server 2008 R2 (v.10.50.1600.1)
ClientOS: Windows XP
ServerOS: Windows 2008 Server

Лабьяк Олег Игоревич

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

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(...)

С уважением,

Олег Лабьяк,
инженер-программист,
группа компаний Terrasoft.

Мещеринов Иван Александрович

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

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

Конфигурация:
TSCRM 3.3.1.67
Microsoft SQL Server 2008 R2 (v.10.50.1600.1)
ClientOS: Windows XP
ServerOS: Windows 2008 Server

Лабьяк Олег Игоревич

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

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

С уважением,

Олег Лабьяк,
инженер-программист,
группа компаний Terrasoft.

Мещеринов Иван Александрович

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

Конфигурация:
TSCRM 3.3.1.67
Microsoft SQL Server 2008 R2 (v.10.50.1600.1)
ClientOS: Windows XP
ServerOS: Windows 2008 Server

Мещеринов Иван Александрович

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

Конфигурация:
TSCRM 3.3.1.67
Microsoft SQL Server 2008 R2 (v.10.50.1600.1)
ClientOS: Windows XP
ServerOS: Windows 2008 Server

Лабьяк Олег Игоревич

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

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

на такие:

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

С уважением,

Олег Лабьяк,
инженер-программист,
группа компаний Terrasoft.

Мещеринов Иван Александрович

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

declare @Name nvarchar(250)

написать
declare @Name varchar(250)

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

Конфигурация:
TSCRM 3.3.1.67
Microsoft SQL Server 2008 R2 (v.10.50.1600.1)
ClientOS: Windows XP
ServerOS: Windows 2008 Server

Мещеринов Иван Александрович

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

SET @Name = (SELECT j.Name FROM [Inserted]
             LEFT OUTER JOIN
             tbl_Job AS j ON j.ID = [Inserted].JobID   )

Конфигурация:
TSCRM 3.3.1.67
Microsoft SQL Server 2008 R2 (v.10.50.1600.1)
ClientOS: Windows XP
ServerOS: Windows 2008 Server

Лабьяк Олег Игоревич

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

С уважением,

Олег Лабьяк,
инженер-программист,
группа компаний Terrasoft.

Мещеринов Иван Александрович

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

Конфигурация:
TSCRM 3.3.1.67
Microsoft SQL Server 2008 R2 (v.10.50.1600.1)
ClientOS: Windows XP
ServerOS: Windows 2008 Server

Лабьяк Олег Игоревич

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

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

С уважением,

Олег Лабьяк,
инженер-программист,
группа компаний Terrasoft.

Мещеринов Иван Александрович

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

Конфигурация:
TSCRM 3.3.1.67
Microsoft SQL Server 2008 R2 (v.10.50.1600.1)
ClientOS: Windows XP
ServerOS: Windows 2008 Server

Александр Кудряшов

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

Alimova Anna
Александр Кудряшов пишет:
http://community.terrasoft.ua/developer/solutions/4800

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

С уважением, Анна Алимова
Специалист II линии технической поддержки Terrasoft