Entwickler-Ecke

Datenbanken - Paradox-Tabelle durchsuchen


delphi_noop - Sa 30.05.09 17:36
Titel: Paradox-Tabelle durchsuchen
Hallo zusammen!

Würde gerne per Knopfdruck eine Tabelle durchsuchen und falls in einer bestimmten Zelle noch kein Eintrag existiert einen einfügen!!!

Wie mach ich das am besten?


ffgorcky - So 31.05.09 08:53

Da ist die Frage, ob Du das mit einem DBGrid machen könntest,
dann würde das doch (meiner in dem Gebiet nicht so bewanderen Ansicht nach) so gehen:

Delphi-Quelltext
1:
2:
3:
4:
for i:=0 to DBGrid1.Lines.Count-1 do
   for j:=0 to DBGrid1.Cols.Count-1 do
     if DBGrid.Cells[i,j]='' then
        DBGrid.Cells[i,j]:='HierDeinEintrag';

Damit würde er dann alle leeren Zellen innerhalb des maximalen Umfangs (also des letzen Zeilen- und letzten Spalten-Eintags) mit dem Eintrag 'HierDeinEintrag' - oder was auch immer Du dahin schreibst - versehen.


arj - So 31.05.09 11:12

Hallo!

Ich würde es in etwa so probieren und mich nicht
auf GUI-Elemente verlassen, wie es user profile iconffgorcky vorgeschlagen hatte.


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:
procedure FillEmptyFields;
var oldpos : Integer;
begin
  oldpos := Table1.RecNo;

  // erster Datensatz selektieren
  table1.First;

  // Alle Datensätze iterieren
  while not table1.Eof do
  begin
    // Felder prüfen
    if table1.Fields[0].AsString = '' then
    // Oder
    if table1.Fields[0].IsNull then
    // Oder
    if table1.FieldByName('Feldname').AsString = '' then
    begin
      // In Editiermodus schalten
      table1.Edit;
      // irgendwie halt füllen
      table1.FieldByName('Feldname').AsString := 'Wert';
      // Abspeichern
      table1.Post;
    end;
  end;

  // Das könnte schief gehen, wenn du Felder hinzufügst/löschst.
  // Deshalb ggf. weglassen und stattdessen ein table1.First;
  table1.RecNo := oldpos;
end;


Das solltest Du gegebenenfalls in einen anderen Thread auslagern,
oder ein Application.ProcessMessages einfügen, sonst
hängt deine Applikation wenn das viele Datensätze sind.

Grüße
arj


delphi_noop - So 31.05.09 11:33

Danke für eure Tipps, aber irgendwie klappt das nicht so ganz... :(

Außerdem möchte ich gerne nicht alle Zellen durchsuchen, sondern nur eine bestimmte Anzahl an Zellen (z.B. von Zeile 3 bis Zeile 5) und in diese dann, falls sie noch leer sind, den Text von Edit1 eintragen!!!

Vielleicht kann mir jemand hierbei behilflich sein!!! DANKE!!!! 8)


arj - So 31.05.09 11:37

Hi user profile icondelphi_noop

mit dem Beitrag von user profile iconffgorcky oder mit meinem solltest Du
ne Lösung basteln können, die das tut.
Versuch einfach mal :-)

Wenns partout nicht klappen will, dann post mal (den relevanten) Teil
deines Codes dann schauen wir uns dass mal an. :-)


delphi_noop - So 31.05.09 11:39

Hab's nochmal probiert, aber es hat wieder nicht funktioniert!

Im Anhang findet ihr mein gesamtes Programm...


arj - So 31.05.09 11:46

user profile iconarj hat folgendes geschrieben:
... dann post mal (den relevanten) Teil
deines Codes...


delphi_noop - So 31.05.09 11:48

Hallo!

In dem Programm gibt es nur ein Dbgrid mit der Tabelle und einen button zum Einfügen, also bitte einfach runterladen!!!


arj - So 31.05.09 12:07

Was meinst Du denn warum ich das da oben geschrieben hab, mit dem relevanten Teil? :evil:

Das hier wäre der relevante Code gewesene:

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:
procedure TForm1.Button1Click(Sender: TObject);
var oldpos : Integer;
begin
  oldpos := Table1.RecNo;

  // erster Datensatz selektieren
  table1.First;

  // Alle Datensätze iterieren
  while not table1.Eof do
  begin
    // Felder prüfen
    if table1.Fields[0].AsString = '' then
    // Oder
    //if table1.Fields[0].IsNull then
    // Oder
    if table1.FieldByName('Tätigkeit').AsString = '' then
    begin
      // In Editiermodus schalten
      table1.Edit;
      // irgendwie halt füllen
      table1.FieldByName('Tätigkeit').AsString := edit1.text;
      // Abspeichern
      table1.Post;
    end;
  end;

  // Das könnte schief gehen, wenn du Felder hinzufügst/löschst.
  // Deshalb ggf. weglassen und stattdessen ein table1.First;
  table1.first        ;
  dbgrid1.refresh;
  Application.ProcessMessages;
end;


user profile icondelphi_noop hat folgendes geschrieben Zum zitierten Posting springen:
Hab's nochmal probiert, aber es hat wieder nicht funktioniert!

Was genau ging denn nicht? Hat es nicht kompiliert? Was hat das Programm stattdessen gemacht?
Was genau möchtest Du denn jetzt Ändern an Deinen Feldern?

Gib mal bitte noch ein paar Infos!


Delete - So 31.05.09 12:23

Wie wäre es denn mit einer Query?

SQL-Anweisung
1:
UPDATE Tabelle SET Feld = Wert WHERE Feld IS NULL                    


ffgorcky - So 31.05.09 12:34

Ich würde auch sagen, dass Du das von user profile iconDeddyH vorgeschlagene erst mal machen solltest
- wobei ich statt Wert einfach einen Leerstring (also nur '') reinsetzen würde - es sei denn, Du möchtest später mal
unterscheiden, ob dieses Feld denn schon einen Wert zugewiesen bekommen hat, oder nicht.

Dann würde ich das eher so schreiben:

Delphi-Quelltext
1:
if table1.FieldByName('Tätigkeit')=null then                    

In der Hoffnung, dass ich da jetzt keinen Denkfehler drin habe, da ich mich mit dem SQL-Server schon länger nicht mehr beschäftigt habe. - Oder war das in dem Fall dann so?:

Delphi-Quelltext
1:
if table1.FieldByName('Tätigkeit')=DBNull then                    

Das könnte auch sein...


Delete - So 31.05.09 12:38

Es geht ja wohl darum, nachträglich einen Standardwert einzusetzen, das kann ein Leerstring oder auch etwas anderes sein (wobei ich nicht weiß, wie Paradox sich bei Leerstrings verhält). Und IIRC prüft man NULL mit IsNull ab, sicher bin da aber gerade nicht.