Announcement

Collapse
No announcement yet.

Parameterübergabe funktioniert nicht

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Parameterübergabe funktioniert nicht

    Hallo,

    ich verwende Perl im OTRS-Framework um ein neues Modul "Kostenstellen" zu schreiben.

    Ich bin recht neu in Perl und wundere mich nun, warum mein Parameter nicht an meine Subroutinen übergeben werden kann.

    Hier der Code des Moduls:

    Code:
    #!/usr/bin/perl -w
    
    package Kostenstellen;
    
    use strict;
    use warnings;
    use Kernel::System::Cache;
    use Kernel::System::DB;
    use Kernel::System::Log;
    
    
    sub new() { #NOCH NICHT GEPRÜFT
        my $Self=shift;
        my $ref={};
    
        bless($ref, $Self);
    		
        #Parameter abrufen 
        my %Param = @_;
        foreach (keys %Param) {
            $ref->{$_} = $Param{$_};
        }
    
        # check needed Objects
        foreach (qw(ParamObject DBObject ConfigObject MainObject)) {
            if (!$ref->{$_}) {
                $ref->{LayoutObject}->FatalError(Message => "Got no $_!");
            }
        }
       
        $ref->{Config} = $ref->{ConfigObject}->Get("Ticket::Frontend::$ref->{Action}");  
        
        $ref->{DBObject} = Kernel::System::DB->new(
            LogObject => $Param{LogObject},
            ConfigObject => $Param{ConfigObject},
            MainObject   => $Param{MainObject},        
        );
        
        # create cache object
        if ($ref->{CustomerUserMap}->{'CacheTTL'}) {
            $ref->{CacheObject} = Kernel::System::Cache->new(%Param);
        }
    
        # create new db connect if DSN is given
        if ($ref->{CustomerUserMap}->{Params}->{DSN}) {
            $ref->{DBObject} = Kernel::System::DB->new(
                LogObject => $Param{LogObject},
                ConfigObject => $Param{ConfigObject},
                MainObject => $Param{MainObject},
                DatabaseDSN => $Self->{CustomerUserMap}->{Params}->{DSN},
                DatabaseUser => $Self->{CustomerUserMap}->{Params}->{User},
                DatabasePw => $Self->{CustomerUserMap}->{Params}->{Password},
                Type => $Self->{CustomerUserMap}->{Params}->{Type} || '',
            ) || die ('Can\'t connect to database!');
            # remember that we have the DBObject not from parent call
            $ref->{NotParentDBObject} = 1;
        }
        return $ref;    
    }
    
    sub checkHatFirmaKostenstellen { #NOCH NICHT GEPRÜFT
      my ( $Self, %Param ) = @_;
      my %Kostenstellen = ();
      # auf benötigte Parameter prüfen	
      if (!$Param{"CompanyID"}) {
          #$Self->{LogObject}->Log(Priority => 'error', Message => "Need CompanyID!");
          return -1;
      }
      
      #SQL-String vorbereiten
      my $SQL = "SELECT COUNT(kennung)";
      $SQL .= " FROM customer_kostenstellen";
      $SQL .= " WHERE customer_id = " . $Param{CompanyID};
      
      # Abfrage starten
      $Self->{DBObject}->Prepare(SQL => $SQL);
      while (my @Row = $Self->{DBObject}->FetchrowArray()) {
          if (!$Kostenstellen{$Row[0]}) {
              foreach (1..8) {
                  if ($Row[$_]) {
                      $Kostenstellen{$Row[0]} .= $Row[$_].' ';
                  }
              }
              $Kostenstellen{$Row[0]} =~ s/^(.*)\s(.+?\@.+?\..+?)(\s|)$/"$1" <$2>/;
          }
      }
      #Prüfung
      my $Laenge = %Kostenstellen;
      if ($Laenge > 0)
      {
      	return 1;
      }
      else
      {
      	return 0;
      }
    }
    
    
    sub getKostenstelleDropdown { #NOCH NICHT GEPRÜFT
    	my ( $Self, %Param ) = @_;
    	
    	# auf benötigte Parameter prüfen	
      	if (!$Param{CompanyID}) {
    	    $Self->{LogObject}->Log(Priority => 'error', Message => "Need CompanyID!");
    	    return "FEHLER: Parameter CompanyID fehlt!";
    	}
      
    	my $HTML = "keine Kostenstellen hinterlegt";
    	my $FirmaID = $Param{CompanyID};
    		
    	my $KSVorhanden = &checkHatFirmaKostenstellen(CompanyID => $FirmaID);
    
    	if ($KSVorhanden == 1)
    	{
    		$HTML = "Es gibt welche";
    	}
    	elsif ($KSVorhanden == -1)
    	{
    		$HTML = "FEHLER";
    	}
    	else
    	{
    		$HTML = "Es gibt keine";
    	}
    	
    	return $HTML;
    }
    
    1;
    Von "außen" rufe ich die Methode getKostenstelleDropdown auf. Diese ruft anschließend die Methode checkHatFirmaKostenstellen auf und je nach Rückgabe erhalte ich einen anderen HTML-String.

    Hier der Code zum Aufruf im externen Modul:
    Code:
    $Param{"KostenstellenDD"} = $Self->{KostenstellenObject}->getKostenstelleDropdown(CompanyID => '111175',);
    Das Ergebnis ist, dass die Parameterprüfung der Methode checkHatFirmaKostenstellen immer FALSE zurück gibt - so als ob ich den Parameter gar nicht übergeben hätte.

    Kommentiere ich die Parameterprüfung dort aus, so erhalte ich die Fehlermeldung
    Can't use string ("CompanyID") as a HASH ref while "strict refs" in use at Kostenstellen.pm line 93
    Was mache ich falsch? Warum fällt der Parameter durch die Prüfung?

    Ich bin für alle Vorschläge und Denkansätze dankbar!

    Gruß
    Theo

  • #2
    Vom Prinzip sollte es so funktioneren, ich kann keinen Fehler erkennen. Auch weil du gar keine Hashreferenz verwendest. Welches ist denn die Zeile 93?

    Comment


    • #3
      Ich habe den Fehler gefunden:

      Der Aufruf hätte heißen müssen:

      my $KSVorhanden = $Self->checkHatFirmaKostenstellen(CompanyID =>
      $FirmaID);



      Danke für dein Interesse
      Theo

      Comment

      Working...
      X