Entwickler-Ecke

Datenbanken - array problem


degabs - Di 18.03.08 20:53
Titel: array problem
hi, habe folgendes problem:
ich hab ne datenbank, in der das feld "Getraenk" enthalten ist.
auf dieses will ich zugreifen, also mit TTable1.FieldByName('Getraenke').
so nun hab ich da 2 einträge, der erste ist "jägermeister" und der 2te "redbull".
nun will ich diese 2 einträge in einen array packen.
der array soll dann in eine ListBox, natürlich die einzelnen einträge.
achte mir das eigentlich so:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
....
eintraege:= TTable.RecordCount;
try
for i:= 1 to eintraege do
array[i]:= TTable1.FieldByName('Getraenke').FieldValues[i];
lauswahl.Items.Add(inttostr(i) + array[i]);
i:=i + 1
except
else
lauswahl.Items.Add('Keine Rezepte vorhanden');

end;
...

dann kommt immer so ne fehlermelung "keine zugriffberechtung für die adresse..."
und in der Listbox steht Keine Rezepte vorhanden.
wo ist der fehler?:D
hab schon bei der delphi hilfe und so gesucht, gegooglet aber nichts gefunden was mir weitergeholfen hätte.
danke schonmal
mfg

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


katjah - Di 18.03.08 21:13

Hi,

1. wozu soll das überhaupt in ein Array ? Man könnte es ja auch direkt in die Listbox schreiben.
2. Hast Du überhaupt ein array deklariert ?
bsp. var ary : array of string;
3. müsstest Du in Deinem Quelltext die Variable (bsp:ary) referenzieren und nicht das Schlüsselwort array.
4. muß es vermutlich heißen: for i:=0 to eintraege - 1
5. müssen die Anweisungen in begin..end eingeschlossen werden, wenn beide ausgeführt werden sollen.

Quelltext
1:
2:
3:
4:
5:
for i:= 1 to eintraege do
begin
  array[i]:= TTable1.FieldByName('Getraenke').FieldValues[i];
  lauswahl.Items.Add(inttostr(i) + array[i]);
end;

6. was soll diese Anweisung bewirken: i:=i + 1


degabs - Di 18.03.08 21:20

1. weil ich das immer so mache
2. ja habe ich und auch gleich 3 is mir klar dass is nur ein beispiel
4. ob ich i 0 setze und eins abziehe oder ob ich i 1 setze und nix abziehe is meineswissen das selbe
5. kannst du recht haben, danke^^
6. dass es i um eins raufzählt damit der nächste datensatz kommt?


degabs - Di 18.03.08 21:22

wenn man das so macht, soweit war ich vorher auch schon^^, kommt
[Fehler] Unit1.pas(81): Undefinierter Bezeichner: 'FieldValues'
an was liegt das??


katjah - Di 18.03.08 21:52

Hi,

Zitat:
1. weil ich das immer so mache

das ist Speicherplatzverschwendung.

Zitat:
4. ob ich i 0 setze und eins abziehe oder ob ich i 1 setze und nix abziehe is meineswissen das selbe

In diesem Fall nicht, da die Indizierung von Tabellenfeldern bei 0 anfängt. D.h. den ersten Satz/das erste Feld bekommst Du nie und die Meldung "keine zugriffberechtung für die adresse..." kommt vermutlich daher, daß Du um ein Feld zu weit greifst.

Zitat:
wenn man das so macht, soweit war ich vorher auch schon^^, kommt
[Fehler] Unit1.pas(81): Undefinierter Bezeichner: 'FieldValues'
an was liegt das??

Wenn man was macht ?


degabs - Di 18.03.08 22:09

Zitat:
array[i]:= TTable1.FieldByName('Getraenke').FieldValues[i];

dann kommt der fehler?
aber wieso?


katjah - Di 18.03.08 22:16

probier mal so:

array[i]:= TTable1.FieldByName('Getraenke').AsString;


degabs - Di 18.03.08 22:30

das geht, dann liest es aber ja nur immer 1 eintrag aus!
es soll aber jeden eintrag der spalte auslesen
und dann dem array zuordnen.
also array[0] = eintrag0
array[1] = eintrag1
also muss da unbedint das .FieldValues rein:D

anderst gefragt, wie würdest du vorschlagen es ohne array zu machen?
danke
mfg


katjah - Di 18.03.08 22:37

Poste doch bitte mal den kompletten Code, den Du bis jetzt hast.

Auszug zum Thema FieldValues aus der Delphi-Hilfe
Zitat:
Die Eigenschaft FieldValues ermöglicht den Zugriff auf alle Feldwerte des aktuellen Datensatzes der Datenmenge.


Du wirst wohl mit einer Schleife alle Datensätze der Tabelle durchlaufen müssen. Stichworte TTable.First, .next usw

auch aus der OH


Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
procedure TForm1.Button1Click(Sender: TObject);

var
  i: Integer;
begin
  with ProgressBar1 do
  begin
    Min := 0;
    Max := Customers.RecordCount;
    Customers.First;
    for i := Min to Max do
    begin
      Position := i;
      Customers.Next;
      // Operationen mit aktuellem Datensatz durchführen
    end;
  end;
end;


degabs - Di 18.03.08 22:42


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:
102:
103:
104:
105:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls, ExtCtrls, DBCtrls, Menus, Unit2, Mask, Db, DBTables;

type
  TForm1 = class(TForm)
    eeingabe: TEdit;
    bsuchen: TButton;
    lauswahl: TListBox;
    bende: TButton;
    ltext: TLabel;
    mm: TMainMenu;
    rsuchen: TMenuItem;
    rhinzu: TMenuItem;
    dbgetraenk: TDBEdit;
    dbprozent: TDBEdit;
    dbrezept: TDBMemo;
    ttable: TTable;
    DataSource1: TDataSource;
    DBNavigator1: TDBNavigator;
    procedure bsuchenClick(Sender: TObject);
    procedure lauswahlClick(Sender: TObject);
    procedure bendeClick(Sender: TObject);
    procedure verbergen(Sender: TObject);
    procedure rhinzuClick(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;
  tt: String;
  i: Integer;


implementation

{$R *.DFM}

procedure TForm1.bsuchenClick(Sender: TObject);
begin
if ttable.Locate('Getraenk', eeingabe.text, [loCaseInsensitive]) then
   begin
     lauswahl.Clear;
     tt:=',,,';
     lauswahl.Items.Add(tt);
     end
else
  ShowMessage('Nichts gefunden...');
end;

procedure TForm1.lauswahlClick(Sender: TObject);
begin
if lauswahl.Selected[0then
ltext.caption:='...';
end;

procedure TForm1.bendeClick(Sender: TObject);
begin
close;
end;

procedure TForm1.verbergen(Sender: TObject);
var eintraege: integer;
    arr : array of String;

begin
SetLength (arr, ttable.RecordCount);
dbgetraenk.Hide;
dbprozent.Hide;
dbrezept.Hide;
DBNavigator1.Hide;
eintraege:= ttable.RecordCount;
try
for i:= 0 to eintraege-1 do
begin
arr[i]:= ttable.FieldByName('Getraenk').AsString;
lauswahl.Items.Add(inttostr(i) + arr[i]);
end;
except
else
lauswahl.Items.Add('Keine Rezepte vorhanden');

end;
end;

procedure TForm1.rhinzuClick(Sender: TObject);
begin
eeingabe.Hide;
bsuchen.Hide;
lauswahl.Hide;
ltext.Hide;
dbgetraenk.Show;
dbprozent.Show;
dbrezept.Show;
DBNavigator1.Show;
end;

end.


wobei ja diese zeile:
arr[i]:= ttable.FieldByName('Getraenk').AsString;
die problemzeile ist, weil ich nicht weis was da hin gehört....


katjah - Di 18.03.08 22:44

Schau nochmal mal meinen vorherigen Post an, ich habe den nochmal geändert.


degabs - Di 18.03.08 23:44

jetzt funzt es mit der schleife