SQL -> Was ist daran falsch?



  • hallo ihr.

    wenn ich dieser erste StringListe (Bliste) auslese und in einer listbox anzeigen lasse, stehen dort auch die gewünschten autonamen:

    while (!Query_vaplocal->Eof)
        {
        Bliste->Add(Query_vaplocal->FieldByName("Bezeichnung")->AsString);
        Query_vaplocal->Next();
        }
    

    klappt auch wunderbar.
    nur wenn ich DIE in der StringListe (BListe) stehenden Daten anhand diesem SQL Befehl weiter vergleichen will:
    SELECT t_aus_tech_code FROM tech_auss,technique WHERE tech_code = t_aus_tech_code_b and tech_vkbezeich1 = 'AnsiString(Bliste->Strings[i])'
    dise Zeile soll aus der BListe auslesen und t_aus_tech_code wird wieder in eine neue StringListe geschrieben:

    for (int i=0;i<Bliste->Count;i++)
        {
        Aliste->Add(Query_topcot->FieldByName("t_aus_tech_code")->AsString);
        Query_topcot->Next();
        }
    

    nur wenn ich das dann auslesen, sieht man nix, er hat zwar anscheinden was gefunden, aber in der listbox sieht man halt nix, als wären die einträge unsichtbar 🙂
    es kommt keine exception, nur irgendwas muss an dieser SQL befehlszeile flasch sein.
    kann mir da jemand helfen, auch wenn es ziemlich verwirrend rüberkommt?!

    THX
    Bj



  • kann mir da jemand helfen?
    Bj



  • So ungeduldig, dass Du gleich nach 5min schon wieder posten musst?
    Dein SQL hat wirklich ein paar Macken.

    1. würde ich die einzelnen WHERE-Bedingungen in Klammern setzen
    2. würde ich 2 Tabellen nur über einen JOIN abfragen, denn so erhälst Du ein kartesisches Produkt
    3. musst Du bei den einzelnen Feldern, wenn Du mehrere Tabellen abfragst, davor schreiben, aus welcher Tabelle das Feld stammt, also etwa: tabelle1.feld1


  • könntest du mir das mit dem JOIN genauer erklären?
    muss das sein das man es so schreibt:
    tabelle.feld ?
    erkennt er das nicht selber?

    THX
    Bj



  • Ne, kann er selber nicht erkennen, schließlich könnte es in 2 Tabellen ja 2 gleich benannte Felder geben.

    SELECT tech_auss.t_aus_tech_code FROM tech_auss
    LEFT OUTER JOIN technique ON technique.tech_code = tech_auss.t_aus_tech_code_b WHERE (tech_vkbezeich1 = 'Bedinung')
    

    Habs jetzt mal so gemacht, wie ich es vermute, aber ohne Gewähr, könnte auch sein, dass Du die Tabellen im JOIN und FROM vertauschen musst, kenne ja Deinen Tabellenaufbau nicht. Aber ich denke, es ist wenigstens mal ein Anfang 😉



  • mh, also habe es jetzt mal so wie du in die Query geschrieben:
    SELECT tech_auss.t_aus_tech_code FROM tech_auss LEFT OUTER JOIN technique ON technique.tech_code = tech_auss.t_aus_tech_code_b WHERE (tech_vkbezeich1 = 'AnsiString(Bliste->Strings[u])')
    aber da gibt er mir einen SQL Syntax error Exception aus 😞

    das kann jetzt nur an den tabelle.feld zuweisungen liegen oder?
    thx
    Bj



  • also ich habe deinen SQLEintrag wieder entfernt, denn habe in ExecSQL (weiß nicht ob das prog nur hier geschrieben wurde...aber da kann man sql-statements auch ausprobieren) und dort klappte diese zeile einwandtfrei:

    SELECT t_aus_tech_code FROM tech_auss,technique WHERE tech_code = t_aus_tech_code_b and tech_vkbezeich1 = 'bez'
    'bez' ist hier ein auto-name, der in einer Stringliste steht.

    so, soweit ist alles klar. doch in einem anderen prog funzte diese zeile:

    while (!Query1->Eof)
    

    aber diesmal nicht.
    er geht einfach weiter, als würde das Ende direkt am anfang erreicht sein. was soll das?
    hier der code dazu:

    Query_topcot->Open();
    Query_topcot->First();
    bez;
    
    while (u<Bliste->Count)
        {
        while (!Query_topcot->Eof)  // das funzt nicht.... :-(
           {
           bez=AnsiString(Bliste->Strings[u]);
           code=Query_topcot->FieldByName("t_aus_tech_code")->AsString;
           if (code!="")
             {
              Aliste->Add(Query_topcot->FieldByName("t_aus_tech_code")->AsString);
             }
           Query_topcot->Next();
           }
        u++;   // obige schleife wird mehrmals wiederholt, da jeder eintrag
               // aus der Stringliste geprüft werden muss....   
        Query_topcot->First(); 
        }
    

    so, ich hoffe der code ist einigermaßen verständlich.....
    aber warum führt er diese schleife KEIN EINZIGES mal aus, da er angibt Eof wäre jedesmal schon erreich.
    das kann nicht sein...

    THX
    Bj



  • OK, was fürne Datenbank verwendest Du eigentlich? 🙄

    Probier mal Query->FetchAll();
    

    vor Deiner Schleife



  • wenn ich fetchall() einsetze, dann klappt es auch nicht so richtig.
    was ist oben an dem code denn falsch? warum könnte er in der 2. while schleife in eine endlos-schleife geraten???

    thx
    Bj


Anmelden zum Antworten