Sie wollen für Ihre Endanwender eine Einbildtransaktion entwickeln, mit welcher die User vereinfacht Bestellanforderungen anlegen können. Dies kann man grundsätzlich über ein InputScript lösen. Bei sehr vielen Positionen dauert dann die Übergabe doch recht lange. Insbesondere, wenn man auf der Position noch eine Anlieferadresse und Langtexte pflegt.

Deshalb habe ich für einen Kunden die bereits realisierte Lösung so umgebaut, dass man das Anlegen nun über das Standard BAPI von SAP löst. Da man bei einem BAPI aber wissen muss, was und wie was zu übergeben ist, stelle ich hier ein Testscript zur Verfügung, aus welchem ersichtlich ist, wie die Werte übergeben werden müssen.

Da das BAPI in der Schnittstelle noch gepackte Felder beeinhaltet, musste ich um den Baustein herum noch einen eigenen schreiben, da bisher in GuiXT noch keine gepackten Felder übergeben werden können (kommt in einer der nächsten GuiXT Versionen).

Dieser Umweg über den eigenen Baustein ist nur notwendig, solange man aus GuiXT heraus noch keine gepackten Felder befüllen kann. Schauen Sie am besten in den Versions Info nach, ab wann die neue Möglichkeit geschaffen wurde.

RFC-Funktionsbaustein ZZGUIXT_BAPI_PR_CREATE

FUNCTION zzguixt_bapi_pr_create.                            "#EC ENHOK
*"----------------------------------------------------------------------
*"*"Lokale Schnittstelle:
*"  IMPORTING
*"     VALUE(PRHEADER) LIKE  BAPIMEREQHEADER STRUCTURE  BAPIMEREQHEADER
*"       OPTIONAL
*"     VALUE(PRHEADERX) LIKE  BAPIMEREQHEADERX STRUCTURE
*"        BAPIMEREQHEADERX OPTIONAL
*"     VALUE(TESTRUN) LIKE  BAPIFLAG-BAPIFLAG OPTIONAL
*"  EXPORTING
*"     VALUE(NUMBER) LIKE  BAPIMEREQHEADER-PREQ_NO
*"     VALUE(PRHEADEREXP) TYPE  BAPIMEREQHEADER
*"  TABLES
*"      RETURN STRUCTURE  BAPIRET2 OPTIONAL
*"      PRITEM_EXT STRUCTURE  ZZGUIXTMEREQITEM
*"      PRITEMX STRUCTURE  BAPIMEREQITEMX OPTIONAL
*"      PRACCOUNT_EXT STRUCTURE  ZZGUIXTMEREQACCOUNT OPTIONAL
*"      PRACCOUNTX STRUCTURE  BAPIMEREQACCOUNTX OPTIONAL
*"      PRADDRDELIVERY STRUCTURE  BAPIMERQADDRDELIVERY OPTIONAL
*"      PRITEMTEXT STRUCTURE  BAPIMEREQITEMTEXT OPTIONAL
*"      PRHEADERTEXT STRUCTURE  BAPIMEREQHEADTEXT OPTIONAL
*"----------------------------------------------------------------------

* Da gepackte Felder noch nicht von GuiXT übergeben werden können
* müssen wir für diese Felder die Werte in CHAR Feldern übernehmen
* und sie mittels ABAP in ein P-Feld umkonvertieren

  DATA: BEGIN OF pritem OCCURS 100.
          INCLUDE STRUCTURE BAPIMEREQITEMIMP.
  DATA: END OF pritem.
  DATA: BEGIN OF praccount OCCURS 100.
          INCLUDE STRUCTURE bapimereqaccount.
  DATA: END OF praccount.

  LOOP AT pritem_ext.
    MOVE-CORRESPONDING pritem_ext TO pritem.
    pritem-quantity = pritem_ext-quantity_char.
    pritem-gr_pr_time = pritem_ext-gr_pr_time_char.
    pritem-preq_price = pritem_ext-preq_price_char.
    pritem-price_unit = pritem_ext-price_unit_char.
    pritem-plnd_delry = pritem_ext-plnd_delry_char.
    pritem-minremlife = pritem_ext-minremlife_char.
    APPEND pritem.
  ENDLOOP.

  LOOP AT praccount_ext.
    MOVE-CORRESPONDING praccount_ext TO praccount.
    praccount-quantity = praccount_ext-quantity_char.
    praccount-distr_perc = praccount_ext-distr_perc_char.
    praccount-net_value = praccount_ext-net_value_char.
    praccount-nond_itax = praccount_ext-nond_itax_char.
    APPEND praccount.
  ENDLOOP.

  CALL FUNCTION 'BAPI_PR_CREATE'
    EXPORTING
      prheader       = prheader
      prheaderx      = prheaderx
      testrun        = testrun
    IMPORTING
      number         = number
      prheaderexp    = prheaderexp
    TABLES
      return         = return
      pritem         = pritem
      pritemx        = pritemx
      praccount      = praccount
      praccountx     = praccountx
      praddrdelivery = praddrdelivery
      pritemtext     = pritemtext
      prheadertext   = prheadertext.
ENDFUNCTION.

Testinputscript Test_Bapi.txt

// Initialisieren aller Werte und Langtexte
Set V[me51_*] ""
Set Text[me51_*] ""

// Füllen der benötigten Strukturen
processingoption  leadingspace="on"
// Kopf
set V[me51_prheader](BAPIMEREQHEADER-PR_TYPE) 		"NB" 
set V[me51_prheader](BAPIMEREQHEADER-ITEM_INTVL) 		"00000" 
set V[me51_prheader](BAPIMEREQHEADER-LAST_ITEM) 		"00000" 
set V[me51_prheaderx] 		" X" 
set V[me51_testrun] ""

// Füllen Positionen
set V[i] 1
Label fill_items
if V[i<1000]

  // führende Nullen hinzufügen
  set V[posnr] &[i] * 10
  Set V[k10] "0000000&V[posnr]"

  Set V[p2] "&V[k10]" -stringlength
  Set V[p1] "&V[p2]" - 4  // wobei hier immer eins weniger abgezogen wird als die Gesamtlänge sein muss
  Set V[posnr] "&V[k10](&V[p1]-&V[p2])"
  Set V[date] "&V[today_y]&V[today_m]&V[today_d]"
  set V[me51_item_string](ZZGUIXTMEREQITEM-PREQ_ITEM) 		"&V[posnr]"     						// Positionsnummer
  set V[me51_item_string](ZZGUIXTMEREQITEM-PUR_GROUP) 		"005"     						// Einkäufergruppe
  set V[me51_item_string](ZZGUIXTMEREQITEM-PREQ_NAME) 		"Anford. &[i]" 			// Name Anforderer
  set V[me51_item_string](ZZGUIXTMEREQITEM-SHORT_TEXT) 		"Kurztext Position &[i]"  // Kurztext Position
  set V[me51_item_string](ZZGUIXTMEREQITEM-PLANT)			"1200"    					// Werk
  set V[me51_item_string](ZZGUIXTMEREQITEM-MATL_GROUP)		"00101"							// Warengruppe
  set V[me51_item_string](ZZGUIXTMEREQITEM-UNIT)			"ST"						// MengenEinheit
  set V[me51_item_string](ZZGUIXTMEREQITEM-PREQ_DATE)		"&[date]"	               // Anforderungsdatum
  set V[me51_item_string](ZZGUIXTMEREQITEM-DELIV_DATE)		"&[date]" 					// Gew. Lieferdatum
  set V[me51_item_string](ZZGUIXTMEREQITEM-ACCTASSCAT)		"K"							// Kontierungstyp
  set V[me51_item_string](ZZGUIXTMEREQITEM-IR_IND)			" "							// RE Kennzeichen

  // Initiale Felder müssen auch gefüllt werden, da das BAPI offensichtlich unterschiedlich reagiert
  // ob Blank oder 00000  übergeben wird  
  set V[me51_item_string](ZZGUIXTMEREQITEM-AGMT_ITEM)      					"00000"                    
  set V[me51_item_string](ZZGUIXTMEREQITEM-RESERV_NO) 	    				"0000000000"
  set V[me51_item_string](ZZGUIXTMEREQITEM-PCKG_NO)  						"0000000000"
  set V[me51_item_string](ZZGUIXTMEREQITEM-INT_OBJ_NO)                    "000000000000000000"
  set V[me51_item_string](ZZGUIXTMEREQITEM-FW_ORDER_ITEM)                 "00000"
  set V[me51_item_string](ZZGUIXTMEREQITEM-PLND_DELRY)   					"0"
  set V[me51_item_string](ZZGUIXTMEREQITEM-DELIV_TIME)                    "000000"
  set V[me51_item_string](ZZGUIXTMEREQITEM-REF_REQ_ITEM)                  "00000"
  set V[me51_item_string](ZZGUIXTMEREQITEM-EXT_PROC_REF_ITEM)             "00000"
  set V[me51_item_string](ZZGUIXTMEREQITEM-RES_ITEM)                      "000"
  set V[me51_item_string](ZZGUIXTMEREQITEM-PRIO_URGENCY)                  "00"
  set V[me51_item_string](ZZGUIXTMEREQITEM-PRIO_REQUIREMENT)              "000"
  set V[me51_item_string](ZZGUIXTMEREQITEM-MINREMLIFE)                    "0"
  set V[me51_item_string](ZZGUIXTMEREQITEM-QUANTITY_CHAR)					"1"				// Menge
  set V[me51_item_string](ZZGUIXTMEREQITEM-PREQ_PRICE_CHAR)					"1"				// Nettopreis
  set V[me51_item_string](ZZGUIXTMEREQITEM-PRICE_UNIT_CHAR)					"1"				// Preiseinheit (pro)

  set V[me51_itemx_string](BAPIMEREQITEMX-PREQ_ITEM) 		"&V[posnr]"     			// Positionsnummer 
  set V[me51_itemx_string](BAPIMEREQITEMX-PREQ_ITEMX) 		"X"     					// Positionsnummer 
  set V[me51_itemx_string](BAPIMEREQITEMX-PUR_GROUP) 		"X"     					// Einkäufergruppe
  set V[me51_itemx_string](BAPIMEREQITEMX-PREQ_NAME) 		"X" 						// Name Anforderer
  set V[me51_itemx_string](BAPIMEREQITEMX-SHORT_TEXT) 		"X"  						// Kurztext Position
  set V[me51_itemx_string](BAPIMEREQITEMX-PLANT)			"X"    						// Werk
  set V[me51_itemx_string](BAPIMEREQITEMX-MATL_GROUP)		"X"							// Warengruppe
  set V[me51_itemx_string](BAPIMEREQITEMX-QUANTITY)			"X"							// Menge
  set V[me51_itemx_string](BAPIMEREQITEMX-UNIT)				"X"							// MengenEinheit
  set V[me51_itemx_string](BAPIMEREQITEMX-PREQ_DATE)		"X"						    // Anforderungsdatum
  set V[me51_itemx_string](BAPIMEREQITEMX-DELIV_DATE)		"X"							// Gew. Lieferdatum
  set V[me51_itemx_string](BAPIMEREQITEMX-PREQ_PRICE)		"X"							// Nettopreis
  set V[me51_itemx_string](BAPIMEREQITEMX-PRICE_UNIT)		"X"							// Preiseinheit (pro)
  set V[me51_itemx_string](BAPIMEREQITEMX-ACCTASSCAT)		"X"							// Kontierungstyp
  set V[me51_itemx_string](BAPIMEREQITEMX-IR_IND)			"X"							// RE Kennzeichen

  CopyText toText="me51_pritem" fromString="me51_item_string" 		-appendline
  CopyText toText="me51_pritemx" fromString="me51_itemx_string" 	-appendline 

  set V[i] &[i] + 1
  goto fill_items
endif

// Füllen Kontierung
set V[i] 1
Label fill_account
if V[i<500]
  // führende Nullen hinzufügen
  set V[posnr] &[i] * 10
  Set V[k10] "0000000&V[posnr]"

  Set V[p2] "&V[k10]" -stringlength
  Set V[p1] "&V[p2]" - 4  // wobei hier immer eins weniger abgezogen wird als die Gesamtlänge sein muss
  Set V[posnr] "&V[k10](&V[p1]-&V[p2])"

  set V[me51_account_string](ZZGUIXTMEREQACCOUNT-PREQ_ITEM)		"&V[posnr]"     			// Positionsnummer 
  set V[me51_account_string](ZZGUIXTMEREQACCOUNT-SERIAL_NO)		"01"     					// Serialnummer
  set V[me51_account_string](ZZGUIXTMEREQACCOUNT-COSTCENTER)		"0000002301"				// Kostenstelle
  set V[me51_account_string](ZZGUIXTMEREQACCOUNT-ITM_NUMBER)		"000000"
  set V[me51_account_string](ZZGUIXTMEREQACCOUNT-SCHED_LINE)     	"0000"
  set V[me51_account_string](ZZGUIXTMEREQACCOUNT-GR_RCPT)			"000000001000"            // Warenempfänger
  set V[me51_account_string](ZZGUIXTMEREQACCOUNT-UNLOAD_PT)			"Abladestelle &[i]"		// Abladestelle
  set V[me51_account_string](ZZGUIXTMEREQACCOUNT-RES_ITEM)        	"000"
  set V[me51_account_string](ZZGUIXTMEREQACCOUNT-QUANTITY_CHAR)			"1"							// Menge

  set V[me51_accountx_string](BAPIMEREQACCOUNTX-PREQ_ITEM)		"&V[posnr]"     			// Positionsnummer
  set V[me51_accountx_string](BAPIMEREQACCOUNTX-SERIAL_NO)		"01"     					// Serialnummer 
  set V[me51_accountx_string](BAPIMEREQACCOUNTX-PREQ_ITEMX)		"X"     					// Positionsnummer
  set V[me51_accountx_string](BAPIMEREQACCOUNTX-SERIAL_NOX)		"X"							// Serialnummer 
  set V[me51_accountx_string](BAPIMEREQACCOUNTX-QUANTITY)		"X"						// Menge
  set V[me51_accountx_string](BAPIMEREQACCOUNTX-COSTCENTER)		"X"						// Kostenstelle
  set V[me51_accountx_string](BAPIMEREQACCOUNTX-GR_RCPT)			"X"            		// Warenempfänger
  set V[me51_accountx_string](BAPIMEREQACCOUNTX-UNLOAD_PT)		"X"						// Abladestelle

  CopyText toText="me51_praccount" fromString="me51_account_string" 		-appendline
  CopyText toText="me51_praccountx" fromString="me51_accountx_string" 	-appendline 

  set V[i] &[i] + 1
  goto fill_account
endif

// Füllen Kopftext
// dazu müssen wir den Text in einen SAP internen Text konvertieren
set V[i] 1
Label Fuellen_Kopftext
if V[i<500]
  set V[me51_ktext_string](BAPIMEREQHEADTEXT-TEXT_ID)				"B01"	
  set V[me51_ktext_string](BAPIMEREQHEADTEXT-TEXT_FORM)			"*"	
  set V[me51_ktext_string](BAPIMEREQHEADTEXT-TEXT_LINE)			"Langtextzeile &[i]"

  CopyText totext="me51_prheadertext" fromString="me51_ktext_string" -appendline
  Set V[i] &[i] + 1
  goto Fuellen_Kopftext
endif
// Füllen Positionstext

set V[i] 1
Label Fuellen_Postext
if V[i<500]
  set V[posnr] &[i] * 10
  Set V[k10] "0000000&V[posnr]"

  Set V[p2] "&V[k10]" -stringlength
  Set V[p1] "&V[p2]" - 4  // wobei hier immer eins weniger abgezogen wird als die Gesamtlänge sein muss
  Set V[posnr] "&V[k10](&V[p1]-&V[p2])"
  set V[me51_ptext_string](BAPIMEREQITEMTEXT-PREQ_ITEM)			"&V[posnr]"		
  set V[me51_ptext_string](BAPIMEREQHEADTEXT-TEXT_ID)				"B02"	
  set V[me51_ptext_string](BAPIMEREQHEADTEXT-TEXT_FORM)			"*"	
  set V[me51_ptext_string](BAPIMEREQHEADTEXT-TEXT_LINE)			"Langtextzeile Position &V[posnr]"

  CopyText totext="me51_pritemtext" fromString="me51_ptext_string" -appendline
  Set V[i] &[i] + 1
  goto Fuellen_Postext
endif

// Füllen Anlieferadresse

set V[i] 1

Label Fuellen_Anlieferadresse
if V[i<500]
  set V[posnr] &[i] * 10
  Set V[k10] "0000000&V[posnr]"

  Set V[p2] "&V[k10]" -stringlength
  Set V[p1] "&V[p2]" - 4  // wobei hier immer eins weniger abgezogen wird als die Gesamtlänge sein muss
  Set V[posnr] "&V[k10](&V[p1]-&V[p2])"
  set V[me51_anlief_string](BAPIMERQADDRDELIVERY-PREQ_ITEM)			"&V[posnr]"		
  set V[me51_anlief_string](BAPIMERQADDRDELIVERY-NAME)				"Name Pos &V[posnr]"	
  set V[me51_anlief_string](BAPIMERQADDRDELIVERY-NAME2)				"Name 2 "	
  set V[me51_anlief_string](BAPIMERQADDRDELIVERY-POSTL_COD1)			"3252"
  set V[me51_anlief_string](BAPIMERQADDRDELIVERY-CITY)				"Lysserbrunnen"
  set V[me51_anlief_string](BAPIMERQADDRDELIVERY-COUNTRY)			"CH"
  set V[me51_anlief_string](BAPIMERQADDRDELIVERY-STREET)			"Hübeliweg 23"
  set V[me51_anlief_string](BAPIMERQADDRDELIVERY-LANGU)				"DE"

  CopyText totext="me51_praddrdelivery" fromString="me51_anlief_string" -appendline
  Set V[i] &[i] + 1
  goto Fuellen_Anlieferadresse
endif

// Aufruf BAPI

processingOption  debugrfc="off"
call "ZZGUIXT_BAPI_PR_CREATE" in.PRHEADER="&V[me51_prheader]" in.PRHEADERX="&V[me51_prheaderx]" in.TESTRUN="&V[me51_testrun]" out.NUMBER="me51_number" out.PRHEADEREXP="me51_prheaderexp" table.PRITEM_EXT(width:3000)="me51_pritem" table.PRITEMX="me51_pritemx" table.PRADDRDELIVERY(width:1000)="me51_praddrdelivery" table.PRACCOUNT_EXT(width:3000)="me51_praccount" table.PRACCOUNTX="me51_praccountx" table.PRHEADERTEXT="me51_prheadertext" table.PRITEMTEXT="me51_pritemtext" table.RETURN(width:3000)="me51_return"

processingoption  leadingspace="off"
processingOption  debugrfc="off" 

call "BAPI_TRANSACTION_COMMIT"

Mit diesem Testbaustein werden 500 Bestellpositionenpositionen in ca. 30 sec angelegt.

Empfehlen