import com.dvelop.d3.server.Document import com.dvelop.d3.server.core.D3Interface import com.dvelop.d3.server.exceptions.SQLException import com.dvelop.d3.server.exceptions.D3Exception import groovy.transform.Field D3Interface d3 = getProperty("d3"); @Field prg = "KLEE_werte_loeschen.groovy"; @Field version = "0.1"; @Field kunde = "Dr. Kleeberg & Partner GmbH"; ///////////////////////////////////////////////////////////////////////// // Dieses Skript erwartet eine folgendermaßen definierte Tabelle in der d.3-Repositorydatenbank: // create table dv_akten_loesen (id varchar(10), doku_id varchar(12), status varchar(15) ); // In dieser Tabelle wird festgehalten, welche Dokumente bereits bearbeitet wurden, damit sie bei einem erneuten Skript-Lauf nicht erneut bearbeitet werden // debug = 0 => es finden Änderungen am Datenbestand statt // debug = 1 => es finden keine Änderungen am Datenbestand statt @Field debug = 0; // zu bearbeitende Dokumentart (Kürzel) @Field dokumentart = "DDAUE"; // Dokumentbereich untere Grenze: @Field doku_id_von = "T000543579" // Dokumentbereich obere Grenze: @Field doku_id_bis = "T000543591" ///////////////////////////////////////////////////////////////////////// def debugtext; switch (debug) { case 0: debugtext = "ausgeschaltet"; break; default: debugtext = "eingeschaltet (keine Aenderungen am Datenbestand)"; break; } xlog( d3, 4, "************************************************" ); xlog( d3, 4, "* Programm : " + prg ); xlog( d3, 4, "* Version : " + version ); xlog( d3, 4, "* Kunde : " + kunde ); xlog( d3, 4, "* geschrieben von : calb / d.velop AG" ); xlog( d3, 4, "* (c) d.velop AG" ); xlog( d3, 4, "************************************************" ); xlog( d3, 4, "Parameter: " ); xlog( d3, 4, "* DEBUG : " + debugtext ); xlog( d3, 4, "* Dokumentart : " + dokumentart ); xlog( d3, 4, "* Dokumentbereich von : " + doku_id_von ); xlog( d3, 4, "* Dokumentbereich bis : " + doku_id_bis ); xlog( d3, 4, "************************************************" ); def sqlQuery = "select top 99999 doku_id from firmen_spezifisch where kue_dokuart = '" + dokumentart + "' and doku_id >= '" + doku_id_von + "' and doku_id <= '" + doku_id_bis + "' and doku_id not in (select doku_id from dv_akten_loesen)"; resultRows = d3.sql.executeAndGet( (String) sqlQuery ); if ( resultRows.size() > 0 ) { xlog( d3, 4, " Es wurden " + resultRows.size() + " Treffer gefunden." ); xlog( d3, 4, "************************************************" ); def j; def sqlStatement = ""; def dokStatus = ""; def anzahl; for ( i = 0; i < resultRows.size(); i++ ) { j = i + 1; xlog( d3, 4, String.format( "%05d", j ) + "/" + resultRows[ i ].doku_id + ": bearbeite Doku-ID " + resultRows[ i ].doku_id ); // Prüfung, ob überhaupt etwas zu tun ist // zu tun ist etwas, wenn ein Dokument mehr als einen Eintrag in den 60er-Feldern hat. sqlStatement = "select * from firm_spez_mult_val where doku_id = '" + resultRows[ i ].doku_id + "' and field_no = 60 and value_char is not null "; anzahl = d3.sql.executeAndGet( (String) sqlStatement ); if ( anzahl.size() > 1 ) { def ueberdoks = d3.call.link_get_parents( resultRows[ i ].doku_id, "Master" ); def ziel_dok_ids = ""; if ( ueberdoks.size() > 0 ) { ueberdoks.each { xlog( d3, 4, String.format( "%05d", j ) + "/" + resultRows[ i ].doku_id + ": Kind: " + resultRows[ i ].doku_id + ", gefundenes Elternelement: " + it ); ziel_dok_ids = ziel_dok_ids + "'" + it + "',"; } ziel_dok_ids = ziel_dok_ids.substring( 0, ziel_dok_ids.length( ) - 1 ); xlog( d3, 4, String.format( "%05d", j ) + "/" + resultRows[ i ].doku_id + ": Elternelemente: " + ziel_dok_ids ); def STATEMENT = "select dok_dat_feld_1, dok_dat_feld_2, dok_dat_feld_10, dok_dat_feld_13, dok_dat_feld_21 from firmen_spezifisch where doku_id in ( " + ziel_dok_ids + " ) "; def resultRows2 = d3.sql.executeAndGet( STATEMENT ); // Schreiben der Verknüpfungen an das Dokument: def currentDoc = d3.archive.getDocument( resultRows[ i ].doku_id ); // Vor dem Leeren der Felder werden diese nochmal aufgelistet: def meld_anz = true; for ( int k = 1 ; k <= Integer.valueOf( d3.config.value( "CUR_60ER_FIELD_NR" ) ); k++ ) { if ( ( (currentDoc.field[ 60 ][ k ]) || (currentDoc.field[ 61 ][ k ]) || (currentDoc.field[ 62 ][ k ]) || (currentDoc.field[ 63 ][ k ]) || (currentDoc.field[ 64 ][ k ]) ) ) { if ( meld_anz == true ) { xlog( d3, 5, String.format( "%05d", j ) + "/" + resultRows[ i ].doku_id + ": Aktuelle Informationen (werden gleich geloescht): " ); meld_anz = false; } xlog( d3, 5, String.format( "%05d", j ) + "/" + resultRows[ i ].doku_id + ": Zeile " + String.format( "%03d", k ) + ": Mandantennamen (DDF60) : " + currentDoc.field[ 60 ][ k ] ); // Mandantennamen xlog( d3, 5, String.format( "%05d", j ) + "/" + resultRows[ i ].doku_id + ": Zeile " + String.format( "%03d", k ) + ": Mandantennummern (DDF61) : " + currentDoc.field[ 61 ][ k ] ); // Mandantennummern xlog( d3, 5, String.format( "%05d", j ) + "/" + resultRows[ i ].doku_id + ": Zeile " + String.format( "%03d", k ) + ": Mandantengruppennummern (DDF62) : " + currentDoc.field[ 62 ][ k ] ); // Mandantengruppennummern xlog( d3, 5, String.format( "%05d", j ) + "/" + resultRows[ i ].doku_id + ": Zeile " + String.format( "%03d", k ) + ": Aktennamen (DDF63) : " + currentDoc.field[ 63 ][ k ] ); // Aktennamen xlog( d3, 5, String.format( "%05d", j ) + "/" + resultRows[ i ].doku_id + ": Zeile " + String.format( "%03d", k ) + ": Aktennummern (DDF64) : " + currentDoc.field[ 64 ][ k ] ); // Aktennummern } else { } } // Die Felder werden vor dem Füllen geleert, damit - für den Fall, dass weniger neue Werte reingeschrieben werden als vorher drin waren - keine // deplazierten Restwerte in den Feldern stehen bleiben. (Könnte man vielleicht auch eleganter lösen.) // Felder leeren: xlog( d3, 4, String.format( "%05d", j ) + "/" + resultRows[ i ].doku_id + ": Mehrfachindexfelder fuer Mandant und Akte (60, 61, 62, 63, 64) werden geleert." ); for ( int k = 1 ; k <= Integer.valueOf( d3.config.value( "CUR_60ER_FIELD_NR" ) ); k++ ) { currentDoc.field[ 60 ][ k ] = ""; // Mandantennamen currentDoc.field[ 61 ][ k ] = ""; // Mandantennummern currentDoc.field[ 62 ][ k ] = ""; // Mandantengruppennummern currentDoc.field[ 63 ][ k ] = ""; // Aktennamen currentDoc.field[ 64 ][ k ] = ""; // Aktennummern } // Jetzt Felder füllen mit den gefundenen Werten: for ( int m = 1 ; m <= resultRows2.size(); m++ ) { currentDoc.field[ 60 ][ m ] = resultRows2[ m - 1 ].dok_dat_feld_2; // Mandantennamen xlog( d3, 4, String.format( "%05d", j ) + "/" + resultRows[ i ].doku_id + ": Mandantennamen (DDF60) Zeile " + String.format( "%03d", m ) + " => " + resultRows2[ m - 1 ].dok_dat_feld_2 ); currentDoc.field[ 61 ][ m ] = resultRows2[ m - 1 ].dok_dat_feld_1; // Mandantennummern xlog( d3, 4, String.format( "%05d", j ) + "/" + resultRows[ i ].doku_id + ": Mandantennummern (DDF61) Zeile " + String.format( "%03d", m ) + " => " + resultRows2[ m - 1 ].dok_dat_feld_1 ); currentDoc.field[ 62 ][ m ] = resultRows2[ m - 1 ].dok_dat_feld_13; // Mandantengruppennummern xlog( d3, 4, String.format( "%05d", j ) + "/" + resultRows[ i ].doku_id + ": Mandantengruppennummern (DDF62) Zeile " + String.format( "%03d", m ) + " => " + resultRows2[ m - 1 ].dok_dat_feld_13 ); currentDoc.field[ 63 ][ m ] = resultRows2[ m - 1 ].dok_dat_feld_21; // Aktennamen xlog( d3, 4, String.format( "%05d", j ) + "/" + resultRows[ i ].doku_id + ": Aktennamen (DDF63) Zeile " + String.format( "%03d", m ) + " => " + resultRows2[ m - 1 ].dok_dat_feld_21 ); currentDoc.field[ 64 ][ m ] = resultRows2[ m - 1 ].dok_dat_feld_10; // Aktennummern xlog( d3, 4, String.format( "%05d", j ) + "/" + resultRows[ i ].doku_id + ": Aktennummern (DDF64) Zeile " + String.format( "%03d", m ) + " => " + resultRows2[ m - 1 ].dok_dat_feld_10 ); } if ( debug == 0 ) { xlog( d3, 4, String.format( "%05d", j ) + "/" + resultRows[ i ].doku_id + ": Aktualisiere Dokument." ); currentDoc.updateAttributes( "Master" ); dokStatus = "FINISHED"; } else { xlog( d3, 4, String.format( "%05d", j ) + "/" + resultRows[ i ].doku_id + ": Debug-Modus eingeschaltet => Es wird keine weitere Aktion durchgefuehrt." ); } } else { xlog( d3, 3, String.format( "%05d", j ) + "/" + resultRows[ i ].doku_id + ": keine Elternelemente gefunden. => Es wird keine weitere Aktion durchgeführt." ); dokStatus = "NOPARENT"; } } else { xlog( d3, 3, String.format( "%05d", j ) + "/" + resultRows[ i ].doku_id + ": Weniger als zwei 60er-Feld-Eintraege gefunden. => Es wird keine weitere Aktion durchgefuehrt." ); dokStatus = "JUSTONE"; } if ( debug == 0 ) { sqlStatement = "insert into dv_akten_loesen ( id, doku_id, status ) values ( '" + String.format( "%05d", j ) + "', '" + resultRows[ i ].doku_id + "', '" + dokStatus + "' )"; def sqlResultRows = d3.sql.execute( (String) sqlStatement ); } xlog( d3, 4, "------------------------------" ); } } else { xlog( d3, 4, "Es wurden keine Treffer gefunden." ); xlog( d3, 4, "************************************************" ); } def xlog( D3Interface d3, int loglevel, String logtext ) { def logdatei = "d:\\d3\\apps\\" + prg + ".txt"; def g_loglevel = 5; def g_logdirect = "BEIDE"; // BEIDE oder D3LOG oder DATEI def date = new Date(); def zeitstempel = date.format( "yyyy.MM.dd HH:mm:ss", TimeZone.getTimeZone('CET') ); def loglevel_lang = "[INFO ]"; if ( loglevel <= g_loglevel ) { switch ( loglevel ) { case 1: loglevel_lang = "[FATAL]"; if ( ( g_logdirect == "D3LOG" ) || ( g_logdirect == "BEIDE" ) ) { d3.log.critical( logtext ); } break; case 2: loglevel_lang = "[ERROR]"; if ( ( g_logdirect == "D3LOG" ) || ( g_logdirect == "BEIDE" ) ) { d3.log.error( logtext ); } break; case 3: loglevel_lang = "[WARN ]"; if ( ( g_logdirect == "D3LOG" ) || ( g_logdirect == "BEIDE" ) ) { d3.log.warn( logtext ); } break; case 4: loglevel_lang = "[INFO ]"; if ( ( g_logdirect == "D3LOG" ) || ( g_logdirect == "BEIDE" ) ) { d3.log.info( logtext ); } break; case 5: loglevel_lang = "[DEBUG]"; // Da die d.3 Server i.d.R. nicht im Debug-Modus laufen, erscheinen DEBUG-Meldungen nicht im Log. if ( ( g_logdirect == "D3LOG" ) || ( g_logdirect == "BEIDE" ) ) { d3.log.debug( logtext ); } break; } } if ( ( g_logdirect == "DATEI" ) || ( g_logdirect == "BEIDE" ) ) { new File( logdatei ).append( zeitstempel + " " + loglevel_lang + " " + logtext + "\n", "UTF8" ); } return 0; }