unit uMainWarenVK;
interface
uses
Winapi.Windows,
Winapi.Messages,
System.SysUtils, System.Variants, System.Classes,
Vcl.Graphics,
Vcl.Controls,
Vcl.Forms,
Vcl.Dialogs,
Vcl.StdCtrls,
Vcl.ComCtrls,
Vcl.Grids,
Vcl.DBGrids,
Vcl.ExtCtrls,
Vcl.DBCtrls,
// XPManager nicht mehr notwendig!
Data.DB, system.UITypes, Data.DbxSqlite, Data.FMTBcd, Data.SqlExpr;
type
// !!! vernüftige Namen für die Controls oder Parameter, bei Controls mit Präfix für den Typ, vorzugsweise englisch und mit CamelCase...Denglisch sieht doof aus. :-) (BearbeitenClick)
TMainFrm =
class(TForm)
// besser
lvProductList: TListView;
// Die Caption kannst du, unabhängig vom Namen, separat ändern!
btnClose: TButton;
// besser
edtCustomerNumber: TEdit;
Name: TEdit;
Vorname: TEdit;
Firma: TEdit;
Produkt: TEdit;
Anzahl: TEdit;
Preis: TEdit;
// besser, sagt was über den Inhalt aus
mmoComment: TMemo;
Neu: TButton;
Bearbeiten: TButton;
Uebernehmen: TButton;
Abbruch: TButton;
loeschen: TButton;
// Auch auf die Form gelegte Komponenten sollen vernüftige Namen haben und nicht die Blubb1...
qryMain: TSQLQuery;
connectButton: TButton;
executebutton: TButton;
outputMemo: TMemo;
// besser
conMain: TSQLConnection;
procedure btnCloseClick(Sender: TObject);
procedure AbbruchClick(Sender: TObject);
procedure BearbeitenClick(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure lvProductListClick(Sender: TObject);
procedure loeschenClick(Sender: TObject);
procedure NeuClick(Sender: TObject);
procedure UebernehmenClick(Sender: TObject);
procedure connectButtonClick(Sender: TObject);
procedure executebuttonClick(Sender: TObject);
private
// Flags gehören nicht in die public Sichtbarkeit weil nicht von außen benutzt
// Name besser
IsEdit: boolean;
procedure ClearAllFields;
procedure RefreshItems(ID, KDNr,
Name, Vorname, Firma, Produkt, Anzahl, Preis:
string);
public
end;
var
MainFrm: TMainFrm;
implementation
{$R *.dfm}
procedure TMainFrm.AbbruchClick(Sender: TObject);
begin
IsEdit := False;
uebernehmen.Enabled := False;
Abbruch.Enabled := False;
lvProductList.SetFocus;
end;
//------------------------------------------------------------------------------ // laß das weg. Macht den Code imho schlechter lesbar. Es gibt bessere !Abgrenzungen.
procedure TMainFrm.BearbeitenClick(Sender: TObject);
begin
IsEdit := True;
uebernehmen.Enabled := true;
abbruch.Enabled := true;
end;
procedure TMainFrm.connectButtonClick(Sender: TObject);
begin
try
// Establish the connection. // !!! Kommentare nur wenn sie wirklich was über die "Funktion" aussagen...hier nicht
conMain.Connected := True;
executeButton.Enabled := True;
showMessage('
Connection erfolgreich!');
// später die Texte in Konstanten verlagern, wenn du die Texte mehrfach verwenden und nur einmal ändern willst.
except
on E: EDatabaseError
do
ShowMessage('
Fehlermeldungstext connection:' + E.
Message);
end;
end;
procedure TMainFrm.ClearAllFields;
//Initialiserung // !!! zur Methode des Formulars machen.
begin
// auch wenn es geht... *würg*
// with MainFrm do ... obsolet mit der Verlagerung der Prozedure in pivate
edtCustomerNumber.Clear;
Name.Clear;
// Name "Name" ist schlecht
vorname.Clear;
Firma.Clear;
Produkt.Clear;
Anzahl.Clear;
Preis.Clear;
mmoComment.Lines.Clear;
name.SetFocus;
end;
procedure TMainFrm.RefreshItems(ID, KDNr,
Name, Vorname, Firma, Produkt, Anzahl, Preis:
string);
// !!! zur Methode des Formulars machen.
// Name besser. Paßt nun mit dem Inhalt der proedure zusammen.
var
Item: TListItem;
begin
Item := lvProductList.Items.Add;
// durch die Verlagerung ins Formular kannst du direkt darauf zugreifen.
Item.Caption := ID;
Item.SubItems.Add(kdnr);
Item.SubItems.Add(
Name);
Item.SubItems.Add(Vorname);
Item.SubItems.Add(Firma);
Item.SubItems.Add(Produkt);
Item.SubItems.Add(Anzahl);
Item.SubItems.Add(Preis);
end;
procedure TMainFrm.btnCloseClick(Sender: TObject);
begin
Close;
end;
procedure TMainFrm.executebuttonClick(Sender: TObject);
begin
outputMemo.ClearSelection;
try
qryMain.SQL.Text := '
SELECT * FROM WARENVERKAUF';
qryMain.Open;
// besser
// Active wird automatisch gesetzt
except
on E:
Exception do
outputMemo.text := '
Fehlermeldungstext execute: ' + E.
Message;
end;
end;
procedure TMainFrm.FormCreate(Sender: TObject);
begin
conMain.LibraryName := ExtractFilePath(Application.ExeName) + '
sqlite3.dll';
conMain.Params.Add('
DataBase=' + ExtractFilePath(Application.ExeName) + '
WarenVK.sqlite');
// !!! keine hardcodierte Pfade verwenden
conMain.Connected := True;
qryMain.SQL.Clear;
qryMain.Params.Clear;
qryMain.SQL.Text := '
SELECT ID,KDNR,NAME,VORNAME,FIRMA,PRODUKT,ANZAHL,PREIS FROM WARENVERKAUF';
// Ich bevorzuge bei SQL immer die Großschreibung. Da grenzt sich das SQL von normalen Texten ab...kannst halten wie es willst...aber dann konsequent!
qryMain.Open;
while not qryMain.Eof
do
begin
RefreshItems(qryMain.FieldByName('
ID').AsString,
qryMain.FieldByName('
KDNR').AsString,
qryMain.FieldByName('
NAME').AsString,
// Feldname "NAME" kann in die Hose gehen...reserviertes Wort.
qryMain.FieldByName('
VORNAME').AsString,
qryMain.FieldByName('
FIRMA').AsString,
qryMain.FieldByName('
PRODUKT').AsString,
qryMain.FieldByName('
ANZAHL').Asstring,
qryMain.FieldByName('
PREIS').Asstring);
qryMain.Next;
end;
qryMain.Close;
IsEdit := False;
end;
procedure TMainFrm.lvProductListClick(Sender: TObject);
var
CurrentCustomerID:
string;
// Name besser...eindeutiger
begin
if lvProductList.SelCount >= 1
then
begin
CurrentCustomerID := lvProductList.Selected.Caption;
qryMain.SQL.Clear;
qryMain.Params.Clear;
qryMain.SQL.Text := '
SELECT * FROM WARENVERKAUF WHERE ID = :CID';
qryMain.ParamByName('
CID').AsString := CurrentCustomerID;
// besser Parameter
qryMain.Open;
edtCustomerNumber.Text := qryMain.FieldByName('
KDNR').AsString;
name.Text := qryMain.FieldByName('
NAME').AsString;
vorname.Text := qryMain.FieldByName('
VORNAME').AsString;
firma.Text := qryMain.FieldByName('
FIRMA').AsString;
Produkt.Text := qryMain.FieldByName('
PRODUKT').AsString;
Anzahl.Text := qryMain.FieldByName('
ANZAHL').Asstring;
Preis.Text := qryMain.FieldByName('
PREIS').Asstring;
mmoComment.Lines.Clear;
mmoComment.Lines.Add(qryMain.FieldByName('
MEMO').AsString);
qryMain.Close;
end;
end;
procedure TMainFrm.loeschenClick(Sender: TObject);
var
CurrentCustomerID:
string;
// Zeichen sind nicht mehr Mangelware
begin
if lvProductList.SelCount >= 1
then
begin
if MessageDlg('
Sind Sie sicher, dass Sie den Datensatz löschen wollen?', mtconfirmation, [mbyes, mbno], 0) = mrYes
then
begin
CurrentCustomerID := lvProductList.Selected.Caption;
qryMain.SQL.Clear;
qryMain.Params.Clear;
qryMain.SQL.Text := '
DELETE FROM WARENVERKAUF WHERE ID = :CID';
qryMain.ParamByName('
CID').AsString := CurrentCustomerID;
qryMain.ExecSQL;
// hier ist es richtig...gibt keine Datenmenge zurück
lvProductList.Selected.Delete;
end;
end;
end;
procedure TMainFrm.NeuClick(Sender: TObject);
begin
ClearAllFields;
uebernehmen.Enabled := True;
abbruch.Enabled := True;
IsEdit := False;
end;
procedure TMainFrm.UebernehmenClick(Sender: TObject);
var
CurrentCustomerID:
string;
// Zeichen sind nicht mehr Mangelware
begin
qryMain.SQL.Clear;
qryMain.Params.Clear;
//Parameter anlegen... passiert automatisch
if IsEdit
then // niemals auf True prüfen
begin
CurrentCustomerID := lvProductList.Selected.Caption;
qryMain.SQL.Text := '
UPDATE WARENVERKAUF SET KDNR=:KDNR,NAME=:NAME,VORNAME=:VORNAME,FIRMA=:FIRMA,PRODUKT=:PRODUKT,ANZAHL=:ANZAHL,PREIS=:PREIS,MEMO=:MEMO WHERE ID = :CID';
qryMain.ParamByName('
CID').AsString := CurrentCustomerID;
// Namensgebung der Parameter verbesserungswürdig...schlechte Unterscheidung Feldname und Parameter
qryMain.ParamByName('
KDNR').Text := edtCustomerNumber.Text;
qryMain.ParamByName('
NAME').Text :=
Name.Text;
qryMain.ParamByName('
VORNAME').Text := vorname.Text;
qryMain.ParamByName('
FIRMA').Text := firma.Text;
qryMain.ParamByName('
PRODUKT').Text := produkt.Text;
qryMain.ParamByName('
ANZAHL').Text := Anzahl.Text;
qryMain.ParamByName('
PREIS').Text := preis.Text;
qryMain.ParamByName('
MEMO').Text := mmoComment.Lines.Text;
qryMain.ExecSQL;
// Wiederverwendbarkeit
RefreshItems(CurrentCustomerID, edtCustomerNumber.Text,
Name.Text, vorname.Text, firma.Text, produkt.Text, Anzahl.Text, Preis.Text);
end
else
begin
qryMain.SQL.Text := '
INSERT INTO WARENVERKAUF(KDNR,NAME,VORNAME,FIRMA,PRODUKT,ANZAHL,PREIS,MEMO) VALUES (:KDNR,:NAME,:VORNAME,:FIRMA,:PRODUKT,:ANZAHL,:PREIS,:MEMO)';
qryMain.ExecSQL;
//LastID
qryMain.SQL.Clear;
qryMain.Params.Clear;
qryMain.SQL.Text := '
SELECT LAST_INSERT_ROWID() AS ID FORM WARENVERKAUF';
qryMain.Open;
CurrentCustomerID := qryMain.FieldByName('
ID').AsString;
qryMain.Close;
// Wiederverwendbarkeit
RefreshItems(CurrentCustomerID, edtCustomerNumber.Text,
Name.Text, vorname.Text, firma.Text, produkt.Text, Anzahl.Text, Preis.Text);
end;
IsEdit := False;
uebernehmen.Enabled := False;
abbruch.Enabled := False;
lvProductList.SetFocus;
end;
end.