Selectergebnisse zwischenspeichern und weiterverarbeiten?!



  • Hallo leutchen!

    ICh hab folgendes Problem....

    Ich habe eine SQL abfrage...und möchte werte aus eine Tabelle (User_ID), zwischenspeichern, damit ich sie später über ein anderes Query in eine andere Tabelle schreiben kann!

    Soweit bin ich gekommen:
    Variablen deklariert

    #include <vcl.h>
    #pragma hdrstop
    
    #include "Unit1.h"
    int U_ID1;
    int U_ID2;
    

    Hier abfrage und zuweisung der variablen:

    Query1->Close();
    Query1->SQL->Clear();
    Query1->SQL->Add("select * from User");
    U_ID1 = Query1->SQL->Add("select U_ID from User where Vorname like '" + DBEdit1->Text + "'");
    Query1->Open();
    
    DBEdit1->DataSource = DataSource1;
    DBEdit1->DataField = "Vorname";
    

    und weiterverarbeitung:

    Query3->Close();
    Query3->SQL->Clear();
    Query3->SQL->Add("select * from Result");
    Query3->Open();
    Query3->Insert();
    Query3->FieldByName("User_ID")->AsInteger = U_ID1;
    Query3->FieldByName("T")->AsInteger = StrToInt(Edit1->Text);
    

    nun sagt er mir das Fehler in Fromklausel ist....weiß jemand wo fehler ist, oder wie ich das besser lösen könnte?!

    Danke schonmal!



  • hm, zum einen weiß ich nicht, wozu das DBEdit gur sein soll, dann stellt sich mir die Frage, warum Du das nicht in einem Durchgang machst?

    Gibt es die Tabelle Result denn? Mit welcher Datenbank arbeitest Du?

    Einfaches Beispiel:

    QueryQuelle->Prepare();
    QueryQuelle->Open();
    
    QueryZiel->RequestLive = true;
    QueryZiel->Prepare();
    QueryZiel->Open();
    
    if (QueryQuelle->FindFirst())
    {
    	do
    	{
    		QueryZiel->Append();
    		if (QueryZiel->State == dsInsert)
    		{
    			QueryZielArtid->AsInteger = QueryQuelleArtid->AsInteger;
    			// alle weiteren Felder
    
    			QueryZiel->Post();
    		}
    		else
    		{
    			// Fehlerbehandlung
    		}
    	} while (QueryQuelle->FindNext());
    }
    
    QueryZiel->Close();
    QueryZiel->UnPrepare();
    QueryZiel->RequestLive = false;
    
    QueryQuelle->Close();
    QueryQuelle->UnPrepare();
    


  • Vielleicht mal ein Datenbank-Tutorial?
    Sei mir nicht böse, aber das sieht für mich eher nach Rumgestochere aus.

    Gruß,

    Alexander



  • Das DBEdit ist für die anzeige von Datensätzen, welche ich dann ja als String gleich speichern kann!

    Und zu dem anderen:

    Ich lese Daten aus Tabelle USer, zB Name (der im DBEdit angezeigt wird), und in der Tabelle ist auch USER_ID...nun will ich für den ausgewählten Spieler, der im DBEdit steht auch die USER_ID haben. aber nicht angezeigt...und diese Daten werden dann in eine andere Tabelle (Results) gespeichert!



  • @ Alexander: Das hab ich schon durch...das hilft mir hier sehr sehr wenig Alex!



  • Testerlein schrieb:

    das hilft mir hier sehr sehr wenig Alex!

    OK. Dann frage ich mich, was es mit der folgenden Code-Zeile auf sich hat:

    U_ID1 = Query1->SQL->Add("select U_ID from User where Vorname like '" + DBEdit1->Text + "'");
    

    Sieht für mich wie grober Unfug aus. Wenn Du so versuchst den Wert eines Feldes auszulesen, zeigt mir das, dass Du entweder beim Programmieren
    gerade einen totalen Aussetzer hattest, oder, dass Du mit den Grundlagen der DB-Komponenten (und der VCL?) im BCB noch nicht vertraut bist.

    Denk mal drüber nach, was Du mit der Code-Zeile erreichen willst, schlag in der Hilfe zu den entsprechenden Methoden/Eigenschaften/Klassen
    nach und dann solltest Du auch dahinter steigen, dass es so nicht klappen wird.

    Gruß,

    Alexander



  • Ja ich hab schon den ganzen Tag aussetzter, weil ich einfach im stress bin!

    Also wenn mir jemand sagen kann wie es geht...wäre ich dankbar...ich hab einfach keine Zeit in der Hilfe jetzt zu suchen!

    Und @ Joe:

    ich kann es nicht in einem zug machen, weil ich erst aus der Datenbank auslese mit einem select...dann gebe ich daten ein...und danach erst wird alles in einer anderen Tabelle gespeichert!



  • Testerlein schrieb:

    Ja ich hab schon den ganzen Tag aussetzter, weil ich einfach im stress bin!

    Dann dürfte ich von morgens bis abends nur einen einzigen grossen Aussetzer haben...

    Testerlein schrieb:

    Also wenn mir jemand sagen kann wie es geht...wäre ich dankbar...ich hab einfach keine Zeit in der Hilfe jetzt zu suchen!

    Wie soll was genau gehen? Kannst die Aufgabe mal genauer beschreiben?

    Testerlein schrieb:

    ich kann es nicht in einem zug machen, weil ich erst aus der Datenbank auslese mit einem select...dann gebe ich daten ein...und danach erst wird alles in einer anderen Tabelle gespeichert!

    Das wäre dann allerdings eine sehr ungewöhnliche Vorgehensweise. Was passiert, wenn der Rechner abstürzt, oder Feierabend ist, oder man aus sonst welchen Gründen die Arbeit unterbrechen muß und das Programm beenden muß?!? Tabelle Result löschen und nochmal von vorne anfangen?!?

    Grundsätzlich möchte ich Dir nahelegen, Dich mal intensiv mit SQL auseinanderzusetzen und auch mit den VCL-Komponenten. Der Einsatz von DBEdit (in diesem Fall) erscheint anhand der verfügbaren Informationen absolut sinnlos, wenn nicht sogar kontraproduktiv.

    Nochmal die Frage, mit welcher Datenbank arbeitest Du? Existiert die Tabelle Result schon?



  • Ich arbeite mit Access
    Die Tabelle existiert schon, weil da schon daten drin stehen....sie wird immer nur um einen Datensatz erweitert!

    Also ich erklär mal das Prinzip:

    Tabelle User: User_ID,Vorname,Name,Gesamtpunkte
    Tabelle Result1: Result_ID,User_ID,Punkte
    Tabelle Result2: Result_ID,User_ID,Punkte
    Verknüpfung Result1.ResultID -> Result2.ResultID (Art: 1:1)

    Das es 2 Tabellen Result gibt ist erstmal unwichtig!

    Es findet eine Art "Contest" statt:

    Über die DBEdit wähle ich den User aus (2 Edits weil User gegen User),hinter DBEdit is Button mit Next() und einer mit Prior()...dann gebe ich in ein Normales Edit hinter dem DBEdit des Users eine Zahl(Punktzahl) ein!

    Beim Button speichern soll dann In die Tabelle Result1 die User_ID und die Punkte des Spielers aus DBEdit1 reingeschrieben werden...
    Bei Result2 eben des Spielers der in DBEdit2 drin steht!

    Aber für die Tabelle Result brauch ich eben die User_ID, die ich ja so nicht anzeigen lassen will...aber die er mir in die Result Tabelle reinschreiben soll!

    Zusammenfassung: 1 Query nur zur Abfrage und Auswahl der Spieler, 2 Query zum Speichern der Daten--> deshalb geht es eben nicht in einem Zug!

    Und wenn der Rechner mal abstürtzt oder so...dann wurden eben daten nicht gespeichert, muss ich es eben nochmal eingeben!

    So, genauer kann ich es fast nicht mehr erklären!



  • Hallo? Joe...kannst mir mal helfen??



  • Ich weiß nicht, wie ich helfen kann/soll?!?

    So wie ich es verstehe, willst Du in einer Schleife durch alle existierenden Datensätze in der Tabelle User iterieren, ein paar Eingaben machen und diese Eingaben in der Tabelle Result speichern. Das einzige Feld, das Du aus der User-Tabelle übernehmen willst ist, ist die User-ID.

    Dazu benotigst Du KEINE DBIrgendetwas-Komponenten. Mach Dir ein Forumular mit Labels für die Felder, die Du aus der Usertabelle anzeigen willst und für die einzugebenden Daten machst Du Dir normaler Editfelder. Natürlich brauchst Du noch einen Button um die Daten zu speichern.
    Beim Erstellen des Formulars öffnest Du die Datenquelle für die Usertabellen und positionierst Sie auf den ersten Datensatz. Zeig die Daten aus der Usertabelle in den Labels an. Beim Klick auf Speichern erstellst Du Dir eine weitere Query (ob nun zur Laufzeit eine neue erstellt wird, oder ob eine zur Entwicklungszeit erstellte, modifiziert wird, ist egal - nur darf es nicht die, sein, die auf dei Usertabelle zugreift). In dieser Query erstellst Du ein Insertstatement für die Tabelle Result. Nachdem die Daten gespeichert sind, positionierst Du die Usertabelle auf den nächsten Datensatz und beginnst mir der Anzeige der Daten von neuem... Dies machst Du solange, bis Du keinen weiteren Datensatz mehr in der Usertabelle hast. Ein vorwärts oder rückwärts navigieren ist nicht sinnvoll. In diesem Fall müßtest Du noch prüfen, ob für diesen User in der Tagelle Result schon ein Eintrag vorhanden ist und diesen Modifizieren, anstatt einen neuen zu Erstellen.

    Deine Daten werden in den Editfeldern zwischengespeichert. Die Daten aus der Usertabellen brauchst Du nicht zwischenzuspeichern, da Du auf den aktiven Datensatz aus der Usertabelle Zugriff hast.

    Die einzigen Datenbankkomponenten die Du benötigst, sind 2 Queries und 2 DataSources.



  • Hehe...

    also...ganz verstanden hast es immernoch nciht...rofl!
    Ich will nicht nacheinander die eingaben für User machen....sondern ich will mir nur 2 spezielle wählen....für die ich dann die eingaben mache!

    Mach das jetzt per Edit....d.h ich gebe in normales Edit einen Name ein, schau ob er vorhanden ist, wenn nein dann Fehlermeldung, wenn ja kanns weitergehen...

    das selbe beim 2ten User (also 2 Edits für Name)...

    Dann jeweils ein Edit noch für die Punkte pro User!

    Und wenn ich dann fertig bin speicher ich....soweit funktioniert das jetzt auch...hab deine Methode etwas verändert...nur habe ich noch ein Problem:

    Ich hab 2 Result Tabelle (die brauche ich auch für spätere Statistiken), diese Tabellen sind über das Feld R_ID (AutoWert,Primärschlüssel) verknüpft....und wenn ich jetzt auf speichern gehe....sagt er das ich nich einfügen kann, weil eine Beziehung besteht (autowert gleich gestartet, d.h es geht in beiden Tabellen bei 1 los)

    wie kann ich das noch beheben? dann wäre das gröbste erstmal weg!

    Wenn wieder was nich verstanden...einfach fragen! 👍


Anmelden zum Antworten