JulianB: Nutzung von $Variable nach IF Anweisung

Beitrag lesen

Hach Mensch, es wäre auch wirklich zu schön gewesen...

Neues (altes) Problem:

Die Fehlfunktion lag nicht daran das die Parameter nicht übergeben wurden, denn das wurden sie problemlos.

Das Problem liegt (immernoch) darin, das ich diese Werte aus einer Datei auslese, und mein Hauptprogramm die betreffenden Zeilen aus der Datei -> Zeilenweise <- an meine Subroutine schickt!

So durchläuft meine Sub jede Zeile einzeln, dann findet sie etwas schreibt es in den String, doch sobald mein Hauptprogramm die nächste Zeile übergibt, wird der alte Wert gelöscht und durch einen neuen Überschrieben, der, wenn die Bedingung false ist, natürlich leer ist.

Deswegen bekomme ich generell leere Strings an mein SQL Statement geschickt!

Hier vielleicht sieht man es anhand des Codes:

Zu filternde Datei:

  
* $$ JOB JNM=KALAS1,CLASS=0,DISP=D  
* $$ LST CLASS=A,DISP=D,DEST=(,UUSER)  
// JOB KALAS1 UTFF-MAIN-FILES  
// EXEC IDCAMS  
   DEFINE CLUSTER                        -  
          (NAME       (AKL.VSAM.UTFFL1)  -  
           VOLUMES    (XXXXXX)           -  
           RECORDS    (850)              -  
           RECORDSIZE (4096 4096)        -  
           CISZ       (4096)             -  
           SHR        (9 9)              -  
           NUMBERED)                     -  
   CATALOG  (VSEKL.USER.CATALOG)  
/*  
/&  
* $$ EOJ  

Hauptprog:

  
use IDCAMS;  
  
use strict;  
  
my $BEFEHL = '';  
my $REST = '';  
my $exec = '';  
my $buffer = '';  
my $dlbl = '';  
my $job = '';  
my $Programm = '';  
my $cmd = '';  
my $BINDESTRICH = '';  
  
open(DB, "<$ARGV[0]") || die "Kann Datei nicht öffnen!";  
while(<DB>)  
          {  
          $buffer = $_;  
  
              if(index($buffer,"// JOB ") != -1)  
              {  
               $job = $buffer;  
               $job =~ m/^(.*?)JOB (.*)$/;  
               print " \n";  
               print "---------------------------------------\n";  
               print "JOBNAME => $2\n";  
              }  
              if(index($buffer,"// DLBL ") != -1)  
              {  
               $dlbl = $buffer;  
               $dlbl =~ m/^(.*?)DLBL (.*),(.*),,(.*)$/;  
               print "DLBL => $2\n";  
              }  
              if(index($buffer,"// EXEC ") != -1)  
              {  
               $exec = $buffer;  
               $exec =~ m/^(.*?)EXEC ([A-Z]*),*(.*)$/;  
               $Programm = $2;  
               print "EXEC => $Programm\n";  
              }  
  
              if((index($buffer,"/") == -1)&&(index($buffer,"*") == -1))  
              {  
               $cmd = $buffer;  
               $cmd =~ m/^.*( - ).*$/;  
               $BINDESTRICH = $1;  
  
               if(defined $BINDESTRICH)  
               {  
               $cmd = $buffer;  
               $cmd =~ m/^[^A-Z]*([A-Z]*)[^A-Z0-9]* (.*) +- .*$/;  
                             #print "Buffer=$cmd\n#$1#$2#\n";  
               $BEFEHL = $1;  
               $REST = $2;  
  
               $REST =~ s/\s+$//g;  
               }  
  
               else  
               {  
               $cmd = $buffer;  
               $cmd =~ m/^[^A-Z]*([A-Z]*)[^A-Z0-9]* (.*) .*$/;  
                             #print "Buffer=$cmd\n#$1#$2#\n";  
               $BEFEHL = $1;  
               $REST = $2;  
  
               $REST =~ s/\s+$//g;  
               }  
  
               if(defined $BINDESTRICH == 0 )  
               {  
  
                if($Programm eq "IDCAMS")  
                {  
  
                 IDCAMS($BEFEHL,$REST);  
                }  
  
               }  
  
              }  
  
          }  
close(DB);  

Und das dazugehörige Modul:

  
use Win32::ODBC;  
use strict;  
  
sub IDCAMS  
{  
my ($TabNAME, $tNAME, $ZEILEN, $ZEIL, $ZEICHEN, $ZEIC, $sql_string, $sql_string2, $db, %Daten);  
my $BEFEHL = *_;  
my $REST = *_;  
  
    $BEFEHL = shift;  
    $REST = shift;  
  
     %Daten = ($BEFEHL, $REST);  
  
       if ($Daten{"NAME"})  
       {  
        $tNAME = $Daten{"NAME"};  
  
        $tNAME =~ m/^\((.*?)\.(.*)\.(.*)\)$/;  
        $TabNAME = $3;  
       }  
  
       if ($Daten{"RECORDS"})  
       {  
        $ZEIL = $Daten{"RECORDS"};  
  
        $ZEIL =~ m/^\((.*)\)$/;  
        $ZEILEN = $1;  
        $ZEILEN++;  
       }  
  
       if ($Daten{"RECORDSIZE"})  
       {  
        $ZEIC = $Daten{"RECORDSIZE"};  
  
        $ZEIC =~ m/^\((.*) {1}(.*)\)$/;  
        $ZEICHEN = $1;  
       }  
  
         if($Daten{"DEFINE"})  
         {  
  
            if($Daten{"DEFINE"} eq 'CLUSTER')  
            {  
  
               if(!($db = new Win32::ODBC("DSN=SNAME;UID=User;PWD=PASS;")))  
               {  
                print "Fehler beim Verbinden\n";  
                print "Fehler: " . Win32::ODBC::Error() . "\n";  
                exit;  
               }  
  
                $sql_string = ("CREATE TABLE $TabNAME (Nr varchar(20), Zeichen char($ZEICHEN))");  
                $db->Sql($sql_string);  
  
               for (my $i=1;$i<$ZEILEN;$i++)  
               {  
                $sql_string2 = ("INSERT INTO $TabNAME (Nr) VALUES ($i)");  
                $db->Sql($sql_string2);  
               }  
  
                 print "\nTablename: ",$TabNAME,"\n";  
                 print "Create Table with: ",$ZEILEN," rows\n";  
                 print "Row filled with: ",$ZEICHEN," spaces\n";  
                 print "---------------------------------------";  
            }  
  
         }  
}  
1;  

Die Datei wird zeilenweise eingelesen und jede einzelne Zeile wird an die Sub übergeben, die läuft einmal komplett durch bis sie die nächste Zeile bekommt,das Ganze bis die Datei endet. Und deswegen bekomme ich nur leere Strings an das SQL Statement gesendet.

Vielleicht hat ja jemand eine Idee, wenn ja wäre ich sehr dankbar.

Liebe Grüße,

Julian