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

Понадобилось добавить логирование для детали Файлы.
Включила логирование для нужной таблицы. В деталь Файлы рядом добавила еще грид, который отображает историю.
Проблема обнаружилась вот в чем:
В таблице логирования есть поле 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.

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

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

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

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

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