Ausschliessen von Doppelerfassungen bei Auftragserfassung in SAP R/3 (Transaktion VA01)

Sie erfassen täglich einige hundert Kundenaufträge, dabei möchten Sie vermeiden, dass einzelne Materialpositionen doppelt erfasst werden.

Mit den unten aufgeführten Scripts können Sie beim Speichern des Belegs alle Positionen auf eine Doppelerfassung hin untersuchen.

Screenshot speichern des Belegs

Wird eine Doppelerfassung gefunden, so wird eine Messagebox ausgegeben, und der Beleg wird nicht gespeichert.

Im aufgeführten Beispiel werden Naturalrabattpositionen ignoriert, da man in diesem Fall immer 2 Mal dasselbe Material hat.

sapmv45a.d4001.txt

on "/11" "process=VA01_Doppelerfassung.txt"

va01_doppelerfassung.txt

// Script das beim Speichern des Beleges aufgerufen wird
// Dabei wird insbesondere kontrolliert, ob ein Material mehrmals erfasst wurde
// Falls Material mehrmals erfasst wird Meldung erzeugt
// Wenn alles i.O. wird gespeichert
// 07.03.03 / G. Koehn / Koehn Consulting / www.guixt.ch


// Variables
Set V[absrow] 1   // Absolute row number
Set V[relrow] 1   // Relative row number
Set V[abs_Pos] 1  // Absolute relevante Position
Set V[rel_Pos] 1  // Relative relevante Position
Set V[tabname] "Alle Positionen"


Screen SAPMV45A.4001

  GetTableAttribute T[&V[tabname]] FirstVisibleRow=FVisRow LastVisibleRow=LVisRow  LastRow=LastRow

// First row on screen?
  if V[FVisRow=1]
    goto new_row
  endif

// scroll to first line
  Enter "/ScrollToLine=1" Table="T[&V[tabname]]"


 label new_screen
  Screen SAPMV45A.4001
   GetTableAttribute T[&V[tabname]]  FirstVisibleRow=FVisRow LastVisibleRow=LVisRow  LastRow=LastRow

   Set V[relrow] 1

  label new_row

// end of table?
  if V[absrow>&V[LastRow]]
    goto end_of_table
  endif

// end of screen?
  if V[absrow>&V[LVisRow]]
    Enter "/ScrollToLine=&V[absrow]"  Table="T[&V[tabname]]"
    goto new_screen
  endif
set V[UPos]    "&cell[Alle Positionen,Üb.Pos,&[relrow]]"
if not V[UPos]       // Keine Unterposition, daher wird sie zwischengespeichert
  set V[Posnr_&V[abs_Pos]]  "&cell[Alle Positionen,Pos,&[relrow]]"
  set V[Material_&V[abs_Pos]]  "&cell[Alle Positionen,Material,&[relrow]]"

// Loop über alle bisher gespeicherten Positionen, um festzustellen, ob das im Zugriff
// stehende Material in einer früheren Position bereits erfasst wurde


  set V[rel_Pos] &V[abs_Pos] - 1
  Label Neue_Pos

  if V[rel_Pos=0]          // Jetzt wurden alle vorhergehenden Position untersucht,
                                   // daher darf es jetzt auf die nächste Position gehen
  goto Next_abs_Pos

  else                     // Die Vorgänger sind noch nicht alle untersucht

    if V[Material_&V[abs_Pos]=&V[Material_&V[rel_Pos]]]      // dann wurde ein gleiches Material gefunden

       Message "In der Position &V[Posnr_&V[abs_Pos]] haben Sie das selbe Material erfasst,\nwie in der Position &V[Posnr_&V[rel_Pos]]"
       Enter
       Leave
    else
       set V[rel_Pos] &V[rel_Pos] - 1
       goto Neue_Pos
    endif
  endif

  Label Next_abs_Pos

  Set V[abs_Pos] &V[abs_Pos] + 1 // Jetzt wird für die relevanten Positionen der Zähler um eins erhöht
endif                                               // Keine Unterposition

Set V[absrow] &V[absrow] + 1
Set V[relrow] &V[relrow] + 1

goto new_row

Screen SAPMV45A.4001
label end_of_table

Enter "/11"

Als Basis zur Erstellung des Scripts wurde das Script Nr. 9 aus den Tipps & Tricks der Synactive GmbH verwendet.

Download: doppelerfassung.zip
(2 txt-Dateien, zip-komprimiert, 1.39 KB)

Empfehlen