Fertigungsaufträge: Unterschied zwischen den Versionen

Aus OrgaMon Wiki
Zur Navigation springen Zur Suche springen
 
(84 dazwischenliegende Versionen desselben Benutzers werden nicht angezeigt)
Zeile 1: Zeile 1:
== Übergang von "ElTex" nach "OrgaMon" ==
== Übergang von "EL-TEX" nach "OrgaMon" ==


* Eltex ist eine DOS Anwendung die vom 05.05.1994 bis zum 07.01.2002 programmiert wurde
* 0,4 MByte Quelltexte (die Bibel hat 5,0)
* 2018 kam die Anfrage 2 Kleinigkeiten zu ändern (2 Feldgrössen, Drucken), das ist aus mehreren Gründen nicht möglich
* Ein breits 2004 geäusserter Gedanke auf den OrgaMon umzustellen wird nun wieder aufgenommen
* Eine automatische Übernahme von Daten aus der alten Software ist nicht nötig, Schritt für Schritt wird die neue Software mit Daten befüllt
* Eine automatische Übernahme von Daten aus der alten Software ist nicht nötig, Schritt für Schritt wird die neue Software mit Daten befüllt
* Die Frage ist jetzt:
** Was macht das ELTEX-Programm?
** Wie macht man Übergänge zum OrgaMon?
** Welche Funktionslücken hat der OrgaMon, die man durch Programmierung schliessen muss.


=== Istzustand ===
Einige Erkenntnisse gibt es schon
 
* Es gibt zahlreiche Daten die inhaltlich zu "Posten" gehören in den Belegen also im Beleg-Kopf, das ist ganz schlimm
** Beispiel "Modellbezeichnung"
 
== Datenstrukturen ==


* Speicherung Kunden (KUNDE.BTV) /Produzenten (PRODUCER.BTV) -> heisst im OrgaMon "Personen"
* Speicherung Kunden (KUNDE.BTV) /Produzenten (PRODUCER.BTV) -> heisst im OrgaMon "Personen"
Zeile 11: Zeile 24:
** es wurden diverse Belege in ein Abschlussverzeichnis (z.B. ".\2012") verschoben, KUNDE und PRODUCER, TEILE wurden beibehalten
** es wurden diverse Belege in ein Abschlussverzeichnis (z.B. ".\2012") verschoben, KUNDE und PRODUCER, TEILE wurden beibehalten


==== Mehrstufiges Abschreibesystem ====
=== Belege ===
 
* Beleg-Kopf-Daten (gleich für ALLE Beleg-Varianten)
* in der Regel kann man Beleg-Kopf Daten mit <Ctrl> & <ENTER> bearbeiten
BelegeType = record
              { KEYS }
        { 0 } BelNo            : LongInt;    { Belegnummer }
        { 1 } knum            : LongInt;    { interne Kunden-Nummer }
        { 2 } pnum            : LongInt;    { interne Produzent-Nummer }
        { 3 } ModellName      : string[15];  { für PA, Abschlußjahr für LSCHEIN / RECHNUNG }
        { 4 } ModellNummer    : string[10];  { für PA }
        { 5 } LieferTerminD    : longint;    { für PA }
        { 6 } LieferTerminP    : longint;    { für PA }
              { Allgemeine Beleg-Daten }
              status        : BelegStatusType;  { Status des Beleges }
              Art            : BelegArtType;    { Art des Beleges }
              Bearbeiter    : string[20];      { Verkäuferbez }
              AnlageDatum    : longint;          { Beleg angelegt }
              TxtNo          : LongInt;          { Proforma : Interne Nummer erweiterter Beleg-Text }
              MwStSatz      : array[1..3] of real; { Damalige MwSt-Sätze }
                                                    { PA: MwST[3] = Preis 1 }
              { Daten für Abschreibung bei "Fertigung" }
              FertigungsAnzahl : real;
              ModellBez        : array[1..2] of string[35];
              ZollCode        : ZollCodeType;
              ZollPro          : real;
              { Daten für "Produktions Auftrag" }
              pano            : LongInt;    { Beleg-Nummer für PA-Beleg }
              PANummer        : string[6];
              StueckIst        : real;      { RE = Summe Wert }
              StueckSoll      : real;      { RE = Summe Mahngebüren }
          {e} EinzelPreis      : real;      { RE = Summe bezahlt }
          {c} GesamtPreis      : real;      { RE = Summe offen }
          {E} EinzelPreis2    : real;
          {E} GesamtPreis2    : real;
          {E} PA_Lieferung    : array[1..MaxPALieferungen] of PALieferungenType;
              PA_Rest          : real;
          {E} PA_Umsatz        : real;
          {E} PA_Umsatz2      : real;
              Bemerkung        : string[50];  { Stichwort }
          {E} VerbrauchEinzel  : array[1..2] of real;
          {c} VerbrauchGesamt  : array[1..2] of real;
              ABScheinNummer  : string[10];
              ArtikelNummer    : longint;
              material        : string[15];
              SubDir          : string[4];
              end;
 
==== Terminliste ====
 
* Es gibt 10 Liefereinträge in die Tabelle:
 
 
PALieferungenType = record
                      LieferTermin      : longint;  { RE= Mahnung }
                      LieferMenge        : real;
                      RechnungTermin    : longint;  { RE= Zahlung }
                  {E} RechnungMenge      : real;
                      AbschreibungTermin : longint;
                      AbschreibungMenge  : real;
                      FNummer            : string[12];
                    end;


* Es ist schwer zu verstehen, aber ich versuche das Abschreibesystem zu beschreiben und habe dazu Quelltexte zu Rate gezogen:
==== Varianten ====


* Es gibt mehrere Beleg-Varianten:
* Es gibt mehrere Beleg-Varianten:
Zeile 29: Zeile 107:
                     BA_notvalid);
                     BA_notvalid);


* Es gibt folgende Beleg-Tabellen in der Datenbank:
* Es gibt folgende Beleg-Tabellen in der Datenbank, diese enthalten den jeweiligen Beleg-Kopf:


  BELEGE    Proforma Rechnungen
  BELEGE    Proforma Rechnungen                                                       prrdatf
  GUTSCHR    Gutschriften
  GUTSCHR    Gutschriften                                                             gutdatf
  IMPORT    gab es nur mal als Datei, wurde bei Programmstart ab noch nicht geöffnet
  IMPORT    gab es nur mal als Datei, wurde bei Programmstart ab noch nicht geöffnet
  IMPPA      gab es nur mal als Datei, wurde bei Programmstart ab noch nicht geöffnet
  IMPPA      gab es nur mal als Datei, wurde bei Programmstart ab noch nicht geöffnet
  LSCHEIN    Lieferscheine
  LSCHEIN    Lieferscheine                                                             lscdatf
  PA        Produktions Aufträge
  PA        Produktions Aufträge                                                     padatf
  RECHNUNG  Rechnungen
  RECHNUNG  Rechnungen                                                               recdatf
 
=== Nummernkreise ===
 
NUM        Nummernkreise                                                            numdatf
 
  kunnum := 0;
  teinum := 0;
  angnum := 0;
  recnum := 0;
  gutnum := 0;
  txtnum := 0;
  posnum := 0;
  impnum := 0;
 
=== Posten ===
 
* Es gibt Posten-Dateien im Dateisystem, diese enthalten die Posten eines Beleges: Die Dateinamen sind eine nummer (belno oder pano) und ein Kopf-Typ (.PA, .LS usw)
 
PostenType = record
              { Keys }
              PosId  : LongInt;    { eigener PostenId }
              ArtNo  : LongInt;    { interne Artikel-Nummer }
              { DATA }
              Typ        : ArtikelArtType;
              material    : string[15];
              bez        : array[1..2] of string[35]; { 2 zeilige Bezeichnung }
              kg_s_m      : real;  { kg / Stück oder kg / Meter }
              Gewicht    : real;  { Gesamt-Gewicht }
              m_stueck    : real;  { Meter pro Stück  }
          {E} dm_s        : real;  { Einzel-Preis }
          {E} gespr      : real;  { Gesamt-Preis }
              vpe        : real;  { Verpackungs-Einheit }
              FehlMenge  : real;  { Fehlmengen in der PA }
              FehlDatum  : longint;
              filler      : array[1..422] of byte;
              ZollCode    : ZollCodeType;
              ZollPro    : real;
          {E} ZollPreis  : real;  { Zoll-Abschlag }
              menge      : real;
              breite      : real;
              stueck_koli : real;        { Verpackungseinheit Kolis }
              MwSt        : byte;        { Mehrwertsteuer Satz 0...3 }
              DontCopy    : boolean;    { gibt darüber Auskunft, }
                                          { ob Position in den Abschreibungsbeleg }
                                          { kopiert werden soll }
              end;
 


* Es gibt Beleg-Dateien im Dateisystem:


  .RE (Rechnung)
  .RE (Rechnung)
  .PA (Produktionsauftrag)
  .PA (Produktionsauftrag)
  .LS (Lieferschein)
  .LS (Lieferschein)
.BEL (Proforma)
  BA_ProForma          : .BEL
  BA_ProduktionsAuftrag : .PA
  BA_ImportPA          : .IPA
  BA_Rechnung          : .RE
  BA_Lieferschein      : .LS
  BA_Gutschrift        : .GUT
  BA_Import            : .IBE
              BA_ProForma          : BelegFName := BasePath + FSubDir + l2str(belrec.belno)+'.BEL';
              BA_ProduktionsAuftrag : BelegFName := BasePath + FSubDir + l2str(belrec.pano)+'.PA';
              BA_ImportPA          : BelegFName := BasePath + FSubDir + l2str(belrec.pano)+'.IPA';
              BA_Rechnung          : BelegFName := BasePath + FSubDir + l2str(belrec.belno)+'.RE';
              BA_Lieferschein      : BelegFName := BasePath + FSubDir + l2str(belrec.belno)+'.LS';
              BA_Gutschrift        : BelegFName := BasePath + FSubDir + l2str(belrec.belno)+'.GUT';
              BA_Import            : BelegFName := BasePath + FSubDir + l2str(belrec.belno)+'.IBE';
   
   
* Es gibt eine "Skizzen" Verzeichnis D:\SKIZZEN\ mit BMP Dateien die scheinbar anzeigbar waren, ich denke das gehört eher zum Thema "Artikel" "Rohstoffe" oder "Modelle"
* Es gibt eine "Skizzen" Verzeichnis D:\SKIZZEN\ mit BMP Dateien die scheinbar anzeigbar waren, ich denke das gehört eher zum Thema "Artikel" "Rohstoffe" oder "Modelle"
=== Fertigungs Auftrags Liste ===
* F1
** Es wurde in Spalte 1 oder 2 "AddThisLieferung" durchgeführt
** Es wurde in Spalte 3 oder 4 "AddThisRechnung" durchgeführt
* F2 Lieferschein editieren
* F3 Rechnung editieren
*
==== F1 AddThisLieferung ====
* Man steht in der Terminliste auf einem der 10 Termine, das merkt er sich auf genau welchem in "line"
* Er merkt sich die Kundennummer, sucht in den Lieferscheinen alle Belege diese Person
* Wenn es einen Lieferschein im Status "in Bearbeitung" gibt merkt er sich diesen Lieferschein
* Gibt es das nicht wird ein neuer Lieferschein angelegt aus dem Nummern kreis "Rechnung" mit der Person und dem Status "InBearbeitung"
* der Lieferschein wird nun geladen, es wird auf die letzte Zeile positioniert
* es wird eine neue Zeile angefügt:
** Bezeichnung (Bez[1]) wird beleg.modellbez[1] + " " + beleg.ModellName
** Bezeichnung (Bez[2]) wird "Lieferung vom " + der .LieferTermin aus der Terminliste
** Material wird beleg.ModellNummer + "  " + beleg.PANummer
** Menge wird die .Liefermenge aus der Termintabelle
** Preis wird beleg.EinzelPreis
==== F1 AddThisRechnung ====
* Man steht in der Terminliste auf einem der 10 Termine, das merkt er sich auf genau welchem in "line"
* Er merkt sich die Kundennummer, sucht in den Rechnungen alle Belege diese Person
* Wenn es eine Rechnung im Status "in Bearbeitung" gibt merkt er sich diese Rechnung
* Gibt es das nicht wird eine neue Rechnung angelegt aus dem Nummernkreis "Rechnung" mit der Person und dem Status "InBearbeitung"
* der Lieferschein wird nun geladen, es wird auf die letzte Zeile positioniert
* es wird eine neue Zeile angefügt:
** Bezeichnung (Bez[1]) wird beleg.modellbez[1] + " " + beleg.ModellName
** Bezeichnung (Bez[2]) wird "Faktura vom  " + der .RechnungsTermin aus der Terminliste
** Material wird beleg.ModellNummer + "  " + beleg.PANummer
** Menge wird die .RechnungsMenge aus der Termintabelle
** Preis wird beleg.EinzelPreis
=== FillWithProformaData ===
* Hat was mit Zollgesamt zu tun und wird nicht mehr benötigt
* Grober Überblick:
** Ausgehend von einer Belegnummer und einem Abschreibungsdatum wird etwas aufsummiert
Eintragen von Relations-Daten in eine einzelne Zoll-Zeile
Input:  BelNo
          ABDatum
OutPut:  BelNo      (-> 0 im Fehlerfall)
          Stueck      Quelle: PAs
          Kilo        Quelle: PAs / PR
          ArtNo      Quelle: PR
          ProdNo      Quelle: PR
          ZollMinus  Quelle: PR
          EZoll
          EUst
Kontext-Auto-Loaded:
  -> Teil = teirec
** Holt aus den Artikeln die Zollprozent
** addiert aus "Proforma Rechnungen"
***    _Kilo := _kilo + AufRunden(posrec.Gewicht);
***    _zoll := _zoll + strtop(ptostr(posrec.ZollPreis,10));
***    _wert := _wert + strtop(ptostr(posrec.gespr,10));
** Listet padatf anhand des ABDatums
***
=== OneABDateMatch ===
* Sucht in der Termintabelle (das sind 10 Einträge) Datums die zu einem gewissen Datum passen
** Dabei summiert er die Abschreibungsmenge
** Dabei summiert er Abschreibungsmenge * Einzelpreis2
=== ABsummeBuchen ===
* in den Artikel!! wird "ab_rest" also die Restabschreibemenge geschrieben/aktualisiert, so eine Art Soll- Verkaufsmenge. Sowas steht eigentlich im Auftrag.
== Datenverarbeitung ==
=== Das Bearbeitungsjahr umschalten ===
* Dazu wurden einfach nur 2 Tabellen auf das jeweils angeforderte Jahr umgeschaltet:
** PA (Produktionsaufträge)
** BELEGE (Proforma Rechnungen)
=== Proforma, SaaCmdDBB ===
-> BelegListe (prrdatf, also "Proforma Rechnungen")
  F1 -> BelegeBearbeiten;
        Hier werden die Posten des Beleges bearbeitet
  F2 -> BelegeAbrufen;
        nur eine Belegsuche!
  ENTER -> PAListe
            Kunde und Produzent werden oben angezeigt und eine Liste:
            Es ist eine Liste aller padatf mit der Belegnummer aus prrdatf
              ModellName |  Modellnummer | copy(PANummer,1,6) | rtostr(StueckSoll,6,0) |rtostr(StueckIst,6,0)| rtostr(PA_rest,6,0);
            F1 -> Summierung
              MakeSummierung(PFList); PFList ist eine Datei!
              BA_ProForma          : BelegFName := BasePath + FSubDir + l2str(belrec.belno)+'.BEL';
              BA_ProduktionsAuftrag : BelegFName := BasePath + FSubDir + l2str(belrec.pano)+'.PA';
              BA_ImportPA          : BelegFName := BasePath + FSubDir + l2str(belrec.pano)+'.IPA';
              BA_Rechnung          : BelegFName := BasePath + FSubDir + l2str(belrec.belno)+'.RE';
              BA_Lieferschein      : BelegFName := BasePath + FSubDir + l2str(belrec.belno)+'.LS';
              BA_Gutschrift        : BelegFName := BasePath + FSubDir + l2str(belrec.belno)+'.GUT';
              BA_Import            : BelegFName := BasePath + FSubDir + l2str(belrec.belno)+'.IBE';
              Alle EinzelBelege zum Gesamt-Beleg summieren
                posrec.menge      := posrec.menge + _posrec.menge;
                posrec.FehlMenge  := posrec.FehlMenge + _posrec.FehlMenge;
                posrec.stueck_Koli := posrec.stueck_Koli + _posrec.stueck_Koli;
            KENTER -> BelegeBearbeiten;
                        Hier werden die Posten des Beleges bearbeitet
            KINS -> Neuanlage
                      MakeSummierung;
                    art    := BA_ProduktionsAuftrag;
                    status := BS_InBearbeitung;
                    pano  := GetNum(GN_posnum,1);
                  CreateEmptyPA;
                  MakeBase;
                  padatf.last;
                  insertkey(KCENTER);
            KCENTER -> PADaten;
                        padatf, Also Belegkopf
                          writes('bst',BS2str(status));
                          writes('bea',bearbeiter);
                          writes('mna',ModellName);
                          writes('mnu',ModellNummer);
                          writes('pan',PANummer);
                          writes('sso',rtostr(StueckSoll,6,0));
                          writes('sis',rtostr(StueckIst,6,0));
                          writes('vp1',rtostr(VerbrauchEinzel[1],6,2));
                          writes('vp2',rtostr(VerbrauchEinzel[2],6,2));
                          writes('bem',Bemerkung);
  CENTER -> InpBelegDaten;
  writes('ada',long2date8(AnlageDatum));
  writes('sta',BS2str(Status));
  writes('bea',bearbeiter);
  writes('txt',ktostr(FExist(BelegTxtFname)));
  writes('mat',material);
  writes('be1',ModellBez[1]);
  writes('be2',ModellBez[2]);
  writes('zco',ZollCode);
  writes('zpr',rtostr(Zollpro,2,2));
  writes('snu',ABScheinNummer);
  writes('mna',ModellName);
  writes('ist',rtostr(StueckIst,6,0));
            danach werden alle PAs mit dieser Nummer bearbeitet und folgende Felder angepasst
                  ModellBez[1]  := _belrec.ModellBez[1];
                  ModellBez[2]  := _belrec.ModellBez[2];
                  ArtikelNummer  := _belrec.ArtikelNummer;
                  ABScheinNummer := _belrec.ABScheinNummer;
                  material      := _belrec.material;
                  ZollCode      := _belrec.ZollCode;
                  ZollPro        := _belrec.ZollPro;
  'c','k' ImportToProforma;
  INS: Entweder "Import" oder "Proforma" neu anlegen
=== Import, SaaCmdDI ===
* Hier werden 2 Tabellen umgeschaltet
              ImportMode := true;
              prrdatf.FileSwitch(BasePath+FSubDir+'IMPORT.BTV');
              padatf.FileSwitch(BasePath+FSubDir+'IMPPA.BTV');
              BelegListe;
              prrdatf.FileSwitch(BasePath+FSubDir+'BELEGE.BTV');
              padatf.FileSwitch(BasePath+FSubDir+'PA.BTV');
              ImportMode := false;
=== Fertigungsliste, SaaCmdDBF ===
-> FertigungsAuftragsListe;
    Liste der padatf (Produktions Aufträge)
    Hier kann man nach 6 Kriterien sortieren
    Hier hat man massiv suchmöglichkeiten
    Unklare Aufsummierung
      SummeIst        := SummeIst  + StueckIst;
      SummeSoll      := SummeSoll + StueckSoll;
      SummeRest      := SummeRest + PA_Rest;
      SummeU1        := SummeU1  + PA_Umsatz;
      SummeU2        := SummeU2  + PA_Umsatz2;
      SummeGP1        := SummeGP1  + GesamtPreis;
      SummeGP2        := SummeGP2  + GesamtPreis2;
    Unklare Fehlmengenlogik
    CENTER -> FaRecInp;
              (im Prinzip immer eine Beleg-Kopf Geschichte!)
    's' Skizze
    ALT F: Fehlmengen
    Alt F1: BelegeBearbeiten (also die einzelnen Posten)
    F6:  Beleg-Kopf des Proforma-Beleges suchen und landen (Beleg.belno)
=== Zoll Gesamt, SaaCmdDZG ===
* wird nicht mehr benötigt
=== Lieferscheine, SaaCmdDBL ===
KENTER -> Kopf bearbeiten
F1 -> Aus den Lierferschein eine Rechnung erstellen anhand "kopie"
KCENTER -> Posten bearbeiten
=== Rechnungen, SaaCmdDBR ===
=== Gutschriften, SaaCmdDBG ===
=== Proforma-Vorlage, SaaCmdDBV ===
prrdatf wird geleert
-> BelegeBearbeiten
  -> die einzelnen Posten  bearbeiten
== Fazit ==
In keinem Fall lassen sich die Prozesse, die verwendet werden auf den OrgaMon übertragen. Die Summierungen, Übertragungen, Nicht-Übertragungen, Ausnahmen und Ausgrenzungen sind für mich unverständlich, offensichtlich damals sehr pragmatisch nach den Vorgaben des Kunden programmiert. Die Zusammenhänge sind nicht trivial, es sind mehrere Tausend Zeilen Quelltext. Einiges sei nicht mehr notwendig. Die Erfahrung zeigt aber, dass die Komplexität verschwiegen oder vergessen wird. Genau bis zu dem Zeitpunkt wo etwas nicht funktioniert. Dann muss es wieder aus der Klamottenkiste herausgeholt werden. Es fehlt eine damalige kritsche Betrachtung und Umstrukturierung in der Folgezeit. Es fehlen Pflege- und Hege- Aufträge von 2002 bis 2018, das sind 16 Jahre ohne schrittweise Verbesserung. Der OrgaMon arbeitet völlig anders, hier müsste man komplett umlernen, den ganzen Prozess von Anfang (Beauftragung) bis Ende (Rechnungsstellung) neu organisieren. Ich kann aber keinesfall abschätzen was im OrgaMon gar nicht möglich ist, es kann sein, dass KEINE Änderungen am OrgaMon nötig sind, aber sehr sehr viele Änderungen in der Abwicklung der Produktions-Aufträge in der alltäglichen Praxis.
Ich sehe z.B. keine Chance für eine "Belegsummierung" im OrgaMon. Ich sehe keine "Restmengen" im Artikel (sondern nur im Auftrag, das heisst im OrgaMon Liefer-Rückstand). Artikel im OrgaMon sind zunächst mal unabhängig von EINEM Auftrag, sie können in vielen Aufträgen verwendet werden, sie können auch bei vielen Aufträgen noch "offen" sein, also viele Kunden könnten auf denselben Artikel warten - das ist keine Exklusivität bei einem Kunden, sie könnten an viele Kunden verkauft werden (auch wenn es individuell für einen Kunden gemacht ist, aber auch in der Realität könnte man eine Sonderanfertigung an einen anderen Kunden als den Ursprünglichen Auftraggeber verkaufen), sie können auch bei unterschiedlichen Lieferanten bestellt werden (z.B. bei hohem Bedarf oder Insolvenz des Hauptlieferanten) usw. usw. Endprodukte sind auch Artikel. Im alten Programm verstehe ich den Sinn an vielen Stellen einfach nicht. Das ist nicht in meine Realität einordenbar.
Produktionsauftrag, Produktionsauftrag-Vorlage-Beleg, Proforma, tatsächlicher Lieferschein, tatsächliche Rechnung haben ihre Berechtigung aber doch nicht über alle Kunden hinweg? Auch nicht als Kopie des einen in das andere. Produktionsauftrag-Vorlage-Beleg für alle Kunden, dann die "Modellname" im Beleg-Kopf, das ist Teil der Posten. Das funktioniert so nicht ...
Im OrgaMon ist das ein VÖLLIG anderer Lösungsansatz (der richtige!): Bei einem Auftrag gibt es Auftrags-Menge, Bestellte-Menge, Gelieferte-Menge, Berechnete-Menge, Stornierte-Menge, Berechnete-Menge. Ein Auftrag kann in z.B. 20 Teillieferungen abgearbeitet werden, das ist aber immer noch ein Auftrag, viele "Modelle", viele Teillieferungen, viele Teilrechnungen ...

Aktuelle Version vom 14. Januar 2019, 18:49 Uhr

Übergang von "EL-TEX" nach "OrgaMon"

  • Eltex ist eine DOS Anwendung die vom 05.05.1994 bis zum 07.01.2002 programmiert wurde
  • 0,4 MByte Quelltexte (die Bibel hat 5,0)
  • 2018 kam die Anfrage 2 Kleinigkeiten zu ändern (2 Feldgrössen, Drucken), das ist aus mehreren Gründen nicht möglich
  • Ein breits 2004 geäusserter Gedanke auf den OrgaMon umzustellen wird nun wieder aufgenommen
  • Eine automatische Übernahme von Daten aus der alten Software ist nicht nötig, Schritt für Schritt wird die neue Software mit Daten befüllt
  • Die Frage ist jetzt:
    • Was macht das ELTEX-Programm?
    • Wie macht man Übergänge zum OrgaMon?
    • Welche Funktionslücken hat der OrgaMon, die man durch Programmierung schliessen muss.

Einige Erkenntnisse gibt es schon

  • Es gibt zahlreiche Daten die inhaltlich zu "Posten" gehören in den Belegen also im Beleg-Kopf, das ist ganz schlimm
    • Beispiel "Modellbezeichnung"

Datenstrukturen

  • Speicherung Kunden (KUNDE.BTV) /Produzenten (PRODUCER.BTV) -> heisst im OrgaMon "Personen"
  • Speicherung Rohstoffe (TEILE.BTV) -> heisst im OrgaMon "Artikel". es gab verschiedene Artikelarten
    • Gewebe, Gewirke, Zutaten, FertigProdukt
  • Jahresabschluss
    • es wurden diverse Belege in ein Abschlussverzeichnis (z.B. ".\2012") verschoben, KUNDE und PRODUCER, TEILE wurden beibehalten

Belege

  • Beleg-Kopf-Daten (gleich für ALLE Beleg-Varianten)
  • in der Regel kann man Beleg-Kopf Daten mit <Ctrl> & <ENTER> bearbeiten
BelegeType = record
              { KEYS }
        { 0 } BelNo            : LongInt;     { Belegnummer }
        { 1 } knum             : LongInt;     { interne Kunden-Nummer }
        { 2 } pnum             : LongInt;     { interne Produzent-Nummer }
        { 3 } ModellName       : string[15];  { für PA, Abschlußjahr für LSCHEIN / RECHNUNG }
        { 4 } ModellNummer     : string[10];  { für PA }
        { 5 } LieferTerminD    : longint;     { für PA }
        { 6 } LieferTerminP    : longint;     { für PA }

              { Allgemeine Beleg-Daten }
              status         : BelegStatusType;  { Status des Beleges }
              Art            : BelegArtType;     { Art des Beleges }
              Bearbeiter     : string[20];       { Verkäuferbez }
              AnlageDatum    : longint;          { Beleg angelegt }
              TxtNo          : LongInt;          { Proforma : Interne Nummer erweiterter Beleg-Text }

              MwStSatz       : array[1..3] of real; { Damalige MwSt-Sätze }
                                                    { PA: MwST[3] = Preis 1 }
              { Daten für Abschreibung bei "Fertigung" }
              FertigungsAnzahl : real;
              ModellBez        : array[1..2] of string[35];
              ZollCode         : ZollCodeType;
              ZollPro          : real;

              { Daten für "Produktions Auftrag" }
              pano             : LongInt;    { Beleg-Nummer für PA-Beleg }
              PANummer         : string[6];
              StueckIst        : real;       { RE = Summe Wert }
              StueckSoll       : real;       { RE = Summe Mahngebüren }
          {e} EinzelPreis      : real;       { RE = Summe bezahlt }
          {c} GesamtPreis      : real;       { RE = Summe offen }
          {E} EinzelPreis2     : real;
          {E} GesamtPreis2     : real;
          {E} PA_Lieferung     : array[1..MaxPALieferungen] of PALieferungenType;
              PA_Rest          : real;
          {E} PA_Umsatz        : real;
          {E} PA_Umsatz2       : real;
              Bemerkung        : string[50];  { Stichwort }
          {E} VerbrauchEinzel  : array[1..2] of real;
          {c} VerbrauchGesamt  : array[1..2] of real;
              ABScheinNummer   : string[10];
              ArtikelNummer    : longint;
              material         : string[15];
              SubDir           : string[4];
             end;

Terminliste

  • Es gibt 10 Liefereinträge in die Tabelle:


PALieferungenType = record
                     LieferTermin       : longint;  { RE= Mahnung }
                     LieferMenge        : real;
                     RechnungTermin     : longint;  { RE= Zahlung }
                 {E} RechnungMenge      : real;
                     AbschreibungTermin : longint;
                     AbschreibungMenge  : real;
                     FNummer            : string[12];
                    end;

Varianten

  • Es gibt mehrere Beleg-Varianten:
BelegArtType    = (BA_ProForma,
                   BA_Abschreibung,
                   BA_ProduktionsAuftrag,
                   BA_Rechnung,
                   BA_Gutschrift,
                   BA_Mahnung1,
                   BA_Mahnung2,
                   BA_Lieferschein,
                   BA_Import,
                   BA_ImportPA,
                   BA_notvalid);
  • Es gibt folgende Beleg-Tabellen in der Datenbank, diese enthalten den jeweiligen Beleg-Kopf:
BELEGE     Proforma Rechnungen                                                       prrdatf
GUTSCHR    Gutschriften                                                              gutdatf
IMPORT     gab es nur mal als Datei, wurde bei Programmstart ab noch nicht geöffnet
IMPPA      gab es nur mal als Datei, wurde bei Programmstart ab noch nicht geöffnet
LSCHEIN    Lieferscheine                                                             lscdatf
PA         Produktions Aufträge                                                      padatf
RECHNUNG   Rechnungen                                                                recdatf

Nummernkreise

NUM        Nummernkreise                                                             numdatf
 kunnum := 0;
 teinum := 0;
 angnum := 0;
 recnum := 0;
 gutnum := 0;
 txtnum := 0;
 posnum := 0;
 impnum := 0;

Posten

  • Es gibt Posten-Dateien im Dateisystem, diese enthalten die Posten eines Beleges: Die Dateinamen sind eine nummer (belno oder pano) und ein Kopf-Typ (.PA, .LS usw)
PostenType = record
              { Keys }
              PosId   : LongInt;     { eigener PostenId }
              ArtNo   : LongInt;     { interne Artikel-Nummer }

              { DATA }
              Typ         : ArtikelArtType;
              material    : string[15];

              bez         : array[1..2] of string[35]; { 2 zeilige Bezeichnung }
              kg_s_m      : real;   { kg / Stück oder kg / Meter }
              Gewicht     : real;   { Gesamt-Gewicht }
              m_stueck    : real;   { Meter pro Stück  }
          {E} dm_s        : real;   { Einzel-Preis }
          {E} gespr       : real;   { Gesamt-Preis }
              vpe         : real;   { Verpackungs-Einheit }
              FehlMenge   : real;   { Fehlmengen in der PA }
              FehlDatum   : longint;
              filler      : array[1..422] of byte;
              ZollCode    : ZollCodeType;
              ZollPro     : real;
          {E} ZollPreis   : real;   { Zoll-Abschlag }
              menge       : real;
              breite      : real;
              stueck_koli : real;        { Verpackungseinheit Kolis }
              MwSt        : byte;        { Mehrwertsteuer Satz 0...3 }
              DontCopy    : boolean;     { gibt darüber Auskunft, }
                                         { ob Position in den Abschreibungsbeleg }
                                         { kopiert werden soll }
             end;


.RE (Rechnung)
.PA (Produktionsauftrag)
.LS (Lieferschein)
.BEL (Proforma)

 BA_ProForma           : .BEL
 BA_ProduktionsAuftrag : .PA
 BA_ImportPA           : .IPA
 BA_Rechnung           : .RE
 BA_Lieferschein       : .LS
 BA_Gutschrift         : .GUT
 BA_Import             : .IBE
             BA_ProForma           : BelegFName := BasePath + FSubDir + l2str(belrec.belno)+'.BEL';
             BA_ProduktionsAuftrag : BelegFName := BasePath + FSubDir + l2str(belrec.pano)+'.PA';
             BA_ImportPA           : BelegFName := BasePath + FSubDir + l2str(belrec.pano)+'.IPA';
             BA_Rechnung           : BelegFName := BasePath + FSubDir + l2str(belrec.belno)+'.RE';
             BA_Lieferschein       : BelegFName := BasePath + FSubDir + l2str(belrec.belno)+'.LS';
             BA_Gutschrift         : BelegFName := BasePath + FSubDir + l2str(belrec.belno)+'.GUT';
             BA_Import             : BelegFName := BasePath + FSubDir + l2str(belrec.belno)+'.IBE';


  • Es gibt eine "Skizzen" Verzeichnis D:\SKIZZEN\ mit BMP Dateien die scheinbar anzeigbar waren, ich denke das gehört eher zum Thema "Artikel" "Rohstoffe" oder "Modelle"

Fertigungs Auftrags Liste

  • F1
    • Es wurde in Spalte 1 oder 2 "AddThisLieferung" durchgeführt
    • Es wurde in Spalte 3 oder 4 "AddThisRechnung" durchgeführt
  • F2 Lieferschein editieren
  • F3 Rechnung editieren

F1 AddThisLieferung

  • Man steht in der Terminliste auf einem der 10 Termine, das merkt er sich auf genau welchem in "line"
  • Er merkt sich die Kundennummer, sucht in den Lieferscheinen alle Belege diese Person
  • Wenn es einen Lieferschein im Status "in Bearbeitung" gibt merkt er sich diesen Lieferschein
  • Gibt es das nicht wird ein neuer Lieferschein angelegt aus dem Nummern kreis "Rechnung" mit der Person und dem Status "InBearbeitung"
  • der Lieferschein wird nun geladen, es wird auf die letzte Zeile positioniert
  • es wird eine neue Zeile angefügt:
    • Bezeichnung (Bez[1]) wird beleg.modellbez[1] + " " + beleg.ModellName
    • Bezeichnung (Bez[2]) wird "Lieferung vom " + der .LieferTermin aus der Terminliste
    • Material wird beleg.ModellNummer + " " + beleg.PANummer
    • Menge wird die .Liefermenge aus der Termintabelle
    • Preis wird beleg.EinzelPreis

F1 AddThisRechnung

  • Man steht in der Terminliste auf einem der 10 Termine, das merkt er sich auf genau welchem in "line"
  • Er merkt sich die Kundennummer, sucht in den Rechnungen alle Belege diese Person
  • Wenn es eine Rechnung im Status "in Bearbeitung" gibt merkt er sich diese Rechnung
  • Gibt es das nicht wird eine neue Rechnung angelegt aus dem Nummernkreis "Rechnung" mit der Person und dem Status "InBearbeitung"
  • der Lieferschein wird nun geladen, es wird auf die letzte Zeile positioniert
  • es wird eine neue Zeile angefügt:
    • Bezeichnung (Bez[1]) wird beleg.modellbez[1] + " " + beleg.ModellName
    • Bezeichnung (Bez[2]) wird "Faktura vom " + der .RechnungsTermin aus der Terminliste
    • Material wird beleg.ModellNummer + " " + beleg.PANummer
    • Menge wird die .RechnungsMenge aus der Termintabelle
    • Preis wird beleg.EinzelPreis

FillWithProformaData

  • Hat was mit Zollgesamt zu tun und wird nicht mehr benötigt
  • Grober Überblick:
    • Ausgehend von einer Belegnummer und einem Abschreibungsdatum wird etwas aufsummiert
Eintragen von Relations-Daten in eine einzelne Zoll-Zeile

Input:   BelNo
         ABDatum
OutPut:  BelNo       (-> 0 im Fehlerfall)
         Stueck      Quelle: PAs
         Kilo        Quelle: PAs / PR
         ArtNo       Quelle: PR
         ProdNo      Quelle: PR
         ZollMinus   Quelle: PR
         EZoll
         EUst

Kontext-Auto-Loaded:

 -> Teil = teirec
    • Holt aus den Artikeln die Zollprozent
    • addiert aus "Proforma Rechnungen"
      • _Kilo := _kilo + AufRunden(posrec.Gewicht);
      • _zoll := _zoll + strtop(ptostr(posrec.ZollPreis,10));
      • _wert := _wert + strtop(ptostr(posrec.gespr,10));
    • Listet padatf anhand des ABDatums

OneABDateMatch

  • Sucht in der Termintabelle (das sind 10 Einträge) Datums die zu einem gewissen Datum passen
    • Dabei summiert er die Abschreibungsmenge
    • Dabei summiert er Abschreibungsmenge * Einzelpreis2

ABsummeBuchen

  • in den Artikel!! wird "ab_rest" also die Restabschreibemenge geschrieben/aktualisiert, so eine Art Soll- Verkaufsmenge. Sowas steht eigentlich im Auftrag.

Datenverarbeitung

Das Bearbeitungsjahr umschalten

  • Dazu wurden einfach nur 2 Tabellen auf das jeweils angeforderte Jahr umgeschaltet:
    • PA (Produktionsaufträge)
    • BELEGE (Proforma Rechnungen)

Proforma, SaaCmdDBB

-> BelegListe (prrdatf, also "Proforma Rechnungen")
 F1 -> BelegeBearbeiten;
        Hier werden die Posten des Beleges bearbeitet
 F2 -> BelegeAbrufen;
        nur eine Belegsuche!
 ENTER -> PAListe
            Kunde und Produzent werden oben angezeigt und eine Liste:
            Es ist eine Liste aller padatf mit der Belegnummer aus prrdatf
              ModellName |  Modellnummer | copy(PANummer,1,6) | rtostr(StueckSoll,6,0) |rtostr(StueckIst,6,0)| rtostr(PA_rest,6,0);
            F1 -> Summierung
             MakeSummierung(PFList); PFList ist eine Datei!
              BA_ProForma           : BelegFName := BasePath + FSubDir + l2str(belrec.belno)+'.BEL';
              BA_ProduktionsAuftrag : BelegFName := BasePath + FSubDir + l2str(belrec.pano)+'.PA';
              BA_ImportPA           : BelegFName := BasePath + FSubDir + l2str(belrec.pano)+'.IPA';
              BA_Rechnung           : BelegFName := BasePath + FSubDir + l2str(belrec.belno)+'.RE';
              BA_Lieferschein       : BelegFName := BasePath + FSubDir + l2str(belrec.belno)+'.LS';
              BA_Gutschrift         : BelegFName := BasePath + FSubDir + l2str(belrec.belno)+'.GUT';
              BA_Import             : BelegFName := BasePath + FSubDir + l2str(belrec.belno)+'.IBE';
             Alle EinzelBelege zum Gesamt-Beleg summieren
                posrec.menge       := posrec.menge + _posrec.menge;
                posrec.FehlMenge   := posrec.FehlMenge + _posrec.FehlMenge;
                posrec.stueck_Koli := posrec.stueck_Koli + _posrec.stueck_Koli;
            KENTER -> BelegeBearbeiten;
                       Hier werden die Posten des Beleges bearbeitet
            KINS -> Neuanlage
                     MakeSummierung;
                   art    := BA_ProduktionsAuftrag;
                    status := BS_InBearbeitung;
                   pano   := GetNum(GN_posnum,1);
                  CreateEmptyPA;
                 MakeBase;
                  padatf.last;
                 insertkey(KCENTER);
            KCENTER -> PADaten;
                        padatf, Also Belegkopf
                         writes('bst',BS2str(status));
                         writes('bea',bearbeiter);
                         writes('mna',ModellName);
                         writes('mnu',ModellNummer);
                         writes('pan',PANummer);
                         writes('sso',rtostr(StueckSoll,6,0));
                         writes('sis',rtostr(StueckIst,6,0));
                         writes('vp1',rtostr(VerbrauchEinzel[1],6,2));
                         writes('vp2',rtostr(VerbrauchEinzel[2],6,2));
                         writes('bem',Bemerkung);
 CENTER -> InpBelegDaten; 
  writes('ada',long2date8(AnlageDatum));
  writes('sta',BS2str(Status));
  writes('bea',bearbeiter);
  writes('txt',ktostr(FExist(BelegTxtFname)));
  writes('mat',material);
  writes('be1',ModellBez[1]);
  writes('be2',ModellBez[2]);
  writes('zco',ZollCode);
  writes('zpr',rtostr(Zollpro,2,2));
  writes('snu',ABScheinNummer);
  writes('mna',ModellName);
  writes('ist',rtostr(StueckIst,6,0));
           danach werden alle PAs mit dieser Nummer bearbeitet und folgende Felder angepasst
                  ModellBez[1]   := _belrec.ModellBez[1];
                  ModellBez[2]   := _belrec.ModellBez[2];
                  ArtikelNummer  := _belrec.ArtikelNummer;
                  ABScheinNummer := _belrec.ABScheinNummer;
                  material       := _belrec.material;
                  ZollCode       := _belrec.ZollCode;
                  ZollPro        := _belrec.ZollPro;
 'c','k' ImportToProforma;
 INS: Entweder "Import" oder "Proforma" neu anlegen

Import, SaaCmdDI

  • Hier werden 2 Tabellen umgeschaltet
              ImportMode := true;
              prrdatf.FileSwitch(BasePath+FSubDir+'IMPORT.BTV');
              padatf.FileSwitch(BasePath+FSubDir+'IMPPA.BTV');
              BelegListe;
              prrdatf.FileSwitch(BasePath+FSubDir+'BELEGE.BTV');
              padatf.FileSwitch(BasePath+FSubDir+'PA.BTV');
              ImportMode := false;

Fertigungsliste, SaaCmdDBF

-> FertigungsAuftragsListe;
    Liste der padatf (Produktions Aufträge)
    Hier kann man nach 6 Kriterien sortieren
    Hier hat man massiv suchmöglichkeiten
    Unklare Aufsummierung
     SummeIst        := SummeIst  + StueckIst;
     SummeSoll       := SummeSoll + StueckSoll;
     SummeRest       := SummeRest + PA_Rest;
     SummeU1         := SummeU1   + PA_Umsatz;
     SummeU2         := SummeU2   + PA_Umsatz2;
     SummeGP1        := SummeGP1  + GesamtPreis;
     SummeGP2        := SummeGP2  + GesamtPreis2;
    Unklare Fehlmengenlogik
    CENTER -> FaRecInp;
              (im Prinzip immer eine Beleg-Kopf Geschichte!)
    's' Skizze
    ALT F: Fehlmengen
    Alt F1: BelegeBearbeiten (also die einzelnen Posten)
    F6:  Beleg-Kopf des Proforma-Beleges suchen und landen (Beleg.belno)

Zoll Gesamt, SaaCmdDZG

  • wird nicht mehr benötigt

Lieferscheine, SaaCmdDBL

KENTER -> Kopf bearbeiten
F1 -> Aus den Lierferschein eine Rechnung erstellen anhand "kopie"
KCENTER -> Posten bearbeiten

Rechnungen, SaaCmdDBR

Gutschriften, SaaCmdDBG

Proforma-Vorlage, SaaCmdDBV

prrdatf wird geleert
-> BelegeBearbeiten
 -> die einzelnen Posten  bearbeiten

Fazit

In keinem Fall lassen sich die Prozesse, die verwendet werden auf den OrgaMon übertragen. Die Summierungen, Übertragungen, Nicht-Übertragungen, Ausnahmen und Ausgrenzungen sind für mich unverständlich, offensichtlich damals sehr pragmatisch nach den Vorgaben des Kunden programmiert. Die Zusammenhänge sind nicht trivial, es sind mehrere Tausend Zeilen Quelltext. Einiges sei nicht mehr notwendig. Die Erfahrung zeigt aber, dass die Komplexität verschwiegen oder vergessen wird. Genau bis zu dem Zeitpunkt wo etwas nicht funktioniert. Dann muss es wieder aus der Klamottenkiste herausgeholt werden. Es fehlt eine damalige kritsche Betrachtung und Umstrukturierung in der Folgezeit. Es fehlen Pflege- und Hege- Aufträge von 2002 bis 2018, das sind 16 Jahre ohne schrittweise Verbesserung. Der OrgaMon arbeitet völlig anders, hier müsste man komplett umlernen, den ganzen Prozess von Anfang (Beauftragung) bis Ende (Rechnungsstellung) neu organisieren. Ich kann aber keinesfall abschätzen was im OrgaMon gar nicht möglich ist, es kann sein, dass KEINE Änderungen am OrgaMon nötig sind, aber sehr sehr viele Änderungen in der Abwicklung der Produktions-Aufträge in der alltäglichen Praxis.

Ich sehe z.B. keine Chance für eine "Belegsummierung" im OrgaMon. Ich sehe keine "Restmengen" im Artikel (sondern nur im Auftrag, das heisst im OrgaMon Liefer-Rückstand). Artikel im OrgaMon sind zunächst mal unabhängig von EINEM Auftrag, sie können in vielen Aufträgen verwendet werden, sie können auch bei vielen Aufträgen noch "offen" sein, also viele Kunden könnten auf denselben Artikel warten - das ist keine Exklusivität bei einem Kunden, sie könnten an viele Kunden verkauft werden (auch wenn es individuell für einen Kunden gemacht ist, aber auch in der Realität könnte man eine Sonderanfertigung an einen anderen Kunden als den Ursprünglichen Auftraggeber verkaufen), sie können auch bei unterschiedlichen Lieferanten bestellt werden (z.B. bei hohem Bedarf oder Insolvenz des Hauptlieferanten) usw. usw. Endprodukte sind auch Artikel. Im alten Programm verstehe ich den Sinn an vielen Stellen einfach nicht. Das ist nicht in meine Realität einordenbar.

Produktionsauftrag, Produktionsauftrag-Vorlage-Beleg, Proforma, tatsächlicher Lieferschein, tatsächliche Rechnung haben ihre Berechtigung aber doch nicht über alle Kunden hinweg? Auch nicht als Kopie des einen in das andere. Produktionsauftrag-Vorlage-Beleg für alle Kunden, dann die "Modellname" im Beleg-Kopf, das ist Teil der Posten. Das funktioniert so nicht ...

Im OrgaMon ist das ein VÖLLIG anderer Lösungsansatz (der richtige!): Bei einem Auftrag gibt es Auftrags-Menge, Bestellte-Menge, Gelieferte-Menge, Berechnete-Menge, Stornierte-Menge, Berechnete-Menge. Ein Auftrag kann in z.B. 20 Teillieferungen abgearbeitet werden, das ist aber immer noch ein Auftrag, viele "Modelle", viele Teillieferungen, viele Teilrechnungen ...