Entwickler-Ecke

Datenbanken - Kleines Kassenprogramm


ElTonno - Fr 25.02.11 06:37
Titel: Kleines Kassenprogramm
Hallo Leute,

schreibe grad nen kleines Kassenprogramm und würde gern wissen wie man die Einträge aus der Table mit dynamisch erzeugten Buttons verknüpfen kann.

Benutze noch BDE und paradox.

Die PLU abfrage funktioniert, was auch nich schwierig war.

Vllt hat ja jemand ne Idee oder ne kleine Code Unterstützung parat. ;-) bis dann


Xion - Fr 25.02.11 10:08

user profile iconElTonno hat folgendes geschrieben Zum zitierten Posting springen:
schreibe grad nen kleines Kassenprogramm und würde gern wissen wie man die Einträge aus der Table mit dynamisch erzeugten Buttons verknüpfen kann.

Versteh ich nicht. Du willst Buttons mit Datenbankeinträgen verknüpfen? Also mit Werten? :nixweiss: Kannst du mal ein Beispiel sagen, wie das aussehen soll?


ElTonno - So 27.02.11 01:58

hi,

habe dynamisch erstellte Buttons, die würde ich gern mit datenbankeinträgen verknüpfen via artikelnr.

Coca Cola Button-> verknüpft mit DB Eintrag '1' wenn man diesen drückt soll er in eine Listview den DB eintrag Cola und den Preis schreiben.
Bin grad nich an meinerm rechner schicke dir mal nen code snippet wenn ich @ home bin. jut details dann später. By


Xion - So 27.02.11 09:50

Achso. Naja, wenn du die Buttons erstellst, dann setzt du ja die Caption auf den Namen. Setze dabei einfach Button.Tag auf die ArtikelNr. Wenn du dann draufklickst, kannst du mit SQL diese Artikelnummer suchen:

Delphi-Quelltext
1:
'SELECT Preis FROM TABELLE WHERE (ARTNR='+inttostr(Button.Tag)+');'                    


jaenicke - So 27.02.11 12:28

user profile iconElTonno hat folgendes geschrieben Zum zitierten Posting springen:
Benutze noch BDE und paradox.
Wobei du bedenken solltest, dass die BDE seit knapp 10 Jahren nicht mehr weiterentwickelt wird und viele Fehler enthält. Deshalb ist sie eigentlich nur unter Win9x voll nutzbar. Ab 2000/XP braucht man ggf. Adminrechte und es funktioniert in (ok, eher seltenen) Fällen nicht richtig. Und ab Windows Vista/7 ist spätestens bei Netzwerkzugriffen über Dateifreigaben der Ofen aus.

Für neue Projekte sollte man die BDE daher auf keinen Fall noch nutzen. Insofern lohnt es auch nicht kleine Lernprogramme damit zu erstellen (auch wenn die Standardkomponenten natürlich auch mit anderen DBs funktionieren). Nimm besser gleich Alternativen...


SmileySN - So 27.02.11 16:04

Ich würde die ADO-Komponenten und die Datenbank Access empfehlen.
Das ist in Delphi und Windows schon vorhanden und man braucht nichts zu installieren.
Wenn man kein Office Paket mit Access hat um die Datenbank und die Tabellen anzulegen, dann kann man das auch im Quellcode machen.
Bei Fragen dazu helfe ich gerne.


ElTonno - So 27.02.11 19:20

hallo,

vielen dank für die tips,

das ist erstmal für die PLU nr. das funzt auch super.

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:
var
query, wert1, wert2, wert3, nr : string;
li : TListitem;
begin
if (key = 13then begin
nr := plu.Text;
query := 'SELECT * from artikel where Nr = '''+ nr +''';';

query1.SQL.Clear;
query1.SQL.Add(query);
query1.prepare;
query1.open;

wert1 := query1.Fields[1].Text;
wert2 := query1.Fields[2].Text;
wert3 := query1.Fields[0].text;

Li:=Listview1.items.add;
Li.Caption:=Wert3 +' '+ wert1;
Li.SubItems.Add(wert2);
edit1.Clear;
query1.close;

end;
end;
//Buttons generieren aus Table
var
i,position:Word;
begin
position:=4;
table1.Open;
Table1.First;
for i := 0 to table1.RecordCount-1  do begin
Buttons:=TButton.create(self);
Buttons.parent:=panel6;
Buttons.top:=50;
Buttons.left:=position;
Buttons.Height:=41;
Buttons.Width:=100;
Buttons.Font.Style:=[fsbold];
Buttons.Font.Size:=12;
Buttons.caption:=Table1.FieldByName('artikel').AsString;
Buttons.Name:='artnr'+inttostr(i);
Buttons.OnClick:=buttonClick;
position:=position+105;
Table1.Next;
end;

ja ick wees das die schon uralt is, wollte auch langsam mal mit ado anfangen, is gut zu wissen das ich hier nachfragen kann wenn bedarf besteht.mit den tags hab ich noch nich so gearbeitet aber is ne gute idee.


SmileySN - So 27.02.11 19:59

Dieser Code funktioniert genauso mit den ADO-Komponenten.
Einfach ADOConnection und ADOQuery rein, die sonstigen Befehle bleiben gleich.

Bei der TextBox plu.txt solltest Du sicherstellen, dass nur korrekte Werte dort eingegeben wurden.
Sonst kann es im SQL-String zu unschönen Erlebnissen kommen :)

Das Query1.prepare kannst Du Dir sparen, da Du keine Parameter übergibst und hier auch keine Zeitkritischen Operationen stattfinden.

Wenn immer nur ein fester Text an die Query übergeben wird, dann kann man sich das:


Delphi-Quelltext
1:
2:
query1.SQL.Clear;
query1.SQL.Add(query);


sparen und einfach


Delphi-Quelltext
1:
query1.Text:=query;                    


schreiben.

Moderiert von user profile iconKlabautermann: Delphi-tags hinzugefügt.


Xion - Mo 28.02.11 10:08

user profile iconSmileySN hat folgendes geschrieben Zum zitierten Posting springen:
Ich würde die ADO-Komponenten und die Datenbank Access empfehlen.

Also ich kann ADO/Access garnicht ausstehen.

Was ich dafür umso mehr empfehlen kann:
SQLite: http://www.itwriting.com/blog/?page_id=659

Dort brauchst du garkeine Installation, nur eine kleine dll, die du bei deinem Programm mit in den Ordner reinpackst. Funktioniert etwas anders als die BDE, aber ich hatte mich in 5 Minuten eingearbeitet, denn das mitgelieferte Beispielprojekt sagt alles aus, was man benötigt.

Was für mich besonders genial ist: Größenunabhängige Suche in beliebig großen Textfeldern (BLOBs). Das ging mit der BDE nicht, und hat mich schon bei meinem ersten Projekt gestört.


jaenicke - Mo 28.02.11 10:30

user profile iconXion hat folgendes geschrieben Zum zitierten Posting springen:
Also ich kann ADO/Access garnicht ausstehen.

Was ich dafür umso mehr empfehlen kann:
SQLite: http://www.itwriting.com/blog/?page_id=659
Das kommt eben auf das Projekt an. Für kleine Progrämmchen ist SQLite super, aber für größere Programme und/oder Netzwerkzugriffe wie z.B. Client-/Server-Anwendungen, Multitier etc. sind ADO & Co sehr interessant. ;-)


Xion - Mo 28.02.11 11:07

Hier ist ne tolle Auflistung dazu:
http://www.sqlite.org/whentouse.html


Klabautermann - Mo 28.02.11 15:16

user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
{...}aber für größere Programme und/oder Netzwerkzugriffe wie z.B. Client-/Server-Anwendungen, Multitier etc. sind ADO & Co sehr interessant. ;-)

Aber dann nicht mit Access. Sorry, aber das ist eine Datenbank, die ich im Client/Server Bereich genau so wenig sehen möchte wie Paradox. Der Wechsel von Paradox aif SQLight scheint mir auch sinniger als der auf Access aber da user profile iconElTonno sich nicht interessiert zeigt, sind die Empfehlungen wahrscheinlich eh vergebens ;).

Gruß
Klabautermann


jaenicke - Mo 28.02.11 15:38

user profile iconKlabautermann hat folgendes geschrieben Zum zitierten Posting springen:
user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
{...}aber für größere Programme und/oder Netzwerkzugriffe wie z.B. Client-/Server-Anwendungen, Multitier etc. sind ADO & Co sehr interessant. ;-)

Aber dann nicht mit Access.
Ich habe kein Wort von Access gesagt, ich dachte da in Verbindung mit Ado eher an MSSQL, Firebird, ... ;-)


Klabautermann - Mo 28.02.11 16:25

user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
user profile iconKlabautermann hat folgendes geschrieben Zum zitierten Posting springen:
Aber dann nicht mit Access.
Ich habe kein Wort von Access gesagt, ich dachte da in Verbindung mit Ado eher an MSSQL, Firebird, ... ;-)

Ich wollte es dir auch gar nicht unterstellen, da ADO in diesem Thread aber bisher ausschließlich im zusammenhang mit Access genannt wurde (auch in deinem Zitat), wollte ich dieses Bundle aufsprengen. Wie dir übrigens sicherlich aufgefallen ist habe ich nichts gegen ADO gesagt ;).

Gruß
Klabautermann


ElTonno - Di 08.03.11 17:53

sry, keine zeit gehabt um zu antworten.

Danke erstmal für den Tip mit der Ado Komponente, muss mich da dann nochmal belesen.

mache erstmal zu Testzwecken weiter mit BDE und dann umstieg auf Ado.
Ist ne kleine Procedure mit dem SQL Code von "Xion". Ich habe die Artikelnr auf Buttons.tag gelegt bekomme aber immer wieder Meldung Listenindex Überschreitung. finde den Fehler nicht. Kann mal jemand drüber lesen und mir nen Tip geben?

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:
procedure TMainForm.FormCreate(Sender: TObject);
var
i,position:Word;
begin
position:=4;
table1.Open;
Table1.First;
for i := 0 to table1.RecordCount-1  do begin
Buttons:=TButton.create(self);
Buttons.parent:=panel6;
Buttons.top:=50;
Buttons.left:=position;
Buttons.Height:=41;
Buttons.Width:=100;
Buttons.Font.Style:=[fsbold];
Buttons.Font.Size:=12;
Buttons.caption:=Table1.FieldByName('artikel').AsString;
Buttons.Tag:=Table1.FieldByName('nr').AsInteger;
Buttons.OnClick:=Mausklick;
Buttons.Name:='artnr'+inttostr(i);
position:=position+105;
Table1.Next;
end;
end;

procedure TMainform.Mausklick(Sender: TObject);
var
query, wert1, wert2: string;
li : TListitem;
begin
query:='SELECT artikel FROM artikel WHERE (nr='+inttostr(Buttons.Tag)+');';
query1.SQL.Clear;
query1.SQL.Add(query);
query1.open;

wert1 := query1.Fields[1].Text;
wert2 := query1.Fields[2].Text;

Li:=Listview1.items.add;
Li.Caption:=wert1;
Li.SubItems.Add(wert2);
edit1.Clear;
query1.close;
end;


Vielen Dank


vagtler - Di 08.03.11 18:03

Quizfrage: Wieviel Felder hat Deine SQL-Query:


SQL-Anweisung
1:
SELECT artikel FROM artikel [...]                    

?

Übrigens: Fehlermeldungen beinhalten meistens auch weitere Meta-Informationen wie z.B. Zeilennummer o.ä.


Xion - Di 08.03.11 18:12

user profile iconElTonno hat folgendes geschrieben Zum zitierten Posting springen:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
query:='SELECT artikel FROM artikel WHERE (nr='+inttostr(Buttons.Tag)+');';
query1.SQL.Clear;
query1.SQL.Add(query);
query1.open;

wert1 := query1.Fields[1].Text;
wert2 := query1.Fields[2].Text;

Du selektierst nur "Artikel" raus, greifst aber auf 2 Felder zu. Ich denk mal, dass geht nicht ;)

Übrigens generierst du in der andren procedure fleißig buttons, die du aber nirgends "festhältst". Du kannst die also nicht mehr (so leicht) ansprechen (und löschen).


ElTonno - Di 08.03.11 22:16

hab das jetzt mal korrigiert, egal welchen Button ich drücke er benutzt den letzten Button der erstellt wurde ich denke mal wegen Table1.next.!!?? Jetzt mal von dem Speichern der Buttons abgesehen, ne andere schleife benutzen oder was is der Fehler???

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
for i := 0 to table1.RecordCount-1  do begin
Buttons:=TButton.create(self);
Buttons.parent:=panel6;
Buttons.top:=50;
Buttons.left:=position;
Buttons.Height:=41;
Buttons.Width:=100;
Buttons.Font.Style:=[fsbold];
Buttons.Font.Size:=12;
Buttons.caption:=Table1.FieldByName('artikel').AsString;
Buttons.Tag:=Table1.FieldByName('nr').AsInteger;
Buttons.OnClick:=Mausklick;
position:=position+105;


jaenicke - Di 08.03.11 22:24

user profile iconElTonno hat folgendes geschrieben Zum zitierten Posting springen:

Delphi-Quelltext
1:
Buttons.OnClick:=Mausklick;                    
Du weißt ja jedem Button den selben Eventhandler zu. Hast du vielleicht vergessen innerhalb von Mausklick zu prüfen welcher der Buttons gedrückt wurde?

(Das Next hast du ja hoffentlich noch in der Schleife dadrunter stehen.)


Robert.Wachtel - Mi 09.03.11 00:45

Das Problem liegt in der Verwendung von "Buttons" - diese Variable beinhaltet letztendlich nur den letzten erzeugten Button.

Warum überhaupt die Nutzung einer klassenweit verfügbaren Variable?

-> Grundlagen!