Связи между таблицами в базе данных MS SQL Orion Pro Болид

Недавно пришлось столкнуться со следующей проблемой: заказчику нужно было сделать отчет по проходам сотрудников, который сильно отличался от шаблонного отчета в генераторе отчетов Орион Про Болида. Изучение конструктора отчетов и иных болидовских глупостей при знании языка SQL мне показалось не нужным… Покопавшись в базе, я установил связи между нужными мне таблицами, после чего написать отчет не составило труда. Есть один момент — коды ключей в таблице pMark в столбце CodeP закодированы. Однако закодированы они не очень сильно и их легко можно узнать. Об этом я напишу в следующий раз. Вот, собственно диаграмма связей между таблицами в базе данных MS SQL Orion Pro Болид:

диаграмма связей между таблицами в базе данных MS SQL Orion Pro Болид

Оцените пожалуйста статью:

ПечальноТак себеНе плохоХорошоОтличная статья! 8 оценок.
Загрузка...

64 Replies to “Связи между таблицами в базе данных MS SQL Orion Pro Болид

  1. Здравствуйте!
    Спасибо за информацию!
    Жду с нетерпением продолжение публикации по данной теме.
    С Уважением, Дмитрий.

    1. Дмитрий! Спасибо. Пишите в комментариях какого рода информация Вас интересует.

      1. Здравствуйте!
        Помогите пожалуйста написать запрос в MS SQL в результате которого по «номеру»(или другому идентификатору работника из таблицы pLogData) получить отчет за определенный временной интервал в котором будет время прохода и точка прохода.
        Заранее спасибо!!!
        С Уважением, Дмитрий.

        1. Дмитрий! Укажите какие столбцы в выходной таблице вы хотите видеть. Прямо так: Фамилия, Имя, Отчество, время прохода, точка прохода и т.д. Так же укажите какие исходные данные вы хотите использовать для получения отчета. Айди сотрудника, временной интервал, точки прохода, вход — выход? Не обещаю что напишу тут-же, пока мало свободного времени.

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

          1. SELECT 
          2. -- лишние столбцы закомментировать
          3. 		TimeVal
          4.       ,HozOrgan
          5.       ,DoorIndex
          6. 	  ,Remark
          7. 	  ,Name + ' ' + FirstName + ' ' + MidName AS Name
          8. FROM pLogData JOIN pList ON pLogData.HozOrgan = pList.ID
          9. WHERE  
          10. pLogData.TimeVal BETWEEN 
          11. CONVERT (datetime,
          12. '2016-07-12 09:57:39.000'	 -- начало интервала (изменить)
          13. , 21) 
          14. AND CONVERT (datetime, 
          15. '2016-07-12 11:57:39.000'	 -- окончание интервала (изменить)
          16. ,21)
          17. AND pLogData.HozOrgan = 11	 -- ID персоны из таблицы pList (изменить)
          1. Добрый день, Алексендр. Подскажите как мне выбрать первый вход и последний выход в текущем случае, по конкретному человеку на опрделенную дату?

          2. Максим, необходимо сделать выборку из таблицы pLogData, с использованием данных из таблиц: pList, AccessPoint и RdrAccessPoint.

  2. Александр, спасибо за информацию. По какой причине часть устройств не фиксируется в pLogData и m_alarm?

    1. Здравствуйте! Возможно это связано с тем, что устройства не прописаны в базе Орион Про. Посмотрите их наличие в таблице DevItems

  3. Здравствуйте,
    организации требуется откорректировать отчет по персоналу для Орион Про:
    Задача: При выгрузке данных из системы СКУД при эвакуации с завода, в отчет попадает персонал, находящийся в момент выгрузки на другом (удаленном) объекте.

    Если Вы готовы выполнить данную задачу, прошу связаться со мной по почте для обсуждения деталей выполнения работы. Спасибо.
    Елена.

  4. Добрый день, Александр.
    Подскажите в какой таблице хранятся данные по пропуску у сотрудника. А именно код карты.
    В таблице [pList] нет кодов карты. Я правильно понимаю коды хранятся Шестнадцатеричной системе. например код 76000B0050C9FE01 мне хотелось получить часть кода C9FE в десятичном формате. т.е. 51710. А по данному коду строить отчеты. Либо как то увязать с таблицей [pLogData] данный код.

    1. Андрей! Коды карточек PROXIMITY в базе хранятся в базе в таблице pMark с столбце CodeP.На сайте есть пост, посвященный этому вопросу : Как расшифровать коды ключей Proximity в базе Орион Про Болид. К сожалению, представленный способ работает не во всех версиях Орион Про. В новых версиях болид стал использовать другой алгоритм шифрования. Пока не было времени подумать над этим. Посмотрите как расшифровываются ключики и в ms sql напишите функцию, которая будет делать это на лету, прямо во время выполнения запроса.

      1. Александр, добрый день )
        А можно ли имитировать вход работника запросом в SQL ? 🙂
        Спасибо!

      2. Добрый день!
        Подскажите пожалуйста, можно ли sql запросами сымытировать приход сотрудника на работу? Спасибо ! )

  5. Добрый день!
    Подскажите пожалуйста, можно ли sql запросом сымитировать приход сотрудника на работу?
    Спасибо 🙂

          1. Добрый день Александр
            Как с вами можно связаться по вопросу базы данных Орион Про?

  6. Добрый день, подскажите пожалуйста, мне нужно создать отчет «Все работники предприятия» — «Оставшиеся на объекте». В итоге мне нужно создать отчет «Отсутствующих на работе»

    1. Айал, как в генераторе отчетов это делать — не знаю. Могу помочь только с запросом к базе в MS SQL.

      1. я вот на основе отчета «оставшиеся на объекте», незнаю как изменить запрос, буду рад помощи.
        var
        PDivisionID, PCompanyID, PListID: array of Integer;
        FirstShow: Boolean;
        ReportDate: TDateTime;
        StaffCount: Integer;

        procedure frReport1OnStartReport(Sender: TfrxComponent);
        var i: integer;
        begin
        with DialogPage, Engine do
        begin
        ReportDate := Now();
        end;
        end;

        procedure btOkOnClick(Sender: TfrxComponent);
        const
        sqlsrall = ‘(Exists(Select * from #tmpPListId)) ‘;
        sqlsr = ‘( pList.ID = @ID OR @ID IS NULL) ‘;
        NumStr = 28;
        var i: integer;
        begin
        with DialogPage, Engine do
        begin
        QueryMain.ParamByName(‘ID’).Clear;
        QueryMain.ParamByName(‘ReportDate’).value := ReportDate;
        QueryMain.SQL[NumStr] := sqlsr;
        end;

        StaffCount := 0;
        if QueryMain.Active then QueryMain.Close;
        QueryMain.Open;

        StaffCount := QueryMain.RecordCount;
        QueryMain.First;

        end;

        begin
        end.

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

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

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

          3. Да, отчет нужен в момент запуска.
            ФИО, подразделение, должность, время последнего входа и выхода.
            Есть зона «объект» в которую ведут два турникета и одна дверь вход/выход.

  7. Здравствуйте.
    Необходимо отредактировать отчет УРВ «Список нарушителей» довавить значения Первый вход Последний выход. Если есть такая возможность свяжитесь со мной по электронной почте.

    1. Здравствуйте, Илья.
      Я не редактирую отчеты, болидовские костыли мне не интересны. Я работаю напрямую с БД. Вы можете использовать запрос в екселе и получать отчет в таблице. Если интересует — пишите.

  8. Здравствуйте, уважаемы Александр!
    Нужен запрос к базе данных, что бы показывал и если возможно выгружал допустим в текстовый файл (как пример) количество находящихся на объекте.
    Если есть такая возможность свяжитесь со мной по электронной почте.

    1. Возможность есть. Единственное, на счет выгрузки не уверен, но такой запрос можно выполнять прямо из файла excel и сохранять.

  9. И в схеме ошибка Таблицы Acesspoint и Plogdata соединяются по ключу

    Acesspoint ON (Plogdata.DoorIndex = AcessPoint.GIndex)

  10. Приветствую. Меня интересует написание вами различных запросов напрямую к БД ОрионПро. Об оплате договоримся. Работа не разовая. Возможно (и желательно) долгое сотрудничесво (из мафии не уходят 🙂

    Прошу связаться со мной.

  11. Александр, подскажите как правильно почистить архив событий вручную в Орион про, база переполнена и не запускается.

    1. Я бы попробовал очистить таблицу pLogData. Из Microsoft SQL Server Management Studio это можно сделать с помощью запроса:
      delete from pLogData

  12. Добрый день Александр
    Руководство поставило задачу получить из SQL данные по действующим сотрудникам. В таблице pList есть поле, по которому можно получить данные?

    1. Собственно говоря, вся таблица pList содержит данные о пользователях, зарегистрированных в системе. Имя, фамилия, отчество и т.д.

  13. Александр, добрый день.
    Имеется задача в «диджитализации» процесса переклички при эвакуации.
    На данный момент используем по «оставшиеся на объекте» для понимания кто не эвакуировался и выгружаем отчет по точке доступа для формирования списка кто эвакуировался. Это все неудобно, а главное не оперативно. Возможно ли сделать это запросом к базе в MS SQL?

    1. Конечно можно. Все, что внесено в базу данных извлекается от туда именно запросами. Пишите ТЗ на запрос, я вам его напишу.

  14. Добрый день!
    Подскажите по одному вопросу. Необходимо настроить контроль изменения списка пользователей, допущенных в помещения, снабженных СКУД.
    В каких таблицах могут содержаться эти данные?

    1. Александр здравствуйте. Инфа о пользователях находится в таблице pList, зоны, группы и точки доступа лежат соответственно в AccessZone, GrAccess, AccessPoint.

  15. Добрый день. Стоит задача блокировать пропуски сотрудников, которые находятся в отпуске или на больничном. Подскажите пожалуйста в какой таблице (поле) возможно поменять данные программно, если это возможно? Спасибо.

    1. Елена здравствуйте. Попробуйте в таблице pMark, для нужного вам пропуска, в столбце Config установить значение 32768 вместо 128. Когда сотрудник вернется, снова установите 128. Сначала проверьте на каком-нибудь пропуске. Данный вариант, я думаю, должен сработать, при условии того что в системе организован «Централизованный доступ» — коды ключей хранятся в Базе данных АРМ «Орион Про», и решение о предоставлении/запрете доступа принимает программный модуль «Ядро опроса» АРМ «Орион Про».
      После проверки отпишитесь пожалуйста получилось или нет.

      1. Добрый день. Получилось прямым обращением в таблицы SQL. Параметр меняется. Все отлично. Только для того чтобы эти данные синхронизировались с контроллерами необходимо нажимать кнопку в АБД Орион. Может вы знаете как можно синхронизировать эти данные в обход ручного управления синхронизацией?

  16. Александр здравствуйте. Подскажите пожалуйста с запросом к SQL по выгрузке данных по событию предоставления доступа к определенному устройству.

    1. Михаил, если вы имеете в виду точки доступа, то вот вам запрос:

      — Выбирает все строки из таблицы (лог событий) для точки доступа AcessPoint.ID
      use Orion11223 /*укажите имя базы данных вместо Orion11223*/ ;
      select

      [pLogData].[TimeVal]
      ,[pLogData].[NumCom]
      ,[pLogData].[IDComp]
      ,[pLogData].[Par1]
      ,[pLogData].[Par2]
      ,[pLogData].[Par3]
      ,[pLogData].[Par4]
      ,[pLogData].[Event]
      ,[pLogData].[IndexKey]
      ,[pLogData].[RazdIndex]
      ,[pLogData].[HozOrgan]
      ,[pLogData].[HozGuest]
      ,[pLogData].[Remark]
      ,[pLogData].[DoorIndex]
      ,[pLogData].[Mode]
      ,[pLogData].[DeviceTime]
      ,[pLogData].[VEvent]
      ,[pLogData].[ZReserv]
      ,[pLogData].[ZoneIndex]
      ,[pLogData].[ReaderIndex]
      ,[pLogData].[Sign]
      ,[pLogData].[tpRzdIndex]
      ,[pLogData].[tpPar4]
      ,[pLogData].[IndexZone]
      ,[pLogData].[tpIndex]
      ,[pLogData].[GUID]

      from [pLogData], AcessPoint
      where
      pLogData.DoorIndex = AcessPoint.GIndex
      and
      AcessPoint.ID = 4 /*Укажите ID точки доступа из таблицы AcessPoint вместо 4*/
      order by [pLogData].[TimeVal] desc

      1. Да, спасибо, то что надо, осталось подтянуть ФИО «хозорганов» и [Events].[Contents] пытаюсь путем скрещивания вашего предыдущего запроса из первых комментариев — но что то идет не совсем так :
        ,Name + ‘ ‘ + FirstName + ‘ ‘ + MidName AS Name
        FROM pLogData JOIN pList ON pLogData.HozOrgan = pList.ID JOIN Events ON pLogData.Event = Events.Event

        1. use Orion11223 /*укажите имя базы данных вместо Orion11223*/ ;
          select
          pList.Name + ‘ ‘ + pList.FirstName + ‘ ‘ + pList.MidName as FIO
          , [Events].Contents as EventDESC
          ,[pLogData].[TimeVal]
          ,[pLogData].[NumCom]
          ,[pLogData].[IDComp]
          ,[pLogData].[Par1]
          ,[pLogData].[Par2]
          ,[pLogData].[Par3]
          ,[pLogData].[Par4]
          ,[pLogData].[Event]
          ,[pLogData].[IndexKey]
          ,[pLogData].[RazdIndex]
          ,[pLogData].[HozOrgan]
          ,[pLogData].[HozGuest]
          ,[pLogData].[Remark]
          ,[pLogData].[DoorIndex]
          ,[pLogData].[Mode]
          ,[pLogData].[DeviceTime]
          ,[pLogData].[VEvent]
          ,[pLogData].[ZReserv]
          ,[pLogData].[ZoneIndex]
          ,[pLogData].[ReaderIndex]
          ,[pLogData].[Sign]
          ,[pLogData].[tpRzdIndex]
          ,[pLogData].[tpPar4]
          ,[pLogData].[IndexZone]
          ,[pLogData].[tpIndex]
          ,[pLogData].[GUID]

          from pLogData, AcessPoint, pList, [Events]
          where
          pLogData.HozOrgan = pList.ID
          and
          pLogData.DoorIndex = AcessPoint.GIndex
          and
          pLogData.[Event] = [Events].[Event]
          and
          AcessPoint.ID = 4 /*Укажите ID точки доступа из таблицы AcessPoint вместо 4*/
          order by [pLogData].[TimeVal] desc

          1. Спасибо, подогнал под свой запрос, получилось так:
            use Orion /*укажите имя базы данных вместо Orion11223*/ ;
            declare @dt0 as datetime
            ,@dt1 as datetime

            select @dt1 = dateadd( day, datediff( day, 0, getdate()), 0)
            ,@dt0 = dateadd( day, datediff( day, 0, getdate() — 1), 0)
            select
            pList.Name + » + pList.FirstName + » + pList.MidName as FIO
            , [Events].Contents as EventDESC
            ,[pLogData].[TimeVal]

            from pLogData, AcessPoint, pList, [Events]
            where
            pLogData.TimeVal BETWEEN @dt0 and @dt1
            and
            pLogData.HozOrgan = pList.ID
            and
            pLogData.DoorIndex = AcessPoint.GIndex
            and
            pLogData.[Event] = [Events].[Event]
            and
            AcessPoint.ID = 16 /*Укажите ID точки доступа из таблицы AcessPoint */
            order by [pLogData].[TimeVal] desc

  17. Добрый день!
    Александр огромное спасибо за помощь в написании SQL запроса для добавления проходов определенных сотрудников через определенные точки доступа в определенный интервал времени в Орион Про.

  18. Здравствуйте, подскажите, можно ли в базе удалить проходы определенных сотрудников ?

  19. Добрый день.
    В таблице [dbo].[pLogData] в столбце Remark записываются номера карт. Но поле Remark имеет varchar(65). в результате часть записи обрезается.
    например:
    8: Вход F2000000B542B601 Турникет 8, F2000000B542B601 Считывате

    Подскажите у всех Remark = 65 символов, пробовали ли вы его менять на побольше?
    Может где то еще фигурирует номер карты в событии в чистом виде, чтоб не парсить запись регулярками и получать номер?

    Кратко что хочу:
    Сделал на ардуино Rfid считыватель. и телеграм бота. в боте родители подписываются на номер карты и получают оповещение, что ребенок пришел в школу.
    Ранее была система перко, там БД попроще была. было поле id карты.
    Школа перешла на Болид и mifare стандарт. Переделываю ПО.
    Спасибо.

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *