Suchen und Auflisten von Werten aus einer Datenbank

Django, Flask, Bottle, WSGI, CGI…
Antworten
BoOnOdY
User
Beiträge: 112
Registriert: Samstag 22. Juli 2006, 13:38

Hey ich habe noch mal eine kleine Frage, geht das auch rückwärts?
Weil ich habe eine SQL-Methode und die soll mir die Daten ausgeben(die funktioniert auch schon)
Aber ich will das in einem Schwung durchmache, das heißt:
Startseite(HTML)--> Daten Eingeben
Pyhton Script --> Daten auslesen (klappt auch schon dank gerold) die Datenin die SQL datenbank eintragen über eineSQLmethode (auch alles schon funktionell wie man in dme beitrag lesen kann)
Hab jetzt noch eine SQL funktion geschrieben die mir die daten die ich will herausfiltert.

Code: Alles auswählen

 
select * from kunden
where
(
vorname=<dtml-sqlvar vorname type="string">
and
zuname=<dtml-sqlvar zuname type="string">
and
strasse=<dtml-sqlvar strasse type="string">
and
ort=<dtml-sqlvar ort type="string">
and
telefon=<dtml-sqlvar telefon type="string">
and
mobil=<dtml-sqlvar mobil type="string">
and
email=<dtml-sqlvar email type="string">
and
info=<dtml-sqlvar info type="string"> 
)
Wie sag ich jetzt meinem Script nur, dass es dise SQL methode aufrufen soll, und danach eine Seite aufrufen soll, zb "bestaetigung",
also ein einfacher aufruf ohne variablen übergabe
Sql Methode nur ausführen und ihr die variablen übergeben und dann das DTML document ohne Variablenübergaben (die soll es sich dann aus der SQL-Methode rausholen) einfach nur aufmachen

Viele liebe Grüße
Tim
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

Hi Tim!

Ich habe ein neues Thema daraus gemacht. Wenn viel Code in einem Thema mit mehreren Beiträgen vorkommt, dann dauert das Antworten auf einen Beitrag ziemlich lange oder funktioniert überhaupt nicht.

@All: Neue Frage -- Neues Thema, bitte.

lg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

Hi Tim!

Wenn du die ZSQL-Methode richtig formulierst, dann kannst du es so einrichten, dass du nicht alle Parameter übergeben musst und trotzdem eine Rückgabe bekommst.

Ich habe zufallig eine Testdatenbankverbindung zu einer Gadfly-Datenbank offen. Damit kann man zwar keine LIKE-Bedingungen in Abfragen verwenden, aber zum Demonstrieren genügt das schon. Es existiert eine Tabelle mit dem Namen ``adressen`` und mit zwei Feldern: ``vorname`` und ``nachname``. Das ist die Basis für mein Beispiel.

Jetzt kommt noch die ZSQL-Methode. In diesem Fall nenne ich sie ``addresses_search_sql``. Als Parameter gebe ich ``vorname`` und ``nachname`` an.

Code: Alles auswählen

SELECT vorname, nachname FROM adressen
<dtml-sqlgroup where>
  <dtml-sqltest vorname op=eq type=string optional>
<dtml-and>
  <dtml-sqltest nachname op=eq type=string optional>
</dtml-sqlgroup>
Dann erstelle ich mit Hilfe des ``Z Search Interface`` ein Suchformular und eine Seitenvorlage für die Anzeige des Ergebnisses. Das was uns dieses ``Z Search Interface`` liefert, ist zwar nicht besonders schön, aber es kann wunderbar als Basis für die Weiterentwicklung dienen, da es auch automatisch Code generiert, der das Ergebnis "Seitenweise" ausgibt.

"Z Search Interface" aus der Kombinationsliste auswählen.
Es erscheint das Fenster "Add Search Interface".

Werte in das Z Search Interface eingeben:
- Select one or more searchable objects: addresses_search_sql
- Report Id: addresses_result
- Report Title: Adressen Suchergebnis
- Report Style: Tabular
- Search Input Id: addresses_search
- Search Input Title: Adressen Suche
- Generate Page Templates: Ja

Mit einem Klick auf [Add] generiert uns nun dieses "Z Search Interface" zwei neue Dateien ``addresses_search`` und ``addresses_result``.

``addresses_result`` kann auch direkt aufgerufen werden. Es werden alle Adressen angezeigt, wenn keine zusätzlichen Parameter übergeben werden. Ruft man die Seite aber mit einem zusätzlichen Parameter auf, dann wird dieser automatisch über das REQUEST-Objekt an die ZSQL-Methode weitergeleitet.

Der Aufruf ``http://localhost:8080/adressen/addresse ... hname=Mair`` gibt nur Adressen zurück, bei denen der Nachname ``Mair`` ist.

Ruft man die Seite ``addresses_search`` auf, dann hat man dort ein Formular, in welches man die Argumente eingeben kann. Allerdings funktioniert die Suche noch nicht so ganz, da vom Formular ein Leerstring ("") übermittelt wird, wenn in ein Textfeld nichts eingegeben wurde. Somit generiert uns die ZSQL-Methode eine SQL-Abfrage, die uns kein Ergebnis liefert, wenn auch nur ein Feld nicht befüllt wird. Wird z.B. nur der Vorname ``Gerold`` eingegeben, aber nichts in das Feld Nachname, dann würde die ZSQL-Methode diese SQL-Abfrage an die Datenbank schicken:

Code: Alles auswählen

select vorname, nachname from adressen
where
(vorname = 'Gerold'
 and nachname = ''
)
Damit können wir aber nichts anfangen. Wir müssen uns darum kümmern, dass ein Argument NICHT übergeben wird, wenn ein Feld leer ist.

Dafür schalten wir ein Python-Script dazwischen (``addresses_searchmethod``):

Code: Alles auswählen

from Products.PythonScripts.standard import html_quote

request = context.REQUEST
response = request.RESPONSE

vorname = request.get("vorname", None)
nachname = request.get("nachname", None)

result_url = container.addresses_result.absolute_url() + "?"

if vorname:
    result_url += "vorname=" + html_quote(vorname)
if nachname:
    result_url += "&nachname=" + html_quote(nachname)

response.redirect(result_url)
In der Datei ``addresses_search`` muss deshalb die Formular-Action geändert werden. Aus

Code: Alles auswählen

<form action="addresses_result" method="get">
wird

Code: Alles auswählen

<form action="addresses_searchmethod" method="get">
lg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Antworten