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 = "verkn_equipm_dokumente.groovy"; @Field version = "0.1"; @Field kunde = "Optima"; ////////////////////////////////////////////////////////////////////////////////////////// // debug: // 0 => es finden Änderungen am Datenbestand statt // 1 => es finden keine Änderungen am Datenbestand statt @Field debug = 0; // Dokumente pro Durchlauf // Gibt an, wie viele Dokumente maximal pro Durchlauf verarbeitet werden @Field dokumente_pro_durchlauf = 10; // CSV-Datei, enthält die Zuordnungen von Dokumentgruppe zu Akte // Wird erwartet ohne Spaltenüberschriften. Sollte aber auch kein Problem sein, wenn welche drin wären. @Field CSV_FILE = "D:\\d3\\d3server.prg\\ext_groovy\\mapping_equipm_dokumente.csv" ////////////////////////////////////////////////////////////////////////////////////////// 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, "* Dokumente pro Durchlauf : " + dokumente_pro_durchlauf ); xlog( d3, 4, "* CSV-Datei : " + CSV_FILE ); xlog( d3, 4, "********************************************************" ); xlog( d3, 4, "* Lese CSV-Datei: " ); def csvanzahl = 0; // Wie viele Zeilen sind in der CSV-Datei enthalten def csvdatei = new File( CSV_FILE ); def csvzeilen = csvdatei.readLines().collect{ it.split( ";" ) }; csvzeilen.each{ csvanzahl++; xlog( d3, 5, "* Zeile " + csvanzahl + ": " + it ); } xlog( d3, 4, "* " + csvanzahl + " Zeilen gelesen." ) xlog( d3, 4, "********************************************************" ); def sqlQuery = "select top " + dokumente_pro_durchlauf + " doku_id, dok_dat_feld_9, dok_dat_feld_21 from firmen_spezifisch where kue_dokuart = 'DEQUI' and dok_dat_feld_48 is null"; resultRows = d3.sql.executeAndGet( (String) sqlQuery ); if ( resultRows.size() > 0 ) { xlog( d3, 4, " Es wurden " + resultRows.size() + " Treffer gefunden." ); xlog( d3, 4, "********************************************************" ); def i = 0; def allesgut = true; def allesgut_2 = true; for ( i = 0; i < resultRows.size(); i++ ) { xlog( d3, 4, "Nr. " + (i+1) + "/" + resultRows[ i ].doku_id + ": Equipmentdokument Doku-ID " + resultRows[ i ].doku_id + " / E-Nr. " + resultRows[ i ].dok_dat_feld_9 + " / Dokumentgruppe " + resultRows[ i ].dok_dat_feld_21 ); // Lade das Dokument equidok = d3.archive.getDocument( resultRows[ i ].doku_id ); def gefunden = false; // DDF21 => Dokumentgruppe // DDF48 => Akte // Suche in den CSV-Daten: csvzeilen.each { if ( it[ 0 ] == equidok.field[ 21 ] ) { gefunden = true; // Setze Akte: xlog( d3, 4, "Nr. " + (i+1) + "/" + resultRows[ i ].doku_id + ": setze Akte " + it[ 2 ] + " bei Dokument " + resultRows[ i ].doku_id ); equidok.field[ 48 ] = it[ 2 ]; // Wenn neue Dokumentgruppe verschieden ist von alter Dokumentgruppe, dann ändere Dokumentgruppe: if ( it[ 0 ] != it[ 1 ] ) { xlog( d3, 4, "Nr. " + (i+1) + "/" + resultRows[ i ].doku_id + ": Dokumentgruppe bei Dokument " + resultRows[ i ].doku_id + " wird gesetzt (alt/neu) " + equidok.field[ 21 ] + " / " + it[ 1 ] ); equidok.field[ 21 ] = it[ 1 ]; } } } if ( gefunden == true ) { try { if ( debug == 0 ) { equidok.updateAttributes("Master"); xlog( d3, 4, "Nr. " + (i+1) + "/" + resultRows[ i ].doku_id + ": Dokument " + equidok.id() + " wurde aktualisiert."); } else { xlog( d3, 4, "Nr. " + (i+1) + "/" + resultRows[ i ].doku_id + ": keine Dokumentaktualisierung, da DEBUG-Modus eingeschaltet." ); } } catch ( D3Exception e ) { xlog( d3, 2, "Nr. " + (i+1) + "/" + resultRows[ i ].doku_id + ": Equipmentdokument konnte nicht aktualisiert werden: " + e.message ) } } else { xlog( d3, 3, "Nr. " + (i+1) + "/" + resultRows[ i ].doku_id + ": Dokumentgruppe " + equidok.field[ 21 ] + " wurde nicht in der CSV-Datei gefunden."); } xlog( d3, 4, "*************************************" ); } xlog( d3, 4, "*************************************************" ); } else { xlog( d3, 4, "* Es wurden keine Dokumente zur Bearbeitung gefunden." ); xlog( d3, 4, "*************************************" ); } def xlog( D3Interface d3, int loglevel, String logtext ) { def logdatei = "d:\\d3\\logs\\" + prg + ".txt"; def g_loglevel = 5; def g_logdirect = "BEIDE"; 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]"; 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; } }