Queue look — различия между версиями

Материал из wiki.standart-n.ru
Перейти к: навигация, поиск
(Правим configs на нашем сервере)
(Нет поля status в таблице g$profiles)
 
(не показано 8 промежуточных версии 3 участников)
Строка 1: Строка 1:
 
Инструкция о том, как настроить страницу, которая будет показывать проблемные точки с синхронизацией.<br>
 
Инструкция о том, как настроить страницу, которая будет показывать проблемные точки с синхронизацией.<br>
Скрипты, которые написаны ниже, нужно выполнять на '''серверной базе'''.
+
Скрипты, которые написаны ниже, нужно выполнять на '''серверной базе'''.  
 
+
Инструкция по настройке службы очереди '''[[Синхронизация:Очередь загрузки|тут]]'''
 
=Создаем процедуру UTPR_EXTRACT_DT_VER=
 
=Создаем процедуру UTPR_EXTRACT_DT_VER=
  
Строка 14: Строка 14:
 
declare variable I integer;
 
declare variable I integer;
 
begin
 
begin
/*
 
33HpO3Do1cf3fXQSycX282P1UwxR1CIFD236LLYBb8bP412PJ45sGihB7OBcg58OECjXRi7Yr52RTmAPAgwKqh=IG4b6vdQpQV48isG3n0O3F6RPh514L6u8NkSYx0WHQlqkG718nQKII63rKB53EAVbF1n34cU3P
 
cmd=senddata2013
 
profile_id=142-031-547-812
 
PCID=A96BDCB61670ECA28B439D053F48AC71
 
exever=1.544
 
exedate=20141028172002
 
exesize=566784
 
dbname=C:\Standart-N\base\ztrade.fdb
 
*/
 
 
   ver=null;
 
   ver=null;
 
   i=position('exever=',params);
 
   i=position('exever=',params);
Строка 38: Строка 28:
 
GRANT EXECUTE ON PROCEDURE UTPR_EXTRACT_DT_VER TO SYSDBA;
 
GRANT EXECUTE ON PROCEDURE UTPR_EXTRACT_DT_VER TO SYSDBA;
 
</pre>
 
</pre>
 
  
 
=Создаем процедуру UTPR_QUEUE_LOOK=
 
=Создаем процедуру UTPR_QUEUE_LOOK=
Строка 55: Строка 44:
 
     MSECS integer,
 
     MSECS integer,
 
     ENDFLAG integer,
 
     ENDFLAG integer,
     ENDTEXT DM_BLOBTEXT)
+
     ENDTEXT DM_BLOBTEXT,
 +
    VIP DM_ID_NULL)
 
as
 
as
 +
declare variable SUBKONTO1 varchar(250);
 
begin
 
begin
   for select id, caption||' ('||DBSECUREKEY||')' from g$profiles where status=0 and caption is not null and id not in (0,1) and DBSECUREKEY is not null into :profile_id,:sprofile do
+
   for
 +
  --select id, caption||' ('||DBSECUREKEY||')', subkonto1 from g$profiles where id = 98 or
 +
  --(status=0 and caption is not null and id not in (0,1))
 +
  select id, caption, subkonto1, coalesce(vip, 0)  from
 +
    ( select g.id, g.caption||' ('||g.description||')' caption, g.vip, g.subkonto1,
 +
      (select first 1 q.insertdt
 +
      from g$queue q where q.profile_id=g.id  and q.ENDFLAG is not null order by q.id desc ) insertdt
 +
      from g$profiles g where g.id = 98 or
 +
  (g.status=0 and g.caption is not null and g.id not in (0,1))  )  order by insertdt
 +
  into :profile_id,:sprofile, :subkonto1, :vip do
 
   begin
 
   begin
 
     cmnt='-'; EXEVER=0;INSERTDT='01.01.2000'; ENDFLAG=0;ENDTEXT='';
 
     cmnt='-'; EXEVER=0;INSERTDT='01.01.2000'; ENDFLAG=0;ENDTEXT='';
 
     select first 1 q.insertdt, datediff(millisecond,q.startdt,q.commitdt), endflag, endtext,
 
     select first 1 q.insertdt, datediff(millisecond,q.startdt,q.commitdt), endflag, endtext,
 
       (select ver from utpr_extract_dt_ver(q.params))
 
       (select ver from utpr_extract_dt_ver(q.params))
       from g$queue q where q.profile_id=:profile_id and q.endflag is not null order by id desc
+
       from g$queue q where q.profile_id=:profile_id and ENDFLAG is not null order by id desc
 
       into :INSERTDT,:MSECS,:ENDFLAG,:ENDTEXT,:exever;
 
       into :INSERTDT,:MSECS,:ENDFLAG,:ENDTEXT,:exever;
 
     cmnt='';
 
     cmnt='';
  
     if (:exever<1.552) then
+
     if ((coalesce(:EXEVER,0) > 0) and (:EXEVER < 1.552)) then
 
       cmnt=cmnt || 'Версия! ';
 
       cmnt=cmnt || 'Версия! ';
  
Строка 75: Строка 75:
 
--      cmnt=cmnt || 'Сейчас в обработке... Проверь позже. ';
 
--      cmnt=cmnt || 'Сейчас в обработке... Проверь позже. ';
 
     if (endflag=-1) then
 
     if (endflag=-1) then
       cmnt=cmnt || 'Ошибка загрузки пакета! ';
+
       --begin
 +
          cmnt=cmnt || 'Ошибка загрузки пакета! ';
 +
          --select first 1 q.insertdt
 +
          --  from g$queue q where q.profile_id=:profile_id and q.endflag<>-1 order by id desc
 +
          --  into :INSERTDT;
 +
      --end
 +
 
 
     if (endflag=1 and (datediff(hour,insertdt,current_timestamp)>1)) then
 
     if (endflag=1 and (datediff(hour,insertdt,current_timestamp)>1)) then
 
     begin
 
     begin
       if (datediff(day,insertdt,current_timestamp)>0) then
+
       if (datediff(hour,insertdt,current_timestamp)>24) then
         cmnt=cmnt || 'Уже больше суток нИ слухом нИ духом!! ';
+
         cmnt=cmnt || 'Не на связи больше суток: ' ||  cast((datediff(hour,insertdt,current_timestamp) / 24) as integer) || ' дн ' ||
 +
        mod(datediff(hour,insertdt,current_timestamp), 24) || ' ч';
 
       else
 
       else
         cmnt=cmnt || 'Не на связи больше часа! ';
+
         cmnt=cmnt || 'Не на связи больше часа: ' || datediff(hour,insertdt,current_timestamp) || ' ч';
 +
      cmnt= cmnt || coalesce(' (' || :subkonto1 || ')','') ;
 
     end  
 
     end  
  
Строка 99: Строка 107:
 
/* Following GRANT statetements are generated automatically */
 
/* Following GRANT statetements are generated automatically */
  
 +
GRANT SELECT ON G$QUEUE TO PROCEDURE UTPR_QUEUE_LOOK;
 
GRANT SELECT ON G$PROFILES TO PROCEDURE UTPR_QUEUE_LOOK;
 
GRANT SELECT ON G$PROFILES TO PROCEDURE UTPR_QUEUE_LOOK;
 
GRANT EXECUTE ON PROCEDURE UTPR_EXTRACT_DT_VER TO PROCEDURE UTPR_QUEUE_LOOK;
 
GRANT EXECUTE ON PROCEDURE UTPR_EXTRACT_DT_VER TO PROCEDURE UTPR_QUEUE_LOOK;
GRANT SELECT ON G$QUEUE TO PROCEDURE UTPR_QUEUE_LOOK;
 
 
GRANT SELECT ON WAREBASE TO PROCEDURE UTPR_QUEUE_LOOK;
 
GRANT SELECT ON WAREBASE TO PROCEDURE UTPR_QUEUE_LOOK;
  
Строка 127: Строка 135:
 
   echo "Время сервера: ".$row[0]."<br>";
 
   echo "Время сервера: ".$row[0]."<br>";
 
    
 
    
   $sqltext="select CMNT,PROFILE_ID,SPROFILE,EXEVER,INSERTDT,MSECS,ENDFLAG,ENDTEXT,G\$TASKS_COUNT from UTPR_QUEUE_LOOK";
+
   $sqltext="select CMNT,PROFILE_ID,SPROFILE,EXEVER,INSERTDT,MSECS,ENDFLAG,ENDTEXT,VIP from UTPR_QUEUE_LOOK";
 
   $qList = ibase_query($it, $sqltext);
 
   $qList = ibase_query($it, $sqltext);
 
   if (!$qList) {die(" error ".ibase_errmsg()."(".$sqltext.")");}
 
   if (!$qList) {die(" error ".ibase_errmsg()."(".$sqltext.")");}
Строка 133: Строка 141:
 
   echo "<table class=\"table table-bordered table-hover table-striped\"><tr><td>##</td><td>Комментарий</td><td>Профиль</td><td>Версия</td><td>Дата</td><td>Время обработки</td><td>Флаг завершения</td></tr>";
 
   echo "<table class=\"table table-bordered table-hover table-striped\"><tr><td>##</td><td>Комментарий</td><td>Профиль</td><td>Версия</td><td>Дата</td><td>Время обработки</td><td>Флаг завершения</td></tr>";
 
   $i=0;
 
   $i=0;
  while ($row = ibase_fetch_row($qList))
+
    while ($row = ibase_fetch_row($qList))
 
   {
 
   {
 
     $i++;
 
     $i++;
     echo "<tr>";
+
     if ($row[8]==1) {
 +
      $class="danger";
 +
    } else {
 +
      $class="";
 +
    }
 +
    echo '<tr class="'.$class.'">';
 
echo "<td>".$i."</td>";
 
echo "<td>".$i."</td>";
 
echo "<td>".$row[0]."</td>";
 
echo "<td>".$row[0]."</td>";
Строка 142: Строка 155:
 
echo "<td>".$row[3]."</td>";
 
echo "<td>".$row[3]."</td>";
 
echo "<td>".$row[4]."</td>";
 
echo "<td>".$row[4]."</td>";
echo "<td>".$row[8]."</td>";
 
 
echo "<td>".$row[5]."</td>";
 
echo "<td>".$row[5]."</td>";
 
echo "<td>".$row[6]."</td>";
 
echo "<td>".$row[6]."</td>";
 +
// echo "<td>".$row[7]."</td>";
 
echo "</tr>";
 
echo "</tr>";
 
   }
 
   }
 
   echo "</table>";
 
   echo "</table>";
 
?>
 
?>
 +
</pre>
 +
 +
=Добавляем данного клиента в настройки=
 +
Дописываем в файл:
 +
<pre>
 +
\\192.168.67.30\web\sinhro\configs\
 
</pre>
 
</pre>
  
Строка 163: Строка 182:
 
===Создаем файл difference_look.php===
 
===Создаем файл difference_look.php===
 
  <nowiki>
 
  <nowiki>
<h1>Аптеки Удмуртии Расхождения</h1>
+
<h1>Имя клиента Расхождения</h1>
 
<?php
 
<?php
 
//<meta http-equiv="Content-Type" content="text/html; charset=windows-1251">
 
//<meta http-equiv="Content-Type" content="text/html; charset=windows-1251">
Строка 201: Строка 220:
 
   echo "</table>";
 
   echo "</table>";
 
?>
 
?>
 +
 
</nowiki>
 
</nowiki>
  
Строка 211: Строка 231:
 
=Возможные проблемы=
 
=Возможные проблемы=
  
==Нет поля status в таблице g$profiles==
+
==Нет полей в таблице g$profiles==
  
Тогда нужно добавить это поле в этой базе и отправить всем по g$tasks
+
Тогда нужно добавить эти поля в этой базе и отправить всем по g$tasks
  
 
<pre>
 
<pre>
ALTER TABLE G$PROFILES
+
ALTER TABLE G$PROFILES ADD STATUS DM_STATUS;
ADD STATUS DM_STATUS
+
ALTER TABLE G$PROFILES ADD SUBKONTO1 DM_TEXT;
 +
ALTER TABLE G$PROFILES ADD VIP DM_ID_NULL;
 +
 
 
</pre>
 
</pre>
  
Строка 223: Строка 245:
 
--update g$profiles set status=0
 
--update g$profiles set status=0
 
</pre>
 
</pre>
 
  
 
==Нет таблицы warebase==
 
==Нет таблицы warebase==

Текущая версия на 17:15, 1 сентября 2017

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

Инструкция по настройке службы очереди тут 

Создаем процедуру UTPR_EXTRACT_DT_VER

SET TERM ^ ;

create or alter procedure UTPR_EXTRACT_DT_VER (
    PARAMS DM_TEXT1024)
returns (
    VER DM_TEXT)
as
declare variable I integer;
begin
  ver=null;
  i=position('exever=',params);
  if (i=0) then exit;
  ver=substring(params from i+7 for position(ascii_char(13)||ascii_char(10),params,i+8)-i-7);
  suspend;
end^


SET TERM ; ^

/* Existing privileges on this procedure */

GRANT EXECUTE ON PROCEDURE UTPR_EXTRACT_DT_VER TO SYSDBA;

Создаем процедуру UTPR_QUEUE_LOOK

SET TERM ^ ;

create or alter procedure UTPR_QUEUE_LOOK (
    VERB_ALL integer = 0)
returns (
    CMNT DM_TEXT,
    PROFILE_ID DM_ID,
    SPROFILE DM_TEXT,
    EXEVER DM_DOUBLE,
    INSERTDT DM_DATETIME,
    MSECS integer,
    ENDFLAG integer,
    ENDTEXT DM_BLOBTEXT,
    VIP DM_ID_NULL)
as
declare variable SUBKONTO1 varchar(250);
begin
  for
  --select id, caption||' ('||DBSECUREKEY||')', subkonto1 from g$profiles where id = 98 or
  --(status=0 and caption is not null and id not in (0,1))
  select id, caption, subkonto1, coalesce(vip, 0)  from
     ( select g.id, g.caption||' ('||g.description||')' caption, g.vip, g.subkonto1,
      (select first 1 q.insertdt
      from g$queue q where q.profile_id=g.id  and q.ENDFLAG is not null order by q.id desc ) insertdt
       from g$profiles g where g.id = 98 or
  (g.status=0 and g.caption is not null and g.id not in (0,1))  )   order by insertdt
  into :profile_id,:sprofile, :subkonto1, :vip do
  begin
    cmnt='-'; EXEVER=0;INSERTDT='01.01.2000'; ENDFLAG=0;ENDTEXT='';
    select first 1 q.insertdt, datediff(millisecond,q.startdt,q.commitdt), endflag, endtext,
      (select ver from utpr_extract_dt_ver(q.params))
      from g$queue q where q.profile_id=:profile_id  and ENDFLAG is not null order by id desc
      into :INSERTDT,:MSECS,:ENDFLAG,:ENDTEXT,:exever;
    cmnt='';

    if ((coalesce(:EXEVER,0) > 0) and (:EXEVER < 1.552)) then
      cmnt=cmnt || 'Версия! ';

    if (insertdt is null) then
      cmnt=cmnt || 'Нет входящих пакетов!! ';
--    if ((endflag is null) and (insertdt is not null)) then
--      cmnt=cmnt || 'Сейчас в обработке... Проверь позже. ';
    if (endflag=-1) then
      --begin
          cmnt=cmnt || 'Ошибка загрузки пакета! ';
          --select first 1 q.insertdt
          --  from g$queue q where q.profile_id=:profile_id and q.endflag<>-1 order by id desc
          --  into :INSERTDT;
      --end

    if (endflag=1 and (datediff(hour,insertdt,current_timestamp)>1)) then
    begin
      if (datediff(hour,insertdt,current_timestamp)>24) then
        cmnt=cmnt || 'Не на связи больше суток: ' ||  cast((datediff(hour,insertdt,current_timestamp) / 24) as integer) || ' дн ' ||
        mod(datediff(hour,insertdt,current_timestamp), 24) || ' ч';
      else
        cmnt=cmnt || 'Не на связи больше часа: ' || datediff(hour,insertdt,current_timestamp) || ' ч';
      cmnt= cmnt || coalesce(' (' || :subkonto1 || ')','') ;
    end 

--cf    if ((select count(1) from warebase where sname='' and g$profile_id=:profile_id)>=1) then
    if (exists(select first 1 part_id from warebase where sname='' and g$profile_id=:profile_id)) then
      cmnt=cmnt || 'Есть пустые наименования ';
    if ((VERB_ALL=1) or (cmnt<>'')) then
      suspend;
  end 
end^

SET TERM ; ^

COMMENT ON PARAMETER UTPR_QUEUE_LOOK.VERB_ALL IS
'1: выводить все, а не только проблемные';

/* Following GRANT statetements are generated automatically */

GRANT SELECT ON G$QUEUE TO PROCEDURE UTPR_QUEUE_LOOK;
GRANT SELECT ON G$PROFILES TO PROCEDURE UTPR_QUEUE_LOOK;
GRANT EXECUTE ON PROCEDURE UTPR_EXTRACT_DT_VER TO PROCEDURE UTPR_QUEUE_LOOK;
GRANT SELECT ON WAREBASE TO PROCEDURE UTPR_QUEUE_LOOK;

/* Existing privileges on this procedure */

GRANT EXECUTE ON PROCEDURE UTPR_QUEUE_LOOK TO SYSDBA;

Создаем файл queue_look.php в папке с синхронизацией

<h1>Имя клиента</h1>
<?php
//<meta http-equiv="Content-Type" content="text/html; charset=windows-1251">
//проверка кодировки
//http://apur.standart-n.ru/sinhro/engine/queue_look.php
include("declare.php");
  $g_db = ibase_connect($GLOBALS["DB_DATABASENAME"], $GLOBALS["DB_USER"], $GLOBALS["DB_PASSWD"]) or die(" error fbdb connect ".ibase_errmsg());
  $it = ibase_trans(IBASE_WRITE + IBASE_COMMITTED + IBASE_REC_VERSION + IBASE_NOWAIT, $g_db) or die(" error start transaction".ibase_errmsg());

  $sqltext="select current_timestamp from rdb\$database";
  $qList = ibase_query($it, $sqltext);
  if (!$qList) {die(" error ".ibase_errmsg()."(".$sqltext.")");}
  $row = ibase_fetch_row($qList);
  echo "Время сервера: ".$row[0]."<br>";
  
  $sqltext="select CMNT,PROFILE_ID,SPROFILE,EXEVER,INSERTDT,MSECS,ENDFLAG,ENDTEXT,VIP from UTPR_QUEUE_LOOK";
  $qList = ibase_query($it, $sqltext);
  if (!$qList) {die(" error ".ibase_errmsg()."(".$sqltext.")");}
//  echo "<table><tr><td>##</td><td>Комментарий</td><td>Профиль</td><td>Версия</td><td>Дата</td><td>Время обработки</td><td>Флаг завершения</td><td>Техт ответа</td></tr>";
  echo "<table class=\"table table-bordered table-hover table-striped\"><tr><td>##</td><td>Комментарий</td><td>Профиль</td><td>Версия</td><td>Дата</td><td>Время обработки</td><td>Флаг завершения</td></tr>";
  $i=0;
    while ($row = ibase_fetch_row($qList))
  {
    $i++;
    if ($row[8]==1) {
      $class="danger";
    } else {
      $class="";
    }
    echo '<tr class="'.$class.'">';
	echo "<td>".$i."</td>";
	echo "<td>".$row[0]."</td>";
	echo "<td>".$row[2]." /".$row[1]."</td>";
	echo "<td>".$row[3]."</td>";
	echo "<td>".$row[4]."</td>";
	echo "<td>".$row[5]."</td>";
	echo "<td>".$row[6]."</td>";
//	echo "<td>".$row[7]."</td>";
	echo "</tr>";
  }
  echo "</table>";
?>

Добавляем данного клиента в настройки

Дописываем в файл:

\\192.168.67.30\web\sinhro\configs\

Дополнительно

Отображение расхождений в базе

Создаем процедуры в базе

Устанавливаем процедуру для сводной базы из статьи Дублирование_чека.

Делаем назначенное задание

Каждую ночь запускаем процедуру PR_GET_DIFFERENCE_BY_DOCS.

Создаем файл difference_look.php

<h1>Имя клиента Расхождения</h1>
<?php
//<meta http-equiv="Content-Type" content="text/html; charset=windows-1251">
//проверка кодировки
//http://apur.standart-n.ru/sinhro/engine/queue_look.php
include("declare.php");
  $g_db = ibase_connect($GLOBALS["DB_DATABASENAME"], $GLOBALS["DB_USER"], $GLOBALS["DB_PASSWD"]) or die(" error fbdb connect ".ibase_errmsg());
  $it = ibase_trans(IBASE_WRITE + IBASE_COMMITTED + IBASE_REC_VERSION + IBASE_NOWAIT, $g_db) or die(" error start transaction".ibase_errmsg());

  $sqltext="select first 1 d.dt from difference_by_docs d";
  $qList = ibase_query($it, $sqltext);
  if (!$qList) {die(" error ".ibase_errmsg()."(".$sqltext.")");}
  $row = ibase_fetch_row($qList);
  echo "Актуальность данных: ".$row[0]."<br>";
  
  $sqltext="select d.profile_id, d.sprofile, d.zdate, d.zid, d.rash_nal, d.rash_beznal, d.doc_id, d.status, d.cmt from DIFFERENCE_BY_DOCS d order by d.zdate desc";
  $qList = ibase_query($it, $sqltext);
  if (!$qList) {die(" error ".ibase_errmsg()."(".$sqltext.")");}
  echo "<table class=\"table table-bordered table-hover table-striped\"><tr><td>#</td><td>№</td><td>Профиль</td><td>Дата Z</td><td>№ Z</td><td>Расх. нал.</td><td>Расх. б/нал.</td><td>DOC_ID</td><td>Статус</td><td>Комментарий</td></tr>";
  $i=0;
  while ($row = ibase_fetch_row($qList))
  {
    $i++;
    echo "<tr>";
	echo "<td>".$i."</td>";
	echo "<td>".$row[0]."</td>";
	echo "<td>".$row[1]."</td>";
	echo "<td>".$row[2]."</td>";
	echo "<td>".$row[3]."</td>";
	echo "<td>".$row[4]."</td>";
	echo "<td>".$row[5]."</td>";
	echo "<td>".$row[6]."</td>";
	echo "<td>".$row[7]."</td>";
	echo "<td>".$row[8]."</td>";
	echo "</tr>";
  }
  echo "</table>";
?>


Правим configs на нашем сервере

 файл \\192.168.67.30\web\sinhro\configs\clients.ini по аналогии
 ждем 3 минуты, чтобы кэш обновился, и проверяем

Возможные проблемы

Нет полей в таблице g$profiles

Тогда нужно добавить эти поля в этой базе и отправить всем по g$tasks

ALTER TABLE G$PROFILES ADD STATUS DM_STATUS;
ALTER TABLE G$PROFILES ADD SUBKONTO1 DM_TEXT;
ALTER TABLE G$PROFILES ADD VIP DM_ID_NULL;

--update g$profiles set status=0

Нет таблицы warebase

Либо меняем в процедуре UTPR_QUEUE_LOOK warebase на аналог данной таблицы, либо убираем упоминания о ней.


Таблица g$queue пустая или отсутствует

В процедуре UTPR_QUEUE_LOOK меняем

select first 1 q.insertdt, datediff(millisecond,q.startdt,q.commitdt), endflag, endtext,
      (select ver from utpr_extract_dt_ver(q.params))
      from g$queue q where q.profile_id=:profile_id order by id desc
      into :INSERTDT,:MSECS,:ENDFLAG,:ENDTEXT,:exever;

на

select first 1 d.insertdt, 1000, 1, '', 100
      from docs d where d.g$profile_id=:profile_id order by d.insertdt desc
      into :INSERTDT,:MSECS,:ENDFLAG,:ENDTEXT,:exever;