Normalerweise nutzt man den RFC Zugriff von GuiXT eigentlich ausschließlich um Daten ab der SAP Datenbank sehr performant zu lesen.
In Ausnahmefällen nutze ich den RFC Zugriff , um auch um mal was direkt in der SAP Datenbank zu ändern.
Hier ging es darum ein einzelnes Feld (ZZART), was als Append in der VBAP appendiert wurde upzudaten.
Dieses Feld hat keine sonstigen Abhängigkeiten zu anderen Daten.
Der Versuch dies mit einem SAP Standardbaustein (BAPI_CUSTOMERQUOTATION_CHANGE) zu tun ging schief, da die Performance definitiv viel zu schlecht war, insbesondere bei Belegen mit sehr vielen Positionen.
Also habe ich einen FUBA entwickelt der dies viel performanter erledigt.
FUNCTION Z_UPDATE_ZZART.
*"----------------------------------------------------------------------
*"*"Lokale Schnittstelle:
*" IMPORTING
*" VALUE(VBELN) TYPE VBELN_VA
*" TABLES
*" T_POS_ZZART STRUCTURE ZZPOS_ZZART
*" EXCEPTIONS
*" OTHERS
*"----------------------------------------------------------------------
DATA: lv_posnr TYPE POSNR_VA,
lv_zzart TYPE ZZART,
ls_pos_zzart TYPE ZZART_ZZART.
LOOP AT T_POS_ZZART INTO ls_pos_zzart.
lv_posnr = ls_pos_zzart-POSNR.
lv_zzart = ls_pos_zzart-ZZART.
UPDATE VBAP
SET ZZART = lv_zzart
WHERE VBELN = VBELN
AND POSNR = lv_posnr.
IF sy-subrc <> 0.
RAISE OTHERS.
ENDIF.
ENDLOOP.
COMMIT WORK.
ENDFUNCTION.
In dem Feld VBELN wird einfach die Angebotsnummer übergeben.
In der Tabelle werden die Wertepaare POSNR und ZZART für alljene Positionen übergeben in welche das Feld ZZART geändert werden soll.
Für dieses hier publizierte Coding übernehmen wir keine Garantie. Es soll nur als Hilfestellung dienen, wenn Sie so was mal selbst entwickeln müssen.
Vor der Benutzung ist es auf jeden Fall ausgiebig zu testen.
Der Aufruf aus dem GuiXT erfolgt dann mittels dem Befehl call:
Call "Z_UPDATE_ZZART" _
export.VBELN="vbeln" _
export.T_POS_ZZART="Update_VBAP"
Wobei vorab die Wertepaare in die Tabellenvariable V[Update_VBAP] und im Feld V[vbeln] die Belegnummer übergeben werden muss.