Schrift
[thread]11487[/thread]

Kurze Frage zur Array mit push

Leser: 1


<< >> 9 Einträge, 1 Seite
Gast Gast
 2008-03-19 09:21
#107216 #107216
Hallo Community,

habe eine Routine geschrieben um aus eine DB eine 2D-Matrix zu erstellen. Leider bekomme ich es nicht mit der push-Funktion hin. Habe schon unterschiedliche Konstellationen versucht, leider ohne Erfolg. Kann mir bitte jemand ein Blick auf die Funktion werden und mir ggf. den Fehler unter der Nase reiben :).

Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
sub GetArray { my($this, $stmt) = @_;
    unless($this->{Cnn}) {
        Win32::MsgBox('Keine Verbindung!');
        return undef;
    }
    my @retArr;
    my $rst = $this->{Cnn}->Execute($stmt);
    unless($rst->EOF and $rst->BOF) {

        $rst->MoveFirst;

        while(not $rst->EOF) {

            push(@retArr, [$rst->Fields(0)->{value}]);
            
            for my $_sp (0..$rst->Fields->{count}) {
                
                push(@{$retArr[$_sp]}, $rst->Fields($_sp)->{value});
            }
            $rst->MoveNext;
        }
    }
    return \@retArr;
}


Vielleicht fällt euch auch was auf, was ich sonst an der Vorgehensweise falsch mache.

Vielen Dank!

Alex
renee
 2008-03-19 09:36
#107218 #107218
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Was kommt raus, wie soll es eigentlich aussehen? Gibt es Fehlermeldungen? Noch können wir nicht hellsehen ;-)

Die entstandene Struktur schonmal mit CPAN:Data::Dumper angeschaut?
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
Gast Gast
 2008-03-19 09:49
#107219 #107219
Ausgabe von Data::Dumper sollte so aussehen:
Code: (dl )
1
2
3
4
5
6
7
8
$VAR1 = [
[
1
],
[
2
]
];

Nur als Beispiel für eine Spalte. Es funktioniert auch so. Und wenn ich mehrere Spalten haben will, geht es nicht mehr. Es werden unterschiedliche Fehler ausgeben, je nach Versuch. Mal sagt er die Variable @retArr nicht definiert, mal handelt es sich um keine HASH Referenz (oder so ähnlich), oder schlicht Parameter 1 erwartet ein Array.

Mit der Funtion arbeite ich eigentlich so:
Code (perl): (dl )
1
2
3
my $arrRef = $adodb->GetArray('SELECT ID FROM Tabelle1');
print Dumper($arrRef);
print $arrRef->[0]->[0],"\n";
renee
 2008-03-19 09:57
#107220 #107220
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Wenn es nicht definiert ist, dann wurde kein Treffer in der DB gelandet. Dann hast Du in der Sub das Array nur deklariert aber nicht initialisiert.

Wenn die Fehlermeldung kommt, dass "es" sich nicht um eine Hashreferenz handelt, dann stimmt was mit $rst->Fields($nr) nicht. Das bedeutet, dass Du überprüfen solltest, ob der Rückgabewert von $rst->Fields($nr) definiert ist.
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
Gast Gast
 2008-03-19 10:08
#107221 #107221
Ok :) Ich schreibe die Fehlermeldungen hier einmal auf, je nach Versuch, denn ich unternommen habe. Es geht hier nur un die eine Zeile:

Code (perl): (dl )
push(@{$retArr[$_sp]}, $rst->Fields($_sp)->{value});


gibt Fehler: «Can't use an undefined value as a HASH reference at ... Line ...»

Code (perl): (dl )
push(@{$retArr->[$_sp]}, $rst->Fields($_sp)->{value});

ergibt: «Global symbol "$retArr" requires explicit package name at ... line ...»

Code (perl): (dl )
push($retArr[$_sp], $rst->Fields($_sp)->{value});

logisch eigentlich: «Type of arg 1 to push must be array (not array element) at ... line ..., near "})"»

Und wenn ich «$retArr->[$_sp]» als Parameter angebe, bekomme ich Kombination an Fehler aus den letzten beiden Versuchen.

Mehr fällt mir dazu nicht ein, wie ich es machen soll. Plz *help*
renee
 2008-03-19 10:21
#107223 #107223
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
@{$retArr->[$_sp]}: Hier versuchst Du auf eine Arrayreferenz $retArr zuzugreifen, die aber nicht existiert! Es müsste so aussehen: @{$retArr[$_sp]}, - also ohne die Dereferenzierung.
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
renee
 2008-03-19 10:21
#107224 #107224
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
push(@{$retArr[$_sp]}, $rst->Fields($_sp)->{value}); Das habe ich ja weiter oben schon beschrieben...
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
Gast Gast
 2008-03-19 11:01
#107227 #107227
Ok, Danke!

Den Fehler erkannt. Es lag daran, dass «Fields->{count}» eins mehr liefert und muss dementsprechend um -1 korrigiert werden.

Soweit auch alles klar mit dem Array und push, auch wenn das gewünschte Ergebnis nicht gegeben ist.

Bekomme leider kein 1 zu 1 Array aus einem Recordset. Da stimmt was nicht mit meinem Versuch, daher war auch meine zweite Bitte zu schauen, ob es die Richtige Vorgehensweise wäre. Aber das gehört hier wahrscheinlich nicht in diesen Forum. Ich versuche es mal weiter... Trotzdem Danke!
Gast Gast
 2008-03-19 11:06
#107229 #107229
Ok. Zweites Problem auch gelöst. Es war ein push vor der for-Schleife zuviel.

Danke!
<< >> 9 Einträge, 1 Seite



View all threads created 2008-03-19 09:21.