AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Projekte Übungsprogramm Lagerverwaltung

Übungsprogramm Lagerverwaltung

Ein Thema von EdAdvokat · begonnen am 13. Mär 2017 · letzter Beitrag vom 17. Mär 2017
Antwort Antwort
Seite 1 von 2  1 2   
EdAdvokat
Registriert seit: 1. Mai 2016
Lagerverwaltung. Ein kleines Programm zur beispielhaften Verwaltung eines Lagerartikels(zunächst einer mit Erweiterungsmöglichkeit) mit einigen Lagerkennziffern und der Möglichkeit die einzelnen Datensätze mit Angabe von Datum und Zeit zu speichern.
Es ist sicher nicht das, was die Wirtschaft wirklich benötigt, doch ich denke es könnte Delphi-Neulingen einige Anregungen geben.
Ich bin wieder mal so mutig, mich der Kritik der Fachleute zu stellen, um daraus zu lernen. Hoffentlich habe ich nicht wieder alte Fehler wiederholt.
Eigentlich wollte ich nur für mich ein Beispielprogramm entwickeln, dass mit einer echten Datenbank(SQLite, XML, ABS oder Firebird..) arbeitet und die entsprechenden Datensäzte automatisch speichert, wenn sie erstellt werden.
Dies gelang mir bisher nicht. Zwar kann ich eine Datenbank erstellen und mit ihr auch arbeiten, doch eine Verbindung zwischen einem Programm, wie der hier vorliegenden Lagerverwaltung und der Datenbank gelang mir bisher nicht. So blieb mir nach einigem Suchen nur die vorliegende Möglichkeit eine "Ersatzdatenbank" zu erstellen und darin die Datensätze der Lagerverwaltung zu speichern.
Alles ist nur zur Übung, denn ich habe keinen Auftraggeber für ein derartiges Programm. Ich will einfach nur mit der Idee mein Wissen vervollkommnen.
Für kritische Hinweise und ein möglichen Ausblick darauf, wie man diesbezüglich weiter kommen könnte wäre ich dankbar.
Norbert
Angehängte Dateien
Dateityp: zip Lager3.zip (3,88 MB, 46x aufgerufen)
 
Benutzerbild von mikhal
mikhal

 
Delphi 10.2 Tokyo Professional
 
#2
  Alt 13. Mär 2017, 22:00
Die Starter kennt keine Datenzugriffskomponenten - aber TDataSet. Damit sollte es möglich sein, die ZEOS-Komponenten für den Datenbankzugriff zu installieren. Die Datenbankfähigkeit sollte damit gegeben sein.

SQLite sollte auch mit dem Workaround möglich sein, es gab da so einen Wrapper für SQLite - mal hier im Forum suchen. Ich nutze UniDAC, aber die kostet Geld und wäre hier wahrscheinlich Overkill...

Deinen Ansatz schaue ich mir auf jeden Fall mal an, heute Abend ist es aber bereits zu spät und Morgen wird da auch nichts draus, mal sehen...

Grüße
Mikhal
Michael Kraemer
  Mit Zitat antworten Zitat
EdAdvokat

 
Delphi 10.2 Tokyo Professional
 
#3
  Alt 13. Mär 2017, 22:26
Danke für die schnelle Antwort. Ich habe bereits mit den ZEOS-Komponenten experimentiert und auch Zugriff auf Datenbanken gehabt. Ebenso gelang es mir mit den Komponenten mit der Absolut Database zu arbeiten. Mit den ZEOS-Komponenten und IBO konnte ich auch eine Firebird-Datenbank ansprechen.... doch wie weiter????
Wie stellt man es an, einer einfachen "Lagerverwaltung", wie der erstellten einen Zugriff auf eine Datenbank beizubringen???? Ich bin diesbezüglich noch recht unbedarft und taste mich heran. Ggf. habe ich auch Zugriff auf Turbo-Delphi 2006 bzw. Delphi 7 und Delphi 4 prof. Doch ich konzentriere mich auf Delphi 10.1 update 2 Starter mit den angebotenen Datenbankkomponenten, hier vorwiegend ZEOS und IBO5_9_1. Ein wesentlicher Schritt war der, dass ich auf die jeweiligen Datenbanken den Zugriff erreichen konnte und mit den Datenbanken arbeiten konnte. Doch ewig nur Adressverwaltungen schreiben ist wohl langweilig. So kam die Idee irgendetwas mit einer Datenbank zu verbinden. Doch auch Google konnte mir da bislang nicht so richtig weiter helfen. Legiglich, dass will ich nicht unterbewerten, habe ich die Lösung von Wolfgang Bergt in die Hände bekommen. Es ist sicher ähnlich einer Ini-Lösung, doch es führt auch zum Ziel. Das erstrebenswerte Ziel ist es jedoch noch nicht.
Norbert
Norbert
  Mit Zitat antworten Zitat
Hobbycoder
 
#4
  Alt 14. Mär 2017, 00:19
Wenn es nur darum geht, ein Übungsprojekt zu realisieren, in dem man einige Daten speichern kann kämen ja ggf. auch andere Lösungsansätze in Frage.
Es muss nicht immer eine SQL-DB dahinter stehen, es sei denn, dass genau dieses dein Ziel der Übung ist.

So könntest du auch deine Daten über Klassen definieren und beim Starten laden und bei Veränderungen speichern. Das ginge in einem Stream, als XML oder auch einfach als JSON-File.

Würde man nicht vor einer Lagerverwaltung erst mal Arikel erzeugen, die man dann im Lager verwalten kann?

Was mir aber schon beim anschauen des Quellcodes aufgefallen ist, sind die StrtoInt um die Daten der Edit's zu speichern. Du läßt da zwar über OnKeyPress nur gültige Eingaben zu, filterst aber gleichzeitig auch die Entf-Taste. Weiterhin könnte ich immernoch eine beliegen Text per CopyAndPaste einfügen, was mal direkt zu einer Exception führt. Und wo wir grad bei Exceptions sind ein bisschen Exceptionbehandlung könnte nicht schaden.

Und im OnFormCreate erzeugst du ein TLager-Object. Wo gibtst du das wieder frei?

In der Unit Lagerberechnung hast du VCL.Dialogs in den Uses. Warum?

Ich finde es im Ganzen schwer zu lesen. So hältst du alle Daten in einem Array of String. Wie soll man da erkennen, welche Daten dort abgelegt werden und welcher Datentyp vorliegt. Um das jetzt rauszukriegen muss ich durch den ganzen Code um irgendwann festzustellen wofür ein Wert verwendet wird.

Erstell dir für die Daten ein Object.
z.B. so (Ist nur mal so zusammengeklatscht:
Delphi-Quellcode:
  TLagerBestand=class
  private
    FStueckpreis: Currency;
    FWarenverkauf: Integer;
    FEndbestand: Integer;
    FLagerbestand: Extended;
    FWareneingang: Integer;
    FLagerumschlH: Extended;
    FWarenwert: Currency;
    FAnfangsbestand: Integer;
    procedure SetAnfangsbestand(const Value: Integer);
    procedure SetEndbestand(const Value: Integer);
    procedure SetLagerbestand(const Value: Extended);
    procedure SetLagerumschlH(const Value: Extended);
    procedure SetStueckpreis(const Value: Currency);
    procedure SetWareneingang(const Value: Integer);
    procedure SetWarenverkauf(const Value: Integer);
    procedure SetWarenwert(const Value: Currency);
  published
    property Anfangsbestand: Integer read FAnfangsbestand write SetAnfangsbestand;
    property Endbestand: Integer read FEndbestand write SetEndbestand;
    property Wareneingang: Integer read FWareneingang write SetWareneingang;
    property Warenverkauf:Integer read FWarenverkauf write SetWarenverkauf;
    property Lagerbestand: Extended read FLagerbestand write SetLagerbestand;
    property LagerumschlH: Extended read FLagerumschlH write SetLagerumschlH;
    property Stueckpreis: Currency read FStueckpreis write SetStueckpreis;
    property Warenwert: Currency read FWarenwert write SetWarenwert;
  end;
Dazu eine TObjectList, wo du die Objecte in einer List hälst. Schwups hast du eine schicke Lagerliste, die gleich ein mindestmaß an Logik beinhaltet, und auch noch Lesbar und leicht erweiterbar ist. Die ObjectList könnte dann noch so Methoden wie SaveToJSONFile, LoadFromJSONFile oder SaveToFileStream, LoadFromFileStream beinhalten zum speichern und laden der Daten. Aber auch Funktion zum Ermitteln des Gesamtwert des Lagers wären hier sinnvoll.

In den einzelnen Objekten können dann Methoden rein wie AddBestand(Menge: Integer); etc.

Beispiele wie man sowas machen könnte gibt es ja zu Hauf.

Wie das im einzelnen dann aussehen könnte hängt von der Notwendigen Funktionalität ab, die ich so auf die Schnelle aus deinem Projekt nicht ergründen konnte.

mehr fällt mir grad dazu nicht ein.

Gruß Hobbycoder
  Mit Zitat antworten Zitat
Ghostwalker

 
Delphi 10.2 Tokyo Professional
 
#5
  Alt 14. Mär 2017, 07:08
Hier mal ein Muster, wie ich auf SQLite zugreife, ohne Komponenten zu nutzen. Ich verwende den Wrapper hier aus dem Forum, und natürlich die passende dll dazu.

Schnippsel für die Verbindung zur DB:
Delphi-Quellcode:
var
  db : TSQLiteDatabase;

INITIALIZTATION
   db := TSQLiteDatabase.Create('C:\db\meinedb.sql3');

FINALIZATION
   db.free
Das in eine globale Unit gepackt, baut dir die Verbindung zu 'meinedb.sql3' auf.

Schnippsel zum lesen von Daten aus einer Tabelle:

Delphi-Quellcode:
    Procedure Liesmich;
    var
     query : TSQlitequery;
    begin
      q := db.query('SELECT * FROM MyTable order by name');
      if (q.next) then
      begin
        repeat
          if (not q.EOF) then
          begin
            //Map die Daten zu den Feldern deiner Form
            edid.text := IntToStr(q.ColumnByName['id'].AsInteger);
            edname.text := q.ColumnByName['name'].AsString;
          end;
        until (not q.next);
      end;
      q.free;
    end;
Schnippsel zum Schreiben von Daten in die Tabelle
Delphi-Quellcode:
   Procedure SchreibMich;
   var
    cmd : TSQLitecommand;
   begin
     cmd := db.Command('INSERT INTO MyTable (id,name) VALUES (:id,:name);');
     cmd.BindingByName[':id'].AsInteger := 1234;
     cmd.BindingByName[':name'].AsString := 'Mein neuer Name';
     cmd.execute;
     cmd.free;
   end;
Ich persönlich schreib mir entsprechende Klassen, die mir das ganze Datenhandling übernehmen und entsprechende Funktionen bieten, so das Daten und UI voneinander getrennt sind. Kleiner Nachteil dabei ist, das ich die entsprechende Daten auch "per Hand" zu UI schaufeln muss, aber das stört mich
nicht wirklich und bietet auf der andere Seite die Möglichkeit, beliebige Komponenten für die UI zu verwenden (auch z.B. einen Treeview).
Uwe
  Mit Zitat antworten Zitat
EdAdvokat

 
Delphi 10.2 Tokyo Professional
 
#6
  Alt 14. Mär 2017, 10:15
Hallo zusammen, zunächst vielen Dank für die Tipps, die ich mir in Ruhe ansehen werde. Zur Erklärung: das ganze ist ein Experimentalprojekt zur eigenen Fortbildung. Zuvor habe ich mich auch hier im Forum erkennbar pseudo-betriebsweirtschaftlich
mit einem Projekt "Waren" beschäftigt. Dazumal noch völlig ohne den Gedanken an eine Datenbank. Jetzt kam der Gedanke mit Delphi 10.1 Starter!!! auch eine Datenbankanbindung zu probieren. Json ist da nicht enthalten oder geht es trotzdem irgendwie???
VCL.Dialogs war natürlich überflüssig und das Lager-Objekt habe ich nun frei gegeben. Dein Vorschlag Hobycoder finde ich interessant, doch für mich noch etwas schwierig. Das man mit Objekten auch so arbeiten könnte, war mir bislang nicht bekannt.
Leider ist die Literatur zu OOP diesbezüglich nicht gerade der Hit. Ich sollte also eine TObjectlist anlegen (Listbox?) und in dieser dann die Objekte aufführen (zB: Bezeichner Warenverkauf mit dem dazugehörigen Value:integer), um diese
Listbox dann speichern und auch wieder laden zu können. Habe ich das so richtig aufgefaßt? Das wäre ähnlich der bishierigen, sicher etwas unübersichtlicheren Lösung. Eine Funktion zur Ermittlung des Gesamtwertes des Lagers ist doch bereits mit "Warenwert"
schon enthalten, oder meitest Du etwas anderes?

Zitat: "In den einzelnen Objekten können dann Methoden rein wie AddBestand(Menge: Integer); etc.

Beispiele wie man sowas machen könnte gibt es ja zu Hauf."

Das habe ich nicht verstanden. Ich habe doch mit "Lagereingang" versucht eine Lieferung von Waren zu simulieren.
Nochmals zur Klarstellung, ich will lediglich experimentieren, um daraus zu lernen. Einen tiefen Sinn hat das Ganze hinsichtlich einer gezielten Funktionalität eigentlich nicht. Ich will lediglich
eine Beispiellösung für diese oder jene Funktionalität erreichen und da bin ich wohl noch weit entfernt. Für gezielte Hinweise Tutorials oder Beispielprogramme, in denen ähnliches bereits enthalten ist, wäre ich dankbar.
Norbert
Norbert
  Mit Zitat antworten Zitat
Jumpy

 
Delphi 6 Enterprise
 
#7
  Alt 14. Mär 2017, 10:33
Vielleicht als Einstieg mal etwas Literatur zum Theme OOP?

http://openbook.rheinwerk-verlag.de/oop/
Ralph
  Mit Zitat antworten Zitat
Benutzerbild von haentschman
haentschman

 
Delphi 10.1 Berlin Professional
 
#8
  Alt 14. Mär 2017, 15:42
Moin...

oder das E-Book zu Delphi Starter... https://downloads.delphi-treff.de/DelphiStarter.pdf
Für dich bestimmt interessant:
4.1.4. Globale Variablen...und folgende.
4.2.2.3.1. Doppelt gemoppelt hält besser...und folgende.
4.6.6. Prozeduren und Funktionen überladen...und folgende.
4.8. Objektorientierung...und folgende.
4.10 Exceptions...und folgende.
4.12.2. Listen mit TList...und folgende.
4.12.3. Dictionaries mit TDictionary...und folgende.
5.4.1. Lesbarkeit des Quelltextes...und folgende.
7.2. Datenbankprogrammierung – SQLite mit Delphi...und folgende.


Geändert von haentschman (14. Mär 2017 um 15:46 Uhr)
  Mit Zitat antworten Zitat
EdAdvokat

 
Delphi 10.2 Tokyo Professional
 
#9
  Alt 14. Mär 2017, 21:59
Hallo zusammen, vielen Dank für die bisherige Hilfe. Ich habe da noch einiges zu tun. Nun komme ich auf den Beitrag von Hobbycoder zurück. An meiner naiven Frage zur Objectlist konntest du sicher erkennen, der ist sowas von ahnungslos - und da hattest du recht. Mit deinem Hinweis auf die Verwendung einer Objectlist habe ich eine Tür aufgestoßen und dann doch leider nur Nebel gesehen. Es gibt von Delphi-Treff einen Beitrag dazu, doch den verstehe ich leider noch nicht. Ich habe zwischenzeitlich Deinem Beispiel folgend das Programm umgestellt und stehe nun vor der unlösbaren Aufgabe eine Objectliste zu erstellen. Sicher ist erkennbar, dass ich auf diesem Gebiet so was von unbeleckt bin. Hat es Zweck, mir da auf die Hufe zu helfen, oder ist das doch eine wesentliche Nummer zu groß für mich? Was müßte ich also an dieser Stelle tun? Eine Komponente wie angenommen TListbox ist also überhaupt nicht im Spiel. Ich wäre wirklich nicht böse, wenn es doch zu kompliziert wäre, das mit mir Greenhon weiter zu probieren, denn so einiges in OOP habe ich bereits gelert und begriffen, doch das man auch wie in deinem Beispiel const Value... verwenden kann, war mir bislang neu. Das meinte ich mit der OOP-Literatur, die ich bislang ausgiebig studiert habe. Doch da wird ewig über Kapselung Polymorphologie und Vererbung referiert. Doch die hier erfahrenenen Untiefen konnte ich bisher an keiner Stelle ausloten.
Also was müßte ich tun um an dieser Stelle weiter zu kommen.
Ich bedanke mich im voraus für die Mühe mit mir.
Norbert
Norbert
  Mit Zitat antworten Zitat
Hobbycoder
 
#10
  Alt 17. Mär 2017, 00:56
Ich habe dir mal ein kleines Demo-Programm geschrieben, in dem die Verwendung von TObjectList ansatzweise veranschautlicht wird.
Es ist natürlich sehr einfach gehalten und beinhaltet lediglich eine Liste für Artikel, die auch nur die Eigenschaften Artkel, Beschreibung, Bestand und Stückpreis enthalten.

Sicherlich ist es wichtig sich auch mit Gültigkeitsbereichen, Vererbung, etc. zu beschäftigen, damit du auch die Vorteile nutzen kannst, dir das Leben nicht unnötig schwer machst und dir selbst ein Bein stellst.
Aber als Angang kann das auch erst mal ignorieren, und sich damit befassen, wenn man den Anfang verstanden hast.

(Das geht natürlich noch um einiges "schöner", aber ich wollte es so einfach wie möglich halten)

Ich habe das auch nicht großartig mit Kommentaren versehen. Schau dir das einfach mal an. Dann kannst du ja anfangen die Klassen nach eigenen Bedürfnissen abzuändern, und dabei Stück für Stück lernen, wie das ganze funktioniert.
Ich denke das sinnvollste ist es, um Objecte und Objectlisten zu verstehen, sich zu verdeutlichen, wie das ganze im Speicher abgelegt und verwaltet wird. Wenn man das verinnerlicht hat, kommt man da recht schnell dahinter. Auch ein Haltepunkt zu sezten und dann mal den Inhalt der Variablen (auch der ObjectList) hilf beim Ergründen der Funktionsweise.
Ansonsten vielleicht -->hier mal reinschauen.

Vielleicht hilft dir das.

Gruß Hobbycoder
Angehängte Dateien
Dateityp: rar BeispielLager.rar (55,7 KB, 29x aufgerufen)

Geändert von Hobbycoder (17. Mär 2017 um 01:01 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2   

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 03:38 Uhr.
Powered by vBulletin® Copyright ©2000 - 2020, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2019 by Daniel R. Wolf