Склонение фамилии основного контакта в отчете Word??
Добрый день! подскажите создал отчет с шаблоном в Word нужно просклонять в родительный падеж ФИО и должность руководителя. Видел есть библиотека склонения в каком то посте на Community но не знаю как сделать именно для отчета Word???
Нравится
Иван, отчёт строится на основании пользовательского запроса?
Если да, в таком случае можно поступить так, например:
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