Переключение на Главную Страницу Страницы: [1] 2  ОтправитьПечать
Горячая тема (более 10 ответов) Класс ПоставщикДанныхЖурналРегистрацииSQL (число прочтений - 18443 )
avgreen
Senior Member
****
Отсутствует



Сообщений: 254
Местоположение: Украина, Кривой Рог
Зарегистрирован: 20. Октября 2006
Пол: Мужской
Класс ПоставщикДанныхЖурналРегистрацииSQL
17. Февраля 2009 :: 11:21
Печать  
После долгих и безуспешных поисков чего-то подобного начал писать свой класс ПоставщикДанныхЖурналРегистрацииSQL
Как ясно из названия он предназначен для хранения ЖР в SQL и работы с ним. Стараюсь реализовать весь функционал базового класса ПоставщикДанныхЖурналРегистрации, который идет в комплекте с 1С++
Если это кому-нибудь кроме меня интересно, постараюсь в ближайшее время его "причесать" и выложить для тестирования....
  
Наверх
ICQ  
IP записан
 
avgreen
Senior Member
****
Отсутствует



Сообщений: 254
Местоположение: Украина, Кривой Рог
Зарегистрирован: 20. Октября 2006
Пол: Мужской
Класс ПоставщикДанныхЖурналРегистрацииSQL
Ответ #1 - 18. Февраля 2009 :: 09:05
Печать  
Ну вот в первом приближении готов Subj
Внутри архива ReadMe.txt в котором, вкратце, сказано что с этим делать.
Пробовал на чужой конфигурации "Demo_RiK" - вроди-как работает
Если что непонятно - спрашивайте здесь.
  

SysLog_SQL.rar ( 83 KB | Загрузки )
Наверх
ICQ  
IP записан
 
avgreen
Senior Member
****
Отсутствует



Сообщений: 254
Местоположение: Украина, Кривой Рог
Зарегистрирован: 20. Октября 2006
Пол: Мужской
Класс ПоставщикДанныхЖурналРегистрацииSQL
Ответ #2 - 19. Февраля 2009 :: 15:50
Печать  
Хотел сделать контроль дупов и столкнулся с такой проблемой - вот такой вот запрос работает нормально

Код
Выбрать все
	|declare @Date datetime
	|declare @Mode char (1)
	|declare @UserName char (50)
	|declare @UserId char (13)
	|declare @EventType varchar (50)
	|declare @Event varchar (250)
	|declare @EventCategory int
	|declare @Comment varchar (8000)
	|declare @ObjectId char (23)
	|declare @ObjectDescr varchar (100)
	|
	|set @Date = CONVERT(datetime, ?, 120)
	|set @Mode = ?
	|set @UserName = ?
	|set @UserId = ?
	|set @EventType = ?
	|set @Event = ?
	|set @EventCategory = ?
	|set @Comment = ?
	|set @ObjectId = ?
	|set @ObjectDescr = ?
	|	INSERT INTO [dbo].["+ИмяТаблицы+"] (EventDateTime, Mode, UserName, UserId, EventType, Event, EventCategory, Comment, ObjectId, ObjectDescr)
	|	 VALUES (@Date, @Mode, @UserName, @UserId, @EventType, @Event, @EventCategory, @Comment, @ObjectId, @ObjectDescr)
 



а стОит добавить перед INSERT проверку на дупы

Код
Выбрать все
	|IF (SELECT count(*) FROM [dbo].["+ИмяТаблицы+"] WHERE EventDateTime = @Date and  Mode = @Mode and UserName = @UserName  and UserId = @USerId and  EventType = @EventType and
	|	Event = @Event and  EventCategory = @EventCategory and  Comment = @Comment  and ObjectId = @ObjectId and  ObjectDescr = @ObjectDescr) = 0
 



как ODBC орет нечеловеческим голосом
"Подключение занято до получения результатов для другого hstmt"

1С при этом падает замертво.... И что с этим делать - не знаю Печаль
  
Наверх
ICQ  
IP записан
 
vandalsvq
1c++ power user
Отсутствует


Я всего лишь als-особиратель
;-)

Сообщений: 2487
Местоположение: Уфа
Зарегистрирован: 18. Июля 2007
Пол: Мужской
Re: Класс ПоставщикДанныхЖурналРегистрацииSQL
Ответ #3 - 19. Февраля 2009 :: 17:32
Печать  
avgreen писал(а) 19. Февраля 2009 :: 15:50:
"Подключение занято до получения результатов для другого hstmt"

1С при этом падает замертво.... И что с этим делать - не знаю Печаль


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

Отхожу от дел. Долго и мучительно.
Наверх
IP записан
 
avgreen
Senior Member
****
Отсутствует



Сообщений: 254
Местоположение: Украина, Кривой Рог
Зарегистрирован: 20. Октября 2006
Пол: Мужской
Re: Класс ПоставщикДанныхЖурналРегистрацииSQL
Ответ #4 - 19. Февраля 2009 :: 21:22
Печать  
vandalsvq писал(а) 19. Февраля 2009 :: 17:32:
avgreen писал(а) 19. Февраля 2009 :: 15:50:
"Подключение занято до получения результатов для другого hstmt"

1С при этом падает замертво.... И что с этим делать - не знаю Печаль


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


А как именно победил? Или сам не понял как?  Улыбка
  
Наверх
ICQ  
IP записан
 
avgreen
Senior Member
****
Отсутствует



Сообщений: 254
Местоположение: Украина, Кривой Рог
Зарегистрирован: 20. Октября 2006
Пол: Мужской
Re: Класс ПоставщикДанныхЖурналРегистрацииSQL
Ответ #5 - 20. Февраля 2009 :: 11:57
Печать  
УРА! Я тоже победил! Улыбка

SET NOCOUNT ON помогло

Потом уже, когда начал рыть инет - нашел
"SET NOCOUNT ON обязателен в любой хп (триггере), имеющей более 1 инструкции."

Но блин один полноценный день работы убил  Злой
  
Наверх
ICQ  
IP записан
 
avgreen
Senior Member
****
Отсутствует



Сообщений: 254
Местоположение: Украина, Кривой Рог
Зарегистрирован: 20. Октября 2006
Пол: Мужской
Re: Класс ПоставщикДанныхЖурналРегистрацииSQL
Ответ #6 - 23. Февраля 2009 :: 14:31
Печать  
Версия 1.01
     1. Изменены КлючПорядка и ИдПоле на "ДатаВремя" вместо составного поля "EventDateTime + Row_Id"
     2. Добавлен индекс на EventDateTime
     3. В результате 1 и 2 значительно увеличилась скорость "прокрутки" ТП. Из-за этого-же необходимо пересоздать таблицу SysLog
     4. Доделана загрузка из файла с контролем дублей строк - теперь "флажок" на форме работает а не просто торчит там
     5. Выгрузка в файл работает частично - а именно пока не выгружается "Объект"
     6. В ТипыСобытия и События добавлены пользовательские "типы" и "события" но пока не работает отбор по ним
     7. Пользовательские ТипыСобытий теперь записываться в базу без лидирующего "$". То что это пользовательский Тип можно определить ТипыСобытий.Получить("ИмяТипа").Системный = 0
     8. Для Событий аналогично ТипамСобытий (см. пред. пункт) Для этих изменений необходимо заменить Событие_ЗаписьСобытияЖурналаРегистрации в ГМ
  

SysLog_SQL_v1_01.rar ( 94 KB | Загрузки )
Наверх
ICQ  
IP записан
 
vandalsvq
1c++ power user
Отсутствует


Я всего лишь als-особиратель
;-)

Сообщений: 2487
Местоположение: Уфа
Зарегистрирован: 18. Июля 2007
Пол: Мужской
Re: Класс ПоставщикДанныхЖурналРегистрацииSQL
Ответ #7 - 23. Февраля 2009 :: 17:50
Печать  
avgreen писал(а) 19. Февраля 2009 :: 21:22:
vandalsvq писал(а) 19. Февраля 2009 :: 17:32:
avgreen писал(а) 19. Февраля 2009 :: 15:50:
"Подключение занято до получения результатов для другого hstmt"

1С при этом падает замертво.... И что с этим делать - не знаю Печаль


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


А как именно победил? Или сам не понял как?  Улыбка


Кстати перекопал форум и четком могу сказать, чтобы такой беды не было поле УстИДПоле должно быть обязательно уникальным. Иначе проблемы.
  

Отхожу от дел. Долго и мучительно.
Наверх
IP записан
 
avgreen
Senior Member
****
Отсутствует



Сообщений: 254
Местоположение: Украина, Кривой Рог
Зарегистрирован: 20. Октября 2006
Пол: Мужской
Re: Класс ПоставщикДанныхЖурналРегистрацииSQL
Ответ #8 - 24. Февраля 2009 :: 14:47
Печать  
Версия 1.02
     1. Наконец-то сделан нормальный КлючПорядка, а именно datetime, без преобразования в сhar. Соответственно он начал попадать в индекс и прокрутка ТП стала работать действительно нормально. Проверено на таблице с 400'000 строк
     2. Теперь работает отбор по пользовательским ТипамСобытий и Событиям. Не работает пока по ВидамОбъектов и ТипамОбъектов

Часть проблем была с головой - описана здесь  http://www.1cpp.ru/forum/YaBB.pl?num=1235457869 Улыбка

Как видно оттуда, для нормальной работы работы класса необходима 1С++ версии не ниже 3.0.1.22. Проверку пока не сделал так-что следите сами

Еще замечание - если положить в каталог 1С или в каталог базы компоненту UsersDef.dll то имя пользователя не нужно будет набирать руками, можно будет выбрать из списка
  

SysLog_SQL_v1_02.rar ( 95 KB | Загрузки )
Наверх
ICQ  
IP записан
 
avgreen
Senior Member
****
Отсутствует



Сообщений: 254
Местоположение: Украина, Кривой Рог
Зарегистрирован: 20. Октября 2006
Пол: Мужской
Re: Класс ПоставщикДанныхЖурналРегистрацииSQL
Ответ #9 - 24. Февраля 2009 :: 14:53
Печать  
vandalsvq писал(а) 23. Февраля 2009 :: 17:50:
Кстати перекопал форум и четком могу сказать, чтобы такой беды не было поле УстИДПоле должно быть обязательно уникальным. Иначе проблемы.


Да это и так понятно. Он у меня всегда был уникальным что породило мне некоторое количество проблем Улыбка (см. пред. пост) Но IMHO матюк "Подключение занято до получения результатов для другого hstmt" с этим никак не связан. С чем он у меня был связан первый раз я уже сказал (2-3 поста выше), а вот второй раз снова вылез, в другом месте ...... Пока пытаюсь разобраться , а когда упрусь в стену, буду здесь спрашивать  Улыбка
  
Наверх
ICQ  
IP записан
 
avgreen
Senior Member
****
Отсутствует



Сообщений: 254
Местоположение: Украина, Кривой Рог
Зарегистрирован: 20. Октября 2006
Пол: Мужской
Класс ПоставщикДанныхЖурналРегистрацииSQL
Ответ #10 - 26. Февраля 2009 :: 14:00
Печать  
Версия 1.03
     1. Заработала выгрузка в файл. Выгружаются и загружаются многострочные комментарии. В SQL такой комментарий хранится в виде нескольких строк а при выгрузке в файл преобразуется в строку с разделителями вида "#newS%". При загрузке соответственно преобразуется обратно Единственное "но" - почему-то один раз дупятся строки с многострочными комметариями (именно один раз - при первой выгрузке/загрузке).  Т.е. преобразование получается неточным  Но вот где неточность - пока не нашел. На глаз не видно
     2. Немного доработан отчет по просмотру ЖР, При выборе периода он сразу отражается в отборе ... ну еще какие-то мелочи
     3. Убрал за избыточностью поле Row_Id из таблицы и переписал индексы. Таблицу можно не пересоздавать - будет работать и так
  

SysLog_SQL_v1_03.rar ( 95 KB | Загрузки )
Наверх
ICQ  
IP записан
 
avgreen
Senior Member
****
Отсутствует



Сообщений: 254
Местоположение: Украина, Кривой Рог
Зарегистрирован: 20. Октября 2006
Пол: Мужской
Класс ПоставщикДанныхЖурналРегистрацииSQL
Ответ #11 - 04. Марта 2009 :: 14:17
Печать  
Версия 1.04
1. Заработал отбор по по ВидамОбъектов и ТипамОбъектов
2. Убрал индексы IX_Object и IX_User потому как не вижу в нех необходимости (по крайней мере пока)
3. Добавил индекс IX_EventType в результате чего немного быстрее стал работать метод ДозаполнитьТипыСобытий() там где
Код
Выбрать все
"select distinct EventType as ТипСобытия, Event as Событие from "+ИмяТаблицы+" order by EventType" 

я так понимаю из-за "order by". Заметно только на больших таблицах в 400-500 тыс строк
4. Из-за последних двух пунктов нужно либо пресоздать таблицу SysLog, либо удалить/создать индексы вручную

А воотбе-то с Event и EventType нужно что-то делать. Может вынести их в отдельные таблицы и связывать по RowId с основной. Вот не знаю не замедлит ли это запись и основную выборку из SysLog. У кого какие мысли по этому поводу...?
  

SysLog_SQL_v1_04.rar ( 96 KB | Загрузки )
Наверх
ICQ  
IP записан
 
DEVIce
YaBB Newbies
*
Отсутствует


I Love YaBB 2!

Сообщений: 12
Зарегистрирован: 24. Октября 2007
Re: Класс ПоставщикДанныхЖурналРегистрацииSQL
Ответ #12 - 05. Марта 2009 :: 04:58
Печать  
Имхается мне, что контроль дупов не через count(*), а запрос в exists() будет работать быстрее.
  
Наверх
 
IP записан
 
avgreen
Senior Member
****
Отсутствует



Сообщений: 254
Местоположение: Украина, Кривой Рог
Зарегистрирован: 20. Октября 2006
Пол: Мужской
Re: Класс ПоставщикДанныхЖурналРегистрацииSQL
Ответ #13 - 06. Марта 2009 :: 06:30
Печать  
DEVIce писал(а) 05. Марта 2009 :: 04:58:
Имхается мне, что контроль дупов не через count(*), а запрос в exists() будет работать быстрее.


Подожди ..... у меня-ж по моему именно так и написано

Код
Выбрать все
	|"+?(КонтрольДублей = 1,"
		|IF NOT EXISTS (SELECT * FROM [dbo].["+ИмяТаблицы+"] WHERE
		|		Convert(char, EventDateTime, 120) = Convert(char, @Date , 120)
		|		and  Mode = @Mode and UserId = @USerId and  EventType = @EventType and Event = @Event and  EventCategory = @EventCategory
		|		and (UserName = @UserName or @UserName is null and UserName is null)
		|		and (Comment = @Comment or @Comment is null and Comment is null)
		|		and (ObjectId = @ObjectId or @ObjectId is null and ObjectId is null)
		|		and (ObjectDescr = @ObjectDescr or @ObjectDescr is null and ObjectDescr is null))
		|BEGIN
	|","")+"
	|	INSERT INTO [dbo].["+ИмяТаблицы+"] (EventDateTime, Mode, UserName, UserId, EventType, Event, EventCategory, Comment, ObjectId, ObjectDescr)
	|								 VALUES (dbo.getUniqueDateTime_"+ИмяТаблицы+"(@Date), @Mode, @UserName, @UserId, @EventType, @Event, @EventCategory, @Comment, @ObjectId, @ObjectDescr)
	|select 1 NOCOUNT
	|"+?(КонтрольДублей = 1,"
		|END
		|ELSE select 0
	|","")
 

  
Наверх
ICQ  
IP записан
 
DEVIce
YaBB Newbies
*
Отсутствует


I Love YaBB 2!

Сообщений: 12
Зарегистрирован: 24. Октября 2007
Re: Класс ПоставщикДанныхЖурналРегистрацииSQL
Ответ #14 - 12. Марта 2009 :: 09:07
Печать  
Ну если посмотреть ответ №2, то не так  Улыбка
  
Наверх
 
IP записан
 
Переключение на Главную Страницу Страницы: [1] 2 
ОтправитьПечать