Hallo, Kann mir jemand einen Tipp geben, welche Möglichkeiten zum Auslesen von mdb- Dateien in Perl- Skripten in Linux existieren? Bisher habe ich aus dem Perl-Script die "mdb-tools" aufgerufen- Da funktioniert ganz gut, hat aber den Nachteil, dass das Verarbeiten der Datei mit mehr als 500000 Zeilen schon mal auf einem besseren Rechner (2x 6CPU-Cores, 16GB RAM usw.) schon mal 4 Tage dauern. Das ist mir einfach zu lange. Nun habe ich mich daran gemacht das auf DBD::ODBC umzustellen. Als Treiber verwende ich die libmdbodbc des MDB-Tools- Projektes. Leider habe ich so meine Probleme. So ist es mir bisher nicht gelungen, die mdb- Datei im Script zu übergeben. Nur wenn ich in die Benutzer- odbc.ini die Datei und Treiber angebe, gelingt die Verbindung. Des weiteren habe ich Probleme den Tabellenkopf der gewählten Tabelle auszulesen. Wenn ich das mit den mdb-tools auf Komandozeiel mache, dann geht das. Ergebnis des Kopfes mit mdb-sql: |PARTNO |OLDPARTNO |DESCRIPTION |PRICE |PRICE_PER |PACKAGING |MAIN_SUBGROUP|KATALOG |PAGE | Wenn ich das gleiche mit DBD::ODBC (print "Field names: @{ $sth->{NAME} }\n";) versuche bekomme ich das: Field names: PODPPPMKP ODPPPMKP DPPPMKP PPPMKP PPMKP PMKP MKP KP P Da ich die ganze Tabelle nat. aufgrund er Größe nicht mit einmal komplett auslesen kann, lese ich erstmal die Artikelnummern (es handelt sich ja um eine Preisliste) und dann lese ich die jeweiligen Datensätze anhand der Nummer. Obwohl es mir nicht gelingt, den Tabellenkopf korrekt auszulesen, gelingt das Auslesen einer Artikelnummernspalte mit: --------------- my $sth = $dbh->prepare(qq(SELECT PARTNO FROM Pricelist)); $sth->execute(); --------------- Wenn ich nun aber versuche anhand der Artikelnummer eine Datenzeile auszulesen, dann kommt nichts: --------------- foreach(@part_no) { my $tmp_var = $_; my $stmt = "SELECT * FROM Pricelist WHERE 'partno' = '$tmp_var'"; $sth = $dbh->prepare(qq(SELECT * FROM Pricelist WHERE 'PARTNO' = '$tmp_var')); $sth->execute(); print "Partno:".$_."=>"; while(my $row = $sth->fetchrow_array()) { foreach (@$row) { $_ = '' unless defined } print "@$row\n"; } $sth->finish(); print "\n"; } ------------- Es kommt nur: ------------- Partno:0000000015=> Partno:0000021550=> Partno:0000028600KR=> Partno:0000028610KR=> Partno:0000028660KR=> Partno:0000030520=> Partno:0000030530=> Partno:0000030574=> Partno:0000076330=> Partno:0000085120=> Partno:0000085140=> Partno:0000085150=> Partno:0000085230=> Partno:0000085240=> Partno:0000085340=> Partno:0000085430=> Partno:0000085430KR=> Partno:0000085450=> Partno:0000085500=> ........ ------------- Füttere ich nun die gleichen Artikelnummern in "mdb-sql", dann kommen die Daten problemlos raus. Die Frage ist nun, mache ich was falsch oder ist der Treiber von libmdbodbc das Problem? Gibt es irgendwo eine ordentliche Doku? Gibt es event. einen anderen Treiber/ PERL-Modul, um die mdb's auszulesen? OS: openSUSE 12.3 (x86_64) mdb-tools: mdbtools-0.6pre1-34.1.2.x86_64 -- Mit freundlichen Grüßen Sebastian Reinhardt -- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um den Listen Administrator zu erreichen, schicken Sie eine Mail an: opensuse-de+owner@opensuse.org
Hallo, Sebastian Reinhardt schrieb:
Kann mir jemand einen Tipp geben, welche Möglichkeiten zum Auslesen von mdb- Dateien in Perl- Skripten in Linux existieren?
Ich hatte mich vor ein paar Jahren ebenfalls mit mdb-tools befasst. Leider war das nicht vom Erfolg gekrönt. Mir scheint auch, daß die mdb-tools seit einigen Jahren schon nicht mehr weiterentwickelt werden. Insofern habe ich diese Bemühungen eingestellt und bin (einschließlich Perl) auf eine Windows-Maschine gewechselt. Dort kann man die MDB-Datei per ODBC zur Verfügung stellen und aus Perl sehr komfortabel drauf zugreifen. Ich weiß, das hilft Dir jetzt recht wenig, weil Du ja nach Möglichkeiten unter Linux gefragt hast... Eine Alternative wäre vielleicht noch, falls Du die Daten, die in der MDB stehen, in eine andere Datenbank migrieren könntest, auf die man einfacher aus Linux zugreifen kann. MySQL, Oracle oder MS-SQL vielleicht... Und die (von mir vermutete) Windows-Anwendung, welche zur Datenpflege benutzt wird, greift per ODBC darauf zu.
Bisher habe ich aus dem Perl-Script die "mdb-tools" aufgerufen- Da funktioniert ganz gut, hat aber den Nachteil, dass das Verarbeiten der Datei mit mehr als 500000 Zeilen schon mal auf einem besseren Rechner (2x 6CPU-Cores, 16GB RAM usw.) schon mal 4 Tage dauern. Das ist mir einfach zu lange.
MDB-Datei mit 500.000 Datensätzen? Das ist sportlich... =;-) -- Viele Grüße aus Weimar Thomas Voigt -- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um den Listen Administrator zu erreichen, schicken Sie eine Mail an: opensuse-de+owner@opensuse.org
Am 25.06.2013 21:37, schrieb Sebastian Reinhardt:
mdb- Dateien
Datei mit mehr als 500000 Zeilen
Ohne jetzt Microsoft-Bashing betreiben zu wollen... aber Access ist eigentlich nicht für solche Datenmengen ausgelegt. In diesen Bereichen sollte man schon auf eine "echte" Datenbank ausweichen. Am einfachsten wird es wohl sein, die Access-Daten auf eine MS-SQL Datenbank zu migrieren. Bei Produkten aus gleichem Hause sollte man erwarten, dass es auch entsprechende Migrationstools gibt. Bzw. wenn es nur eine Tabelle ist (was ich mal aufgrund deines "Datei mit 500.000 Zeilen" vermute), wäre es vielleicht sinnvoll, gar nicht erst auf SQL zu setzen, denn das spielt ja seine Stärken vor allem beim Verknüpfen von Tabellen aus. Schon mal über eine NoSQL-Datenbank nachgedacht? Gruß Uli -- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um den Listen Administrator zu erreichen, schicken Sie eine Mail an: opensuse-de+owner@opensuse.org
Am 26.06.2013 10:22, schrieb Ulrich Gehauf:
Am 25.06.2013 21:37, schrieb Sebastian Reinhardt:
mdb- Dateien
Datei mit mehr als 500000 Zeilen
Ohne jetzt Microsoft-Bashing betreiben zu wollen... aber Access ist eigentlich nicht für solche Datenmengen ausgelegt. In diesen Bereichen sollte man schon auf eine "echte" Datenbank ausweichen. Am einfachsten wird es wohl sein, die Access-Daten auf eine MS-SQL Datenbank zu migrieren. Bei Produkten aus gleichem Hause sollte man erwarten, dass es auch entsprechende Migrationstools gibt.
Bzw. wenn es nur eine Tabelle ist (was ich mal aufgrund deines "Datei mit 500.000 Zeilen" vermute), wäre es vielleicht sinnvoll, gar nicht erst auf SQL zu setzen, denn das spielt ja seine Stärken vor allem beim Verknüpfen von Tabellen aus. Schon mal über eine NoSQL-Datenbank nachgedacht?
Gruß Uli
@Thomas Voigt und Ulrich Gehauf: Ich bekomme von einem Zulieferer für Norm- und Verschleißteile diese MDB- Datei, wie sie ist! Alle "akademischen" Diskussionen über "muss das so sein" sind damit schlicht egal! Die bieten auch noch einen Satz von xls- Dateien an. Da ist de "Wust" aber nicht leichter zu entwirren. Die über 500.000 Zeilen kommen auch dadurch zu Stande, weil auch eine Spalte mit "alten" Artikelnummern existiert. Damit wird versucht das "Umschlüsseln" der Artikelnummern von allen alten zur aktuellen abzubilden. Das heißt, es gibt für jede Artikelnummer den Datensatz bis zu 5 oder 6 mal. Das filtere ich nat. raus, da mich nur die aktuellen interessieren, um eine csv- Datei zum Import in Kivitendo (Warenwirtschaftssystem) zu erstellen und dort die Preise zu aktualisieren. Also alles mit Winstone- Maschine und Migration in Datenbank usw. ist "Quatsch-mit-Soße", da es ja darum geht, eine csv- Datei zu erstellen, damit das ins Kivitendo bzw. dessen Postgre- SQL- Datenbank importiert werden kann. Ich muss also zwingend die Daten erst mal aus der mdb extrahieren. Da die mdb-tools das auf "command-line" korrekt machen, muss das ja irgendwie gehen! -- Mit freundlichen Grüßen Sebastian Reinhardt -- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um den Listen Administrator zu erreichen, schicken Sie eine Mail an: opensuse-de+owner@opensuse.org
Am 26.06.2013 10:42, schrieb Sebastian Reinhardt:
Ich bekomme von einem Zulieferer für Norm- und Verschleißteile diese MDB- Datei, wie sie ist!
Der wird aber seinen Bestand auch nicht in Access verwalten? Vielleicht kann man mit denen ja mal reden, ob sie nicht direkt eine CSV-Datei zur Verfügung stellen können, wenn's eh nur darum geht, eine Datenbanktabelle zu übertragen. Die Datei sollte dann auch mit der von dir genannten Maschine recht schnell "durchsortiert" sein.
Alle "akademischen" Diskussionen über "muss das so sein" sind damit schlicht egal!
Also ein typisches "des hamma scho immer so gmacht". Ich hab allerdings die Erfahrung gemacht, dass manche "Datenlieferanten" durchaus kompromissbereit sind und für eine sinnvolle Zusammenarbeit auch mal was neues ausprobieren. Tatsache ist halt, dass hier offensichtlich ein unpassendes Datenformat zusammen mit einem kaputten Datendesign zu unnötigen Klimmzügen und Lösungen in der Art "Von hinten durch die Brust ins Auge" führen. Gruß Uli -- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um den Listen Administrator zu erreichen, schicken Sie eine Mail an: opensuse-de+owner@opensuse.org
Hallo, o.k., wenn es keine Möglichkeit zur Migration der Ausgangsdaten gibt, wage ich mal einen Schnellschuß in Richtung "Fehler in Deinem Script":
while(my $row = $sth->fetchrow_array())
Laut http://search.cpan.org/~timb/DBI-1.627/DBI.pm#fetchrow_array ist bei Verwendung von fetchrow_array im scalaren Context folgendes zu beachten: "If called in a scalar context for a statement handle that has more than one column, it is undefined whether the driver will return the value of the first column or the last. So don't do that. Also, in a scalar context, an undef is returned if there are no more rows or if an error occurred. That undef can't be distinguished from an undef returned because the first field value was NULL. For these reasons you should exercise some caution if you use fetchrow_array in a scalar context." Sollte das also nicht besser @row heißen? Wie gesagt, nur ein Schnellschuß zum nachdenken... -- Viele Grüße aus Weimar Thomas Voigt -- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um den Listen Administrator zu erreichen, schicken Sie eine Mail an: opensuse-de+owner@opensuse.org
On Tue, June 25, 2013 21:37, Sebastian Reinhardt wrote:
Hallo,
Kann mir jemand einen Tipp geben, welche Möglichkeiten zum Auslesen von mdb- Dateien in Perl- Skripten in Linux existieren? Bisher habe ich aus dem Perl-Script die "mdb-tools" aufgerufen- Da funktioniert ganz gut, hat aber den Nachteil, dass das Verarbeiten der Datei mit mehr als 500000 Zeilen schon mal auf einem besseren Rechner (2x 6CPU-Cores, 16GB RAM usw.) schon mal 4 Tage dauern. Das ist mir einfach zu lange. Nun habe ich mich daran gemacht das auf DBD::ODBC umzustellen. Als Treiber verwende ich die libmdbodbc des MDB-Tools- Projektes. Leider habe ich so meine Probleme. So ist es mir bisher nicht gelungen, die mdb- Datei im Script zu übergeben. Nur wenn ich in die Benutzer- odbc.ini die Datei und Treiber angebe, gelingt die Verbindung. Des weiteren habe ich Probleme den Tabellenkopf der gewählten Tabelle auszulesen. Wenn ich das mit den mdb-tools auf Komandozeiel mache, dann geht das. Ergebnis des Kopfes mit mdb-sql: |PARTNO |OLDPARTNO |DESCRIPTION |PRICE |PRICE_PER |PACKAGING |MAIN_SUBGROUP|KATALOG |PAGE |
Wenn ich das gleiche mit DBD::ODBC (print "Field names: @{ $sth->{NAME} }\n";) versuche bekomme ich das: Field names: PODPPPMKP ODPPPMKP DPPPMKP PPPMKP PPMKP PMKP MKP KP P
Da ich die ganze Tabelle nat. aufgrund er Größe nicht mit einmal komplett auslesen kann, lese ich erstmal die Artikelnummern (es handelt sich ja um eine Preisliste) und dann lese ich die jeweiligen Datensätze anhand der Nummer. Obwohl es mir nicht gelingt, den Tabellenkopf korrekt auszulesen, gelingt das Auslesen einer Artikelnummernspalte mit: --------------- my $sth = $dbh->prepare(qq(SELECT PARTNO FROM Pricelist)); $sth->execute(); --------------- Wenn ich nun aber versuche anhand der Artikelnummer eine Datenzeile auszulesen, dann kommt nichts: --------------- foreach(@part_no) { my $tmp_var = $_; my $stmt = "SELECT * FROM Pricelist WHERE 'partno' = '$tmp_var'"; $sth = $dbh->prepare(qq(SELECT * FROM Pricelist WHERE 'PARTNO' = '$tmp_var')); $sth->execute(); print "Partno:".$_."=>"; while(my $row = $sth->fetchrow_array()) { foreach (@$row) { $_ = '' unless defined } print "@$row\n"; } $sth->finish(); print "\n"; } ------------- Es kommt nur: ------------- Partno:0000000015=> Partno:0000021550=> Partno:0000028600KR=> Partno:0000028610KR=> Partno:0000028660KR=> Partno:0000030520=> Partno:0000030530=> Partno:0000030574=> Partno:0000076330=> Partno:0000085120=> Partno:0000085140=> Partno:0000085150=> Partno:0000085230=> Partno:0000085240=> Partno:0000085340=> Partno:0000085430=> Partno:0000085430KR=> Partno:0000085450=> Partno:0000085500=> ........ ------------- Füttere ich nun die gleichen Artikelnummern in "mdb-sql", dann kommen die Daten problemlos raus.
Die Frage ist nun, mache ich was falsch oder ist der Treiber von libmdbodbc das Problem? Gibt es irgendwo eine ordentliche Doku? Gibt es event. einen anderen Treiber/ PERL-Modul, um die mdb's auszulesen?
OS: openSUSE 12.3 (x86_64) mdb-tools: mdbtools-0.6pre1-34.1.2.x86_64
Falls es mit den mdb-tools nicht klappen sollte, würde ich mir ja mal den RapidMiner anschauen. Der kann Access Datenbanken lesen und entweder in csv wandeln oder gleich in eine Datenbank dumpen. Viele Grüße, Christian -- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um den Listen Administrator zu erreichen, schicken Sie eine Mail an: opensuse-de+owner@opensuse.org
Am 26.06.2013 12:49, schrieb Christian Brabandt:
On Tue, June 25, 2013 21:37, Sebastian Reinhardt wrote:
Hallo,
Kann mir jemand einen Tipp geben, welche Möglichkeiten zum Auslesen von mdb- Dateien in Perl- Skripten in Linux existieren? Bisher habe ich aus dem Perl-Script die "mdb-tools" aufgerufen- Da funktioniert ganz gut, hat aber den Nachteil, dass das Verarbeiten der Datei mit mehr als 500000 Zeilen schon mal auf einem besseren Rechner (2x 6CPU-Cores, 16GB RAM usw.) schon mal 4 Tage dauern. Das ist mir einfach zu lange. Nun habe ich mich daran gemacht das auf DBD::ODBC umzustellen. Als Treiber verwende ich die libmdbodbc des MDB-Tools- Projektes. Leider habe ich so meine Probleme. So ist es mir bisher nicht gelungen, die mdb- Datei im Script zu übergeben. Nur wenn ich in die Benutzer- odbc.ini die Datei und Treiber angebe, gelingt die Verbindung. Des weiteren habe ich Probleme den Tabellenkopf der gewählten Tabelle auszulesen. Wenn ich das mit den mdb-tools auf Komandozeiel mache, dann geht das. Ergebnis des Kopfes mit mdb-sql: |PARTNO |OLDPARTNO |DESCRIPTION |PRICE |PRICE_PER |PACKAGING |MAIN_SUBGROUP|KATALOG |PAGE |
Wenn ich das gleiche mit DBD::ODBC (print "Field names: @{ $sth->{NAME} }\n";) versuche bekomme ich das: Field names: PODPPPMKP ODPPPMKP DPPPMKP PPPMKP PPMKP PMKP MKP KP P
Da ich die ganze Tabelle nat. aufgrund er Größe nicht mit einmal komplett auslesen kann, lese ich erstmal die Artikelnummern (es handelt sich ja um eine Preisliste) und dann lese ich die jeweiligen Datensätze anhand der Nummer. Obwohl es mir nicht gelingt, den Tabellenkopf korrekt auszulesen, gelingt das Auslesen einer Artikelnummernspalte mit: --------------- my $sth = $dbh->prepare(qq(SELECT PARTNO FROM Pricelist)); $sth->execute(); --------------- Wenn ich nun aber versuche anhand der Artikelnummer eine Datenzeile auszulesen, dann kommt nichts: --------------- foreach(@part_no) { my $tmp_var = $_; my $stmt = "SELECT * FROM Pricelist WHERE 'partno' = '$tmp_var'"; $sth = $dbh->prepare(qq(SELECT * FROM Pricelist WHERE 'PARTNO' = '$tmp_var')); $sth->execute(); print "Partno:".$_."=>"; while(my $row = $sth->fetchrow_array()) { foreach (@$row) { $_ = '' unless defined } print "@$row\n"; } $sth->finish(); print "\n"; } ------------- Es kommt nur: ------------- Partno:0000000015=> Partno:0000021550=> Partno:0000028600KR=> Partno:0000028610KR=> Partno:0000028660KR=> Partno:0000030520=> Partno:0000030530=> Partno:0000030574=> Partno:0000076330=> Partno:0000085120=> Partno:0000085140=> Partno:0000085150=> Partno:0000085230=> Partno:0000085240=> Partno:0000085340=> Partno:0000085430=> Partno:0000085430KR=> Partno:0000085450=> Partno:0000085500=> ........ ------------- Füttere ich nun die gleichen Artikelnummern in "mdb-sql", dann kommen die Daten problemlos raus.
Die Frage ist nun, mache ich was falsch oder ist der Treiber von libmdbodbc das Problem? Gibt es irgendwo eine ordentliche Doku? Gibt es event. einen anderen Treiber/ PERL-Modul, um die mdb's auszulesen?
OS: openSUSE 12.3 (x86_64) mdb-tools: mdbtools-0.6pre1-34.1.2.x86_64 Falls es mit den mdb-tools nicht klappen sollte, Das funktioniert ja mit "mdb-sql" usw.. Leider dauert dieser Aufruf des "command-line"- Programmes leider extrem lange. würde ich mir ja mal den RapidMiner anschauen. Der kann Access Datenbanken lesen und entweder in csv wandeln oder gleich in eine Datenbank dumpen.
Viele Grüße, Christian
Das Thema hat sich aber exakt 13:56Uhr erledig. Da bekam ich eine E-Mail, dass am 01.07. eine neu Preisliste rauskommt (wie erwartet). Dabei wird gleich noch ein neues Dateiformat eingeführt. Das ist vom Prinzip her eine reine Textdatei mit festen Spaltenbreiten. Die Datei hat gleich mal 77MB und es wird eh noch ein komplett neues Rabattsystem eingführt. Es gab zwar auch schon mal eine Textdatei von denen, aber da fehlten Infos, die aber nun enthalten sind. Da die zweite Firma, von der wir auch eine mdb- Datei bekommen haben, auch eine Textdatei als Alternative anbietet, werde ich das "ad akta" legen und den Weg mit der mdb nicht weiter verfolgen. Das "wurmt" mich allerdings extrem!!!! Irgendwie muss das doch funktionieren..... -- Mit freundlichen Grüßen Sebastian Reinhardt -- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um den Listen Administrator zu erreichen, schicken Sie eine Mail an: opensuse-de+owner@opensuse.org
Hallo, Am Wed, 26 Jun 2013, Sebastian Reinhardt schrieb: [..]
Das Thema hat sich aber exakt 13:56Uhr erledig. Da bekam ich eine E-Mail, dass am 01.07. eine neu Preisliste rauskommt (wie erwartet). Dabei wird gleich noch ein neues Dateiformat eingeführt. Das ist vom Prinzip her eine reine Textdatei mit festen Spaltenbreiten. Die Datei hat gleich mal 77MB und es wird eh noch ein komplett neues Rabattsystem eingführt.
Die kannst du dann mit DBD::AnyData als Backend mit DBI verwursten. Such nach 'fixed' in 'man DBD::AnyData'. HTH, -dnh -- Hehehe: Der LaTeX Benutzer flucht halt auf den ersten zehn Seiten. Der Word-Mensch auf den danach folgenden. -- Karl Wunderle -- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um den Listen Administrator zu erreichen, schicken Sie eine Mail an: opensuse-de+owner@opensuse.org
Am 26.06.2013 18:16, schrieb David Haller:
Hallo,
Am Wed, 26 Jun 2013, Sebastian Reinhardt schrieb: [..]
Das Thema hat sich aber exakt 13:56Uhr erledig. Da bekam ich eine E-Mail, dass am 01.07. eine neu Preisliste rauskommt (wie erwartet). Dabei wird gleich noch ein neues Dateiformat eingeführt. Das ist vom Prinzip her eine reine Textdatei mit festen Spaltenbreiten. Die Datei hat gleich mal 77MB und es wird eh noch ein komplett neues Rabattsystem eingführt. Die kannst du dann mit DBD::AnyData als Backend mit DBI verwursten. Such nach 'fixed' in 'man DBD::AnyData'.
HTH, -dnh
Wow, das sieht gut aus. Merke ich mir. Derzeit (seit gestern Nachmittag/ Abend) habe ich das aber anders realisiert, indem ich das zeilenweise auslese und die Zeile mit "subtr" zerlege. Ich bekomme ja eine Beschreibung der Datei (z.B. von 1-10-Artikelnummer, 11-40 Bezeichnung, 41-50-Listenpreis usw.). Das speichere ich mir für jeden Lieferanten in eine Datei und lese es dann in ein Hash ein (natürlich in der Form (Array in Hash!): "Artikelnummer => [Start][Länge]"). Da die das alle mit 1. Zeichen in Zeile = 1 angeben, steht unten im Codeausschnitt nat. Position-1 ! Ich schreibe das auch so universell, wie möglich, damit ich für verschiedene Listen nur die eine Routine brauche. Ich mache jetzt übrigens das hier: ------------------------------------------------ while( my $line = <$inputfile>) { .......ein paar Tests, ob die Spalte auch benötigt wird und Auswahl der Tabellenkopfbezeichnung (tmp_head, die auch in der Definitionsdatei verwendet wird)....... $output_hash{$tmp_head} = substr($line,$head_def_hash{$tmp_head}[0]-1,$head_def_hash{$tmp_head}[1]-1); ..........Verarbeitung der gelesenen Werte (z.B. mit Rabatt unseren Einkaufspreis errechnen usw.)......... } ------------------------------------------------ Zugegeben, mit "SELECT.."-Anwewisungen sieht das "professioneller" aus, aber dann brauche ich ja eigentlich wieder eine Hilfsvariable, da ich dem Modul ja sagen muss, nach welchem Kriterium (z.B. spezifische Artikelnummer) die Zeile selektiert wird. Mal sehen, vielleicht schreibe ich das noch mal um.......Danke für den Tipp. -- Mit freundlichen Grüßen Sebastian Reinhardt -- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um den Listen Administrator zu erreichen, schicken Sie eine Mail an: opensuse-de+owner@opensuse.org
Hallo, Am Tue, 25 Jun 2013, Sebastian Reinhardt schrieb: [..]
my $sth = $dbh->prepare(qq(SELECT PARTNO FROM Pricelist)); $sth->execute(); Wenn ich nun aber versuche anhand der Artikelnummer eine Datenzeile auszulesen, dann kommt nichts: foreach(@part_no) { my $tmp_var = $_; my $stmt = "SELECT * FROM Pricelist WHERE 'partno' = '$tmp_var'"; $sth = $dbh->prepare(qq(SELECT * FROM Pricelist WHERE 'PARTNO' = '$tmp_var')); $sth->execute(); print "Partno:".$_."=>"; while(my $row = $sth->fetchrow_array()) { foreach (@$row) { $_ = '' unless defined } print "@$row\n"; } $sth->finish(); print "\n"; } Es kommt nur: Partno:0000000015=>
Du verwendest nicht 'use warnings; use strict;'.
while(my $row = $sth->fetchrow_array())
hier holst du dir ein Array (bzw. das erste Element oder so, siehe nebenan), verwendest es dann aber als Arrayref: foreach (@$row) { $_ = '' unless defined } Siehe @row_ary = $sth->fetchrow_array; $ary_ref = $sth->fetchrow_arrayref; in man DBI. Ausserdem solltest du prepared statements verwenden: my $sth = $dbh->prepare("SELECT * FROM Pricelist WHERE 'PARTNO' = ?); $sth->execute($tmp_var); while(my $row = $sth->fetchrow_arrayref()) { print join(", ", @{$row}), "\n"; } $sth->finish(); print "\n"; Oder so. HTH, -dnh -- "Cynical" is a term invented by optimists to describe realists. -- Gregory Benford -- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um den Listen Administrator zu erreichen, schicken Sie eine Mail an: opensuse-de+owner@opensuse.org
Am 26.06.2013 16:25, schrieb David Haller:
Hallo,
Am Tue, 25 Jun 2013, Sebastian Reinhardt schrieb: [..]
my $sth = $dbh->prepare(qq(SELECT PARTNO FROM Pricelist)); $sth->execute(); Wenn ich nun aber versuche anhand der Artikelnummer eine Datenzeile auszulesen, dann kommt nichts: foreach(@part_no) { my $tmp_var = $_; my $stmt = "SELECT * FROM Pricelist WHERE 'partno' = '$tmp_var'"; $sth = $dbh->prepare(qq(SELECT * FROM Pricelist WHERE 'PARTNO' = '$tmp_var')); $sth->execute(); print "Partno:".$_."=>"; while(my $row = $sth->fetchrow_array()) { foreach (@$row) { $_ = '' unless defined } print "@$row\n"; } $sth->finish(); print "\n"; } Es kommt nur: Partno:0000000015=> Du verwendest nicht 'use warnings; use strict;'.
while(my $row = $sth->fetchrow_array())
hier holst du dir ein Array (bzw. das erste Element oder so, siehe nebenan), verwendest es dann aber als Arrayref:
foreach (@$row) { $_ = '' unless defined }
Siehe
@row_ary = $sth->fetchrow_array; $ary_ref = $sth->fetchrow_arrayref;
in man DBI. Das mit "array_ref" stand da auch schon drin. Ich habe schon einige Abende dran gesessen...hat nur nicht funktioniert.
Ausserdem solltest du prepared statements verwenden:
my $sth = $dbh->prepare("SELECT * FROM Pricelist WHERE 'PARTNO' = ?); $sth->execute($tmp_var); while(my $row = $sth->fetchrow_arrayref()) { print join(", ", @{$row}), "\n"; } $sth->finish(); print "\n";
Oder so.
HTH, -dnh
Danke, das Ihr Euch Gedanken gemacht habt, aber wie bereits erwähnt, hat sich das heute nach dem Mittag geklärt. Es werden jetzt neue Textdateien bereitgestellt, die ich nun verabreite und damit das Problem umgehe. -- Mit freundlichen Grüßen Sebastian Reinhardt -- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um den Listen Administrator zu erreichen, schicken Sie eine Mail an: opensuse-de+owner@opensuse.org
participants (5)
-
Christian Brabandt
-
David Haller
-
Sebastian Reinhardt
-
Ulrich Gehauf
-
Voigt, Thomas