Thema: Kundenliste

Einzelnen Beitrag anzeigen

EdAdvokat

Registriert seit: 1. Mai 2016
Ort: Berlin
414 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#19

AW: Kundenliste

  Alt 16. Apr 2017, 19:11
Hallo zusammen, es ist mein erstes Projekt dieser Dimension und ich komme einfach nicht weiter und verzweifele, da ich bereits 2 Tage vergeblich den Fehler in diesem kleinen Übungsprogramm suche.
Nach dem Aufruf des Programms wird die SQLLite-Tabelle in einem Listview (auch mit ID!)exakt angezeigt und auch die TEdit-Felder sind parallel dazu zu sehen. Will ich jedoch einen Datensatz daraus löschen oder bearbeiten (entspr. Methoden per ButtonClick) kommt die Meldung
"Argument außerhalb des Bereiches". Will ich einen Datensatz hinzufügen oder auch mit DBSpeichern kommt: "Operation bei geschlossener Datenmenge nicht ausführbar" .
Nach dem Aufruf von Bearbeiten rückt die Anzeige im Listview nach links d.h. das Feld ID wird nun mit der KDNR belegt. Also die ID ist nicht mehr sichtbar und dafür in der Spalte wird die Kundennummer angezeigt und folgend Name bei KDNR usw.
Ich habe bereits alles versucht, was mir eingefallen ist, doch ich kam zu keinem vernünftigen Ergebnis.
Die Anzeige der Daten in den Edit-Feldern im FRMMain ist ebenfalls weg. Es wird wohl irgendwo was unterschlagen, vermutlich die ID.
Wo könnte ich suchen oder was müßte ich tun? Debugger.. na ja brachte mich nicht weiter, da mir wohl die Erfahrung fehlt.
Es ist für mich wirklich völliges Neuland und ich habe mich wirklich bemüht, doch jetzt stehe ich in dieser Sache vermutlich vor dem Aus, doch ich glaube es ist nur ein verdammter Denkfehler von mir.
Sollte sich jemand erbarmen, mir einen Tipp zu geben, wäre ich sehr dankbar. Anbei das Programm in der jetzigen Fassung und die beiden entscheidenen units:
Delphi-Quellcode:
unit UCustomerList;

interface

uses
classes, system.Types, system.SysUtils, ZAbstractRODataset, ZAbstractDataset,
ZDataset, ZAbstractConnection, ZConnection ,contnrs, System.Generics.Collections;

type
  TCustomer=class
  private
   // FID: integer;
    FKDNR : Integer;
    FName: string;
    FVorname: string;
    FFirma : string;
    FProdukt: string;
    FAnzahl : Integer;
    FPreis : Currency;
   // procedure SetID(const Value: Integer);
    procedure SetKDNR(const Value: Integer);
    procedure SetName(const Value: string);
    procedure SetVorname(const Value: string);
    procedure SetFirma (const Value : string);
    procedure SetProdukt(const Value : String);
    procedure SetAnzahl (const Value : Integer);
    procedure SetPreis(const Value: Currency);
  published
   // property ID: integer read FID write SetID;
    property KDNR: integer read FKDNr write SetKDNR;
    property Name: string read FName write SetName;
    property Vorname: string read FVorname write SetVorname;
    property Firma: string read FFirma write SetFirma;
    property Produkt: string read FProdukt write setProdukt;
    property Anzahl: Integer read FAnzahl write SetAnzahl;
    property Preis: Currency read FPreis write SetPreis;
  end;

  TCustomerList=class(TObjectList<TCustomer>)//generische Liste (contnrs, System.Generics.Collections)
    procedure LoadFromDB(con: TZConnection);
    procedure SavetoDB(con: TZConnection);
  public
    function AddCustomer(KDNR: integer; Name: string; Vorname: string; Firma: string; Produkt: string; Anzahl: Integer; Preis: Currency):integer;
  end;

implementation

  { TCustomer }

procedure TCustomer.SetAnzahl(const Value: Integer);
begin
  FAnzahl := Value;
end;

procedure TCustomer.SetFirma(const Value: string);
begin
  FFirma := Value;
end;

{procedure TCustomer.setID(const Value: Integer);
begin
  FID := Value;
end;   }


procedure TCustomer.SetKDNR(const Value: Integer);
begin
  FKDNR:= Value;
end;

procedure TCustomer.SetName(const Value: string);
begin
  FName := Value;
end;

procedure TCustomer.SetPreis(const Value: Currency);
begin
  FPreis := Value;
und weiter
Delphi-Quellcode:
//Programm Kundenliste als ersten Versuch eine Objectlist zur Aufnahme der Daten
//für eine SQLite DB einzusetzen.
//Hilfe dazu erhielt ich aus vorangegangenen Projekten in der DP vor allem von
//Hobbycoder, Haentschmann und P80286, dennen ich hiermit nochmals danke.
//Erstellt von EdAdvokat April 2017
unit uMainFRM;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes,
  Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, uFRMCustomer,
  uCustomerList, Vcl.ComCtrls, Data.DB, ZAbstractRODataset, ZAbstractDataset,
  ZDataset, ZAbstractConnection, ZConnection;

type
  TFRMMainCustomer = class(TForm)
    lvCustomer: TListView;
    btnAdd: TButton;
    btnMake: TButton;
    btnDelete: TButton;
    btnAutomatic: TButton;
    btnClose: TButton;
    conMain: TZConnection;
    zqryMain: TZQuery;
    btnSaveDB: TButton;
    btnloadDB: TButton;
    edtKDNR: TEdit;
    edtName: TEdit;
    edtVorname: TEdit;
    edtFirma: TEdit;
    edtProdukt: TEdit;
    edtAnzahl: TEdit;
    edtPreis: TEdit;
    lblKDNR: TLabel;
    lblName: TLabel;
    lblVorname: TLabel;
    lblFirma: TLabel;
    lblProdukt: TLabel;
    lblAnzahl: TLabel;
    lblPreis: TLabel;
    edtTestID: TEdit;
    procedure btnAddClick(Sender: TObject);
    procedure btnMakeClick(Sender: TObject);
    procedure btnDeleteClick(Sender: TObject);
    procedure btnAutomaticClick(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TOBject);
    procedure btnCloseClick(Sender: TObject);
    procedure btnSaveDBClick(Sender: TObject);
    procedure btnloadDBClick(Sender: TObject);
    procedure lvCustomerClick(Sender: TObject);

  private
    { Private-Deklarationen }
    CustomerList: TCustomerList;
    procedure FuelleListView;
    procedure connect;
    procedure clearAllFields;
    procedure saveTableData(ID,KDNR,NAME,VORNAME,FIRMA,PRODUKT,ANZAHL,PREIS:string );
  public
    { Public-Deklarationen }
  end;

var
  FRMMainCustomer: TFRMMainCustomer;

implementation

{$R *.dfm}

procedure TFRMMainCustomer.btnAutomaticClick(Sender: TObject);
var
  r: integer;
  I: Integer;
  KDN, KDN1, Name, Vorname, Firma, Produkt: string;
  KDNR, Anzahl: Integer;
  Preis: Currency;
begin
  Customerlist.Clear;
  Randomize;
  for I := 0 to 999 do
  begin
    r:=Random(10);
    case r of
      0: Name:='Lehmann';
      1: Name:='Krausnig';
      2: Name:='Karlsberg';
      3: Name:='Ludwig';
      4: Name:='Antonia';
      5: Name:='Delphenhorst';
      6: Name:='Erinig';
      7: Name:='Fiedler';
      8: Name:='Gurrlig';
      9: Name:='Henzener';
    end;
    r:=Random(10);
    case r of
      0: Vorname:='Dieter';
      1: Vorname:='Klaus';
      2: Vorname:='Paul';
      3: Vorname:='Helga';
      4: Vorname:='Bernd';
      5: Vorname:='Friedel';
      6: Vorname:='Gustaf';
      7: Vorname:='Heinz';
      8: Vorname:='Joachim';
      9: Vorname:='Manfred';
    end;
    r:=Random(10);
    case r of
      0: KDN:='11';
      1: KDN:='12';
      2: KDN:='13';
      3: KDN:='14';
      4: KDN:='15';
      5: KDN:='16';
      6: KDN:='17';
      7: KDN:='18';
      8: KDN:='19';
      9: KDN:='20';
    end;
    r:=Random(10);
    case r of
      0: KDN1:='21';
      1: KDN1:='22';
      2: KDN1:='23';
      3: KDN1:='24';
      4: KDN1:='25';
      5: KDN1:='26';
      6: KDN1:='27';
      7: KDN1:='28';
      8: KDN1:='29';
      9: KDN1:='30';
    end;
    r:=Random(10);
    case r of
      0: Firma:='Schulbedarf';
      1: Firma:='Schule&mehr';
      2: Firma:='Hausmeisterserv.';
      3: Firma:='Lernen KG';
      4: Firma:='Lehrbuch Co.';
      5: Firma:='Möbel KG';
      6: Firma:='Hefte/Bücher';
      7: Firma:='Buch4you';
      8: Firma:='Lernen4all';
      9: Firma:='Bedarf Schule';
    end;
    r:=Random(10);
    case r of
      0: Produkt:='Stühle';
      1: Produkt:='Tische';
      2: Produkt:='Hefte';
      3: Produkt:='Blöcke';
      4: Produkt:='Bilder';
      5: Produkt:='Kreide';
      6: Produkt:='Bücher';
      7: Produkt:='Tafeln';
      8: Produkt:='Werkzeug';
      9: Produkt:='Mappen';
    end;
    KDNR:=strtoint(KDN[1]+KDN1[1]+format('%.6d',[i]));
    Anzahl:=Random(20);
    r:=Random(10000);
    Preis:=r/100;
    CustomerList.AddCustomer(KDNR, Name, Vorname, Firma, Produkt, Anzahl, Preis );
  end;
  FuelleListView;
end;

procedure TFRMMainCustomer.btnCloseClick(Sender: TObject);
begin
  close;
end;

procedure TFRMMainCustomer.btnAddClick(Sender: TObject);
var
  Customer: TCustomer;
begin
  //Eingabeformular mit Defaultwerten bestücken

  FRMCustomer.edtKDNR.Text:='';
  FRMCustomer.edtName.Text:='';
  FRMCustomer.edtName.Text:='';
  FRMCustomer.edtVorname.text:='';
  FRMCustomer.edtFirma.text:='';
  FrmCustomer.edtProdukt.Text:='';
  FrmCustomer.edtAnzahl.text:='';
  FRMCustomer.edtPreis.text:='';

  if frmCustomer.ShowModal=mrOK then
  begin
    Customer:=TCustomer.Create; //Das Object Customer erzeugen.
    Customer.KDNR:=strtoint(frmCustomer.edtKDNR.Text); //Customer wird befüllt
    Customer.Name:=FRMCustomer.edtName.Text;
    Customer.Vorname:=FRMCustomer.edtVorname.text;
    Customer.Firma:=FRMCustomer.edtFirma.text;
    Customer.Produkt:=FRMCustomer.edtProdukt.text;
    customer.Anzahl:=strtoint(FRMCustomer.edtAnzahl.text);
    Customer.Preis:= StrToCurr(FRMCustomer.edtPreis.Text);
    CustomerList.Add(Customer); //Übergabe an CustomerList
    FuelleListView;
  end;
end;

procedure TFRMMainCustomer.btnDeleteClick(Sender: TObject);
begin
   if lvCustomer.Selected<>nil then
  begin
    //Hier löschen wir das Object aus der ObjectListe
    //Durch die Eigenschaft OwnObjects, die zu jeder TObjectList gehört,
    //kümmert sich die ObjectListe selber darum, das entsprechende Object Customer
    //frei zugehen. Brauchen wir also nicht selber mache.
    //Ansonsten gilt grundsätzlich, was ich selber erzeuge gebe ich auch selber wieder frei
    CustomerList.Delete(lvCustomer.Selected.Index);
    FuelleListView;
  end;
end;

procedure TFRMMainCustomer.btnloadDBClick(Sender: TObject);
begin
  CustomerList.LoadFromDB(conMain);
end;

procedure TFRMMainCustomer.btnSaveDBClick(Sender: TObject);
begin
  CustomerList.SavetoDB(conMain);
end;

procedure TFRMMainCustomer.btnMakeClick(Sender: TObject);
begin
   if lvCustomer.Selected<>nil then
  begin
    //Über den Index kann man nun auf jedes Object in der ObjektListe zugreifen
    //Damit bestücken wir das Formular mit den Werten aus den Eigenschaften des Objects
    frmCustomer.edtKDNR.Text:=inttostr(CustomerList[lvCustomer.Selected.Index].KDNR);
    frmCustomer.edtName.Text:=CustomerList[lvCustomer.Selected.Index].Name;
    frmCustomer.edtVorname.Text:=CustomerList[lvCustomer.Selected.Index].Vorname;
    fRMCustomer.edtFirma.Text:=CustomerList[lvCustomer.Selected.Index].Firma;
    frmCustomer.edtProdukt.text:=CustomerList[lvCustomer.Selected.Index].Produkt;
    frmCustomer.edtAnzahl.Text:=IntToStr(Customerlist[lvCustomer.Selected.Index].Anzahl);
    frmCustomer.edtPreis.Text:=CurrToStr(Customerlist[lvCustomer.Selected.Index].Preis);

    if FRMCustomer.ShowModal=mrOK then
    begin
      //Object erzeugen nicht nötig, da es bereits besteht. Zugriff also möglich
      //für die Übertragung der Daten aus dem Formular
      CustomerList[lvCustomer.Selected.Index].KDNR:=strtoint(frmCustomer.edtKDNR.Text);
      CustomerList[lvCustomer.Selected.Index].Name:=frmCustomer.edtName.Text;
      CustomerList[lvCustomer.Selected.Index].Vorname:=FRMCustomer.edtVorname.Text;
      CustomerList[lvCustomer.Selected.Index].Firma:=FRMCustomer.edtFirma.text;
      CustomerList[lvCustomer.Selected.Index].Produkt:=FRMCustomer.edtProdukt.text;
      CustomerList[lvCustomer.Selected.Index].Anzahl:=strtoint(FRMCustomer.edtAnzahl.text);
      CustomerList[lvCustomer.Selected.Index].Preis:=strtocurr(FRMCustomer.edtPreis.Text);
      FuelleListView;
    end;
  end;
end;

procedure TFRMMainCustomer.clearAllFields;
begin
  with FRMMainCustomer do
  begin
    edtKDNR.Clear;
    edtName.Clear;
    edtVorname.Clear;
    edtFirma.Clear;
    edtProdukt.Clear;
    edtAnzahl.Clear;
    edtPreis.Clear;
  end;
end;

procedure TFRMMainCustomer.connect;
begin
  conMain.LibraryLocation:=ExtractFilePath(application.ExeName)+'sqlite3.dll';
  conMain.Database:=ExtractFilePath(application.ExeName)+'WarenVK.sqlite';
  conMain.Connected:=true;

  zqryMain.SQL.Clear;
  zqryMain.Params.Clear;

  zqryMain.SQL.Text:='SELECT * FROM WARENVERKAUF1';
  zqryMain.Open;
  while not zqryMain.Eof do
  begin
    saveTableData(zqryMain.FieldByName('ID').AsString,zqryMain.FieldByName('KDNR').AsString,zqryMain.FieldByName('Name').AsString, zqryMain.FieldByName('Vorname').AsString,zqryMain.FieldByName('Firma').AsString,zqryMain.FieldByName('Produkt').AsString,zqryMain.FieldByName('Anzahl').AsString, zqryMain.FieldByName('Preis').AsString);
    zqryMain.Next
  end;
  zqryMain.Close;
end;

procedure TFRMMainCustomer.FormCreate(Sender: TObject);
begin
  CustomerList:=TCustomerList.Create;
  connect;
  clearAllFields;
end;

procedure TFRMMainCustomer.FormDestroy(Sender: TOBject);
begin
  CustomerList.Free;
end;

procedure TFRMMainCustomer.FuelleListView;
var
  li: TListItem;
  I: Integer;
begin
  lvCustomer.Items.BeginUpdate;
  Try
    //ListView mit Daten aus der ObjectList befüllen.
    lvCustomer.Items.Clear;
    for I := 0 to CustomerList.Count-1 do
    begin
      li:=lvCustomer.Items.Add;
      li.Caption:=inttostr(CustomerList[i].KDNR);
      li.SubItems.Add(CustomerList[i].Name);
      li.SubItems.Add(CustomerList[i].Vorname);
      li.SubItems.Add(CustomerList[i].Firma);
      li.SubItems.Add(CustomerList[i].Produkt);
      li.SubItems.Add(inttostr(CustomerList[i].Anzahl));
      li.SubItems.Add(FormatCurr('#0.00 €', CustomerList[i].Preis));
    end;
  Finally
    lvCustomer.Items.EndUpdate;
  End;
end;

procedure TFRMMainCustomer.lvCustomerClick(Sender: TObject);
var CurrentCustomerID : string;
begin
  if lvCustomer.SelCount>=1 then
  begin
    CurrentCustomerID:=lvCustomer.Selected.Caption; //
    zqryMain.SQL.Clear;
    zqryMain.Params.Clear;
    zqryMain.SQL.Text:='SELECT * FROM WARENVERKAUF1 WHERE ID = :CID';
    // WHERE ID='+#39+ID+#39;
    zqryMain.ParamByName('CID').AsString := CurrentCustomerID; //
    zqryMain.Open;

    edtKDNR.text:=zqryMain.FieldByName('KDNR').AsString;
    edtName.text:=zqryMain.FieldByName('Name').AsString;
    edtVorname.Text:=zqryMain.FieldByName('Vorname').AsString;
    edtFirma.text:=zqryMain.FieldByName('Firma').asstring;
    edtProdukt.text:=zqryMain.FieldByName('Produkt').AsString;
    edtAnzahl.text:=zqryMain.FieldByName('Anzahl').AsString;
    edtPreis.Text:=zqryMain.FieldByName('Preis').AsString;
    zqryMain.Next; //
    zqryMain.close;
  end;
end;

procedure TFRMMainCustomer.saveTableData(ID, KDNR, NAME, VORNAME, FIRMA, PRODUKT, ANZAHL, PREIS: string);
var item:TListItem;
begin
  Item:=lvCustomer.Items.Add;
  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;

end.
ich wäre sehr dankbar für eine Meinungsäußerung, damit ich das ganze nicht wirklich in die Tonne treten muss.
Angehängte Dateien
Dateityp: rar customerList2.rar (4,02 MB, 1x aufgerufen)
Norbert
  Mit Zitat antworten Zitat