Autor Beitrag
sendman
Hält's aus hier
Beiträge: 15



BeitragVerfasst: So 09.01.05 00:24 
Hallo NG,

bei der Umsetzung meiner DB-Anbindung habe ich folgendes Problem:
Ich selektiere per SQL die Felder ID, Name und Vorname und möchte aus dieser Ergebnisliste in eine Einzelansicht (mit mehr Infos) gelangen.

Frage: Wie kann ich das Feld ID in einen Parameter überführen, um diese in dem Einzelformular wieder ansteuern zu können? Meine bisherige Idee u := DB-Name.ID in eine globale Variabel zu schleusen und wieder auszulesen ist schon im Ansatz gescheiter, da das Feld ID nich ansprechbar ist.

Oder gibt es auch noch andere Lösungen??

Über eine Idee von Euch würde ich mich freuen.

Gruß

Stefan
MrSpock
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 262



BeitragVerfasst: So 09.01.05 13:42 
Hallo sendman,

welche Datenbank und welche Komponenten für den Zugriff nutzt du?

Nehmen wir an, du nutzt eine TQuery Komponente namens qryName, und hast ein qryName.Open bereits ausgeführt. Wenn du das Ergebnis in einem datensensitiven Element anzeigst (z.B. DBGrid), greist du mit:

ausblenden Delphi-Quelltext
1:
theID := qryName.FieldByName('ID').AsInteger;					


auf die aktuell ausgewählte ID der Ergebnismenge zu. Diese kannst du dann weiter verwenden.

Beispiel:

ausblenden Quelltext
1:
SELECT * FROM detals WHERE ID = :ID					


dann schreibst du:

ausblenden Delphi-Quelltext
1:
2:
qryDetails.ParamByName('ID').AsInteger := theID;
qryDetails.Open;


... und feddich :D

_________________
Live long and prosper
MrSpock \\//
sendman Threadstarter
Hält's aus hier
Beiträge: 15



BeitragVerfasst: So 09.01.05 22:15 
Hallo MrSpock,
vielen Dank für Deinen Tipp. So habe ich schon einmal den inhalt der ID ermitteln können. Leider kann ich dies nicht in einer globalen Variablen mit dem Namen "varUser" ablegen. Ich habe es schon mittels einer neuen Unit versucht, doch der Wert wird nicht in die Variable geschrieben (Wert bleibt Null). Muss ich diesen Wert denn per Code zurückschreiben (in Access reichte in einem Modul der Befehl: Public varUser As String 'User-ID Gibt es dieses auch in Delphi?

Besten Dank für die Hilfe

Stefan

Ps: Ich nutze MySQL und die Komponente TQuery
MrSpock
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 262



BeitragVerfasst: Mo 10.01.05 07:50 
Hallo sendman,

warum muss der Wert in eine globale Variable? Zeige doch einmal den Code, der nicht funktioniert.
Muss der Wert in einer anderen Unit verfügbar sein, falls ja, solltest du noch einmal die Struktur deines Programmes prüfen. Es könnte sinnvoll sein, ein Datenmodul anzulegen, in dem alle TQuery Objekte liegen. Dann hat jedes TQuery Objekt automatisch Zugriff auf die anderen TQuery Objekte oder auch globalen Variablen in dieser Unit.

_________________
Live long and prosper
MrSpock \\//
sendman Threadstarter
Hält's aus hier
Beiträge: 15



BeitragVerfasst: Mo 10.01.05 20:32 
Hi MrSpock,

mit folgendem Code suche ich einem Suchformular mit Eingabe in dem Edit1.Feld nach einem bestimmtem Namen. Jeder User hat auch einen eigenen Primärschlüssel (TUSRNR).

ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
procedure TfrmSQLEdit.Button1Click(Sender: TObject);
var
s, n : string;
begin
    Query1.Close;
    Memo1.Clear;
    Memo1.Lines.Add('SELECT TUSRNName, TUSRVName, TUSRUserID, TUSRTelD, TUSRNR FROM TUSR');
    Memo1.Lines.Add('WHERE (TUSRNName like "' + Edit1.Text + '%")');
    Memo1.Lines.Add('ORDER BY TUSRNName');
    Query1.SQL := Memo1.Lines;
    Query1.Open;
    s:= IntToStr(Query1.RecordCOUNT);
    StatusBar1.SimpleText := s + (' Datensatz / Datensätze gefunden');
    varUser := Query1.FieldByName('TUSRNR').AsInteger; //Anzeige des Primärschlüssel
    Label1.Caption := IntToStr(varUser);
    end;

procedure TfrmSQLEdit.Button2Click(Sender: TObject);

begin
     frmUserAnzeigen.Show;

end;


Durch klick auf den Button2 möchte ich in das Formular "frmUserAnzeigen" wechseln, um mir dort die Details zu diesem User, den ich vorher gesucht und gefunden habe, anzeigen zu lassen. Dieses Formular öffne ich mit folgenden Parametern:

ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
procedure TfrmUserAnzeigen.FormCreate(Sender: TObject);
begin
     Label19.Caption := IntToStr(VarUser);
     Query1.Close;
     Query1.SQL.Clear;
     Query1.SQL := Memo1.Lines;
     Query1.Open;
  end;


In dem Memo1.Feld steht folgender Code:
ausblenden Quelltext
1:
2:
SELECT * FROM TUSR 
WHERE 'TUSNR' = varUser


Meine Idee war die, das ich die Info aus TUSRNR in die Globale Variable varUser speicher, und dann in anderen Formularen benutzen kann (z.B. Editiermodus). Leider werden beide Formulare nicht synchronisiert und ich weiss noch nicht warum.
Mit dem Datenmodul habe ich mich noch nicht mit beschäftigt. Ich muss mich mal durch die Hilfe lesen.
Aber vielleicht kannst Du mir mit diesen Infos (siehe oben) weiterhelfen.

Danke im Voraus

Gruss
Stefan
MrSpock
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 262



BeitragVerfasst: Mo 10.01.05 20:51 
Hallo Stefan,

ich hab dazu einmal ein paar Fragen bzw. Anmerkungen:

Warum schreibst du den SQL String erst in ein Memo Feld? Du kannst ihn doch gleich mit:

ausblenden Delphi-Quelltext
1:
Query1.SQL.Add('SELECT ...');					


zeilenweise der Eigenschaft SQL zuweisen.

Machst du irgendwetwas mit Query1? Wird das Ergebnis von Query1 irgendwo angezeigt? Hat die Tabelle TUSR nur die Felder TUSRNName, TUSRVName, TUSRUserID, TUSRTelD, TUSRNR oder noch mehr? In Abhängigkeit von den Antworten auf die Fragen, kann ich dir dann sagen, wie du es am geschicktesten anstellst. :)

_________________
Live long and prosper
MrSpock \\//
sendman Threadstarter
Hält's aus hier
Beiträge: 15



BeitragVerfasst: Mo 10.01.05 21:06 
Hai,

gute Frage, warum ich das Memo-Feld benutze! Ich lerne gerade mittels eines Buches die Anbindung von MySQL per Delphi und dort war das Beispiel mit dem Memo-Feld aufgeführt (dieser diente auch zur direkten Äderung des Codes im Formular). Die Methode, dierekt per SQl.Add die Abfrage durchzuführen, werde ich gleich mal umsetzen.

Query1 im Suchformular nutze ich, um die Abfrage durchzuführen. Meine Tabelle hat noch mehr Felder wie Mail, Fax-Nr, Standort, Raum, Abteilung und ca. 15 weitere Felder (ÄnderungsDatum und-User). Diese sind für das Finden von User nicht notwendig.

Query1 im Anzeige-Formular dient zum Anzeigen der Detail-Daten (habe ich von der TTable-Komponente auf TQuery umgestellt). Da ich von dem Suchform aus verweisen wollte, fand ich diesen Weg "einfacher" :shock: (was es ja wohl nicht ist)

Beide Querys sind nicht miteinander verwandt (glaube ich, da sie nicht auf dem gleichen Form zu finden sind).

Ich hoffe, diese Antworten reichen aus :D .

CU
Stefan
MAlsleben
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 303

W2k,WinXP
D3 - DXE3 Enterprise
BeitragVerfasst: Di 11.01.05 08:40 
Hi,

wenn Du die Unit des 1. Formulars in das 2. Formular aufnimmst, müßte normalerweise der Zugriff auf die globalen Variablen des 1. Formulars klappen.

Gruß Micha.

_________________
Viele Wege führen nach Rom.
MrSpock
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 262



BeitragVerfasst: Di 11.01.05 08:52 
Hallo sendman,

ich würde beide Queries in ein DataModule packen und dieses Modul mit uses in die beiden Formulare aufnehmen. Du kannst aber auch direkt auf die query im Formular1 vom Formular2 aus zugreifen, wenn du in Form2 uses Form1 aufnimmst. Dann kannst du die Detailanzeige realisieren über:

ausblenden Delphi-Quelltext
1:
2:
3:
qryDetail.SQL.Add('SELECT * FROM TUSR WHERE TUSNR = :varUser');
qryDetail.ParamByName('varUser').AsString := Form1.query1.FieldByName('TUSNR').AsString;
qryDetail.Open;


Nutzt du ein DM, dann kannst du direkt auf Query1 zugreifen.

_________________
Live long and prosper
MrSpock \\//
sendman Threadstarter
Hält's aus hier
Beiträge: 15



BeitragVerfasst: Di 11.01.05 22:31 
Hallo MrSpock,

gute Nachricht :D von der Basis: es hat funktioniert.
Da ich die Daten direkt aus dem 1.Form an das 2.Form per Params übergeben habe, war eine Detailansicht mit den aktuellen Einträgen möglich.

Da ich ebenfalls Deinem Rat, den SQL-Code ohne Memo-Feld zu nutzen, gefolgt bin, konnte ich meinen Code noch reichlich ausdünnen (und ich habe etwas neues gelernt).
Nochmals besten Dank für Deine (geduldige) Hilfe

Man liest sich

Gruß Stefan

@Micha: Leider wurde die Variable nicht von den Forms aus angesprochen. Auch Dir Dank für Deine Hilfe