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 = "mehrfachfelder_einrichten.groovy"; @Field version = "0.1"; @Field kunde = "Dr. Kleeberg & Partner GmbH"; // Dieses Skript soll bei allen Dokumenten innerhalb der Mandatenakte die verknüpften Akten in 60er-Felder eintragen, damit die Dokumente bei einer passenden Suche gefunden werden. // Dabei wird festgehalten, welche Dokumente bereits aktualisiert wurden. ///////////////////////////////////////////////////////////////////////// // debug = 0 => es finden Änderungen am Datenbestand statt // debug = 1 => es finden keine Änderungen am Datenbestand statt @Field debug = 0; @Field suffix = Math.abs( new Random().nextInt() % (99999 - 10000) ) + 10000; ///////////////////////////////////////////////////////////////////////// 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, "************************************************" ); def i, ergebniszeilen, ergebnistext; def dokumentarten = "'DBERA', 'DBETR', 'DDAUE', 'DDEBD', 'DFIBU', 'DABSC', 'DLOHN', 'DLSTD', 'DSTEU' "; def sqlQuery = "select top (10000) doku_id, kue_dokuart from firmen_spezifisch where kue_dokuart in ( " + dokumentarten + " ) and doku_id not in ( select doku_id from dv_mehrf_feld) order by kue_dokuart"; DB_Zeilen = d3.sql.executeAndGet( (String) sqlQuery ); if ( DB_Zeilen.size() > 0 ) { xlog( d3, 4, " Es wurde(n) " + DB_Zeilen.size() + " Treffer gefunden." ); xlog( d3, 4, "************************************************" ); for ( i = 0; i < DB_Zeilen.size(); i++ ) { def docChild = DB_Zeilen[ i ].doku_id; xlog( d3, 4, i + ": bearbeite Doku-ID " + docChild ); def ueberdoks = d3.call.link_get_parents( docChild, "Master" ); //xlog( d3, 4, i + ": bearbeite ueberdoks-ID " + ueberdoks + " " + ueberdoks.size() ); def ziel_dok_ids = ""; if ( ueberdoks.size() > 0 ) { ueberdoks.each { xlog( d3, 4, i + ": => Kind: " + docChild + " 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, i + ": Ziel-Dok_IDs: " + ziel_dok_ids ); def STATEMENT = "select kue_dokuart, 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 resultRows = d3.sql.executeAndGet( STATEMENT ); if ( resultRows.size() > 0 ) { // Schreiben der Verknüpfungen an das Dokument: def currentDoc = d3.archive.getDocument( docChild ); // 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: for ( int m = 1 ; m <= Integer.valueOf( d3.config.value( "CUR_60ER_FIELD_NR" ) ); m++ ) { currentDoc.field[ 60 ][ m ] = ""; // Mandantennamen currentDoc.field[ 61 ][ m ] = ""; // Mandantennummern currentDoc.field[ 62 ][ m ] = ""; // Mandantengruppennummern currentDoc.field[ 63 ][ m ] = ""; // Aktennamen currentDoc.field[ 64 ][ m ] = ""; // Aktennummern } // Jetzt Felder füllen mit den gefundenen Werten: for ( int j = 1 ; j <= resultRows.size(); j++ ) { currentDoc.field[ 60 ][ j ] = resultRows[ j - 1 ].dok_dat_feld_2; // Mandantennamen currentDoc.field[ 61 ][ j ] = resultRows[ j - 1 ].dok_dat_feld_1; // Mandantennummern currentDoc.field[ 62 ][ j ] = resultRows[ j - 1 ].dok_dat_feld_13; // Mandantengruppennummern currentDoc.field[ 63 ][ j ] = resultRows[ j - 1 ].dok_dat_feld_21; // Aktennamen currentDoc.field[ 64 ][ j ] = resultRows[ j - 1 ].dok_dat_feld_10; // Aktennummern xlog( d3, 4, i + ": Dokument " + docChild + ": Info-Zeile " + j + " gesetzt: <" + resultRows[ j - 1 ].kue_dokuart + "> <" + resultRows[ j - 1 ].dok_dat_feld_2 + "> <" + resultRows[ j - 1 ].dok_dat_feld_1 + "> <" + resultRows[ j - 1 ].dok_dat_feld_13 + "> <" + resultRows[ j - 1 ].dok_dat_feld_21 + "> <" + resultRows[ j - 1 ].dok_dat_feld_10 + ">" ); } currentDoc.updateAttributes( "Master" ); dokument_fertig( d3, docChild, "Aktualisierung erfolgt." ); xlog( d3, 4, i + ": Dokument " + docChild + ": Aktualisierung erfolgt." ); } } else { dokument_fertig( d3, docChild, "keine uebergeordneten Akten" ); xlog( d3, 3, i + ": Dokument " + docChild + " hat keine uebergeordneten Akten." ); } xlog( d3, 4, "************************************************" ); } } else { xlog( d3, 3, "Es wurden keine passenden Treffer gefunden!" ); } def dokument_fertig( D3Interface d3, String doku_id, String meldung ) { def meldung_db; if ( meldung.length() > 200 ) { meldung_db = meldung.substring( 0, 199 ); } else { meldung_db = meldung; } if ( debug == 0 ) { //xlog( d3, 4, "Angekommen" ); sql = "insert into dv_mehrf_feld (doku_id, status) values ( '" + doku_id + "', '" + meldung + "' )"; d3.sql.execute( sql ); } } def xlog( D3Interface d3, int loglevel, String logtext ) { def logdatei = "d:\\d3\\logs\\" + prg + "_" + suffix + ".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; }