Вопрос

Добрый день!

Данные:
клиент версии 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:

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

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

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

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

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

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

Добрый день!
Сегодня поговорим немного о функциональности, которую я и Евгений Генов недавно реализовали и которую уже несколько раз запрашивали клиенты. Это логирование (журналирование) действий пользователей.
 
Очень часто руководителю компании или CRM-координатору хочется знать, насколько активны пользователи при работе с CRM-системой, что конкретно они делают и работают ли они в ней вообще. Более того, некоторые даже хотят строить на основе подобной активности сотрудников мотивационные схемы, формирование заработной платы, бонусов и т.д. Для этих целей и была реализована некая функциональность, которая отслеживает большинство операций (манипуляций) пользователя и пишет это все в специальную таблицу. 
 
Теперь о самой утилите. Вот так выглядит окно логирования действий.

 
Как Вы видите, все довольно-таки просто: в верхней части фильтрация по периоду и пользователю, которого Вы мониторите. 
Поскольку сама утилита предназначена в основном ответственному лицу, занимающимся подобным мониторингом и скорее всего будет доступна только пользователю с административными правами, то мы вынесли возможность удаления записей из этого журнала, о чем свидетельствует наличие кнопки "Удалить"
 
Теперь о настройке. Вот так выглядит окно настроек.

Как видно из скриншота, под настройкой понимается следующее: какие действия конкретного пользователя система должна отслеживать.

На данный момент доступны следующие действия: переходы по разделам, переходы по деталям, запуски действий, отчетов, открытия наборов данных, открытия карточек редактирования и, на мой взгляд, самое интересное - изменение записей, т.е. регистрируются все внесения изменений, производимые пользователем.

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

Поделиться

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

Очень интересно!
Скажите, функционал войдет в базовую версию или будет распространятся как утилита?
Если как утилита, то каким образом можно получить\купить функционал?

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

Такая функциональность очень полезна для мотивации персонала при внедрении системы и при аудите использования ПО. Также есть смысл для аналитики определенных действий пользователя при отладке. В принципе этот функционал с определенной фильтрацией можно заложить для формирования БП, но с условием, что пользователь действительно занят работ в системе, а не просто нажимает кнопки, и при условии, что он не начинающий пользователь.
Также была бы полезна фильтрация/поиск в действиях по значениям.
В качестве развития этой утилиты предлагаю в отдельное окно вынести пользователей, к-е на текущий момент активны в системе и период их активности. Эта информация используется в системах документооборота (БП визирования документов), а так же при мотивации персонала, особенно на этапе внедрения нового ПО, когда важно сотрудников приучить к тому, что по приходу на работу они должны запускать Terrasoft CRM.

Вы знаете, у меня сразу возникает вопрос а не будет ли система перегружена? Ведь на каждое действие пользователя формируется запись в таблице, обрабатывается какой то скрипт или триггер.. Как это скажется на скорости? И если таких пользователей много, то со временем база данных вырастет в разы.

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

"S.Kalishenko" написал:Пока что значительных "тормозов" замечено не было.

Попробуйте протестировать на веб-сервисах и больше 10 пользователей. Интересно узнать результат.

--
www.it-sfera.com.ua

Как вариант расширения функциональности данной утилиты - возможность возврата к некоторым типовым действиям: редактировал запись - возможность вернуться к ней (карточке или выделение ее в реестре нужного раздела быстрым фильтром) и т.д;-)

Было бы хорошо видеть не только конкретные действия пользователей, но и общие показатели в виде отчетов и графиков. Например: общее время работы в системе за день, общее время по разделам, можно отслеживать в какие часы пользователь сидит в системе и т.п.

"Александр Кудряшов" написал:Как вариант расширения функциональности данной утилиты - возможность возврата к некоторым типовым действиям: редактировал запись - возможность вернуться к ней (карточке или выделение ее в реестре нужного раздела быстрым фильтром) и т.д;-)

Неплохая идея. Думаю, сделаем.

"Хорошилов Евгений Игоревич" написал:Было бы хорошо видеть не только конкретные действия пользователей, но и общие показатели в виде отчетов и графиков. Например: общее время работы в системе за день, общее время по разделам, можно отслеживать в какие часы пользователь сидит в системе и т.п.

Честно говоря, не думал еще об отчетах, но, в принципе, поскольку вся необходимая информация для анализа есть, то разработать их не составит особого труда. Попробуем.

Было бы очень интересно попробовать применить в нашей компании функционал, именно для аналитики - кто сколько времени провел в системе и кто что полезного сделал. А то клиентам внедряем, у них все хорошо, а вот у нас самих полноценно не больше 70% сотрудников активно используют crm. Скажите, когда будет возможность попробовать это?

"S.Kalishenko" написал:А вот на вопрос приобретения пока не готов ответить, т.к. мы презентовали ее только на днях.

Есть какие-либо новости по данному вопросу?

Пока новостей нет. :(
Предлагаю следующее: если Вы хотите видеть эту функциональность в базовой версии, то добавьте, пожалуйста, идею с ссылкой на эту ветку. Просто мне, да и коллегам из разработки продуктов, не совсем понятна актуальность этого функционала. Поэтому хотелось бы оценить это по голосам участников комьюнити.

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

Да. я имел ввиду часть, которую упомянула Алёна. Была фраза о оформлении функционала как отдельного модуля.

Вариант частичного решения требуемого функционала.

Вот тоже заинтересовал вопрос о распространении ... У нас руководство хотело видеть кто, со скольки и до скольки работает в системе. И что собственно с системе делает.
Вопрос кажется актуальным на этапе внедрения, когда некоторые сотрудники скажем так "саботируют" процесс.

А время все идет... Решение какое то принято?

подскажите пожалуйста решение уже сейчас можно купить как отдельный модуль?
если да прошу скинуть цену в личку. спасибо

Обещаю, до конца недели выложить сюда, в эту ветку сервисы по этому функционалу. Ничего покупать не нужно. :)
Прошу прощения у всех, просто времени совсем не было.

Друзья!
Прикрепил к посту архив с сервисами и с описанием действий, которые обязательно нужно выполнить после загрузки этих сервисов (см. файл Readme.txt). Проверено на версии 3.3.2 (сервисы именно этой версии). Если что-то не будет получаться, пишите.

Настоятельная просьба, кто будет пробовать загружать сервисы: СДЕЛАЙТЕ БЕКАП БАЗЫ.

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

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

версия террасофта 3.3.2 Террасофт Пресс

нашел ошибку. все исправил работает вопрос снят

А в чем ошибка была?

так как мы в 3.3.2 перешли с 3.3.0. Обновление глобальных скриптов и необходимых разделов шло по потребности. и поэтому многое что еще вручную сравниваю исправляю и добавляю. но там уже остались мелочи. вот одна из таких мелочей это отсутствие в scr_Main в функции wnd_MainOnPrepare двух строчек:
DatasetTriggers.Load();
SetServicesEvents();
+ самой функции SetServicesEvents и ссылки на скрипт scr_DatasetTriggers. Добавив данные строчки у меня все заработало. плюс я добавил еще 2 подписи на события. Для того чтобы логировать удаления. Это для меня важно. плюс хочу доработать систему поиска и фильтрации внутри лога. Как доработаю выложу сюда.

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

Понятно. Выкладывайте, как доработаете. Думаю, всем пригодится.

А версию утилиты для 3.4 можете выложить?

А текущий вариант на 3.4 разве не работает? Недавно вроде пробовал - все было ок.

Перестает работать автоматический запуск БП из-за этой утилиты

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

Добрый день!

По этому функционалу можно построить отчет Fast Report, использовав набор данных логов.
Либо Вы можете установить необходимые фильтры прямо в окне логов и распечатать/экспортировать в Excel все записи реестра.

Сегодня решила настроить эти доработки у себя в базе.
Все сделала, по кнопке вызывается указанное окно, ошибок нет. Но и логирования собственно тоже нет, никакого вообще.
Прочитала, что это возможно из-за нашего перехода из 3.3.1 в 3.3.2, но для устранения проблемы не смогла найти в нашей базе scr_DatasetTriggers. Где мне можно его взять?

Вктория, я прикрепил Вам все необходимые файлы, но нет никакой гарантии, что они Вам помогут, так как мне не известно, как именно вы делали переход из версии на версию, это чистой воды конфигурация.

Видимо у меня нет не только этого скрипта, но и enm_DatasetTriggerType, ds_DatasetTrigger, sq_DatasetTrigger, tbl_DatasetTrigger, и что там еще может быть с этими DatasetTrigger.

Если возможно выгрузите и их тоже

Виктория, вложила архив с сервисами.

спасибо, буду надеяться что поможет.

С логированием действий все получилось, спасибо!

Войдите или зарегистрируйтесь, чтобы комментировать