[Allegro] Version 35.10

Thomas Berger ThB at Gymel.com
Mi Nov 11 14:45:57 CET 2015


Am 11.11.2015 um 12:18 schrieb Mettler, Jeannette:
> Lieber Herr Berger, 
> 
> Ja, erst kommt diese Zeile wegen der Bestellnummernvergabe.
> 
> set tbl loc           // .TBL blockieren, damit keiner speichern kann 
> perf nextnum          // ermittelt die Nummer, liefert sie in #uoY   
> 
> danach erst
>  
> set tbl free      //  s. Mails Diskussionsliste: vor dem Aufruf von onput soll die tbl freigegeben werden
> exec onput


Ich habe jetzt die entsprechende Diskussion hier auf der Liste
von 2004 gefunden, evtl. eine spaetere nicht: In der cat.api
finde ich im PV-Abschnitt bei #-N
"ab V28.2 obsolet, weil Nummernvergabe per FLEX"
was aber nicht stimmt, denn der Standard-Flex o-bestel.flx
veranstaltet keine Vergabe der Bestellnummer in #9DA und
beruht also weiterhin darauf, dass die .api das beim
Speichern tut.

In Ihrem Fall mit tatsaechlicher Nummernvergabe im Flex
muessen Sie aufpassen: Sinn des nextnum-Unterprogramms
ist, die naechste freie Nummer zu /ermitteln/, solange
diese aber noch nicht gespeichert ist, muss die Datenbank
gesperrt bleiben!

Insofern duerfen Sie keinesfalls zuerst "set tbl free"
geben und dann ganz gemaechlich onput.flx aufrufen, in
dessen Ablauf der Satz irgendwann gespeichert wird (mit
vorheriger Sperre der Satztabelle etc.). In der Zwischen-
zeit werden naemlich andere Besteller, die durch die
von Ihnen gesperrte Satztabelle zum Warten gezwungen waren,
ebenfalls zum Zuge kommen und fuer deren Bestellungen
wird dann (im Zeitraum zwischen Ihrem "set tbl free" und
dem Moment, wo Ihr "put" im onexec.flx sich die Datenbank
erneut exklusiv sichern kann) dieselbe Nummer errechnet.

In o-invent.flx koennen Sie zwei verschiedene Arten
besichtigen, diese Klippe zu umschiffen:
a) (ueber einen Dummy-Datensatz) den durch die Nummer
   erzeugten Schluessel errechnen lassen und explizit
   vorab in den Index schreiben

b) so lange warten, bis der Datensatz tatsaechlich
   geschrieben werden soll (hoffentlich nicht zu lange)

Beides endet letztlich mit einem
put free
d.h. der Satz wird trotz gesperrter Satztabelle gespeichert,
diese anschliessend freigegeben.

Die Frage ist, ob Sie wirklich den onput.flx benoetigen
(weil Ihre Variante davon automatisiert irgendwelche
Abschliessenden Verschoenerungen auch an Bestellsaetzen
vornimmt), denn der kann ja nicht davon abgebracht werden,
ein einfaches "put" auszufuehren, das in der Situation mit
gesperrter Satztabelle scheitern muss. Wenn Sie den onput-
Aufruf durch ein

put free

ersetzen koennen, haben Sie in mehrfacher Hinsicht gewonnen:
- Die Nummernvergabe ist wasserdicht
- Alles wird schneller da die .tbl nur ein- und nicht zweimal
  gesperrt und freigegeben wird
- Die stoerende Meldung unterbleibt

viele Gruesse
Thomas Berger





Mehr Informationen über die Mailingliste Allegro