Guest User

Untitled

a guest
Jul 21st, 2018
71
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Perl 8.33 KB | None | 0 0
  1. #!/usr/bin/perl
  2. ########################################################################################################
  3. #
  4. # kvsinport.pl < CSV-Datei
  5. #
  6. # Vergleicht und importiert Schülergrunddaten aus KVS in TGASCH.DBF
  7.  
  8. use strict;
  9. use DBI;
  10. use Encode;
  11.  
  12. # KVS-Datenfelder im CSV File
  13. my $ciKvsKbNummer= 4;
  14. my $ciKvsLfdNr= 5;
  15. my $ciKvsKursbeginn= 12;
  16. my $ciKvsGeschlecht= 45;
  17. my $ciKvsTitel= 47;
  18. my $ciKvsVorname= 48;
  19. my $ciKvsNachname= 49;
  20. my $ciKvsStrasse= 50;
  21. my $ciKvsPlz= 52;
  22. my $ciKvsOrt= 53;
  23. my $ciKvsGeburtsdatum= 55;
  24. my $ciKvsSvNummer= 56;
  25. my $ciKvsTelefonMobil= 66;
  26. my $ciKvsEmailPrivat= 68;
  27. my $ciKvsAnmeldedatum= 113;
  28. my $ciKvsStornodatum= 125;
  29.  
  30. # Datenfelder in der Abfrage aus TGASCH
  31. my $ciDatAnsprache= 0;
  32. my $ciDatName= 1;
  33. my $ciDatVorname= 2;
  34. my $ciDatSvnr= 3;
  35. my $ciDatKlasse= 4;
  36. my $ciDatPlz= 5;
  37. my $ciDatOrt= 6;
  38. my $ciDatStrasse= 7;
  39. my $ciDatTel= 8;
  40. my $ciDatEmail= 9;
  41. my @asTgaFields= ('ANSPRACHE', 'NAME', 'VORNAME', 'SVNR', 'KLASSE', 'PLZ', 'ORT', 'STRASSE', 'TEL_P', 'EMAIL');
  42.  
  43. # Variablen
  44. my (@asTgaData, @asImpData, @asKvsData);                # TGA-Daten, CSV-Daten, aufbereitete KVS-Daten
  45. my ($bAddRecord, $iDeltaKlasse, $bIsFirst);             # Insert notwendig, vor oder nach Abschluss, erste Zeile im CSV
  46. my ($sTgaSemester, $iTgaMaxRec, $iTgaJahr);             # nur TGA-Daten
  47. my ($sKvsAnmeldung, $sKvsKursbeitrag, $sKvsGeburtstag, $sKvsBeginn);    # nur KVS-Daten
  48. my ($sKvsTmp, $sTgaTmp, $sUpdTmp);                  # Arbeitsstrings
  49.  
  50. # DBase-Verzeichnis (Netware über Nncp gemountet- darin TGASCH.DBF)
  51. my $dbh = DBI->connect('DBI:XBase:/home/hms/work') or die $DBI::errstr;
  52.  
  53. #my $sth= $dbh->prepare ('select GEB from TGASCH');
  54. #$sth->execute() or die $sth->errstr();
  55. #if (@asTgaData = $sth->fetchrow_array()) {
  56. #  print $asTgaData[0];
  57. #}
  58.  
  59. # laufendes Semester (in allen TGA-Records) und maximale Stammnummer
  60. my $sth= $dbh->prepare ('select STAMM_NR from TGASCH order by STAMM_NR');
  61. $sth->execute() or die $sth->errstr();
  62. $iTgaMaxRec= 0;
  63. while (@asTgaData = $sth->fetchrow_array()) {
  64.   $asTgaData[0]=~ s/^(.+)\///;
  65.   $sTgaSemester= $1;
  66.   $iTgaMaxRec= $asTgaData[0] if ($asTgaData[0] > $iTgaMaxRec);
  67. }
  68.  
  69. # Basis Schuljahr (xS20xx, im SS 1 Jahr vorher)
  70. $iTgaJahr= substr($sTgaSemester,2,4);
  71. $iTgaJahr-- if (substr($sTgaSemester,0,1) eq 'S');
  72.  
  73. # wenn zumindest eine 0er-Klasse, vor Abschluss => eine Klassennummer niedriger
  74. $iDeltaKlasse= 0;
  75. my $sth= $dbh->prepare('select KLASSE from TGASCH where KLASSE like "%0%"');
  76. $sth->execute() or die $sth->errstr();
  77. if (@asTgaData = $sth->fetchrow_array()) {
  78.   $iDeltaKlasse= 1;
  79. }
  80.  
  81. # alle CSV Records einlesen
  82. $bIsFirst= 1;
  83. while (<>) {
  84.   # erste Zeile (Feldnamen) überspringen
  85.   if ($bIsFirst) {
  86.     $bIsFirst= 0;
  87.     next;
  88.   }
  89.   # mit ; getrennt
  90.   @asImpData= split(/;/);
  91.   # Klasse ergibt sich aus 2. Buchstaben Kursbezeichnung und 1. Zeichen der laufenden Nummer
  92.   $asKvsData[$ciDatKlasse]= substr($asImpData[$ciKvsKbNummer],1,1 ).(substr($asImpData[$ciKvsLfdNr],0,1)-$iDeltaKlasse).'A';
  93.   # Umwandlung Geschlecht (KVS) auf Ansprache (TGA)
  94.   $asKvsData[$ciDatAnsprache]= ($asImpData[$ciKvsGeschlecht]eq 'M') ? 'HERR' : 'FRAU';
  95.   # Namen etc. in Großschrift
  96.   $asKvsData[$ciDatName]= myuc($asImpData[$ciKvsNachname]);
  97.   $asKvsData[$ciDatVorname]= myuc($asImpData[$ciKvsVorname]);
  98.   $asKvsData[$ciDatStrasse]= myuc($asImpData[$ciKvsStrasse]);
  99.   $asKvsData[$ciDatPlz]= $asImpData[$ciKvsPlz];
  100.   $asKvsData[$ciDatOrt]= myuc($asImpData[$ciKvsOrt]);
  101.   $asKvsData[$ciDatTel]= $asImpData[$ciKvsTelefonMobil];
  102.   $asKvsData[$ciDatEmail]= $asImpData[$ciKvsEmailPrivat];
  103.   # SVNR mit Geburtsdatum ergänzen
  104.   $asKvsData[$ciDatSvnr]= $asImpData[$ciKvsGeburtsdatum].substr($asImpData[$ciKvsGeburtsdatum],0,2).substr($asImpData[$ciKvsGeburtsdatum],3,2).
  105.      substr($asImpData[$ciKvsGeburtsdatum],8,2);
  106.   # Datumsangaben von TT.MM.JJJJ auf JJJJMMTT
  107.   $sKvsGeburtstag= substr($asImpData[$ciKvsGeburtsdatum],6,4).substr($asImpData[$ciKvsGeburtsdatum],3,2).substr($asImpData[$ciKvsGeburtsdatum],0,2);
  108.   $sKvsAnmeldung= substr($asImpData[$ciKvsAnmeldedatum],6,4).substr($asImpData[$ciKvsAnmeldedatum],3,2).substr($asImpData[$ciKvsAnmeldedatum],0,2);
  109.   $sKvsBeginn= substr($asImpData[$ciKvsKursbeginn],6,4).substr($asImpData[$ciKvsKursbeginn],3,2).substr($asImpData[$ciKvsKursbeginn],0,2);
  110.  
  111.   # Vereinheitlichung der Abkürzungen für Straße und Gasse
  112.   $asKvsData[$ciDatStrasse]=~ s/STRASSE */STR. /;
  113.   $asKvsData[$ciDatStrasse]=~ s/GASSE */G. /;
  114.   $asKvsData[$ciDatStrasse]=~ s/STRAßE */STR. /;
  115.   $asKvsData[$ciDatStrasse]=~ s/G\. */G. /;
  116.   $asKvsData[$ciDatStrasse]=~ s/STR\. */STR. /;
  117.   # Vereingeitlichung der Telefonnummern
  118.   $asKvsData[$ciDatTel]=~ s/^\+43 ?//;
  119.   $asKvsData[$ciDatTel]=~ s/^0//;
  120.   $asKvsData[$ciDatTel]=~ s/[ \/\-]//g;
  121.   $asKvsData[$ciDatTel]=~ s/^/0/ if $asKvsData[$ciDatTel];
  122.  
  123.   # Abfrage der Grunddaten aus der TGASCH, Match auf Vorname, Name, Klasse und SVNR
  124.   my $sth = $dbh->prepare('select '.join(',', @asTgaFields).' from TGASCH where NAME="'.encode("cp850", decode("utf8", $asKvsData[$ciDatName])).
  125.             '" and VORNAME="'.encode("cp850", decode("utf8", $asKvsData[$ciDatVorname])).'" and KLASSE="'.$asKvsData[$ciDatKlasse].
  126.             '" and SVNR="'.$asKvsData[$ciDatSvnr].'"') or die $dbh->errstr();
  127.   $sth->execute() or die $sth->errstr();
  128.   $bAddRecord= 1;
  129.  
  130.   # vergleich der Grunddaten bei vorhandenen Usern
  131.   while (@asTgaData = $sth->fetchrow_array()) {
  132.     $bAddRecord= 0;
  133.     $sKvsTmp= $sTgaTmp= '';
  134.     for (my $i= 0; $i < scalar(@asTgaFields); $i++) {
  135.       $asTgaData[$i]= encode("utf8", decode("cp850", $asTgaData[$i]));
  136.       # Vereinheitlichung wir oben
  137.       if ($i == $ciDatStrasse) {
  138.     $asTgaData[$i]=~ s/STRASSE */STR. /;
  139.     $asTgaData[$i]=~ s/GASSE */G. /;
  140.     $asTgaData[$i]=~ s/STRAßE */STR. /;
  141.     $asTgaData[$i]=~ s/G\. */G. /;
  142.     $asTgaData[$i]=~ s/STR\. */STR. /;
  143.       }
  144.       elsif ($i == $ciDatTel) {
  145.     $asTgaData[$i]=~ s/^\+43 ?//;
  146.     $asTgaData[$i]=~ s/^0//;
  147.     $asTgaData[$i]=~ s/[ \/\-]//g;
  148.     $asTgaData[$i]=~ s/^/0/ if $asTgaData[$i];
  149.       }
  150.       # Emails wechselseitig ergänzen
  151.       elsif ($i == $ciDatEmail) {
  152.         $asTgaData[$i]= $asKvsData[$i] unless $asTgaData[$i];
  153.         $asKvsData[$i]= $asTgaData[$i] unless $asKvsData[$i];
  154.       }
  155.       # führende und endende Leerzeichen entfernen
  156.       $asTgaData[$i]=~ s/^ +//;
  157.       $asKvsData[$i]=~ s/^ +//;
  158.       $asTgaData[$i]=~ s/ +$//;
  159.       $asKvsData[$i]=~ s/ +$//;
  160.       $sTgaTmp.= $asTgaData[$i].'…';
  161.       $sKvsTmp.= $asKvsData[$i].'…';
  162.     }
  163.     # bei Unterschieden Anzeige
  164.     if ($sTgaTmp ne $sKvsTmp) {
  165.       print 'Unterschiede bei '.$asKvsData[$ciDatVorname].' '.$asKvsData[$ciDatName].' ('.$asKvsData[$ciDatKlasse].")\n";
  166.       for (my $i= 0; $i < scalar(@asTgaFields); $i++) {
  167.          if ($asTgaData[$i] ne $asKvsData[$i]) {
  168.            print '  TGA: '.$asTgaData[$i]."\n  KVS: ".$asKvsData[$i]."\n";
  169.          }
  170.       }
  171.     }
  172.   }
  173.   # Wenn kein Match gefunden, Record zu TGASCH hinzufügen
  174.   if ($bAddRecord) {
  175.     print 'Hinzufügen '.$asKvsData[$ciDatVorname].' '.$asKvsData[$ciDatName].' ('.$asKvsData[$ciDatKlasse].")\n";
  176.     $sTgaTmp= 'insert into TGASCH ('join(',', @asTgaFields).',AUS_STAND,WERB1,WERB2,WERB3,ERST_PERS,SJ1,SJ2,STAMM_NR,SE_KLASSE,ANMELD,ERST_AUF,GEB) values (';
  177.     for (my $i= 0; $i < scalar(@asTgaFields); $i++) {
  178.       $sTgaTmp.= '"'.encode("cp850", decode("utf8", $asKvsData[$i])).'", ';
  179.     }
  180.     $sTgaTmp.= '"NE", ';                                # Schulabschluss
  181.     $sTgaTmp.= '0, ';                                   # geworben durch
  182.     $sTgaTmp.= '0, ';
  183.     $sTgaTmp.= '0, ';
  184.     $sTgaTmp.= '"P", ';                                 # Eingabe durch
  185.     $sTgaTmp.= ($iTgaJahr-(substr(@asKvsData[$ciDatKlasse],1,1) eq 2 ? 1 : 0)).", ";    # Schuljahr 1. Klasse
  186.     $sTgaTmp.= ($iTgaJahr-(substr(@asKvsData[$ciDatKlasse],1,1) eq 2 ? 1 : 0)+1).", ";  # Schuljahr 2. Klasse
  187.     $sTgaTmp.= '"'.$sTgaSemester."/".++$iTgaMaxRec.'" ,';               # Stammnummer ([SW]S20xx/###)
  188.     $sTgaTmp.= "$sKvsBeginn, ";                             # Schuljahresbeginn
  189.     $sTgaTmp.= "$sKvsAnmeldung, ";                          # Datum der Anmeldung
  190.     $sTgaTmp.= "$sKvsAnmeldung, ";                          # Datum der Erstanmeldung
  191.     $sTgaTmp.= "$sKvsGeburtstag";                           # Geburtstag
  192.     $sTgaTmp.= ')';
  193.  
  194.     # Spezialzeichen escapen
  195.     $sTgaTmp=~ s/@/\\@/g;
  196.  
  197.     my $sth= $dbh->prepare($sTgaTmp);
  198.     $sth->execute() or die $sth->errstr();
  199.   }
  200. }
  201.  
  202. # uc wandelt erweiterte Zeichen nicht um
  203. sub myuc {
  204.   my $sText= shift;
  205.   $sText= uc($sText);
  206.   $sText=~ tr/äöüéè/ÄÖÜÉÈ/;
  207.   return $sText;
  208. }
Add Comment
Please, Sign In to add comment