SQL Problem -> funzt irgendwie nicht



  • morgen @ all

    also ich habe ein SQL problem, es ist zwar schwierig für euch mir zu helfen, wenn ihr die tabelle nicht seht, aber ich versuche es mal:
    das SQL statement müsste so richtig sein, denn wenn ich es in einem programm mit der tabelle auspobiere, bekomme ich genau die werte selektiert, wie es vorgesehen war.

    zB wenn ich in dieses SQL Statement "Avensis" am schluss eingebe:
    SELECT t_aus_tech_code FROM tech_auss,technique WHERE tech_code = t_aus_tech_code_b and tech_vkbezeich1 = 'Avensis'
    dann funzt es in dem SQLprogramm.

    aber wenn ich in meinem Builder code diese zeile implementiere, und die Query durchlaufen lassen, dann funzt es nicht, irgendwie gelangt es da in eine endlosschleife....:

    AnsiString bez;
    Query_topcot->SQL->Clear();
    Query_topcot->SQL->Add("SELECT t_aus_tech_code FROM tech_auss,technique WHERE tech_code = t_aus_tech_code_b and tech_vkbezeich1 = '"+AnsiString(bez)+"'");
    Query_topcot->Open();
    Query_topcot->First();
    bez=AnsiString(Bliste->Strings[u]); /*bekommt hier den ersten eintrag der Liste
                                        das ist in diesem fall "avensis", und 
                                        diese variable wird in das SQL-statement
                                       übernommen...hier vielleicht der fehler?*/  
        while (Query_topcot->Eof)
           {
           Aliste->Add(Query_topcot->FieldByName("t_aus_tech_code")->AsString);
           Query_topcot->Next();
           }
    

    was timmt hier denn nicht?
    eigentlich ist das doch völlig logisch und müsste auch funktionieren....
    kann mir da jemand helfen?

    THX
    Bj



  • Bj schrieb:

    irgendwie gelangt es da in eine endlosschleife....:

    AnsiString bez;
    Query_topcot->SQL->Clear();
    Query_topcot->SQL->Add("SELECT t_aus_tech_code FROM tech_auss,technique WHERE tech_code = t_aus_tech_code_b and tech_vkbezeich1 = '"+AnsiString(bez)+"'");
    Query_topcot->Open();
    Query_topcot->First();
    bez=AnsiString(Bliste->Strings[u]); /*bekommt hier den ersten eintrag der Liste
                                        das ist in diesem fall "avensis", und 
                                        diese variable wird in das SQL-statement
                                       übernommen...hier vielleicht der fehler?*/  
        while (Query_topcot->Eof)
           {
           Aliste->Add(Query_topcot->FieldByName("t_aus_tech_code")->AsString);
           Query_topcot->Next();
           }
    

    was timmt hier denn nicht?

    Warum könnte das Programm wohl in eine Endlosschleife geraten? Vielleicht weil
    die Abbruchbedingung nie erfüllt ist? Schau Dir das doch nochmal an, dann
    siehst Du's vielleicht selber (Tip: das, was in der Klammer nach while steht)

    Gruß,

    Alexander



  • scheisse, verdammte scheisse.
    sorry aber das musste sein,
    danke, natürlich, dass ! vergessen 😡

    was für ein ärgerlicher blöder fehler.

    danke 🙂
    Bj



  • gut dann wäre ich aber jetzt bei einem neuen problem... das hatte ich die tage auch schon gepostet, aber da verlief es irgendwie im sand....

    ...also:

    while (!Query_topcot->Eof)
           {
           Aliste->Add(Query_topcot->FieldByName("t_aus_tech_code")->AsString);
           Query_topcot->Next();
           }
    

    diese schleife überspringt der einfach.
    als wäre EoF schon direkt am anfang erreciht, obwohl ich auch First() gesgat habe usw..... woran kann sowas liegen?
    (in bezug auch auf oben das SQL statement...wo ja 2 tabellen verwendet werden, und ob das dann überhaupt geht...)

    vielen dank
    Bj



  • Bj schrieb:

    while (!Query_topcot->Eof)
           {
           Aliste->Add(Query_topcot->FieldByName("t_aus_tech_code")->AsString);
           Query_topcot->Next();
           }
    

    diese schleife überspringt der einfach.
    als wäre EoF schon direkt am anfang erreciht, obwohl ich auch First() gesgat habe usw..... woran kann sowas liegen?

    Also nach meiner Erfahrung werden Schleifen im Allgemeinen nicht einfach will-
    kürlich übersprungen. Das kann dann nur bedeuten, daß die Bedingung nicht
    erfüllt ist. Das würde bedeuten, daß das Query keinen Datensatz zurückliefert.
    Sowas kommt in den besten Tabellen vor. 😃
    Schau Dir doch mal das Statement an, wenn das Programm die while-Schleife er-
    reicht (im Debugger Query_topcot->SQL->Text anschauen).
    Wenn Du die Möglichkeit hast das Statement direkt auf der Datenbank auszu-
    führen, dann kannst Du dort ja sehen, was zurückgegeben wird.

    Gruß,

    Alexander



  • genau dieses statement habe ich ja schon auf der datenbank ausgeführt, und er liefert mir bestimmt 100 werte zurück.

    also muss er einfach einen wert zurückliefern.
    das ist doch sehr unlogisch, das es in ExecSQL geht, aber im builder nicht, da bekommt er noch nichtmal einen datensatz geliefert...

    ? ich bin jetzt wirklich ziemlich ratlos...

    das einzige was falsch sein kann, ist das man EoF nicht verwenden darf, wenn man 2 tabellen benutzt?
    ...FROM tech_auss,technique...

    geht das überhaupt?
    denn das ist doch das einzigste was falsch sein kann?
    das er die datenmenge von den beiden tabellen nicht zusammen rechnen kann und dann die schleife überspringt???

    thx
    bj



  • habe es hinbekommen.
    das problem war, dass die in dem SQL-statement verwendete variable erst nach der implemetierung des SQL-statements einen wert zugewiesen bekam.....
    ... aber das muss davor passieren.

    eben so:

    String bez = "hallo";
    
    Query->SQL->Clear();
    Query->SQL->Add("select bla1 from bla2 where bla3= '"+AnsiString(bez)+"'");
    

    so funzt es, anders herum nicht. und das wußte ich nicht.

    danke
    Bk



  • Das hat nix mit SQL zutun BJ das ist ein ganz normales Verhalten in der Programmiersprache...
    Wenn du eine Variable verwendest dann sollte diese Variable schon einen Wert haben und nicht erst später einen zugewiesen bekommen.
    Zumindest wenn du unbedingt den Wert den du zuweist verwenden willst. 🙂



  • ja ja, weiß ich doch auch, so dumm bin ich nun wieder auch nicht. 😞
    aber ich hatte mir das so gedacht, das wenn man das sql statement in die eigenschaft SQL der Query schreibt, das dort ja eigentlich noch nix passiert.

    dachte erst beim auslesen mit FieldByName würde man auf dieses Statement zugreifen, und davor müsste dann erste der wert der varibale zugewiesen werden....

    ... eben weil man davor noch nicht mit dem statement arbeitet....

    so, dass zu meiner verteidigung.
    😃
    Bj


Anmelden zum Antworten