Datenbank Abfrage - Auflistung wie in Suchmaschine (mehrere Seiten)
Torsten
- perl
0 timo0 Torsten
0 Michael Schröpl
Hallo
Ich möchte eine Access-Datenbank mit einem Perl-Script durchsuchen und das Ergebnis als HTML-Seite
ausgeben. Dabei soll die Ausgabe gedruckt werden können.
Da die Datenbank aber sehr viele Einträge besitzt und das Format auch die Breite einer Din A4 Seite
überschreitet, sollen maximal 10 bis 15 Einträge pro Seite gezeigt werden, dann soll es die Möglichkeit geben, auf die nächste Seite der Ergebnisse zu wechseln ( also ähnlich wie bei einer Suchmaschine).
Außerdem soll das Ergebnis im querformat gedruckt werden, ohne das der Anwender später dies einstellen muß.
Hier mein bisheriges Script:
Ich hab keine Idee wo ich in diesem Fall anfangen müßte!
#!/perl/bin/perl.exe
$os = "WINDOWS";
read(STDIN, $input, $ENV{'CONTENT_LENGTH'});
@pairs = split(/&/, $input);
foreach $pair (@pairs) {
($name, $value) = split(/=/, $pair);
$name =~ tr/+/ /;
$name =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
$value =~ tr/+/ /;
$value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
$FORM{$name} = $value;
}
$name=$FORM{"name"};
$wert=$FORM{"wert"};
$dbank=$FORM{"dbank"};
$tabelle=$FORM{"tabelle"};
$max_rows = 1000000;
$rows = 0;
use CGI;
$cgi = new CGI;
use Win32::ODBC;
if ($dbank eq "stamm") {
$DSN="stamm";
if (! ($db=new Win32::ODBC("DSN=stamm")))
{
print "Fehler:".Win32::ODBC::Error() . "\n";
}
else
{
$sql_string = "SELECT * FROM Stellenplan WHERE $name LIKE '$wert%'"; }
}
else {
$DSN="d_baan";
$CONNECT="DSN=d_baan;UID=read;PWD=read;";
$db = new Win32::ODBC("DSN=d_baan;UID=read;PWD=read;");
if( ! ($db = new Win32::ODBC("DSN=d_baan;UID=read;PWD=read;"))) {
print "Fehler beim Verbinden mit $CONNECT\n";
print "Fehler: ". Win32::ODBC::Error() ."\n";
exit;
}
$sql_string = "SELECT BEZ1, BEZ2 FROM tiitm001101 WHERE artikel LIKE '001%'";
}
@FelderNamen = $db->FieldNames();
$spalten = @FelderNamen;
if(! $db->Sql($sql_string))
{
@FelderNamen = $db->FieldNames(); # Feldnamen
$spalten = @FelderNamen; # Spaltenanzahl ermitteln
#Ausgabe der Daten in den Browser (Tabelle)
print $cgi->header,
$cgi->start_html(-title=>'Ergebnis der SQL - Abfrage',
-http-equiv=>'Content-Type content=text/html; charset=iso-8859-1',
-target=>'_new',
-background=>'http://172.18.2.1/images/backgrnd.gif'),
$cgi->h2('Ergebnis der SQL - Abfrage'),
chop;
print "<table border cellspacing=0><tr>";
print "<table border cellspacing=0><tr>";
for (@FelderNamen){
print "<th>", $_, "</th>";
}
print "</tr><br>";
# Und nun den Rest der Tabelle
# FetchRow() gibt 0, wenn keine weiteren Daten anliegen
while ($db->FetchRow() and $rows < $max_rows){
print "<tr>";
undef %Daten ;
%Daten = $db->DataHash();
$rows++;
for ($i = 0; $i < $spalten; $i++){
if ($Daten{$FelderNamen[$i]} gt ''){
print "<td>",$Daten{$FelderNamen[$i]},"</td>";
}
else{
print "<td>-frei-</td>";
}
}
print "</tr>";
}
print "</table>",
$cgi->end_html;
$db->Close() ;
}
else{
print $cgi->header,
$cgi->start_html('Fehler im SQL Statement'),
$cgi->h2('Fehler im SQL Statement'),
$cgi->p,
$db->Error();
}
Danke
hallo,
also deine problematik ist ja eine riesige:
das mit dem dokument quer einstellen wird wohl dein grösstes problem werden denke ich, ansonsten kannst du eine A4 seite mit a. 700 pixel hoch anlegen. man könnte jetzt ausrechnen wieviele zeilen das wären umd die maximale ausgabe zu erhalten. du kannst dir das ja mal ansehen, auf www.wohnungshaus.de gehen und dort die wohnungen in der detailansicht ausdrucken. da haben wir es genauso gemacht.
ansonsten, falls dies nicht helfen sollten schickste mir ne mail und da machen wir uns nochmal nen kopf
gruß
timo
Danke für eure Beiträge,
das mit dem quer ausdrucken hab ich jetzt erstmal wieder vergessen, es wäre auch nur nebensächlich
gewesen, trotzdem danke.
Die Auflistung hab ich jetzt wie folgt gemacht:
#!/perl/bin/perl.exe
$os = "WINDOWS";
read(STDIN, $input, $ENV{'CONTENT_LENGTH'});
@pairs = split(/&/, $input);
foreach $pair (@pairs) {
($name, $value) = split(/=/, $pair);
$name =~ tr/+/ /;
$name =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
$value =~ tr/+/ /;
$value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
$FORM{$name} = $value;
}
$name=$FORM{"name"};
$wert=$FORM{"wert"};
$dbank=$FORM{"dbank"};
$tabelle=$FORM{"tabelle"};
$anzahl=$FORM{"anzahl"};
$max_rows = 10;
$rows = 0;
use CGI;
$cgi = new CGI;
use Win32::ODBC;
if ($dbank eq "stamm") {
$DSN="stamm";
if (! ($db=new Win32::ODBC("DSN=stamm")))
{
print "Fehler:".Win32::ODBC::Error() . "\n";
}
else
{
$sql_string = "SELECT * FROM Stellenplan WHERE $name LIKE '$wert%'"; }
}
else {
$DSN="d_baan";
$CONNECT="DSN=d_baan;UID=read;PWD=read;";
$db = new Win32::ODBC("DSN=d_baan;UID=read;PWD=read;");
if( ! ($db = new Win32::ODBC("DSN=d_baan;UID=read;PWD=read;"))) {
print "Fehler beim Verbinden mit $CONNECT\n";
print "Fehler: ". Win32::ODBC::Error() ."\n";
exit;
}
$sql_string = "SELECT BEZ1, BEZ2 FROM tiitm001101 WHERE artikel LIKE '001%'";
}
@FelderNamen = $db->FieldNames();
$spalten = @FelderNamen;
if(! $db->Sql($sql_string))
{
@FelderNamen = $db->FieldNames(); # Feldnamen
$spalten = @FelderNamen; # Spaltenanzahl ermitteln
#Ausgabe der Daten in den Browser (Tabelle)
print $cgi->header,
$cgi->start_html(-title=>'Ergebnis der SQL - Abfrage',
-http-equiv=>'Content-Type content=text/html; charset=iso-8859-1',
-target=>'unten',
-background=>'http://172.18.2.1/images/backgrnd.gif'),
$cgi->h2('Ergebnis der SQL - Abfrage'),
chop;
print "<table border cellspacing=0><tr>";
print "<table border cellspacing=0><tr>";
for (@FelderNamen){
print "<th>", $_, "</th>";
}
print "</tr><br>";
# Und nun den Rest der Tabelle
# FetchRow() gibt 0, wenn keine weiteren Daten anliegen
if (! ($anzahl==-1))
{
while ($db->FetchRow() and $rows < $anzahl){
$rows++;
}
}
$rows=0;
while ($db->FetchRow() and $rows < $max_rows){
print "<tr>";
undef %Daten ;
%Daten = $db->DataHash();
$rows++;
for ($i = 0; $i < $spalten; $i++){
if ($Daten{$FelderNamen[$i]} gt ''){
print "<td>",$Daten{$FelderNamen[$i]},"</td>";
}
else{
print "<td>-frei-</td>";
}
}
print "</tr>";
}
$anzahl=$anzahl+10;
print "</table>";
print "<form method="post" action="../scripts/daten.plx">";
print "<input type="submit" name="submit" value="weiter">";
print "<input type="hidden" name="anzahl" value="$anzahl">";
print "<input type="hidden" name="name" value="$name">";
print "<input type="hidden" name="wert" value="$wert">";
print "<input type="hidden" name="dbank" value="$dbank">";
print "</form>";
$cgi->end_html;
$db->Close() ;
}
else{
print $cgi->header,
$cgi->start_html('Fehler im SQL Statement'),
$cgi->h2('Fehler im SQL Statement'),
$cgi->p,
$db->Error();
}
sub debug{
print $cgi->header,
$cgi->start_html('Debug'),
$cgi->h2('Debug'),
"Debug:",$_[0],":";
print $cgi->end_html;
}
Es ist zwar mehr schreibarbeit, dafür versteht man es aber einfacher meine ich.
Danke nochmal an eure Antworten.
Torsten
Hi,
maximal 10 bis 15 Einträge pro Seite gezeigt werden, dann soll es die Möglichkeit geben, auf die nächste Seite der Ergebnisse zu wechseln ( also ähnlich wie bei einer Suchmaschine).
Ich hab keine Idee wo ich in diesem Fall anfangen müßte!
übergib Deiner Suchmaschine einen zusätzlichen CGI-Parameter "offset" mit einem integer-Wert für die Zeilenzahl.
Dann führe Deine Suche durch, berechne *alle* Treffer und gibt aber nur diejenigen aus, welche zwischen Nummer "offset+1" und Nummer "offset+15" liegen.
mfG - Michael
Nachtrag:
übergib Deiner Suchmaschine einen zusätzlichen CGI-Parameter "offset" mit einem integer-Wert für die Zeilenzahl.
Dann führe Deine Suche durch, berechne *alle* Treffer und gibt aber nur diejenigen aus, welche zwischen Nummer "offset+1" und Nummer "offset+15" liegen.
Falls der Wert dieses Parameters nicht angegeben war, dann soll er auf 0 gesetzt sein.
Jeder der Links, welcher die Anzeige weiterer Teile des Ergebnisses bewirken soll, wird bei der Ausgabe so generiert, daß er ebenfalls wieder das CGI-Skript aufruft, und zwar mit einem passenden offset-Wert.
mfG - Michael