App-Link #1042 Lager -- Bestand verwalten und abrechnen -- {2}

z.B.

aus dem erfassten Bestand
- O-Sostr-Lager
- O-W13rp-Lager1
- O-W13rp-Lager2
- ...


Rechnungen kalkulieren
- Miete
- BK
- ...

/public/Bestand_und_Abrechnung.png


--> /frepjs2000/Fr_Anf_Ang_Auftr_Pflege?submitaction=%2F%3D%2F&datatable_primarykey=25

Grundstücke, Lagerhallen und Co

kann man auch als Stücklisten betrachten.
- 1 -    (TxtDoc-lag-z-b-2026-06-24.html)


App-Link #1052 Neues wie Einkauf per ERP abwickeln

Dann ist das Teil 
- initial als Anlage erfasst
durchläuft das Einkaufsprozedere u.A. mit Prüfung auf
- laufende Aufwände
und Ersatz (Entsorgung).


Mit dem ERP fallen dann wichtige weitere Informationen zwangsläufig an.

Z.B. Gliederung in
- F&E / Investitionen / laufenden Kosten / ausserordentlichen ...
- ev. Kostenstellen
- ev. Kostenträgern
- ...
und tauchen dann als Planungs-, Forecast- und Ist-Darstellungen auf.

- 2 -    (TxtDoc-lag-z-b-2026-06-24.html)


App-Link #1044 Lager -- als Artikel mit Stückliste verwalten

Einen Artikel kann man
- herstellen
- einkaufen
- verkaufen
- vermieten
- warten
- ...

( Was das ERP eben hergibt )




z.B.

--> /frepjs2000/Fr_Artikel_Pflege?submitaction=%2F%3D%2F&datatable_primarykey=129


/public/Lager_als_Artikel_Stueckliste_verwalten.png

Pro Artikelgruppe können individuelle Felder ohne Datenbank/Programm-Änderung definiert werden

--> s.a.  https://jobst-software.net/ainfojs2000/InfoPrint_Default?only_REPORT_KNZ=TxtDoc&search_text=ADialog
- 3 -    (TxtDoc-lag-z-b-2026-06-24.html)


App-Link #1035 Mit SPICE oder VNC auf virtuelle Maschinen zuzugreifen

Damit 
- Zwischenablage
- höhere/dynamische Auflösung
funktioniert,
ist auf dem Clientsystem ein passender Gast-Treiber erforderlich.






Konfigration z.B. per virt-manager

/public/virt-anzeige-spice-vnc.png


--> https://de.wikipedia.org/wiki/SPICE_(Protokoll)

Zugriff von Ausserhalb z.B. mit dem remote-viewer

remote-viewer spice://10.110.10.101:5999

oder

remote-viewer vnc://10.110.10.101:5982
- 4 -    (TxtDoc-lag-z-b-2026-06-24.html)


App-Link #1033 Script/Runtime/VM-Sprachen mit Fehlerbehandlung und zwingend automatischer Speicherverwaltung

z.B.


try {
dokument.speichern();

datenbank.commit();

status_anzeigen("Daten gespeichert");

}
catch() {
datenbank.rollback();

meldung("speichern fehlgeschlagen");
}


Also, versuche zu speichern:
- wenn's klappt, alles festschreiben
- wenn nicht, alles rückgängig machen und den User informieren





Buffer-Overflows sollten in Script/Runtime/VM-Sprachen auch nicht vorkommen.
( z.B. TypeScript/JavaScript, Java, C#, ... )

Diese benutzen jedoch Bibliotheken, die's ev. mit dem Speicher nicht so genau nehmen.
Oder man benutzt unsafe-Blöcke oder unglückliche Compilerschalter.
( Undefiniertes Verhaltung (UB) glänzt am besten durch Abwesenheit )

C++ ohne UB geht auch -- z.B. mit C++/CLI

jedoch nicht ISO C++ konform.
( Alles mit ^ ist hier auch verwalteter Speicher )


public ref class IntDotnetClass
{
public: int IntValue;

public: IntDotnetClass()
{
this->IntValue = 0;
}


public: virtual ~IntDotnetClass()
{
System::Console::WriteLine("~destruct IntDotnetClass" + IntValue.ToString());
}


public: int operator=( const int IntValue)
{
this->IntValue = IntValue;

return this->IntValue;
}

public: virtual System::String^ ToString() override
{
return IntValue.ToString();
}

};

Weiters stehen zur Vermeidung von Speicherproblemen

- Rust
- Fil-C
- Valgrind
- und ev. bald TrapC
zur Verfügung.

Auf Client und Server eine Script-Sprache

ist auf dem Weg.

Und dann ev.
- sicherer
- Module per import ohne Konfigs und Builds
- TypeScript neben JavaScript es6 out of the Box
- Grundfunktionen (z.B. HTTP, SQL) ohne zusätzliche Abhängigkeit

Hat Vorteile, wenn am Client und Server
die gleichen Formate und Werkzeuge verwendet werden können.

( natürlich eher für Sachen, bei denen man mit Scriptsprachen auskommen kann )

Compiler vs. Script/Runtime/VM-Sprachen

Anforderungen schnell umzusetzen, 
braucht dynamische Software.

Laufzeitprüfungen bei Script/Runtime/VM-Sprachen,
wie z.B.
- RtAssert( fdName != null && !"".equals(fdName), "fdName mit Inhalt erwartet");
können den Nachteil gegenüber statischer Codeanalyse bei Compilern z.T. ausgleichen.

Diese sind
- beim entwickeln / testen
und
- im Produktivbetrieb
aktiv.


Immer Prüfen kostet jedoch immer Resourcen.

Unterschied zwischen UB und Exception

- undefiniertes Verhalten 
--> Kontrolle verloren --> bevorzugter Kandidat für Container
( Programmtypen, die das NICHT vermeiden, sind im Container besser aufgehoben )

- Exception
--> Ausnahme per Catch einfangen, Fehlermeldung, Rollback --> nichts kaputt
- 5 -    (TxtDoc-lag-z-b-2026-06-24.html)


App-Link #1024 Lager -- z.B. Abgänge und Zugänge direkt aus den aktuellen Bewegungsdaten bilden

Zusammen mit den aktuellen Stammdaten,
ergibt sich der aktuelle Bedarf.

/public/js_es6_minierp_report_beta.png


--> https://jobst-software.net/al_storage/?submitaction=%2F%3D%2F&datatable_primarykey=6

Auch hier, trägt die Last die SQL.

Webanwendung und/oder Office für Eingabe und Anzeige.


Die SQL kümmert sich um
- Tabellen -- Abfragen
- Benutzer -- Rollen -- Berechtigungen
- Integrität
- Grundlagen für Reports / PDFs


Sparsamer Umgang mit Scripts/Makros fördert
- Systemunabhängigkeit
und
- Sicherheit
- 6 -    (TxtDoc-lag-z-b-2026-06-24.html)


App-Detail #1022 KORE / Logistik -- z.B. eine Palette und die Details

Details lassen sich per Kopfrechnung weniger gut überschlagen.

Dafür hat man ev. eine SQL samt Tools.




z.B.

/public/Artikel_AParts.png


--> /frepjs2000/Fr_Artikel_Pflege?submitaction=%2F%3D%2F&datatable_primarykey=127

Eine SQL kann auch helfen mit rekursiven Strukturen umzugehen.

z.B.:


WITH RECURSIVE included_parts( t_nr, apart_artikelnr, artikelnr, par_menge, t1_x_menge) AS (
SELECT 1 as t_nr, apart_artikelnr, artikelnr, 1::numeric as par_menge, menge::numeric as t1_x_menge
FROM frepjs2000.Artikel_AParts WHERE artikelnr like '%Pal%'
UNION ALL
SELECT (t_nr + 1) as t_nr, p.apart_artikelnr, p.artikelnr, (par_menge * 1)::numeric as par_menge, (p.menge * pr.t1_x_menge)::numeric as t1_x_menge
FROM included_parts pr
join frepjs2000.Artikel_AParts p on pr.apart_artikelnr = p.artikelnr
)
SELECT
string_agg( inc_pr.t_nr::varchar, ' ') as t_nrs,
--
inc_pr.artikelnr,
round( SUM( inc_pr.par_menge), 4) as menge,
string_agg( distinct art.mengen_einheit, ' ') as mengen_einheit,
--
inc_pr.apart_artikelnr as t_artikelnr,
round( SUM( inc_pr.t1_x_menge), 4) as t1_x_menge,
string_agg( distinct ap_art.mengen_einheit, ' ') as t_meh,
string_agg( concat( f_n(inc_pr.t1_x_menge), f_meh( ' ', ap_art.mengen_einheit) ), ' + ') as t1_x_menge_dets,
string_agg( concat( inc_pr.apart_artikelnr, ' ', f_n(inc_pr.t1_x_menge), f_meh( ' ', ap_art.mengen_einheit) ), ' + ') as t1_x_menge_dets_ex
FROM included_parts inc_pr
join frepjs2000.artikel art on inc_pr.artikelnr = art.artikelnr
join frepjs2000.artikel ap_art on inc_pr.apart_artikelnr = ap_art.artikelnr
GROUP BY
inc_pr.artikelnr, inc_pr.apart_artikelnr
;
- 7 -    (TxtDoc-lag-z-b-2026-06-24.html)

INTRANET