App-Link #1042 Lager -- Bestand verwalten und abrechnen

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-12.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
- 2 -    (TxtDoc-lag-z-b-2026-06-12.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.
- 3 -    (TxtDoc-lag-z-b-2026-06-12.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 ist 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
- 4 -    (TxtDoc-lag-z-b-2026-06-12.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


--> https://www.postgresql.org/docs/current/queries-with.html#QUERIES-WITH-RECURSIVE

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
;
- 5 -    (TxtDoc-lag-z-b-2026-06-12.html)

INTRANET