Реестр страховой по счету

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

CREATE OR ALTER PROCEDURE SDSYS$JACCREPORT
(
  SCHNUM TYPE OF COLUMN JACCOUNTS.SCHNUM,
  REPTYPE INTEGER = 0,
  APCODE TYPE OF COLUMN CLIENTS.PCODE = NULL
)
RETURNS
(
  ROWNUM TICODE,
  CLIENTNUM TICODE,
  ISFIRSTROWBYCLIENT TICODE,
  HISTID TYPE OF COLUMN JPPAYMENTS.HISTID,
  TREATCODE TYPE OF COLUMN JPPAYMENTS.TREATCODE,
  DCODE TYPE OF COLUMN JPPAYMENTS.DCODE,
  DEPNUM TYPE OF COLUMN DEPARTMENTS.DEPNUM,
  DEPNAME TYPE OF COLUMN DEPARTMENTS.DEPNAME,
  SORTORDER TYPE OF COLUMN TREATSCH.SCHNUM,
  PMDATE TYPE OF COLUMN JPPAYMENTS.PMDATE,
  NSP TYPE OF COLUMN JPPAYMENTS.NSP,
  HISTNUM TYPE OF COLUMN JPPAYMENTS.HISTNUM,
  FILIAL TYPE OF COLUMN JPPAYMENTS.FILIAL,
  FULLNAME TYPE OF COLUMN CLIENTS.FULLNAME,
  FIRSTNAME TYPE OF COLUMN CLIENTS.FIRSTNAME,
  MIDNAME TYPE OF COLUMN CLIENTS.MIDNAME,
  LASTNAME TYPE OF COLUMN CLIENTS.LASTNAME,
  BDATE TYPE OF COLUMN CLIENTS.BDATE,
  PCODE TYPE OF COLUMN CLIENTS.PCODE,
  DATEENTER TYPE OF COLUMN CLIENTS.DATEENTER,
  DATEEXIT TYPE OF COLUMN CLIENTS.DATEEXIT,
  DNAME TYPE OF COLUMN DOCTOR.DNAME,
  SCHID TYPE OF COLUMN WSCHEMA.SCHID,
  KODOPER TYPE OF COLUMN WSCHEMA.KODOPER,
  SCHNAME TYPE OF COLUMN WSCHEMA.SCHNAME,
  SCOUNT TYPE OF COLUMN JPAYMDET.SCOUNT,
  AMOUNTRUB TYPE OF COLUMN JPAYMDET.AMOUNTRUB,
  AMOUNTRUB_A TYPE OF COLUMN JPAYMDET.AMOUNTRUB_A,
  ROUNDRUB_A TYPE OF COLUMN JPAYMDET.ROUNDRUB,
  ROUNDRUB TYPE OF COLUMN JPAYMDET.ROUNDRUB,
  REALCOUNT TYPE OF COLUMN JPAYMDET.REALCOUNT,
  TOOTHCODE TYPE OF COLUMN JPAYMDET.TOOTHCODE,
  DGNAME TYPE OF COLUMN DIAGNOSIS.DGNAME,
  MKBCODE TYPE OF COLUMN DIAGNOSIS.MKBCODE,
  WORKPLACE TYPE OF COLUMN DICINFO.SIMPLENAME,
  MKBCODES TTEXT16K,
  IS_FIRST_DIAG TSMALLCODE,
  SERVCOUNT_BY_CLIENT TYPE OF COLUMN JPAYMDET.REALCOUNT,
  TOTAL_BY_CLIENT TYPE OF COLUMN JPAYMDET.ROUNDRUB
)
AS
DECLARE histid_buf TYPE OF COLUMN jppayments.histid;
DECLARE treatcode_buf TYPE OF COLUMN jppayments.treatcode;
DECLARE dcode_buf TYPE OF COLUMN JPPAYMENTS.dcode;
DECLARE sortorder_buf TYPE OF COLUMN treatsch.schnum;
DECLARE pmdate_buf TYPE OF COLUMN jppayments.pmdate;
DECLARE depnum_buf TYPE OF COLUMN departments.depnum;
DECLARE depname_buf TYPE OF COLUMN departments.depname;
DECLARE nsp_buf TYPE OF COLUMN jppayments.nsp;
DECLARE histnum_buf TYPE OF COLUMN jppayments.histnum;
DECLARE filial_buf TYPE OF COLUMN jppayments.filial;
DECLARE fullname_buf TYPE OF COLUMN clients.fullname;
DECLARE firstname_buf TYPE OF COLUMN clients.firstname;
DECLARE midname_buf TYPE OF COLUMN clients.midname;
DECLARE lastname_buf TYPE OF COLUMN clients.lastname;
DECLARE bdate_buf TYPE OF COLUMN clients.bdate;
DECLARE pcode_buf TYPE OF COLUMN clients.pcode;
DECLARE dateenter_buf TYPE OF COLUMN clients.dateenter;
DECLARE dateexit_buf TYPE OF COLUMN clients.dateexit;
DECLARE dname_buf TYPE OF COLUMN doctor.dname;
DECLARE schid_buf TYPE OF COLUMN wschema.schid;
DECLARE kodoper_buf TYPE OF COLUMN wschema.kodoper;
DECLARE schname_buf TYPE OF COLUMN wschema.schname;
DECLARE scount_buf TYPE OF COLUMN jpaymdet.scount;
DECLARE amountrub_buf TYPE OF COLUMN jpaymdet.amountrub;
DECLARE amountrub_a_buf TYPE OF COLUMN jpaymdet.amountrub_a;
DECLARE roundrub_a_buf TYPE OF COLUMN jpaymdet.roundrub;
DECLARE roundrub_buf TYPE OF COLUMN jpaymdet.roundrub;
DECLARE realcount_buf TYPE OF COLUMN jpaymdet.realcount;
DECLARE toothcode_buf TYPE OF COLUMN jpaymdet.toothcode;
DECLARE dgname_buf TYPE OF COLUMN diagnosis.dgname;
DECLARE mkbcode_buf TYPE OF COLUMN diagnosis.mkbcode;
DECLARE workplace_buf TYPE OF COLUMN dicinfo.simplename;
DECLARE mkbcodes_buf ttext16k;
DECLARE total_by_client_buf TYPE OF COLUMN jpaymdet.roundrub;
DECLARE servcount_by_client_buf TYPE OF COLUMN jpaymdet.realcount;
DECLARE prev_pcode TYPE OF COLUMN clients.pcode;
DECLARE total_by_client_accum TYPE OF COLUMN jpaymdet.roundrub;
DECLARE servcount_by_client_accum TYPE OF COLUMN jpaymdet.realcount;
DECLARE is_first_row ticode;
DECLARE dgcode_buf TYPE OF COLUMN jpaymdet.dgcode;
DECLARE diaglist_by_client ttext32k;
DECLARE is_next_client tsmallcode;
BEGIN
  total_by_client_accum = 0;
  servcount_by_client_accum = 0;
  is_first_row = 1;
  isfirstrowbyclient = 1;
  clientnum = 0;
  is_next_client = 0;
  rownum = 0;
  diaglist_by_client = ',';
 
  FOR SELECT (SELECT FIRST 1 ts.schnum FROM treatsch ts WHERE ts.treatcode = jd.treatcode AND ts.schid = jd.schid) sortorder,
             jd.treatcode, jd.dcode, t.depnum, dep.depname,
             t.treatdate pmdate,
             (SELECT list(DISTINCT Jj.NSP) FROM jppayments jj INNER JOIN jacclink jjl ON jj.treatcode=jjl.treatcode
               WHERE jjl.accid = :schnum AND jj.pcode = jd.pcode) nsp,
             c.histnum, c.fullname, c.firstname, c.midname, c.lastname, c.bdate, d.dname, c.pcode, c.dateenter,
             c.dateexit, w.schid,
             CASE WHEN POSITION('-', w.kodoper)>0 THEN SUBSTRING(w.kodoper FROM 1 FOR POSITION('-', w.kodoper)-1) ELSE w.kodoper END kodoper, 
             COALESCE(NULLIF(w.texttoorder,''), w.schname) schname,
             jd.scount, jd.amountrub,jd.amountrub_a, (jd.amountrub_a*jd.scount) roundrub_a,
             jd.roundrub, jd.realcount,
             jd.dgcode, COALESCE(dgc.mkbcode, dgj.mkbcode, dg.mkbcode, dgt.mkbcode), 
             COALESCE(dgc.dgname, dgj.dgname, dg.dgname, dgt.dgname), jd.filial,
             (SELECT list(dg2.mkbcode, ';;') FROM diagclients dc LEFT JOIN diagnosis dg2 ON dg2.dgcode = dc.dgcode
               WHERE dc.objcode = jd.treatcode AND dc.objtype = 1) mkbcodes,
             iif(jd.toothcode > 0, jd.toothcode, NULL) toothcode,
             dic.simplename workplace
        FROM jpaymdet jd
       INNER JOIN treatsch ts ON jd.treatcode = ts.treatcode AND jd.schid = ts.schid AND jd.schnum = ts.schnum AND COALESCE(ts.complex_schid,0) = 0
       INNER JOIN wschema w ON jd.schid = w.schid
       INNER JOIN jacclink jl ON jd.treatcode=jl.treatcode
        LEFT JOIN Treat T ON Jd.TreatCode = T.TreatCode
        LEFT JOIN doctor d ON t.dcode = d.dcode
        LEFT JOIN clients c ON jd.pcode = c.pcode
        LEFT JOIN diagclients dgcl ON dgcl.objtype=1
                                  AND dgcl.objcode=t.treatcode
                                  AND dgcl.organid=jd.toothcode
                                  AND dgcl.dgtypecode=1
        LEFT JOIN diagnosis dgc ON dgc.dgcode = dgcl.dgcode
        LEFT JOIN diagnosis dg ON dg.dgcode = jd.dgcode
        LEFT JOIN diagnosis dgj ON dgj.dgcode = jd.dgcode
        LEFT JOIN DIAGNOSIS dgt ON t.dgcode = dgt.dgcode
        LEFT JOIN dicinfo dic ON c.workplaceid = dic.dicid AND dic.refid = 53
        LEFT JOIN departments dep ON dep.depnum = t.depnum
        LEFT JOIN speciality spec ON w.speccode = spec.scode
       WHERE jl.accid = :schnum AND (jd.pcode IS NOT NULL) AND (:apcode IS NULL OR jd.pcode = :apcode)
         AND ( :REPTYPE = 0 OR spec.razdel= :REPTYPE OR w.speccode = :REPTYPE -3)
       ORDER BY c.fullname, c.pcode, t.treatdate,jd.treatcode,sortorder
  INTO sortorder_buf, treatcode_buf, dcode_buf, depnum_buf, depname_buf, pmdate_buf, nsp_buf, histnum_buf, fullname_buf,
       firstname_buf, midname_buf, lastname_buf, bdate_buf, dname_buf, pcode_buf, dateenter_buf, dateexit_buf, schid_buf, 
       kodoper_buf, schname_buf, scount_buf, amountrub_buf, amountrub_a_buf, roundrub_a_buf, roundrub_buf,  realcount_buf, 
       dgcode_buf, mkbcode_buf, dgname_buf, filial_buf, mkbcodes_buf, toothcode_buf, workplace_buf do
  BEGIN
    IF (is_first_row = 1) THEN
      prev_pcode = pcode_buf;
 
    IF (prev_pcode <> pcode_buf) THEN
    BEGIN
      is_next_client = 1;
      diaglist_by_client = ',';
      total_by_client = total_by_client_accum;
      total_by_client_accum = roundrub_buf;
 
      servcount_by_client = servcount_by_client_accum;
      servcount_by_client_accum = realcount_buf;
 
      prev_pcode = pcode_buf;
    END
    ELSE
    BEGIN
      total_by_client_accum = total_by_client_accum + roundrub_a_buf;
      servcount_by_client_accum = servcount_by_client_accum + realcount_buf;
      --suspend;
    END
 
    IF (is_first_row = 0) THEN
    BEGIN
      suspend;
      isfirstrowbyclient = 0;
    END
    ELSE
    BEGIN
      is_first_row = 0;
    END
 
    rownum = rownum + 1;
 
    treatcode = treatcode_buf;
    dcode = dcode_buf;
    depnum = depnum_buf;
    depname = depname_buf;
    sortorder = sortorder_buf;
    pmdate = pmdate_buf;
    nsp = nsp_buf;
    histnum = histnum_buf;
    filial = filial_buf;
    fullname = fullname_buf;
    firstname = firstname_buf;
    midname = midname_buf;
    lastname = lastname_buf;
    bdate = bdate_buf;
    pcode = pcode_buf;
    dateenter = dateenter_buf;
    dateexit = dateexit_buf;
    dname = dname_buf;
    schid = schid_buf;
    kodoper = kodoper_buf;
    schname = schname_buf;
    scount = scount_buf;
    amountrub = amountrub_buf;
    amountrub_a = amountrub_a_buf;
    roundrub_a = roundrub_a_buf;
    roundrub = roundrub_buf;
    realcount = realcount_buf;
    toothcode = toothcode_buf;
    dgname = dgname_buf;
    mkbcode = mkbcode_buf;
    workplace = workplace_buf;
    mkbcodes = mkbcodes_buf;
 
    total_by_client = NULL;
    servcount_by_client = NULL;
 
    IF (diaglist_by_client containing ',' || :dgcode_buf || ',' OR :dgcode_buf IS NULL) THEN
    BEGIN
      is_first_diag = 0;
    END 
    ELSE
    BEGIN
      diaglist_by_client = diaglist_by_client || :dgcode_buf || ',';
      is_first_diag = 1;
    END
    --if (rownum > 13) then
    --  exception error diaglist_by_client || dgcode_buf ;
 
    IF (is_next_client = 1) THEN
    BEGIN
      isfirstrowbyclient = 1;
      is_next_client = 0;
      clientnum = clientnum + 1;
    END
    ELSE
      IF (rownum > 1) THEN
        isfirstrowbyclient = 0;
 
    is_first_row = 0;
  END
  total_by_client = total_by_client_accum;
  servcount_by_client = servcount_by_client_accum;
  suspend;
END

расширенная.настройка/страховые/реестр.страховой.по.счету.txt · Последние изменения: 2019/07/06 14:58 (внешнее изменение)