Queue look — различия между версиями
Материал из wiki.standart-n.ru
Aleksnick (обсуждение | вклад) (→Создаем процедуру UTPR_QUEUE_LOOK) |
Aleksnick (обсуждение | вклад) (→Создаем процедуру UTPR_QUEUE_LOOK) |
||
| Строка 58: | Строка 58: | ||
as | as | ||
begin | begin | ||
| − | for select id, caption||' ('||DBSECUREKEY||')' from g$profiles where status=0 and caption is not null and id not in (0) and DBSECUREKEY is not null into :profile_id,:sprofile do | + | 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 |
begin | begin | ||
cmnt='-'; EXEVER=0;INSERTDT='01.01.2000'; ENDFLAG=0;ENDTEXT=''; | cmnt='-'; EXEVER=0;INSERTDT='01.01.2000'; ENDFLAG=0;ENDTEXT=''; | ||
Версия 20:02, 31 марта 2016
Инструкция о том, как настроить страницу, которая будет показывать проблемные точки с синхронизацией.
Скрипты, которые написаны ниже, нужно выполнять на серверной базе.
Содержание
Создаем процедуру 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
/*
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;
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)
as
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
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 order by id desc
into :INSERTDT,:MSECS,:ENDFLAG,:ENDTEXT,:exever;
cmnt='';
if (: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
cmnt=cmnt || 'Ошибка загрузки пакета! ';
if (endflag=1 and (datediff(hour,insertdt,current_timestamp)>1)) then
begin
if (datediff(day,insertdt,current_timestamp)>0) then
cmnt=cmnt || 'Уже больше суток нИ слухом нИ духом!! ';
else
cmnt=cmnt || 'Не на связи больше часа! ';
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$PROFILES 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;
/* 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 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++;
echo "<tr>";
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>";
?>
Дополнительно
Отображение расхождений в базе
Создаем процедуры в базе
Устанавливаем процедуру для сводной базы из статьи Дублирование_чека.
Делаем назначенное задание
Каждую ночь запускаем процедуру 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>";
?>
Возможные проблемы
Нет поля status в таблице g$profiles
Тогда нужно добавить это поле в этой базе и отправить всем по g$tasks
ALTER TABLE G$PROFILES ADD STATUS DM_STATUS
--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;