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.

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)

