Привет коллеги!
 
Иногда требуется отловить плавающий кейс в работе процесса или "отладить" процесс без использования VisualStudio. Большинство проблем можно решить с помощью трассировки процесса. Но если проблема в коде написанном в скриптаске или методах процесса, то самый простой способ - это добавить логирование.

Для этого необходимо:
1) в Using добавить

global::Common.Logging

2) в коде использовать

var _log = LogManager.GetLogger("BusinessProcess");
var processName = "MyProcess"; //Название процесса для простого поиска логов
_log.DebugFormat(@"{0}: Process was started", processName); //Уровень логирования Debug
_log.InfoFormat(@"{0}: Process was started", processName); //Уровень логирования Info
_log.WarnFormat(@"{0}: Process was started", processName); //Уровень логирования Warn
_log.ErrorFormat(@"{0}: Process was started", processName); //Уровень логирования Error

Если сайт развернут в облаке (cloud), то логи можно получить обратившись в техническую поддержку.
Если же сайт размещен на своих серверах (on-site), то логи необходимо искать по пути C:\Windows\TEMP\Creatio\SiteName\0\Log (этот путь может быть изменен в файле nlog.targets.config, параметр LogDir).

Для уровня логирования Debug и Info логи запишутся в файл Common.log, а для уровня Error - в файл Error.log
По умолчанию минимальный уровень логирования в on-site для логера "Common" указан Info. Изменить его можно в файле ..\Terrasoft.WebApp\nlog.config

<logger name="*" writeTo="commonAppender" minlevel="Info" maxlevel="Warn" />

 

Нравится

Поделиться

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

Добрый день!

Данные:
клиент версии 3.3.2.275
база ms sql 2005

Задачи
1. Удалить все письма (всех пользователей) из БД.
2. Удалить логи.
3. Уменьшить размер БД другими способами – если есть какой-то способ (кроме шринка).

По первой задаче - В тестовой базе скл запросом удалили данные в таблицах dbo.tbl_MailMessage, dbo.tbl_MailMessageLog, dbo.tbl_MailMessageRight – но на сколько это правильно вопрос…
По второй задаче - если поступить также скл запросом - вопрос какие таблицы чистить?

Есть варианты правильного решения указанных задач (может штатные средства террасофт)?

Нравится

5 комментариев
Лучший ответ

Насколько я помню, то готовых утилит для очистки писем и логов в 3-ке не было. Решение только написание своих скриптов.

Чтобы понять в какой таблице хранятся логи, запустите sql-профайлер, перейдите на вкладку с логами в 3-ке и посмотрите в sql-профайлере, в какую таблицу пойдет запрос.

Ещё для уменьшения размера БД можно очистить таблицу процессов и их элементов (если процессы использовались).

Также можно посмотреть, что содержится в таблице История и удалить лишнее.

В любом случае нужно понимать, что, если с базой данных активно работают пользователи, то её размер будет расти.

Насколько я помню, то готовых утилит для очистки писем и логов в 3-ке не было. Решение только написание своих скриптов.

Чтобы понять в какой таблице хранятся логи, запустите sql-профайлер, перейдите на вкладку с логами в 3-ке и посмотрите в sql-профайлере, в какую таблицу пойдет запрос.

Ещё для уменьшения размера БД можно очистить таблицу процессов и их элементов (если процессы использовались).

Также можно посмотреть, что содержится в таблице История и удалить лишнее.

В любом случае нужно понимать, что, если с базой данных активно работают пользователи, то её размер будет расти.

При удалении записей таблицу прав отдельно чистить не нужно, там каскадная связь и записи о правах удалятся вслед за записями основной таблицы сами.

Логи в других разделах устроены аналогично, плюс tbl_DatabaseLog для записей самого раздела логов.

Кроме почты и логов, много места могут занимать таблицы файлов каждого раздела.

Вообще, для быстрого поиска, куда делось место, можно воспользоваться стандартным отчётом «Disk Usage by Top Tables» в Management Studio:

 

Алла Савельева 

 Спасибо,   sql-профайлер посмотрю 

Зверев Александр пишет:
При удалении записей таблицу прав отдельно чистить не нужно, там каскадная связь и записи о правах удалятся вслед за записями основной таблицы сами.

Т.е.  если SQL запросом удаляю только dbo.tbl_MailMessage,  то dbo.tbl_MailMessageRight очистится сама?
Не понимаю как это работает... на уровне запуска клиента под супервизором запускается какой-то скрипт?

«Disk Usage by Top Tables»  так и нашел dbo.tbl_MailMessage

В TSAdmin у связи в таблице прав стоит галка «каскадная связь». На уровне базы удаление в связанных таблицах работает при помощи триггера tr_tbl_MailMessage_ID и аналогичных для каждого раздела.

Зверев Александр,

Ясно , спасибо

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

Коллеги, всем доброго времени суток!

В мобильном приложении необходимо логировать некоторые данные. В приложении есть свой логгер -  http://prntscr.com/noti8j
Подскажите где смотреть логи если назначение будет Terrasoft.LogDestination.Analytics?

 

Нравится

2 комментария

Логи Terrasoft.LogDestination.Analytics не предназначены для просмотра пользователем. Можно посмотреть только Terrasoft.LogDestination.File, сформировав письмо с отчётом для отправки.

 

Зверев Александр,

 Благодарю.

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

Добрый день, коллеги!

Установлен bpm'online на сервере 2012 R2, в папке temp нет папки BPMonline. Вопрос - куда пишутся логи и пишутся ли они?

Нравится

2 комментария

Добрый день! По умолчанию путь для Log-файлов следующий:

C:\Windows\Temp\BPMonline\site x, где x - номер сайта в iis.

Обращаю Ваше внимание, что папка [Temp], находится в папке [Windows].

Также можете проверить, включено ли логирование в файле log4net.config в папке приложения. 

Большое спасибо!

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

Приветсвую!
Есть ли в системе штатная возможность логировать операцию слияния дублей?

Нравится

1 комментарий

Добрый день!

К сожалению, в функционал системы не включена функция логирования слияния дублей.
Это можно реализовать только средствами дополнительной разработки.

С уважением, Анна

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

Добрый день.

Нужно изменить вид журнала изменений.
В кратце - добавить, удалить некоторые поля, которых нет в оригинальной таблице.

Ознакомился с логикой работы журнала: http://www.community.terrasoft.ua/forum/topic/2345
Создание триггеров я еще могу изменить,
однако есть вопросы по работе приложения:
Цытата п.2:
"При сохранении такой таблицы создается специальная таблица tbl_MyTableLog, в которой создаются все поля основной таблицы..."

А если Мне нужно другую структуру. Создание таблицы tbl_MyTableLog делается в конфигурации или на уровне ядра?. Как это обойти?

Нравится

3 комментария

Здравствуйте Руслан,
Создание таблицы tbl_XXXLog происходит средствами ядра при установке галочки
1
и последующего сохранении таблицы, по сути отрабатывает хранимая процедура tsp_TableTrigger которая по сути пересоздает триггера и таблицы логирования

Подобная тема обсуждалась в http://www.community.terrasoft.ru/forum/topic/5602

Также опишите более подробно Вашу задачу.
Простым решением будет редактирование триггеров таблицы, таким образом что бы Вы писали изменения в выделенную таблицу необходимые строки после чего подменить сервис tbl_XXXLog на вашу таблицу. Но тут возникнут проблеммы если таблицу пересохранить.

Спасибо Алексей.

Все дело в том что средствами ядра практически создается копия логгируемой таблицы. Так?

У меня задача использовать свои поля, с другими названиями, которые будут содержать другие данные.
Триггеры же мне дадут возможность управлять данными. но не механизмом создания таблиц.
Можно конечно создать структуру таблицы tbl_XXXLog как мне нужно, но ведь она при первом же изменении чек боксов - пересохраниться.

Руслан, в частном случае вы можете решить задачу написав исключения в хранимых процедурах tsp_CreateDeleteTrigger,tsp_CreateUpdateTrigger так что бы в случае этой таблицы таблица tbl_XXXLog не пересоздавалась, это можно сделать дописав в тело хранимых процедур проверки вида :

  if (@Table = 'tbl_Account')
  begin
    return
  end
Показать все комментарии

Здравствуйте!
Помогите советом, пожалуйста.

Я добавила логирование для детали Файл в разделе Проекты.
В грид логирования Файлов попросили добавить одно из полей Проекта, стадию.
Я думаю, правильно это было бы сделать добавив новое поле в таблицу логирования и при добавлении файла писать туда текущее значение стадии.
Но т.к у датасет детали Файл - ds_FileInItem не срабатывают события на изменение и добавление, то сделать этого не могу.

можно как-нибудь реализовать этот функционал?

Просто добавить поле джоином не подходит, т.к при этом получается не историрование.

Создавала тему с похожим вопросом http://www.community.terrasoft.ua/forum/topic/7318,
но там решили проблему другим способом

Нравится

3 комментария

Светлана,

Мне кажется логически правильно добавить столбец "Стадия" в таблицу файлов, сделать ее вычисляемым полем (не уверен, если это можно сделать на уровне БД в Террасофт или придется делать ее заполнение на уровне приложения), ну и собственно все. В логах будут видны стадии проекта.

P.S.
Возможно изменять таблицу логов вручную как-то не совсем хорошо... возможно, при изменении основной таблицы (файлы) таблица логов будет перестроена автоматически.

Да, так можно было бы сделать, если бы это была обычная деталь. А у файлов в детали есть только таблица и инсерт.
А датасет используется общий для всех деталей файлов ds_FilesInItem.
Добавить столбец стадия можно в таблицу детали файлов, но вот писать туда не получается т.к на изменения датасет ds_FilesInItem не выходит по событиям...
Выходит только в самом ds_Files, но в файлах мне неоткуда взять Стадию. Т.к с разделом Проекты файлы не связаны. Связывается же только деталь.

"komgbu" написал:

Светлана,

Мне кажется логически правильно добавить столбец "Стадия" в таблицу файлов, сделать ее вычисляемым полем (не уверен, если это можно сделать на уровне БД в Террасофт или придется делать ее заполнение на уровне приложения), ну и собственно все. В логах будут видны стадии проекта.

P.S.
Возможно изменять таблицу логов вручную как-то не совсем хорошо... возможно, при изменении основной таблицы (файлы) таблица логов будет перестроена автоматически.

Здравствуйте Светлана,
Я понимаю, что вы хотите добавить название стадии, если в проекте такой элемент есть. Для решения предлагаю вам создать триггер на таблицу легирования файлов, и на событие Insert, записывать Имя стадии в дополнительную колонку (т.е написать select Name from tbl_Project where EssenceType = 'Stage' and ProjectID = '...' ), после чего вынести ее в sq грида

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

Здравствуйте!

Понадобилось добавить логирование для детали Файлы.
Включила логирование для нужной таблицы. В деталь Файлы рядом добавила еще грид, который отображает историю.
Проблема обнаружилась вот в чем:
В таблице логирования есть поле ActionID(строка), которое содержит записи вида D и U.
D - добавление, U - изменение и удаление.
Но мне нужно изменение и удаление все-таки различать.
Это можно сделать как-то стандартными средствами?

У нас уже есть подобная реализация для другой детали, там у поля ActionID стоит тип уникального идентификатора.
Для него заведен enm.
Далее, в датасет детали ловятся события добавление\удаление\изменение и в датасет лога, в поле ActionID записывается нужное значение enm. Проблема решена.

Я пыталась поступить точно так же, но у датасет детали Файл - ds_FileInItem не срабатывают события на изменение и добавление. Только на удаление.
Я предполагаю, что это из-за того, что значения вставляются отдельным инсертом.

Подскажите, пожалуйста, что тут можно сделать?

Нравится

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

Может update для tbl_Files решит вопрос ? :wink:
Какая версия исполняемых файлов на Вашей машине?

Версия 3.3.2.47
Terrasoft Sales

Игорь, а что вы имеете ввиду под апдейтом tbl_Files?
Поле ActionID хранится только в таблицах логов и содержимое там стандартное, на сколько я понимаю.

Светлана,

Дело в том, что есть бага в хранимой процедуре, которая генерирует триггера к таблицам.
Мы об этой проблеме сообщали команде, которая внедряла нам Террасофт (из самого Террасофта).

Действительно, по-идее должно быть следующее:
I - вставка (Insert)
U - обновление (Update)
D - удаление (Delete)

Есть:
D - вставка
U - обновление
D - удаление

komgbu,

а вам эту багу еще не исправили?

Светлана,

Нет, не исправили, у нас много других более критичных проблем, помимо этой :)
Я думаю стоит подождать, пока ответят разработчики из Террасофт в этой ветке.

Здравствуйте,
В хранимой процедуре tsp_TableTrigger поменяйте строчку 306

 '    ,''D'' as [ActionID]' + @NL + 

на

 '    ,''I'' as [ActionID]' + @NL + 

и пересохраните таблицу, что бы пересоздались тригерра.

Проверял на tbl_ContactLog, все работает корректно
1
В итоге хранимая процедура будет иметь вид:

--USE [XRMDistri_Demo_RUS_3_3_2_172]
GO
/****** Object:  StoredProcedure [dbo].[tsp_TableTrigger]    Script Date: 12/12/2011 10:40:06 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER procedure [dbo].[tsp_TableTrigger]
  @ATableName sysname,
  @TrackFieldsInfo varchar(8000),
  @TrackFieldsInfoForDelete varchar(8000),
  @ATrackChangesEnabled int = 1,
  @AClosingPeriodEnabled int = 0,
  @ADBSchema sysname = 'dbo'
as
begin
  set nocount on
------------------- declare -------------------------
 
  declare @SchemaTableName sysname
  declare @TableName sysname
  declare @TableLogName sysname
  declare @ShortTableName sysname
  declare @InteadOfInsertTriggerName sysname
  declare @UpdateTriggerName sysname
  declare @DeleteTriggerName sysname
  declare @UpdateTriggerNameOld sysname
  declare @DeleteTriggerNameOld sysname
  declare @NL sysname
  declare @Column varchar(150)
  declare @LookupColumn varchar(150)
  declare @Line int
  declare @CheckReplication varchar(250)
  declare @DisplayColumn varchar(33)
  declare @SchemaJoinTable varchar(70)
  declare @JoinTable varchar(33)
  declare @JoinField varchar(33)
  declare @DBName sysname  
  declare @RecordTitle varchar(40)
  declare @TableID varchar(36)
  declare @Comma varchar(10)
  declare @Version int
  declare @Trigger2005 varchar(8000)
  declare @DatabaseLogBegin varchar(1000)
  declare @ContactID varchar(1000)
  declare @InsertTableLogBegin varchar(1000)
  declare @DBErrorMessageBegin nvarchar(10)
  declare @DBErrorMessageEnd nvarchar(10)
  declare @IsAdministratedByRecords varchar(10)
 
---------------- clear old triggers -----------------
 
  set @IsAdministratedByRecords = 
    (select Upper(p.Value) from tbl_Service s left outer join tbl_ServiceProperty p on s.id = p.ServiceID
      where s.Code = @ATableName and p.Name = 'IsAdministratedByRecords');
 
  set @TableName = '[' + @ATableName + ']'  
  set @InteadOfInsertTriggerName = '[' + @ADBSchema + '].[tr_' + @ATableName + '_II]'
  set @UpdateTriggerName = '[' + @ADBSchema + '].[tr_' + @ATableName + '_IU]'
  set @DeleteTriggerName = '[' + @ADBSchema + '].[tr_' + @ATableName + '_ID]'
 
  if (not object_id(@InteadOfInsertTriggerName, 'TR') is null)
  begin
    exec('DROP TRIGGER ' + @InteadOfInsertTriggerName)
  end  
  if (not object_id(@UpdateTriggerName, 'TR') is null)
  begin
    exec('DROP TRIGGER ' + @UpdateTriggerName)
  end
  if (not object_id(@DeleteTriggerName, 'TR') is null)
  begin
    exec('DROP TRIGGER ' + @DeleteTriggerName)
  end  
 
  if ((not isnull(@ATrackChangesEnabled, 0) = 1) and 
	(not isnull(@AClosingPeriodEnabled, 0) = 1))
  begin
    exec tsp_CreateDeleteTrigger 
      @Table = @ATableName,
      @IsTrackChanges = 0,
	    @UseClosingPeriod = 0
    return
  end
---------------- initialization ---------------------
 
  set @SchemaTableName = '[' + @ADBSchema + '].' + @TableName  
  set @TableLogName = '[' + @ADBSchema + '].[' + @ATableName + 'Log]'  
  set @ShortTableName = replace(@ATableName, 'tbl_', '')
 
  set @DBName = db_name()
  set @NL = char(13) + char(10)
  set @CheckReplication = 
    '  IF (SYSTEM_USER = ''TS_REPLICATION'') RETURN ' + @NL
  set @TableID = (
    select top 1 [ID] from [tbl_Service] [S]
    where [S].[Code] = @ATableName)
 
  if (@TableID is null) 
  begin
    RAISERROR ('Can''t track changes for new table', 16, 1)
    return
  end
 
  if (@AClosingPeriodEnabled = 1)
  begin
    set @DBErrorMessageBegin = '<#'
    set @DBErrorMessageEnd = '#>'
 
    declare @QuerySQLText nvarchar(4000)
    declare @ClosedPeriodMessage nvarchar(270)
    select
          @ClosedPeriodMessage = replace(@DBErrorMessageBegin + 
						[ClosedPeriodMessage] + @DBErrorMessageEnd, '%', '%%')
    from [tbl_PreventEditing] where [RootTableID] = @TableID     
    set @QuerySQLText = [dbo].[fn_GetClosingPeriodCheckSQL](@TableID)    
 
    declare @UpdateCheckSQLText nvarchar(4000)
    set @UpdateCheckSQLText = @QuerySQLText    
  end 
 
  create table #Trigger ( 
    [Line] int not null identity(1, 1), 
    [Trigger_Text] nvarchar(4000)
  )
 
  create table #TrackFields ( 
    [Line] int not null identity(1, 1), 
    [TrackField] varchar(8000)
  )
 
  insert into #TrackFields ([TrackField])
  select [Part] from [fn_ParseString](@TrackFieldsInfo, ';')
  order by [Line]
 
  set @RecordTitle = ''''''
  set @Line = (select top 1 [Line] from #TrackFields)
  select @Column = [TrackField] from #TrackFields where [Line] = @Line
  if ((@Column is not null) and (@Column <> '') and (@Column <> '...'))  
     set @RecordTitle = '[D].[' + @Column + ']'
  delete from #TrackFields where [Line] = @Line  
 
  set @Version = @@microsoftversion /0x01000000
 
  if (@Version > 8)   
  begin
    set @Trigger2005 =
	    'declare @TriggerText nvarchar(max) ' + @NL + 
	    'set @TriggerText = '''' ' + @NL + 
      'declare @TriggerRec nvarchar(max) ' + @NL +
      'set @TriggerRec = '''' ' + @NL +
      'declare [c] cursor for ' + @NL +
      '  select [Trigger_Text] from #Trigger order by [Line] ' + @NL +
      'open [c] ' + @NL +
      'while (1 = 1) ' + @NL +
      'begin ' + @NL +
      '  fetch next from [c] into @TriggerRec ' + @NL +
      '  if @@fetch_status = -1 break ' + @NL +
      '  if @@fetch_status = -2 continue   ' + @NL +
      '  set @TriggerText = @TriggerText + @TriggerRec ' + @NL +
      'end ' + @NL +
      'close [c] ' + @NL +
      'deallocate [c] ' + @NL +
      'exec (@TriggerText)' 
  end
 
  set @ContactID = @NL +  
    '  declare @ContactID uniqueidentifier' + @NL +
    '  declare @UserIsAdmin int' + @NL +
    '  select @ContactID = au.UserContactID, ' + @NL +
    '         @UserIsAdmin = au.UserIsAdmin ' + @NL +
    '    from tbl_AdminUnit au' + @NL +
    '  where au.SQLObjectName = system_user' + @NL + @NL
 
  set @DatabaseLogBegin =
    '  insert into [tbl_DatabaseLog]' + ' (' + @NL + 
    '    [TableID]' + @NL +
    '    ,[RecordID]' + @NL +
    '    ,[RecordTitle]' + @NL +
    '    ,[ActionID]' + @NL +
    '    ,[CreatedOn]' + @NL +
    '    ,[CreatedByID]' + @NL +
    '  ) ' + @NL
 
------------ instead of update ----------------------
 
  declare @AdministratedByRecords varchar(10)
  set @AdministratedByRecords = 
    (select Upper(p.Value) from tbl_Service s left outer join tbl_ServiceProperty p on s.id = p.ServiceID
      where s.Code = @ATableName and p.Value = 'True'
        and p.Name = 'IsAdministratedByRecords')
 
  exec tsp_CreateUpdateTrigger
    @ADBSchema = @ADBSchema,
    @ATableName = @ATableName,
    @IsTable = 1,
    @AClosingPeriodEnabled = @AClosingPeriodEnabled,
    @AdministratedByRecords = @AdministratedByRecords,
    @ATrackChangesEnabled = @ATrackChangesEnabled,
    @TableLogName = @TableLogName,
    @TrackFieldsInfo = @TrackFieldsInfo,
    @TrackFieldsInfoForDelete = @TrackFieldsInfoForDelete
  if (@AdministratedByRecords = 'TRUE')
  begin
    exec tsp_CreateUpdateTrigger
      @ADBSchema = @ADBSchema,
      @ATableName = @ATableName,
      @IsTable = 0,
      @AClosingPeriodEnabled = @AClosingPeriodEnabled,
      @AdministratedByRecords = @AdministratedByRecords,
      @ATrackChangesEnabled = @ATrackChangesEnabled,
      @TableLogName = @TableLogName,
      @TrackFieldsInfo = @TrackFieldsInfo,
      @TrackFieldsInfoForDelete = @TrackFieldsInfoForDelete
  end
 
------------ instead of delete ----------------------
 
  exec tsp_CreateDeleteTrigger 
    @Table = @ATableName,
    @IsTrackChanges = @ATrackChangesEnabled,
	  @UseClosingPeriod = @AClosingPeriodEnabled,
    @RecordTitle = @RecordTitle,
    @DBSchema = @ADBSchema
 
------------ instead of insert ----------------------
if ((@AClosingPeriodEnabled = 1) or (@ATrackChangesEnabled = 1))
begin
  delete from #Trigger
  insert into #Trigger ([Trigger_Text]) select  
    'create trigger ' + @InteadOfInsertTriggerName + ' on ' + @SchemaTableName + @NL +
    'instead of insert' + @NL + 
    'as' + @NL + 
    '  set nocount on' + @NL 
 
  if (@AClosingPeriodEnabled = 1)
  begin
    declare @InsertCheckSQLText nvarchar(4000)
    set @InsertCheckSQLText = @QuerySQLText    
    set @InsertCheckSQLText = replace(@InsertCheckSQLText, @SchemaTableName, '[inserted]')
    insert into #Trigger ([Trigger_Text]) select @NL +
      '  declare @DenyRecordsCount int ' + @NL +
      '  set @DenyRecordsCount = 0 ' + @NL + 
      '  SELECT ' + @NL +
      '      @DenyRecordsCount = count(*) ' + @NL + @InsertCheckSQLText + @NL + @NL +
      '  if (@DenyRecordsCount > 0) ' + @NL +
      '  begin ' + @NL +
      '    RAISERROR(''' + isnull(@ClosedPeriodMessage, '') + ''', 16, 1) ' + @NL +
      '    return ' + @NL +
      '  end ' + @NL
  end
 
  insert into #Trigger ([Trigger_Text]) select @NL +
    '  insert into ' + @SchemaTableName + ' select * from [inserted]'
 
  if (@ATrackChangesEnabled = 1)
  begin
    insert into #Trigger ([Trigger_Text]) select @NL + 
      @ContactID +
      '  insert into ' + @TableLogName + ' (' + @NL +
      '    [RecordID]' + @NL +
      '    ,[ActionID]' + @NL +
      '    ,[CreatedOn]' + @NL +
      '    ,[CreatedByID]'    
 
    delete from #TrackFields
    insert into #TrackFields ([TrackField])
    select [Part] from [fn_ParseString](@TrackFieldsInfoForDelete, ';')  
    order by [Line]
 
    declare [c1] cursor for
      select [TrackField] from #TrackFields
      order by 1
 
    open [c1]
    while (1 = 1)
    begin    
      fetch next from [c1] into @Column
      if @@fetch_status = -1 break
      if @@fetch_status = -2 continue
 
      if (patindex('%,%', @Column) > 0) 
      begin 
        declare [c2] cursor for
        select [Part] from [fn_ParseString](@Column, ',')
        order by [Line]
 
        open [c2]
        fetch next from [c2] into @Column
        fetch next from [c2] into @DisplayColumn
        close [c2]
        deallocate [c2]
 
        insert into #Trigger ([Trigger_Text])
        select @NL + '    ,[' + @DisplayColumn + ']'
      end
      insert into #Trigger ([Trigger_Text])
      select @NL + '    ,[' + @Column + ']'
    end
    close [c1]
    deallocate [c1]
 
    insert into #Trigger ([Trigger_Text]) select @NL + 
      '  ) ' + @NL + 
      '  select' + @NL + 
      '    [D].[ID] as [RecordID]' + @NL +
      '    ,''I'' as [ActionID]' + @NL + 
      '    ,getdate() as [CreatedOn]' + @NL +
      '    ,[D].[ModifiedByID] as [CreatedByID]'
 
    declare [c1] cursor for
      select [TrackField] from #TrackFields
      order by 1
 
    open [c1]
    while (1 = 1)
    begin
      fetch next from [c1] into @Column
      if @@fetch_status = -1 break
      if @@fetch_status = -2 continue
      if (patindex('%,%', @Column) > 0) 
      begin      
        declare [c2] cursor for
        select [Part] from [fn_ParseString](@Column, ',')
        order by [Line]
 
        open [c2]
        fetch next from [c2] into @Column
        fetch next from [c2] into @DisplayColumn
        fetch next from [c2] into @JoinTable
        fetch next from [c2] into @JoinField
 
        set @DisplayColumn = '[' + @DisplayColumn + ']'
        set @JoinTable = '[' + @JoinTable + ']'
        set @SchemaJoinTable = '[' + @ADBSchema + '].' + @JoinTable
        set @JoinField = '[' + @JoinField + ']'
 
        close [c2]
        deallocate [c2]
 
        insert into #Trigger ([Trigger_Text]) select @NL +
          '   ,(select ' + @JoinTable + '.' + @JoinField + @NL +
          '      from ' + @SchemaJoinTable + ' as ' + @JoinTable + @NL +
          '      where  ' + @JoinTable + '.[ID] = [D].[' + @Column + '])' + @NL + 
          '    as ' + @DisplayColumn
      end 
 
      insert into #Trigger ([Trigger_Text])
      select @NL + '    ,[D].[' + @Column + '] as [' + @Column + ']'
    end
    close [c1]
    deallocate [c1]
 
    insert into #Trigger ([Trigger_Text]) select @NL + 
      '  from [INSERTED] AS [D] ' + @NL
 
    insert into #Trigger ([Trigger_Text]) select @NL + 
      @DatabaseLogBegin +
      '  select' + @NL + 
      '    ''' + @TableID + ''' as [TableID]' + @NL + 
      '    ,[D].[ID] as [RecordID]' + @NL + 
      '    ,' + @RecordTitle + ' as [RecordTitle]' + @NL + 
      '    ,''I'' as [ActionID]' + @NL + 
      '    ,getdate() as [CreatedOn]' + @NL +
      '    ,@ContactID as [CreatedByID]' + @NL +    
      '  from [INSERTED] AS [D]' 
  end
 
  if (@Version = 8)
    exec master.dbo.xp_execresultset 'select [Trigger_Text] from #Trigger order by [line]', @DBName
  else
    exec (@Trigger2005)
end
end
drop table #TrackFields
drop table #Trigger

Алексей, все получилось, спасибо! :)

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

В последнее время активировалась тема по логированию действий пользователей в системе Terrasoft. Оригинальный пост и идея о востребованности внутреннего логирования действий в Terrasoft.

В связи с этим, решил написать об одном из способов частично закрыть функционал логирования действий в Terrasoft и не только в нем. Этот способ - использование программы ManicTime. Не буду делать обзор программы - просто скажу что программа фиксирует вашу деятельность на компьютере в разрезе активных приложений и открытых
в них документах (для браузеров - вкладок), а также фиксирует все заголовки окон с которыми велась работа в приложении. Конечно, все это фиксируется с датами начала и завершения активности.

Очень радует возможность выгрузить лог своей работы за компьютером в формате cvs. Можно даже выполнить загрузку значений в раздел Задачи с отдельным типом и сравнить плановые занятия с фактическими.

В последнем релизе платной версии ManicTime появилась интеграция с задачами Outlook и Google Calendar, что тоже дает возможность наглядно сравнить фактическую деятельность и запланированные задачи.

Сам я использую ManicTime не так давно и, в принципе, программой доволен. Чего не могу сказать о статистике, которую она показывает :)

Нравится

Поделиться

1 комментарий

Суть указанных постов и заключается в том, что хотелось бы избежать использования стороннего ПО и каких-либо кустарных методов, а иметь инструмент в Terrasoft и только касательно работы в Terasoft.

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

Видеозапись работы утилиты.

Работает логирования переписки по другим протоколам, которые поддерживает Pidgin(AIM, Bounjour, Gadu-Gadu, Group Wise, IRC, MSN, MXit, MySpaceIM, SILC, Simple, SameTime, XMPP, Yahoo).

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

Нравится

Поделиться

4 комментария

прикольно )))) :twisted:

Да, впечатлило. Сергей, думаю это легко можно оформлять в виде расширения

Спасибо за отзывы.

"Карло Сергей" написал: Сергей, думаю это легко можно оформлять в виде расширения

Ок. Будем двигаться в этом направлении.

Сергей, как "поживает" это расширение? На каких условиях можно его получить или купить?

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