Seringkali selama ABAP coding muncul tugas khas - untuk menginisialisasi bidang lain dengan nilai-nilai beberapa bidang tabel internal (pilih dari tabel database, dengan memanggil FM, subrutin). Dan kode dalam hal ini sangat sederhana dalam hal algoritme, tetapi cukup banyak. Saya selalu ingin mengurangi waktu yang dihabiskan untuk operasi rutin seperti itu. Dan dia bahkan menulis metode berdasarkan penciptaan dinamis program untuk
memilih nilai referensi dengan kunci mereka dari tabel database .
Dalam komentar menunjuk
"
tidak terbaca kode " adalah bahasa mikro yang perlu Anda pelajari.
"
panggilan dinamis " -
panggilan dinamis tidak diterima, termasuk bahwa dalam hal ini log penggunaan tidak menemukan tempat untuk menggunakan tabel / bidang yang sesuai.
Sebagai alternatif, saya masih mengusulkan opsi dengan pembuatan kode otomatis, tetapi baru sekarang saya membawa alat ini ke
alat yang sudah jadi . Siapa yang peduli, tolong, di bawah kucing.
Idenya sederhana: ada seperangkat parameter dimana kode ABAP dihasilkan sesuai dengan template yang diberikan.
Mari kita ambil contoh sederhana: di tabel internal, letakkan nama bidang dengan nilai bidang . Berbicara dalam bahasa teknis pengembang:
dalam tabel internal, dengan nilai bidang BUKRS, masukkan nilai bidang BUTXT sesuai dengan tabel database T001 .
Pernyataan sederhana hanya dalam satu kalimat. Tetapi untuk mewujudkan ini, Anda harus melakukan LOOP pada tabel internal dan SELECT SINGLE dalam satu lingkaran (yang cepat, tetapi dari sudut pandang kecepatan, itu tidak terlalu disambut baik, terutama jika ada banyak baris dalam tabel internal), atau pilih nilai BUKRS unik, permintaan ke tabel database T001, dan kemudian kita meletakkan nilai yang sesuai dari bidang BUTXT melalui READ TABLE. Dalam hal ini, kodenya akan lebih optimal, tetapi penulisannya tidak begitu cepat, karena kodenya sudah banyak. Selain itu, tidak ada yang rumit di dalamnya - โmonyetโ yang hampir sederhana bekerja pada pengetikan.
Dan di sini generator otomatis datang untuk menyelamatkan, karena kode semacam itu memiliki bentuk boilerplate, yang berarti bahwa penulisan dapat otomatis.
Tentukan parameter berikut:
Tabel DB:
T001bidang komunikasi:
BUKRSbidang yang diinisialisasi:
BUTXTdan dapatkan kode yang dihasilkan berikut*-- T001 FORM values_from_tab_T001 USING "-- () uv_in_BUKRS TYPE any "-- uv_out_BUTXT TYPE any CHANGING "-- ct_table TYPE ANY TABLE . "-- ? CHECK NOT ( ct_table[] IS INITIAL ). "-- TYPES: BEGIN OF lty_item, BUKRS TYPE T001-BUKRS, BUTXT TYPE T001-BUTXT, END OF lty_item. DATA ls_item TYPE lty_item. DATA lt_item LIKE TABLE OF ls_item. FIELD-SYMBOLS <ls_item> LIKE LINE OF lt_item. FIELD-SYMBOLS <ls_table> TYPE any. FIELD-SYMBOLS <lv_BUKRS> TYPE any. FIELD-SYMBOLS <lv_BUTXT> TYPE any. "-- LOOP AT ct_table ASSIGNING <ls_table>. CLEAR ls_item. ASSIGN COMPONENT uv_in_BUKRS OF STRUCTURE <ls_table> TO <lv_BUKRS>. ls_item-BUKRS = <lv_BUKRS>. APPEND ls_item TO lt_item. ENDLOOP. "-- SORT lt_item BY BUKRS. DELETE ADJACENT DUPLICATES FROM lt_item COMPARING BUKRS. "-- SELECT BUKRS BUTXT FROM T001 INTO TABLE lt_item FOR ALL ENTRIES IN lt_item WHERE BUKRS = lt_item-BUKRS . "-- SORT lt_item BY BUKRS. "-- LOOP AT ct_table ASSIGNING <ls_table>. "-- ASSIGN COMPONENT uv_in_BUKRS OF STRUCTURE <ls_table> TO <lv_BUKRS>. ls_item-BUKRS = <lv_BUKRS>. "-- ASSIGN COMPONENT uv_out_BUTXT OF STRUCTURE <ls_table> TO <lv_BUTXT>. "-- READ TABLE lt_item ASSIGNING <ls_item> WITH KEY BUKRS = ls_item-BUKRS BINARY SEARCH. IF sy-subrc = 0. IF <lv_BUTXT> IS ASSIGNED. <lv_BUTXT> = <ls_item>-BUTXT. ENDIF. ELSE. IF <lv_BUTXT> IS ASSIGNED. CLEAR <lv_BUTXT>. ENDIF. ENDIF. ENDLOOP. ENDFORM.
Sekarang cukup menelepon subrutin yang dihasilkan di program Anda
PERFORM values_from_tab_T001 USING 'BUKRS' 'BUTXT' CHANGING lt_TABLE.
Lihat kode di situs web
generator ABAPNama-nama bidang dalam tabel internal dan tabel internal itu sendiri diteruskan sebagai parameter ke subrutin. Setelah panggilan, bidang BUTXT akan memiliki nilai yang diinginkan.
Nama bidang dalam tabel internal dibuat dalam bentuk parameter sehingga subrutin yang sama dapat dipanggil untuk bidang yang berbeda. Yaitu jika Anda memiliki dua bidang BE dalam tabel internal (misalnya, BUKRS1 dan BUKRS2), maka Anda hanya perlu membuat satu subrutin dan menyebutnya dua kali
PERFORM values_from_tab_T001 USING 'BUKRS1' 'BUTXT1' CHANGING lt_TABLE. PERFORM values_from_tab_T001 USING 'BUKRS2' 'BUTXT1' CHANGING lt_TABLE.
Dalam hal ini, "non-optimalitas" muncul, karena akan ada dua SELECT dari tabel database T001, meskipun dalam kasus ideal Anda dapat melakukan semuanya melalui satu. Tapi ini biaya otomatisasi. Tidak mungkin hal ini secara signifikan akan memperlambat pelaksanaan program, tetapi jika perlu, Anda selalu dapat "menyelesaikan" subprogram untuk kebutuhan pribadi Anda.
Anda dapat menginisialisasi beberapa bidang sekaligus, dan dalam kondisi menentukan konstanta (misalnya sy-langu, yang sering digunakan saat memilih teks). Dalam contoh standar,
nama -
nama UE dipilih sesuai dengan tabel T006A.
Saat membuat kode, tautan juga dibuat untuk membuka contoh yang dibuat di browser.
Saat ini ada beberapa template di generator:
- Definisikan struktur [+ tipe tabel] - tentukan struktur + tipe tabel + tabel tipe ini + tabel workspace + bidang-simbol tabel. Ini tidak selalu diperlukan, tetapi lebih mudah untuk menghapus yang dihasilkan daripada mengetik secara manual
- Menghapus rekaman duplikat dari tabel internal dengan bidang adalah generator yang sangat sederhana dan secara umum, kode tersebut dapat ditulis secara manual, tetapi jika ada banyak bidang, maka, menurut pendapat saya, lebih baik menggunakan templat ini.
- Pilih nilai referensi dari tabel database - template yang dijelaskan di atas
- Pilih nilai referensi - templat memungkinkan Anda untuk menetapkan nilai bidang melalui panggilan ke FM, subprogram. Dalam hal ini, panggilan di-cache.
- Pilih nilai referensi dari domain - template ini tidak memiliki parameter dan ditambahkan untuk hanya dapat menyalin kode ini ke program Anda
Saya pikir uraian terperinci tentang pengoperasian masing-masing templat tidak masuk akal, karena lebih mudah untuk melihat hasil kerjanya di
situs . Setiap templat memiliki nilai default untuk parameternya dan jika Anda adalah pengembang abap, maka Anda akan dengan cepat memahami kode tersebut.