Codeblock Onlinehilfe

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:

  1. Kalkulation einer Vorgabe-Versandmenge bei Pos.Erfassung in der Auftragsbearbeitung (nModus = 0)

  2. Kalkulation einer verfügbaren Versandmenge, welche zur Validierung bzw. Freigabe einer Menge an folgenden Programmstellen verwendet wird (nModus = 1):

    1. Bei manueller Eingabe einer Versandmenge, bzw. bei Aufruf von AufPosPost()

    2. Bei der manuellen Lieferfreigabe aus der Auftragsverwaltung

    3. Bei der automatischen Lieferfreigabe

    4. 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ö&szlig;er 0
     // - Priorität grö&szlig;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
// =============================================================================