SAP üzerinde iki farklı programın birbirleri ile arasında ilişki kurmak istendiği zaman kullanılan submit and return yapısı bazı senaryolar için vazgeçilmez bir yöntemdir.
Bir abap raporu hazırlanmak istendiğinde bu raporun verileri başka bir programın türettiği veriler ile sunulmak istenirse, istenilen rapora ilgili parametrelerle submit işlemi yapılır ve dönen liste memory üzerinden alınarak istenilen tablo tipine çevrilir ve üzerinde her türlü işlemler yapıldıktan sonra tekrar sunulabilir. Böylelikle bir programın türettiği veriler başka bir programda yeniden kodlama yapılmasına gereksinim duyulmadan farklı şekillerde sunulabilir. Bu konuyla ilgili olarak örnek program ve kodlar aşağıdaki gibidir.
İlk olarak basit bir alv raporu türeten programımızı hazırlıyoruz. Demo olarak oluşturduğumuz bir tablodaki verileri üretim yeri parametresi ile olduğu gibi bir alv raporu olarak ekrana yansıtıyoruz.
REPORT ZDEMO_1. PARAMETERS : P_WERKS TYPE WERKS_D. START-OF-SELECTION. SELECT * INTO TABLE @DATA(LT_DEMO_TABLE) FROM ZDEMO_TABLE WHERE WERKS EQ @P_WERKS.


Daha sonra birinci programın sonuç listesini kullanarak oluşturacağımız ikinci programın yazımına geçiyoruz.
REPORT ZLRNG_P_DEMO1. TYPES: BEGIN OF LISTOUT, LINE(1024) TYPE C, END OF LISTOUT. DATA : LS_LISTOUT TYPE LISTOUT. DATA : LT_LISTOUT TYPE TABLE OF LISTOUT. DATA : LIST_TAB TYPE TABLE OF ABAPLIST. *TYPES : LT_DEMO_TABLE TYPE TABLE OF ZDEMO_TABLE. DATA : LS_DEMO_TABLE TYPE ZDEMO_TABLE. DATA : LT_DEMO_TABLE TYPE TABLE OF ZDEMO_TABLE. " Submit Demo 1 Program With Parameters SUBMIT ZDEMO_1 WITH P_WERKS = '1000' AND RETURN EXPORTING LIST TO MEMORY. " Get Data List From Memory ( Demo 1 Program Result List ) REFRESH LIST_TAB. CALL FUNCTION 'LIST_FROM_MEMORY' TABLES LISTOBJECT = LIST_TAB EXCEPTIONS NOT_FOUND = 1 OTHERS = 2. CHECK SY-SUBRC = 0. " Convert List Data to ASCI standart CALL FUNCTION 'LIST_TO_ASCI' TABLES LISTOBJECT = LIST_TAB LISTASCI = LT_LISTOUT EXCEPTIONS EMPTY_LIST = 1 LIST_INDEX_INVALID = 2 OTHERS = 3. CHECK SY-SUBRC = 0. " Delete Write List Header and Footer Lines DO 3 TIMES. DELETE LT_LISTOUT INDEX 1. ENDDO. DESCRIBE TABLE LT_LISTOUT LINES DATA(LV_LINE). DELETE LT_LISTOUT INDEX LV_LINE. " Append List to Table Type LOOP AT LT_LISTOUT INTO LS_LISTOUT. LS_DEMO_TABLE-MATNR = LS_LISTOUT-LINE+11(9). LS_DEMO_TABLE-WERKS = LS_LISTOUT-LINE+21(10). DATA(LV_TARIH) = LS_LISTOUT-LINE+32(10). LS_DEMO_TABLE-URETIM_TARIHI = LV_TARIH+6(4) && LV_TARIH+3(2) && LV_TARIH+0(2). DATA(LV_COST) = LS_LISTOUT-LINE+43(5). REPLACE ALL OCCURRENCES OF ',' IN LV_COST WITH '.'. LS_DEMO_TABLE-COST = LV_COST. APPEND LS_DEMO_TABLE TO LT_DEMO_TABLE. ENDLOOP. CALL FUNCTION 'LIST_FREE_MEMORY'. " Display Table To ALV CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY' EXPORTING I_STRUCTURE_NAME = 'ZDEMO_S_TABLE' TABLES T_OUTTAB = LT_DEMO_TABLE.
Yukarıda ki kodlama sırasıyla şu şekildedir.
İlk olarak submit sonucunda alacağımız tablo tipine uygun LISTOUT ve structure tanımlamaları yapılıyor. daha sonrasında en son olarak ekrana bastıracağımız tablo tipine ilişkin tanımlamalar yapılıyor.
SUBMIT kod bloğunda ise, birinci programın alacağı werks parametresini ekran adına göre belirleyerek istediğimiz parametreyi belirtiyoruz. An Return Exporting List To Memory ile birinci programda parametreye göre dönüş yapan listeyi memory üzerinde tutuyoruz.
Memory’deki listeyi almak için List_From_Memory fonksiyonu kullanıyoruz. Bu fonksiyonda bize memory üzerindeki listenin ASCI’ye uygun olmadığını göreceksiniz. Bunu ASCI formatına çevirmek için List_to_Asci fonksiyonuna çeviriyoruz. Dönüş tablosunda Write ile bastırılmış bir tablo göreceksiniz. Artık birinci programdaki listenin ham halini elimizde bulunduruyoruz. Ancak bu listeyi parçalayarak istediğimiz bir tablo tipine aktarmamız gerekiyor. Loop işlemi ile istediğimiz alanları karakter sayılarına göre alıp tablo tipine aktarıyoruz. Daha sonra oluşan tablomuzu istediğiniz şekilde üzerinde hangi işlemi yapmak isterseniz size kalmış. Bu tabloyu ekrana bastırdıktan sonra işlemi tamamlıyoruz.
