Отчетов, для отображения изменений. Вызов отчетов через «Генератор отчетов».
Учет дублируемости карт
Журнал отображения изменения кол-ва задублированных карт в общей базе
Дубли. Статистика
Количественные показатели по журналу ведения дубликатов карт, с возможность детализации по сотрудникам.
Для работы непосредственно с дубликатами карт возможно ознакомиться на странице
Триггер хеширования ФИО
CREATEORALTERTRIGGER CLIENTS_MISPRINT_BIU FOR CLIENTS
active BEFOREINSERTORUPDATEPOSITION0ASBEGINIF(EXISTS(SELECT*FROM REPL$GETACCESS WHERE REPL$ACCESS ='REPL'))THENBEGINSELECT astrip FROM strip_string_type(UPPER(NEW.LASTNAME),'UPPER_NOBUGLETTERS')INTONEW.PREPLASTNAME ;
SELECT astrip FROM strip_string_type(UPPER(NEW.FIRSTNAME),'UPPER_NOBUGLETTERS')INTONEW.PREPFIRSTNAME;
SELECT astrip FROM strip_string_type(UPPER(NEW.MIDNAME),'UPPER_NOBUGLETTERS')INTONEW.PREPMIDNAME ;
SELECT astrip FROM strip_string_type(UPPER(NEW.FULLNAME),'UPPER_NOBUGLETTERS')INTONEW.PREPFULLNAME ;
ENDEND
Триггер запуска проверки на дубликат
CREATEORALTERTRIGGERUSER$CLIENTS_CHECK_DUBLE FOR CLIENTS
active after INSERTORUPDATEPOSITION99ASBEGINIF(EXISTS(SELECT*FROM repl$getgrpid g JOIN filials f ON f.grpid=g.repl$grpid WHERE f.ismain=1))THENEXECUTEPROCEDUREUSER$clients_duble_set(NEW.pcode);
END
Процедура установки дубликатов
CREATEORALTERPROCEDUREUSER$CLIENTS_DUBLE_SET
(
INPCODE TYPEOFCOLUMN CLIENTS.PCODE
)ASDECLARE pcode INTEGER;
DECLARE cstatus_duble TYPEOFCOLUMN clients.cstatus;
DECLARE i INT;
BEGIN
cstatus_duble =994045364;
i =0;
FORSELECT pcode FROMUSER$clients_duble_find(:INPCODE)INTO :pcode do
BEGINUPDATE clients SET cstatus=994045364, modifydate =CURRENT_TIMESTAMPWHERE pcode = :pcode
ANDCOALESCE(cstatus,0) != :cstatus_duble;
i =1;
ENDIF(i =1)THENBEGINUPDATE clients SET cstatus=994045364, modifydate =CURRENT_TIMESTAMPWHERE pcode = :inpcode
ANDCOALESCE(cstatus,0) != :cstatus_duble;
ENDEND
Процедура поиска дубликатов
CREATEORALTERPROCEDUREUSER$CLIENTS_DUBLE_FIND
(
INPCODE TYPEOFCOLUMN CLIENTS.PCODE
)RETURNS(
PCODE TYPEOFCOLUMN CLIENTS.PCODE,
SEARCH_TYPE VARCHAR(16),
CUR_CSTATUS TYPEOFCOLUMN CLIENTS.CSTATUS
)ASBEGINIF(inpcode ISNULL)THEN
exit;
-- поиск по ФИО + др
search_type ='FIO+BDATE';
FORSELECT c.pcode, c.cstatus FROM clients p
LEFTJOIN clients c ON p.prepfullname=c.prepfullname AND p.bdate=c.bdate
WHERE p.pcode= :inpcode AND p.pcode!=c.pcode
AND c.bdate ISNOTNULLAND c.prepfullname ISNOTNULLINTO :pcode, :cur_cstatus do
BEGIN
suspend;
END-- поиск по документу
search_type ='PASP';
FORSELECT c.pcode, c.cstatus FROM clients p
LEFTJOIN clients c ON p.PASPTYPE=c.PASPTYPE
ANDUPPER(REPLACE(c.PASPSER||c.PASPNUM,' ',''))=UPPER(REPLACE(p.PASPSER||p.PASPNUM,' ',''))WHERE p.pcode= :inpcode AND p.pcode!=c.pcode
ANDUPPER(REPLACE(c.PASPSER||c.PASPNUM,' ','')) !=''INTO :pcode, :cur_cstatus do
BEGIN
suspend;
END-- поиск по ФИО + телефон
search_type ='FIO+PHONE';
FORSELECT c.pcode FROM clients p
LEFTJOIN clients c ON p.prepfullname=c.prepfullname
WHERE p.pcode= :inpcode AND p.pcode!=c.pcode
AND(p.phone1 IN(c.phone1, c.phone3)ANDCOALESCE(p.phone1,'')!=''OR
p.phone3 IN(c.phone1, c.phone3)ANDCOALESCE(p.phone3,'')!='')INTO :pcode do
BEGIN
suspend;
END-- поиск по др + телефон/*search_type = 'BDATE+PHONE';
for select c.pcode from clients p
left join clients c on p.bdate=c.bdate
where p.pcode= :inpcode and p.pcode!=c.pcode
and p.phone1 in (c.phone1, c.phone3)
and p.phone3 in (c.phone1, c.phone3)
into :pcode do
begin
suspend;
end*/-- поиск по ФИО + email
search_type ='FIO+EMAIL';
FORSELECT c.pcode, c.cstatus FROM clients p
LEFTJOIN clients c ON p.prepfullname=c.prepfullname
ANDUPPER(p.CLMAIL)=UPPER(c.CLMAIL)ANDUPPER(p.CLMAIL)!=''WHERE p.pcode= :inpcode AND p.pcode!=c.pcode
ANDPOSITION(' 'IN p.clmail)=0INTO :pcode, :cur_cstatus do
BEGIN
suspend;
END-- поиск по др + email
search_type ='EMAIL+BDATE';
FORSELECT c.pcode, c.cstatus FROM clients p
LEFTJOIN clients c ONUPPER(p.CLMAIL)=UPPER(c.CLMAIL)ANDUPPER(p.CLMAIL)!=''AND p.bdate=c.bdate
WHERE p.pcode= :inpcode AND p.pcode!=c.pcode
ANDPOSITION(' 'IN p.clmail)=0INTO :pcode, :cur_cstatus do
BEGIN
suspend;
ENDEND
Отчет "Учет дублируемости карт"
SELECT g.outdate wdate,
d.rekvint1 cnt_duble,CASEWHEN g.outdate>CURRENT_DATETHEN0ELSECOALESCE(d.rekvint1,0)-COALESCE(dd.rekvint1,0)END cnt_duble_r,
d.rekvint2 cnt_all,CASEWHEN g.outdate>CURRENT_DATETHEN0ELSECOALESCE(d.rekvint2,0)-COALESCE(dd.rekvint2,0)END cnt_all_r,CASEWHEN d.rekvint2 ISNULLTHENNULLELSE d.rekvint1*100.000/d.rekvint2 END cnt_duble_p
FROM getdate([bdate],[fdate]) g
LEFTJOIN dicinfo d ON d.refid=990005080AND d.bdate=g.outdate
LEFTJOIN dicinfo dd ON dd.refid=990005080AND dd.bdate=g.outdate-1
Отчет "Дубли. Статистика"
EXECUTE block
RETURNS(
yy INTEGER,
mm INTEGER,
wdate DATE,
dcode TYPEOFCOLUMN doctor.dcode,
dname TYPEOFCOLUMN doctor.dname,
cnt_add INTEGER,
cnt_out INTEGER)ASDECLARE bdate DATE;
DECLARE fdate DATE;
BEGIN
bdate =[bdate];
fdate =[fdate];
--
cnt_add =1;
cnt_out =NULL;
FOREXECUTE statement ('select adddate, adddcode from CL$DUBLE_JORNAL
where /*adddcode is not null and*/ adddate between ? and ? ')(bdate, fdate)ON external '192.168.2.10:meta'ASUSER'CHEA' password 'PDNTP'INTO wdate, dcode do
BEGIN
dname =NULL;
SELECT dname FROM doctor WHERE dcode= :dcode
INTO dname;
yy =EXTRACT(YEARFROM wdate);
mm =EXTRACT(MONTHFROM wdate);
suspend;
END--
cnt_add =NULL;
cnt_out =1;
FOREXECUTE statement ('select outdate, outdcode from CL$DUBLE_JORNAL
where outdcode is not null and outdate between ? and ? ')(bdate, fdate)ON external '192.168.2.10:meta'ASUSER'CHEA' password 'PDNTP'INTO wdate, dcode do
BEGINSELECT dname FROM doctor WHERE dcode= :dcode
INTO dname;
yy =EXTRACT(YEARFROM wdate);
mm =EXTRACT(MONTHFROM wdate);
suspend;
ENDEND