Zugriff mit TAL auf ZSQL gibt keine Werte zurück

  • Hi all,

    ich versuch mir gerade TAL usw anzueignen, bin jetzt aber auf ein Problem gestoßen das ich trotz Doku nicht gelöst bekommen. Vielleicht sehe ich vor lauter Bäumen auch den Wald nicht mehr.

    Also, ich habe zwei Tabellen in einer MySQL DB. Die eine wird erfolgreich durchlaufen und die Daten in einer Spalte dargestellt (ZSQL Methode).

    Nun sind in der zweiten Tabelle daten die mit einem Datensatz der ersten zusammenhängen. Diese sollen ausgelesen werden und dargestellt werden.

    Habe dazu dies entworfen:

    Code
    <td tal:define="userid kunden/id">
        <span tal:repeat="test context/domains_kundenid/userid">
    	<span tal:content="test/id"></span>
        </span>
       </td>


    tal:define definiert die Variable, dies habe ich schon geprüft, darin steht die richtige ID. Mit Repeat will ich dann durch die Datensätze der zweiten Tabelle gehen und diese darstellen.
    Doch es kommt folgender Fehler: Iterator does not support <Shared.DC.ZRDB.DA.Traverse object at 0xbaf8b4c>

    Die Z_SQL Methode domains_kundenid funktioniert, ein test im ZMI spuckt die richtigen Werte aus.

    Wo liegt mein Fehler? Ideen?

    Gruß
    GomezR

  • Hmmm...du kannst mal schauen was er überhaupt zurückliefert. Es gibt Rückgabewerte (ich glaube Brains waren das) sind im HTML nicht sichtbar. Jedoch kann man sie sichtbar machen.

    Code
    <td tal:define="userid kunden/id">
        <span tal:repeat="test context/domains_kundenid/userid">
       <span tal:content="python:'result: ' + str(test.id)"></span>
        </span>
       </td>


    NOTE! Evtl. muss es bei dir auch str(test.id()) lauten. Das merkst du aber ja dann. ;)

    Torty

    "Carpe Diem" powered by positiv Feelings

  • Danke für die Antwort, Torty.

    Bei tal:repeat komme ich leider nicht soweit, es kommt der Fehler: Fehler: Iterator does not support. !?!

    Deshalb habe ich dies erstellt:

    Code
    <td tal:define="userid kunden/id">
       <span tal:define="test context/domains_kundenid/userid">
         <span tal:content="python:'result: ' + str(test.id)"></span>
       </span>      
       </td>

    damit bekomme ich dann dieses Ergebnis: result: domains_kundenid. Also nur den Namen/id der ZSQL Methode.
    Ich denke in test sind keine Daten aus der Tabelle. Irgendwas läuft da falsch.

    Habe ich noch andere Möglichkeiten den Wert der ersten Tabelle (kunden/id) an die zweite Abfrage zu übergeben und so werte zurückzubekommen?

    Vielen Dank im voraus

  • warum machst du so etwas?
    Wenn du 2 Tabellen hast, dann geht das doch alles über eine SQL-Abfrage. So das du nur eine Liste zurück bekommst und diese dann in deinem Template anzeigst. Bringen deine ZSQL-Methoden die richtigen Ergebnisse?

    Poste bitte mal deine Tabellen, damit wir besser sehen was du machen möchtest.

    Gruß Maik

  • Also ich habe zwei Tabellen:

    Beispiel:

    Kunden
    ID, Name, Ort, ....

    Domains
    ID, Domainname, Kundenid

    In meinem Template möchte ich nun in einer Zeile diese Daten ausgeben:

    Kunden.id, Kunden.Name, Kunden.ort, Domains.Domainname1,Domainname2,Domainname3

    Ein Kunde kann ja mehrere Domains haben.

    Wende ich z.B. dieses SQL an:

    SELECT kunden.* , domains.kundenid, domains.domainname
    FROM kunden, domains
    WHERE kunden.id = domains.kundenid
    AND kunden.id =<dtml-sqlvar userid type=int>

    bekomme ich ja aber für jede Domain auch nochmal sämtliche Kundendaten, was ja auch nicht optimal ist.

    Gruß

  • das ist aber besser als das was du machst, du kannst jetzt ja einfach die Kunden Daten nur einmal ausgeben, das die daten in deinem Suchergebniss mehrfach m9it drinn sind ist ja egal.

    Aber es gibt bestimmt auch SQL-Querys die es so zurück geben wie du es brauchst. Da muss du mal schauen, eine Datenbank ist dabei aber immer flexibler und sollte dafür verwendet werden, das Ergebnis sauber zurück zu geben.

    Es macht keinen Sinn, das Suchergebnis im Programmcode nochmal zu bearbeiten, da dies immer langsamer ist, als wenn die DB gleich das richtige zurück gibt.


    Gruß Maik

  • Habe das Problem gelöst, obs elegant ist, weiß ich nicht.

    Gelernt habe ich aber etwas, Variablen müssen an ZSQL Methoden explizit übergeben werden:

    Code
    <td tal:define="userid kunden/id">
         <span tal:repeat="row python: here.domains_kundenid(userid=userid)">
           [url='Domain']<span tal:replace="row/domainname"></span>[/url]
     
         </span>   
       </td>