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.
Hi ,
I wonder if it is possible to use GuiXT directly to call BAPI for sale order create
Thanks,
Ziv Marcovich
No wunder, when you use the InputAssistant and you have declared an RFC User it runs.