Event "Kd.Auftr.Pos Versand-Mengen-Kalkulation"
Event "Kd.Auftr.Pos Versand-Mengen-Kalkulation" (ab V4.4)
Dieser Event stellt folgende Möglichkeiten zur Verfügung:
Kalkulation einer Vorgabe-Versandmenge bei Pos.Erfassung in der Auftragsbearbeitung (nModus = 0)
Kalkulation einer verfügbaren Versandmenge, welche zur Validierung bzw. Freigabe einer Menge an folgenden Programmstellen verwendet wird (nModus = 1):
Bei manueller Eingabe einer Versandmenge, bzw. bei Aufruf von AufPosPost()
Bei der manuellen Lieferfreigabe aus der Auftragsverwaltung
Bei der automatischen Lieferfreigabe
Bei der Lieferfreigabe nach Wareneingang
Beispiel
// =============================================================================
// Event zur Berechnung einer eigenen Versand-Menge (DAB055:VMENGE)
// je nach Aufruf entweder als Vorbelegung in der Eingabemaske oder als
// maximal verfügbare Menge
// =============================================================================
// =============================================================================
// Variablen Deklarationen
// =============================================================================
| nEvtNo:P1, oDab000:P2, oDab050:P3, oDab055:P4, oDab010:P5,
oOld055:P6, nModus:P7, nVMenge:P8, x,
cTest:C:="", oCalc055:DB:='waDAB055, DAB057', nPrioDays:N:=0, nPMenge:N:=0 |
// oOld050, oOld055 enthalten alte Versionen der Datensätze (vor dem Editieren)
// nVMenge : Errechnete VMenge (Vorgabe bzw. verfügbar)
// nModus = 0 : Rückgabe = Vorgabe VMenge
// nModus = 1 : Rückgabe = Verfügbare VMenge
// Rückgabe : leer = keine Änderung, sonst Vorgabe- bzw. verfügbare VMenge
// =============================================================================
// Vorgaben zum Testen in Programmierung ...
//oDab000 := DBOpen(waDAB000),
//oDab010 := DBOpen(waDAB010),
//oDab050 := DBOpen(waDAB050),
//oDab055 := DBOpen(waDAB055),
//oOld055 := DBOpen(waDAB055),
//
//nModus := 0,
//nVMenge:= 99,
//
//DbSeek( {100287}, oDab000 ),
//DbSeek( {"100211"}, oDab050 ),
//DbSeek( {"100211 1"}, oDab055 ),
//DbSeek( {"100211 1"}, oOld055 ),
//DbSeek( {oDab055:ARTNR}, oDab010 ),
// =============================================================================
// Beginn Hauptprogramm
// =============================================================================
startseq
if (mAbteilung = oDab055:LAGER) and // Abt = LAGER (sollte immer der Fall sein)
(oDab055:AUF_LAG = "J") and // Auftr.Pos. lagerwirksam
(oDab055:LAGER > 0) and // Lager 1-9
(oDab055:LAGER <= 9) and
(oDab055:BMENGE > 0) and // Bestell-Menge > 0
(oDab010:ARTTYP = "T") then // Kaufteil
// Prioritäts-Vorschau-Tage ermitteln (Allg.Param)
nPrioDays := 0,
DbRefresh(dabpar),
if not Empty(DabPar:PRIOR_TAGE) then
nPrioDays := Eval( "| Dab010 | " + DabPar:PRIOR_TAGE, oDab010 ),
endif,
// Filter auf Dab055 setzten auf Auftr.Pos. nur mit
// - jeweils bis oder ohne Prioritäts-Vorschau-Tage
// - Priotitäts-Menge größer 0
// - Priorität größer Prio. der aktuellen Pos.
// - nur aktuelles Lager berücksichtigen
// (===> Abweichung von BE-Standard-Logik <===)
if nPrioDays > 0 then
oCalc055.Filter := 'artnr<>"' + oDab055:ARTNR + '" .or. ('
+ 'TERM_INDEX <= "' +
FormatDateTime( 'yyyymmdd', mBDatum + nPrioDays ) + '" '
+ ' .and. PMENGE >0 '
+ ' .and. PRIORI > "' + oDab055:PRIORI + '") '
+ ' .and. LAGER = ' + Str(oDab055:LAGER),
else
oCalc055.Filter := 'artnr<>"' + oDab055:ARTNR + '" .or. ('
+ 'PMENGE >0 '
+ ' .and. PRIORI > "' + oDab055:PRIORI + '") '
+ ' .and. LAGER = ' + Str(oDab055:LAGER),
endif,
// Filter aktivieren
oCalc055.Filtered := True,
// oCalc055 auf aktuellen Artikel filtern
DBScope( oDab055:ARTNR, oDab055:ARTNR, oCalc055 ),
DBGotop( oCalc055 ),
// offene Mengen mit höherer Priorität kumulieren
nPMenge := 0,
while not Eof(oCalc055) do
nPMenge := nPMenge + max(min(oCalc055:PMENGE, oCalc055:BMENGE</p>
<ul class="alternate">
<li>oCalc055:VMENGE - oCalc055:LMENGE ), 0),
DbSkip( 1, oCalc055 ),
end,
// Kum.Prio.Mengen von Lagerbestand subtrahieren
nVMenge := Lager( Str(oDab055:LAGER), oDab010 ),
nVMenge := nVMenge - nPMenge,
// Bereits freigegebene Menge wieder addieren
nVMenge := Min( oDab055:BMENGE, nVMenge + oOld055:VMENGE ),
oCalc055.Filtered := False,
DBScope( , , oCalc055 ),
endif,
onerror
MessageDlg( 'Event : '+ 'Events\Kd.Auftr.Pos. VMengen-Kalk.' + crlf +
'Fehler: '+ GetErrorText() + crlf +
'Zeile : '+ Str(GetErrorLine()) + crlf +
'Info : '+ Classname(GetErrorObj()), mtError, mbOK, 0 ),
stopseq,
// =============================================================================
// Ende Hauptprogramm
// =============================================================================
// Rückgabe der (ggf. neuen) Vorgabe/Verfügbarkeit
nVMenge
// =============================================================================
// Ende
// =============================================================================