Falsche Ergebnismenge bei TQuery-Abfrage



  • Wenn Du das Statement nur auf die Tabelle computer abschickst, also:

    SELECT * FROM computer
    WHERE [cpz_nr]='CPZ 300';
    

    Bekommst Du dann einen Datensatz zurück?
    Falls ja, dann notiere Dir mal die [computer_id] und prüfe, ob diese in der Tabelle
    [arbeitsplatz] existiert:

    SELECT * FROM arbeitsplatz
    WHERE [computer_id] = {Der notierte Wert};
    

    Falls Du hier einen Datensatz zurückbekommst, notiere als nächstes den Wert von [nutzer_id]
    und probiere damit eine Abfrage auf die Tabelle [nutzer]:

    SELECT * FROM nutzer
    WHERE [nutzer_id] = {Der notierte Wert};
    

    Wenn für alle Abfragen Datensätze zurückgeliefert werden, dann ist das ein interessantes
    Phänomen. Ist dies nicht der Fall, dann wäre es normal, daß die Join-Abfrage über alle
    drei Tabellen keinen Datensatz zurückliefert. Dann kannst Du es mal mit einem Outer-Join
    versuchen...

    Gruß,

    Alexander



  • also...

    die tabelle computer gibt den wert 2 als computer_id zurück.
    diese liefert aber keinen wert in der tabelle arbeitsplatz 😡

    somit scheinen die tabellen nicht verknüpft. was ich aber nicht verstehe, habe ich sie doch bei beziehungen miteinander verknüpft 😕

    was nun ??



  • ok, beschreib doch bitte exakt, welche Felder sich in welcher Tabelle befinden. Welche Datenbank verwendest Du?



  • ich verwende eine access db.
    3 tabellen....arbeitsplatz, computer, nutzer.
    computer hat primärschlüssel computer_id.
    arbeitsplatz " " arbeitsplatz_id.
    nutzer " " nutzer_id.
    computer_id und nutzer_id sind in tabelle arbeitsplatz vorhanden(long integer).

    die beziehungen hab ich halt auch so hergestellt, klick klick.
    allerdings beinhalten die felder computer_id und nutzer_id in tabelle arbeitsplatz keine werte.
    sollten sie das ??
    erfolgt das bei access automatisch ??



  • nachtrag:

    die relevanten felder in den tabellen....

    arbeitsplatz computer_id, nutzer_id
    computer cpz_nr, computer_id
    nutzer nutzer_id, vorname, nachname



  • Access macht von sich aus keine automatischen Beziehungen,
    dafür bist du Verantwortlich.
    In Access kannst du die Beziehung zwar Festlegen, diese werden aber nur
    in den Abfragen benutzt, also wird vom BCB ignoriert.

    Du kannst aber im BCB deine Tabellen verknüpfen, dazu schau dir
    mal in der Hilfe Table::MasterSource bzw. Table::MasterField an.



  • Pilsbaron schrieb:

    allerdings beinhalten die felder computer_id und nutzer_id in tabelle arbeitsplatz keine werte.
    sollten sie das ??

    ja, wie soll das denn sonst funktionieren?!?



  • danke für die hilfe.
    ist das nun ein hilfeforum oder ein forum um sich über andere lustig zu machen ???



  • Entschuldigung. War aber nicht persönlich oder gar herablassend gemeint. Und mich über Dich lustig machen, wollte ich mich auch nicht. Ich poste Dir morgen noch was dazu...



  • das problem ist, ich muß es bis morgen nachmittag 16-17uhr fertig haben.
    ein dilemma.
    danke trotzdem.



  • Wenn Du mir die Datenbank mailst, würde es schneller gehen.
    Vielleicht packst Du noch die .cpp dazu, aus der der Code mit der Query ist.



  • das werde ich tun.vielen dank schonmal.
    geht gleich los...



  • Ich kenne mich jetzt zwar nicht mit Access-DBs aus, aber eigendlich sollte man Tabellen mit "LEFT JOIN ... ON ..." verknüpfen können:

    SELECT n.vorname, n.nachname, c.cpz_nr
    FROM arbeitsplatz a,
    LEFT JOIN computer c ON a.computer_id=c.computer_id
    LEFT JOIN nutzer n ON a.nutzer_id=n.nutzer_id
    WHERE c.cpz_nr='CPZ 300';
    

    Das geht jetzt alle Arbeitsplätze durch und wertet die entsprechend aus.



  • Hi Pilsbaron,

    so funktionierts bei mir:

    AnsiString SuchString;	
    	SuchString = "CPZ 300";	// normalerweise aus dem EditSuche...
    
    	// Prüfen ob Query offen, wenn ja -> schließsen
    	if (Query1->Active)
    		Query1->Close();
    	if (Query1->Prepared)
    		Query1->UnPrepare();   
    
    	//Suche nach CPZ_Nr
    	Query1->SQL->Clear();
    	Query1->SQL->Add("SELECT n.Vorname, n.Nachname, c.CPZ_Nr");
    	Query1->SQL->Add("FROM computer c, nutzer n, arbeitsplatz a");
    	Query1->SQL->Add("WHERE (c.Computer_ID = a.Computer_ID)");
    	Query1->SQL->Add("AND (a.Nutzer_ID = n.Nutzer_ID)");
    	Query1->SQL->Add("AND (c.CPZ_Nr = '" + SuchString + "')");
    
    	Query1->Prepare();
    	Query1->Open();
    
    	// Suche was gefunden??
    	if(Query1->FindFirst())
    	{  // Ergebnis anzeigen
    		//
    	}
    	else
    	{  // kein Ergebnis --> Fehlermeldung
    		Application->MessageBox("Es wurde kein entsprechender Datensatz gefunden!", "Meldung", MB_OK);
    		Suchfunktion->EditSuche->Clear();
    		return;
    	}
    

    Du mußt jedoch sicher stellen, dass alle nötigen ID eingepflegt werden. Dies macht Access nicht automatisch. Ob man das dem Access beibringen kann, weiß ich nicht. Da mußt Du mal die Access-Spezialisten fragen.



  • mahlzeit.

    genau.
    das ist das eigentliche problem,dass er die fremdschlüsselfelder nicht automatisch mit werten belegt. auch nciht bei neuen datensätzen. hab ich gestern auch schon bemerkt.
    alles andere funzt nun.
    danke für die mühen.
    ich frag mal die access spezies 🤡

    nice we!


Anmelden zum Antworten