# # ITSV GmbH # CCDB - Command and Control Database # # FILE: dquerymfile_repLSWtopCF.txt # DESCRIPTION: DQUERY-Definition for CCDB-Query repLSWtopCF # this query reports the top Clearingfall-Rückfragecodes for one specific Lohnsoftware # VERSION: 1.4 # HISTORY: # Date | Version | Author | Description # -----------+---------+--------+----------------------------------------------- # 2019-XX-XX | 1.0 | WSC | Created # -----------+---------+--------+----------------------------------------------- # | 1.2 | WSC | restrict CF to "EXTERN" # -----------+---------+--------+----------------------------------------------- # 2020-10-22 | 1.3 | WSC | suppress MW2022,MW0120 as these are not sent to LSW # -----------+---------+--------+----------------------------------------------- # 2020-10-30 | 1.4 | WSC | options vondat, bisdat to narrow time range # -----------+---------+--------+----------------------------------------------- # 2022-01-07 | 1.5 | WSC | use SVCLLSWIDRFDATCOUNT to optimize performance # -----------+---------+--------+----------------------------------------------- # | | | # -----------+---------+--------+----------------------------------------------- # | | | # -----------+---------+--------+----------------------------------------------- # @querytitle Top-Clearingfall-Rückfragecodes für eine Lohnsoftware im STP-MVB @querydescription Listet die Clearingfall-Rückfragecodes aus CCMVBRFAUSW für eine Lohnsoftware (LSWID) in absteigender Häufigkeit @group SVCLMVBRFAUSWREPSTAT @attributenames LSWID:LSWID,showtechdetail:noyes:{{stdoptions}},vondat:string:{{vondatoptions}},bisdat:string:{{bisdatoptions}} @stdoptions { labeltext: "Technische Detailerklärung", typedesc: "Bei Ja werden technische Erklärungen zur Ermittlung der Daten mit ausgegeben. Solche Berichte dürfen NUR INNERHALB DER SV verwendet werden!", is_optional: true, default: "N" } @vondatoptions { labeltext: "Beginndatum", typedesc: "Frühestes Datum, von dem Meldungen in der Auswertung berücksichtigt werden, in der Form YYYYMMDD", is_optional: true, default: "20180101" } @bisdatoptions { labeltext: "Endedatum", typedesc: "Spätestes Datum, von dem Meldungen in der Auswertung berücksichtigt werden, in der Form YYYYMMDD", is_optional: true, default: "29991231" } @querytype function @function seqtrans.seqtrans @sql_select select LSWID,LSWHID,LSWATTRIBS from SVCLRWLSW where LSWID=::LSWID:: @formpagetitle Lohnsoftware für Top-Clearingfall-Auswertung auswählen @init.qexpression if (this.query.hasOwnProperty("showtechdetail")) { this.query.showtechdetail = aux.boolFromString(this.query.showtechdetail); } else { this.query.showtechdetail = false; } ~query.tsteps # # <>: initialize # if (this.init_done) goto init_complete # # 1: initialize: setup reporting text flow # qexpression proc: { copycvars(this,"LSWID,LSWHID,LSWATTRIBS"); if (this.query.vondat) { this.vondat = this.query.vondat; } else { this.vondat = "20180101"; } if (this.query.bisdat) { this.bisdat = this.query.bisdat; } else { this.bisdat = "29991231"; } this.ftd = function(htext) { return "
\r\n

Technische Details

\r\n

\r\n"+htext+"\r\n

" }; this.init_done = true; } # # <>: check if LSWID is known # init_complete: pre_qexpression this.lswattributes = aux.txtObjDecode(this.LSWATTRIBS); sql select * from SVCLRWLSW where LSWID=::LSWID:: named_params LSWID result_varname lswres post_qexpression if (this.lswres.getRowCount()<1) { this.errcoll.collect(null,"LSWID "+this.LSWID+" is not known in RW SVCLRWLSW"); } # # <>: get records for the LSW in a working table # pre_qexpression this.temptabname = "TOPCF_TEMP_"+aux.syncUniqueNowID(); if (this.lswattributes.mvbrfausw_select) { this.tempselsql = "create table " + this.temptabname + " as "+this.lswattributes.mvbrfausw_select; } else { this.tempselsql = "create table " + this.temptabname + " as select * from SVCLLSWIDRFDATCOUNT where "+ "LSWID='"+this.LSWID+"' and RUECKFRAGETYPCODE!='MW2022' and RUECKFRAGETYPCODE!='MW0120' and "+ "DOKDATNUM between '"+this.vondat+"' and '"+this.bisdat+"'"; } sql @@tempselsql@@ introtext

Diese Auswertung beinhaltet Daten eines begrenzten Zeitraums. Dieser ist untenstehend aufgeführt

Es sind in dieser Auswertung noch nicht alle Texte zu den Rückfrage-Codes formalisiert aufgelöst. Wir arbeiten daran, alle formalisiert auflösen zu können. In der Zwischenzeit werden in der Spalte für den Text Beispiele angegeben.

techdetail

Software-Informationen

Version1.5
Ausgabedatum07.01.2022
Historie
28.10.2019Einschränkung auf EXTERN_JN='J' bei Rückfragen
22.10.2020Ausfilterung der Rückfragecodes MW2022 und MW0120, da diese nicht als externe Clearingfälle erzeugt werden
07.01.2022Performance-Optimierung für große Anzahl von Datensätzen in CCMVBRFAUSW

Alle Basisdaten werden in der Tabelle CCMVBRFAUSW gespeichert und von dort aus verwendet.

Die Basisdaten werden täglich aus den am Ende der STP-MVB TEV laufenden Auswertungen_MeldungenClearingfaelle entnommen. Diese erzeugen eine Datei pro Tag und pro Träger. Eine solche Datei hat einen Zeitstempel, der den Durchführungszeitpunkt angibt. Dieser liegt im Zeitraum der TEV-Durchführung und kann daher am Abend eines Tages oder dem Morgen des Folgetages liegen.

Die Einträge werden mit

  • dem MST-Code des Trägers,
  • dem Durchführungszeitstempel und
  • der ID der Lohnsoftware, die den Eingangs-Meldungsbestand geliefert hat
ergänzt.

Die ID der Lohnsoftware (LSWID) wird auf Basis des Datenfelds SOID im Auswertungs-Datensatz folgendermaßen ermittelt:

  1. existiert im Regelwerk SVCLRWSOID ein Eintrag mit der SOID des Datensatzes, dann wird die dort gespeicherte LSWID herangezogen:
    1. Die so ermittelte LSWID wird als LSWID im Datensatz aufgenommen
    2. existiert keine passende SOID, dann werden alle Einträge im Regelwerk SVCLRWLSW durchgegangen, die ein Attribut soidrex haben:
      1. Das Attribut soidrex enthält eine Regular Expression, gegen die die SOID geprüft wird
    3. Ergibt die soidrex eine Übereinstimmung, so wird angenommen, dass die Lohnsoftware des SVCLRWLSW-Eintrags gemeint war (eventuell eine andere Version)
      1. Die SOID des Datensatzes wird mit der ermittelten LSWID in das Regelwerk SVCLRWSOID aufgenommen.
      2. Die ermittelte LSWID wird als LSWID im Datensatz aufgenommen
    4. Ergibt die soidrex keine Übereinstimmung, so wird angenommen, dass eine neue, noch nicht bekannte Lohnsoftware vorliegt:
      1. Es wird eine neue, eindeutige LSWID LSW_<uniqueID>: erzeugt und als neuer Eintrag im Regelwerk SVCLRWLSW angelegt
      2. Die SOID des Datensatzes wird mit der ermittelten LSWID in das Regelwerk SVCLRWSOID aufgenommen.
      3. Die ermittelte LSWID wird als LSWID im Datensatz aufgenommen

    Beim Verarbeiten der MVB-Auswertungen werden auch in der Tabelle SVCLLSWIDRFDATCOUNT Zähler zu Rückfragen pro LSWID, Erzeugungsdatum und Rückfragetyp-Code geführt

    Diese Zähler werden in dieser Auswertung zur Ermittlung der Zahl der Rückfragen pro Rückfragetyp-Code im betrachteten Zeitraum herangezogen

    post_qexpression ppush(this,{type: 'html', htext: this.tstep.introtext}); if (this.tstep.techdetail && this.query.showtechdetail) { ppush(this,{type: 'html', htext: this.ftd(this.tstep.techdetail)}); } # # <>: get range # sql select 'Datumsbereich Meldungen von' as "Bereich",MIN(DOKDATNUM) as "Wert" from @@temptabname@@ UNION select 'Datumsbereich Meldungen bis', MAX(DOKDATNUM) from @@temptabname@@ UNION select 'Anzahl Rückfragen im Zeitraum', SUM(RFCOUNT) from @@temptabname@@ where RUECKFRAGETYPCODE!='' result_varname rangeres description
    • Datumsbereich Meldungen: dies ist der Zeitraum, aus dem Meldungen in die Auswertung herangezogen wurden. Dieser kann auch groß sein, da Rückfragen zu weit zurückliegenden Meldungen entstehen können.
    • Anzahl Rückfragen im Zeitraum: Das ist die Anzahl der Rückfragen in den Clearingfällen. Ein Clearingfall kann eine oder mehrere Rückfragen enthalten
    techdetail
    • Der Datumbereich der Meldungen wird aus den DOKDATNUM Eigenschaften der Datensätze ermittelt.
    • Anzahl der Rückfragen sind die Anzahl der Rückfragen aus mit nicht-leerem RUECKFRAGETYPCODE aus dem Betrachtungszeitraum
    • Rückfragen werden nur berücksichtigt, wenn sie extern sind (EXTERN_JN=J)
    post_qexpression this.rangeres.title = "Betrachtete Bereiche"; this.rangeres.description = this.tstep.description; if (this.tstep.techdetail && this.query.showtechdetail) this.rangeres.description += this.ftd(this.tstep.techdetail); ppush(this,{ type: 'result', result: this.rangeres }); # # <>: list SOIDs used # sql_old_014 select distinct SOID from @@temptabname@@ where SOID is not null and SOID!='' sql select distinct rfc.LSWID, lsw.*, soid.* from @@temptabname@@ rfc join svclrwlsw lsw on lsw.LSWID=rfc.LSWID join svclrwsoid soid on soid.LSWID = lsw.LSWID order by lsw.LSWID asc result_varname soidres post_qexpression if (this.soidres.getRowCount()>0) { this.soidres.title = "erkannte Software-ID(SOID)-Werte zur Berücksichtigung"; this.soidres.description = "In dieser Liste sind alle Werte aufgeführt, die in Meldungen im Datenfeld \"SOID\" übermittelt wurden, nicht leer sind "+ "und als zur Lohnsoftware \""+this.LSWID+"\" gehörig erkannt wurden"; if (this.lswattributes.mvbrfausw_select) { this.soidres.description += '

    Die Auswahl der Rückfragen ist für diese Lohnsoftware besonders und beinhaltet nicht nur SOID

    '; } if (this.tstep.techdetail && this.query.showtechdetail) this.soidres.description += this.ftd(this.tstep.techdetail); ppush(this,{type: 'result', result: this.soidres }); } else { ppush(this,"Die Auswahl der Daten für diese Auswertung wurde nicht auf Grund der SOID vorgenommen"); if (this.lswattributes.ident_qexpression) { ppush(this,"Die logische Bedingung für die Auswahl der Datensätze für die Lohnsoftware \""+this.LSWID+"\" ist: \""+this.lswattributes.ident_qexpression+"\""); } if (this.lswattributes.mvbrfausw_select) { ppush(this,"Die Auswahl der Datensätze ist für diese Lohnsoftware besonders und beinhaltet nicht nur SOID"); } } # # <>: get TOP RF along with descriptive data from SVCLRWRFCMX - for all types with more than 10 occurences # gosub gentopres params.minrfcount 10 # # <>: if not much data, report ALL counts # if (this.topres.getRowCount()>5) goto got_top # # <>: get TOP RF along with descriptive data from SVCLRWRFCMX - FOR ALL counts # gosub gentopres params.minrfcount 0 # # <>: drop temporary table # got_top: sql drop table @@temptabname@@ # # <>: title the protocol, seqtrans will produce a result from it # qexpression this.protocol.title = 'Top-Clearingfälle für Lohnsoftware "'+this.LSWID+'"'; # # <>: end of processing sequence # end # # ============================================================================== # SUBROUTINES # ============================================================================== # # ------------------------------------------------------------------------------ # # SUBROUTINE: gentopres # INPUT: minrfcount - minimum count of occurences for a RUCKFRAGETYPCODE to be included in report # DESCRIPTION: generate a report result about the top RF counts for the LSWID # # <>: # gentopres: pre_qexpression this.local.minrfcount = this.local.params.minrfcount; sql_old_014 select RUECKFRAGETYPCODE,COUNT(RUECKFRAGETYPCODE) as ANZAHL_RUECKFRAGEN, (CASE WHEN rfc.RUECKFRAGETEXT is not null THEN rfc.RUECKFRAGETEXT ELSE CONCAT('Beispiel: ',(select RUECKFRAGETEXTGESAMTSABE from CCMVBRFAUSW where RUECKFRAGETYPCODE=aw.RUECKFRAGETYPCODE LIMIT 1)) END) as TEXT_DER_RUECKFRAGE, (CASE WHEN rfc.VARIABLEFELDER is null THEN '-----' WHEN rfc.VARIABLEFELDER='' THEN '-----' ELSE rfc.VARIABLEFELDER END) as VARIABLE_FELDER from @@temptabname@@ aw left outer join SVCLRWRFC rfc on rfc.CODE = aw.RUECKFRAGETYPCODE where (RUECKFRAGETYPCODE is not null and RUECKFRAGETYPCODE!='') and EXTERN_JN='J' group by RUECKFRAGETYPCODE, rfc.RUECKFRAGETEXT, rfc.VARIABLEFELDER having COUNT(RUECKFRAGETYPCODE)>@@minrfcount@@ order by count(RUECKFRAGETYPCODE) desc -- ---------------------------------------------------------- sql select LSWID,RUECKFRAGETYPCODE,SUM(RFCOUNT) as ANZAHL_RUECKFRAGEN, (CASE WHEN rfc.RUECKFRAGETEXT is not null and rfc.RUECKFRAGETEXT!='' THEN rfc.RUECKFRAGETEXT WHEN rfc.BEISPIELTEXT is not null and rfc.BEISPIELTEXT!='' THEN CONCAT('Beispiel: ',rfc.BEISPIELTEXT) ELSE '-----' END) as TEXT_DER_RUECKFRAGE, (CASE WHEN rfc.VARIABLEFELDER is null THEN '-----' WHEN rfc.VARIABLEFELDER='' THEN '-----' ELSE rfc.VARIABLEFELDER END) as VARIABLE_FELDER from @@temptabname@@ aw left outer join SVCLRWRFCMX rfc on rfc.CODE = aw.RUECKFRAGETYPCODE where (RUECKFRAGETYPCODE is not null and ((RUECKFRAGETYPCODE!='') and (RUECKFRAGETYPCODE!='MW2022') and (RUECKFRAGETYPCODE!='MW0120'))) group by LSWID, RUECKFRAGETYPCODE, TEXT_DER_RUECKFRAGE, VARIABLE_FELDER having ANZAHL_RUECKFRAGEN>@@minrfcount@@ order by ANZAHL_RUECKFRAGEN desc named_params LSWID result_varname topres toptext Diese Aufstellung beinhaltet alle SV-externen Rückfragetypen, die in Clearingfällen im Betrachtungszeitraum vorkommen techdetail
    • Die Abfrage zählt Rückfragen (=Zähler in SVCLLSWIDRFDATCOUNT) zu einer bestimmten Lohnsoftware, ungeachtet ihrer Zugehörigkeit zu Meldungen.
    • Gezählt wird über den gesamten Datenbestand von SVCLLSWIDRFDATCOUNT, eingeschränkt auf den ausgewählten Zeitraum.
    • Es werden nur Ergebnisse aufgenommen, die mehr als @@minrfcount@@ Rückfragen des Typs haben
    • Gezählt in SVCLLSWIDRFDATCOUNT werden nur externe Rückfragen (EXTERN_JN='J')
    • Rückfragen mit Typcodes MW2022 und MW0120 sind ausgenommen, da sie ungeachtet von EXTERN_JNnicht als externe Clearingfälle erzeugt werden
    • Die Ergebnisse werden absteigend nach Anzahl der vorgekommenen Rückfragen des Typs sortiert.
    post_qexpression proc: { let vfcn = this.topres.findColumn("VARIABLE_FELDER"); let rtcn = this.topres.findColumn("TEXT_DER_RUECKFRAGE"); if ( /* (vfcn<0) || */ (rtcn<0)) { this.errcoll.collect(null,"topres does not have the correct columns",{topres: topres, vfcn: vfcn, rtcn: rtcn}); break proc; } if (vfcn>=0) { let vf; for (let ri=0; ri"); /* convert newlines to HTML line breaks */ this.topres.setCellValue(ri,vfcn,vf); } } this.topres.title = "Häufigste Rückfragecodes"; if (this.tstep.toptext) this.topres.toptext = this.tstep.toptext; if (this.tstep.techdetail && this.query.showtechdetail) this.topres.toptext += this.ftd(this.tstep.techdetail); if (this.topres.getRowCount()>5) { this.ppush({ type: 'result', result: this.topres }); } else { this.ppush('Zu wenige Rückfragetypen (<=5), die im Betrachtungszeitraum mehr als '+this.local.minrfcount+' Mal vorkommen'); } } then_return