Entwickler-Ecke

Datenbanken - Zeile in DBGrid markieren/Daten in weiterem Formular übern.


lola - Mo 30.08.04 12:50
Titel: Zeile in DBGrid markieren/Daten in weiterem Formular übern.
Halli Hallo

Da ich noch ein absoluter "Neuling" auf Delphi bin, hoffe ich das mir jemand weiterhelfen kann.

Ich habe eine Formular "Adressen" erstellt, auf welchem ich Stammdaten wie Name, Vorname, Adresse, Telefon usw. verwalten kann (verschiedene DBEdit's).

Dafür habe ich 5 Button's erstellt: Neu, Suchen, Mutieren, Löschen, Speichern.
Jetzt habe ich Schwierigkeiten mit dem Suchen der Stammdaten.

Wenn ich auf dem Forumlar "Adresen" den Button "Suchen" drücke, wird ein weiteres Formular geöffnet, in welchem ich mit "Name" Personen suchen kann.
Mit Hilfe von SQL können die gewünschten Daten in ein DBGrid angezeigt werden. Soweit so gut.

Nun aber zu meinem Problem:
Ich möchte im DBGrid eine Zeile markieren und mit dem Drücken eines Button die Daten in das erste Formular übernehmen.

Ist dies überhaupt möglich? Wenn ja, wer kann mir da weiterhelfen?

Vielen Dank im Voraus
Lola
:D


grayfox - Mo 30.08.04 14:29

hallo lola!

nichts einfacher, als das! ;)

du definierst in deinem suchdialog eine 'public'-variable, zb mit dem namen 'aKundenID' als type longint.
wenn du in deinem DBGrid einen kunden ausgewählt hast, weist du der variablen aKundenID seine ID zu.
in deinem den suchdialog aufrufenden programm überprüfst du mittels 'ModalResult', ob die suchrourtine mit ok oder cancel beendet wurde und holst dir im falle von ok den wert der variablen aKundenID. klar?


zb:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
{$UNTESTED}
  SuchDlg:= TSuchDlg.Create(application);
  with SuchDlg do begin
    try
      ShowModal;
      if ModalResult = mrOK then 
        KundenID:= aKundenID  // = die variable aus SuchDlg
      else 
        KundenID:= -1 //zur kennzeichnung, dass nichts ausgewählt wurde 
    finally
      Free
    end
  end;


somit hast du auch in dem aufrufenden programm den aufgewählten kunden und kannst ihn weiterbewurzeln.


mfg, stefan


lola - Mo 30.08.04 15:09

Hallo Stefan

Vielen Dank für deine Antwort!

Leider ist das Beispiel für mich noch nicht so klar. Bin wohl etwas schwer von Begriff. :wink:

Vielleicht könntest du mit meinen Begriffen das Beispiel machen? Das wäre wirklich super. Könnte sein, dass ich es dann besser begreiffe.

Such-Formular:
===================================================

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
type
  TForm3 = class(TForm)
    DBGrid1: TDBGrid;
    Label1: TLabel;
    Edit1: TEdit;
    BtnSuchen4: TButton;
    BtnAnzeigen: TButton;
    Query1: TQuery;
    DataSource1: TDataSource;
    procedure BtnSuchen4Click(Sender: TObject);

  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form3: TForm3;

implementation

uses Unit1;

{$R *.dfm}

procedure TForm3.BtnSuchen4Click(Sender: TObject);
begin
with Query1 do begin
SQL.Clear;
SQL.Add ('SELECT * FROM tblKUNDE');
SQL.Add ('WHERE NAME LIKE');
SQL.Add ('"' + Edit1.Text + '%"');

Query1.Open;
end;
end;

procedure TForm3.BtnAnzeigenClick(Sender: TObject);
begin

end;
end.

============================================================

Gruss
Lola

Moderiert von user profile iconUGrohne: Delphi-Tags hinzugefügt.


grayfox - Di 31.08.04 01:08

hallo lola!

weil ich grad nichts wichtigeres zu tun hatte... :wink:

beim hauptprogramm sollte es keine probleme geben - es besteht hier aus einem edit-feld und 2 buttons...


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
unit Mainprog;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls, Buttons;

type
  TMainDlg = class(TForm)
    Edit1: TEdit;
    SuchBtn: TSpeedButton;
    EndeBtn: TBitBtn;
    procedure EndeBtnClick(Sender: TObject);
    procedure SuchBtnClick(Sender: TObject);
  private
    { Private-Deklarationen }
    aKundenID: LongInt;
  public
    { Public-Deklarationen }
  end;

var
  MainDlg: TMainDlg;

implementation

uses DataMod, SuchFrm;

{$R *.DFM}

procedure TMainDlg.EndeBtnClick(Sender: TObject);
begin
  DM.Query1.Close;
  close
end;

procedure TMainDlg.SuchBtnClick(Sender: TObject);
begin
  SuchDlg:= TSuchDlg.Create(Application);
  with SuchDlg do begin
    try
      ShowModal;
      if ModalResult= mrOk then
        aKundenID:= GetKundenID
      else
        aKundenID:= -1;
    finally
      Free
    end
  end;

  if aKundenID > -1 then begin
    with DM.Query1 do begin
      Close;
      SQL.Clear;
      SQL.Add('SELECT CustNo, Company FROM customer ');
      SQL.Add('WHERE (CustNo = :KundenNo)');
      ParamByName('KundenNo').asInteger:= aKundenID;
      Open
    end;

    Edit1.Text:= DM.Query1.FieldByName('Company').asString
  end
end;

end.



der suchdialog - eigentlich auch selbsterklärend - nur das dataset der datasource zeigt auf 'DM.Query1'. wenn du aber das datenmodul zu beginn erzeugst und in die uses-klausel aufnimmst, wird dir das richtige dataset vorgeschlagen.
der suchdialog wird erst zur laufzeit erzeugt (in [Projekt] - [Optionen] aus der listbox 'automatisch erzeugte' nach 'verfügbar' verschieben'


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
91:
92:
93:
94:
95:
96:
97:
98:
99:
100:
101:
unit SuchFrm;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls, Buttons, DBCtrls, Grids, DBGrids, ExtCtrls, Db;

type
  TSuchDlg = class(TForm)
    Panel1: TPanel;
    Label1: TLabel;
    Edit1: TEdit;
    Label2: TLabel;
    Edit2: TEdit;
    StartBtn: TSpeedButton;
    DBGrid1: TDBGrid;
    Panel2: TPanel;
    DBNavigator1: TDBNavigator;
    StaticText1: TStaticText;
    BitBtn1: TBitBtn;
    UebernahmeBtn: TBitBtn;
    DataSource1: TDataSource;
    procedure StartBtnClick(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
    procedure UebernahmeBtnClick(Sender: TObject);
    procedure DBGrid1DblClick(Sender: TObject);
    procedure FormShow(Sender: TObject);
  private
    { Private-Deklarationen }
    aKundenID: LongInt;
  public
    { Public-Deklarationen }
    function GetKundenID: LongInt;
  end;

var
  SuchDlg: TSuchDlg;

implementation

uses DataMod;

{$R *.DFM}

function ChangeChar(tmpString: String):String;
var
  i: SmallInt;
begin
  Result:= '';
  if tmpString= '' then
    Exit;

  for i:= 1 to Length(tmpString) do
    if tmpString[i] = '*' then
      tmpString[i]:= '%'
    else if tmpString[i] = '?' then
      tmpString[i]:= '_';
  Result:= tmpString
end;

function TSuchDlg.GetKundenID: LongInt;
begin
  Result:= aKundenID
end;

procedure TSuchDlg.StartBtnClick(Sender: TObject);
var
  SqlString: String;
begin
  SqlString:= 'SELECT * FROM customer WHERE (Company LIKE "%s") '
    + 'AND (City LIKE "%s")';
  with DM.Query1 do begin
    Close;
    SQL.Text:= (Format(SqlString,[ChangeChar(Edit1.Text),ChangeChar(Edit2.Text)]));
    Open
  end;
end;

procedure TSuchDlg.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  DM.Query1.Close
end;

procedure TSuchDlg.UebernahmeBtnClick(Sender: TObject);
begin
  aKundenID:= DM.Query1.FieldByName('CustNo').asInteger
end;

procedure TSuchDlg.DBGrid1DblClick(Sender: TObject);
begin
  aKundenID:= DM.Query1.FieldByName('CustNo').asInteger;
  ModalResult:= mrOk
end;

procedure TSuchDlg.FormShow(Sender: TObject);
begin
  DM.Query1.Close
end;

end.


das datenmodul ist auch nichts aussergewöhnliches - darin befindet sich nur die Query1,
deren databasename 'DBDemos' lautet.


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
unit DataMod;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  Db, DBTables;

type
  TDM = class(TDataModule)
    Query1: TQuery;
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  DM: TDM;

implementation

{$R *.DFM}

end.


ich hoffe, dass du nun besser damit zurecht kommst - wenn nicht, dann frag ruhig noch mal ;)

mfg, stefan
ps: schon klar, dass es kürzere lösungen gibt, aber diese hat auch seine vorteile


lola - Di 31.08.04 10:42

Hallo Stefan

Vielen Vielen Dank!!

Ich probliere das ganze Mal.
Bei Problemen melde ich mich sonst wieder. :wink:

Gruss
Lola