Einzelnen Beitrag anzeigen

Benutzerbild von haentschman
haentschman

Registriert seit: 24. Okt 2006
Ort: Seifhennersdorf / Sachsen
5.387 Beiträge
 
Delphi 12 Athens
 
#7

AW: SQLConnect ist erforderlich!

  Alt 8. Apr 2017, 10:40
Moin...
Du hast es so gewollt...
Ohne Gewähr auf Vollständigkeit. Vergleiche das Original mit, dem Comparer deiner Wahl, dem hier...
Ansonsten benutze einen Codeformatter und die Codevervollständigung... da passieren weniger Tippfehler. (false statt False)
Delphi-Quellcode:
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.
Angehängte Dateien
Dateityp: zip Test.zip (1,58 MB, 7x aufgerufen)

Geändert von haentschman ( 8. Apr 2017 um 13:34 Uhr)
  Mit Zitat antworten Zitat