Can add parameters to the INSERT COMMAND (IC). Then, when you insert command, your info appears in the editor. Useful for comment blocks, common section of code, etc.
governs the foreground sequence of infotypes the system will use to prompt the user during online and batch processing. You will have to code your BDC to follow that sequence of creating infotypes.
governs the dynamic event processing that will only take place during online user inputs. For BDC's you will have to create separate BDC's to handle any infotypes that are inserted dynamically by this table.
Malzemelerle uğraşırken zaman zaman ölçü dönüşümü yapmamız gerekebilir. Örneğin 1 KG kaç M2 ya da 5 Koli kaç Adet yapar gibi. Bu çevirimleri yapmak için, MARC tablosuna gidip dönüşümlerle uğraşmak yerine;
MD_CONVERT_MATERIAL_UNIT
Fonksiyonunu kullanabiliriz.
Örnek;
DATA: pmatnr LIKE mara-matnr, pmein1 LIKE mara-meins, pmein2 LIKE mara-meins, pmeng1 LIKE ekpo-menge, pmeng2 LIKE ekpo-menge.
Normalde , bir dialog ekranını çağırırken basitçe call screen metodunu kullanırırız, çağırdığımız ekran tüm ekranı kapladığı için, zaman zaman bunun olmasını istemeyiz. İstediğimiz boyutlarda popup ekranı gibi çağırmak için sonuna starting at komutunu ekleriz. Daha sonra vereceğimiz kordinatlara göre ekran gelecektir.
call screen '0300' starting at 20 11 ending at 70 24.
TAB Delimeted olarak ayrılmış bir text dosyasını ITAB'a upload etme ve daha sonra yüklenen verileri ALV olarak gösterme işlemi.
REPORT ZDTS_UPLOAD . type-pools: slis.
datA: begin of gt_data occurs 0, ad(10) type c, soyad(10) type c, end of gt_grup.
*ALV data declarations DATA: fieldcatalog TYPE slis_t_fieldcat_alv WITH HEADER LINE, gd_tab_group TYPE slis_t_sp_group_alv, gd_layout TYPE slis_layout_alv, gd_repid LIKE sy-repid, gt_events TYPE slis_t_event, gd_prntparams TYPE slis_print_alv, is_variant LIKE disvariant.
DATA : gt_fcat TYPE slis_t_fieldcat_alv, gf_fcat LIKE LINE OF gt_fcat.
DATA : layout TYPE slis_layout_alv .
PARAMETERS : FILEX LIKE RLGRAP-FILENAME DEFAULT 'C:\' OBLIGATORY.
initialization. AT SELECTION-SCREEN ON VALUE-REQUEST FOR FILEX . CALL FUNCTION 'F4_FILENAME' IMPORTING FILE_NAME = FILEX .
1000 ekranında , "Select-options" kullanırken zaman zaman direk tablo referansı ile atadığımız "search help"ler yeterli olamayabilir ya da hiç search help olmayabilir. Bu gibi durumlarda yapmamız gereken ; dinamik bir search help oluşturmaktır. Dinamik search help oluşturmak için yapmamız gereken hangi alan için kullanılacağını seçmemiz ve ITAB'ımızı oluşturduktan sonra fonksiyonumuzu çağırmaktır.
*****
Referans ile yaptığımız "select-opitons"lar da arkasında hangi search help veya checktable varsa onun içeriğini getirir.
Örneğin,
Select-Opitons:
So_BUKRS for BSEG-BUKRS.
Tanımlamasını yaptığımızda, SO_BUKRS'nin içi BSEG-BUKRS alanının C_T001 isimli search help'i ile otomatik olarak dolmaktadır . Yukarıda ki resimde gördüğünüz gibi , hangi alan hangi search help'e veya check table'a bağlanmış görebiliriz. Her zaman search help olmayabilir =)
Örneğin ZSINIF bir tablomuz olsun ve onun OBJID alanıiçinsearch help yazalım.
Sütun isimleri de ;
NO,
AD ,
SOYAD,
..
..
..
OBJID olsun.
Gelelim dinamik search help oluşturmaya.
Report Z_DINAMIK_SEARCHELP.
*Değişkenleri tanımlıyoruz.
Data:
So_OBJ for ZINIF-OBJID.
*Internal Table tanımlaması
*Kullanıcı F4 e bastığında karşısında ne görecek buradan belirliyoruz
*Tablonu tüm sütunlarını listelemeye gerek yok o yüzden hangilerini göstereceğimizi
*seçiyoruz
Begin of gt_data occurs 0,
OBJID like ZINIF-OBJID,
NO like ZINIF-NO,
AD like ZINIF-AD,
SOYAD like ZINIF-SOYAD,
End of gt_data.
*Select-options'da hem LOW hemde HIGH için aynı işlemleri yaparız böylece Select-Options için oluşan iki kutucuğun da search help' i olmasını sağlarız.
AT SELECTION-SCREEN ON VALUE-REQUEST FOR SO_OBJ-LOW.
CALL FUNCTION 'F4IF_INT_TABLE_VALUE_REQUEST'
EXPORTING
retfield= 'OBJID'"seçim sonucu hangi alanı yazdıracağız, burada AD yazarsak seçili AD satırını so_obj-low alanına yazdırır.
dynpprog= sy-repid "program adı
dynpnr= '1000'"ekran numarası
dynprofield = 'SO_OBJ-LOW' "ekrandaki alan adının LOW kısmı
value_org= 'S' "iki değer almaktadır C ve S , C : cell by cell , S: structured
TABLES
value_tab= gt_data. "Doldurduğumuz tablonun adını buraya yazıyoruz
*High için
AT SELECTION-SCREEN ON VALUE-REQUEST FOR SO_OBJ-HIGH.
CALL FUNCTION 'F4IF_INT_TABLE_VALUE_REQUEST'
EXPORTING
retfield= 'OBJID'
dynpprog= sy-repid
dynpnr= '1000'
dynprofield = 'SO_OBJ-HIGH'
value_org= 'S'
TABLES
value_tab= gt_data.
*Bu işlemler bittikten sonra program çalışır çalışmaz tetiklenen INITIALIZATION sekmesinde GT_DATA isimli ITAB'ımızı doldururz böylece kullanıcı F4 e bastığı anda veriler karşısına gelir.
INITIALIZATION.
Perform Generate_DATA_SearchHelp."ITAB'ımızı dolduracak olan form
START-OF-SELECTION.
Perform …
Perform …
Perform …"buralarda kendi perform işlemlerimizi yapıyoruz SEARCH_HELP'den bağımsız olarak
ALV'mizi gösterirken, üzerinde bazı değişiklikler sütunlara özel işlemler yapmamız gerekebilir. Bu gibi durumlarda REUSE_ALV_FIELDCATALOG_MERGE fonksiyonunu kullanıp daha sonra üretilen fieldcatalog'da looplar yapıp değişiklik yapmak yerine , sıfırdan manuel olarak fieldcatalog yaratmak en temiz yöntemdir. Hem yukarıda ki fonksiyonda karşılaştığımız sorunlar ortaya çıkmayacaktır (örneğin like yerine type ile tanımladığımız sütun isimleri gibi) hem de her sütuna özel işlemi çok rahat bir biçimde yapabilme imkaanımız olacaktır.
Verileri okuyup ITAB'ımızı (internal table) doldurduğumuzu varsayıyorum. ITAB'ımız da şöyle olsun,
data: begin of gt_itab occurs 0, sira type i, ad(10) type c, soyad(10) type c, no(10) type c, end of gt_itab.
*** ALV için değişkenler . DATA : gt_fcat TYPE slis_t_fieldcat_alv, gf_fcat LIKE LINE OF gt_fcat. DATA : layout TYPE slis_layout_alv . DATA : variant TYPE disvariant . **************** start-of-selection. perform read_data. "ITAB ımız burada doldu. perform generate_fcat. "fieldcatalog işlemleri perform display_alv. "ALV yi görüntüleme end-of-selection. **************** ITAB'ımızı veri ile doldurduktan sonra fieldcatalog yaratma kısmına geçebiliriz.
FORM appalv USING p_fn p_tn p_txt p_fix p_key p_no_zero . CLEAR gf_fcat. gf_fcat-fieldname = p_fn . "ITAB da tanımladığımız sütun adı gf_fcat-tabname = p_tn . "ITAB adı gf_fcat-seltext_m = p_txt . "ALV de görünecek sütun başlığı gf_fcat-fix_column = p_fix . "İşaretlendiği takdirde sütunu sabitleyecektir gf_fcat-key = p_key . "Anahtar bir alan mı ? gf_fcat-no_zero = p_no_zero . "Soldaki sıfırlar silinsin mi ?
APPEND gf_fcat TO gt_fcat.
ENDFORM.
Bu işlemler bittikten sonra, tek yapacağımız ALV Display fonksiyonunu çalıştırmak. FORM DISPLAY_ALV.
CALL FUNCTION 'REUSE_ALV_LIST_DISPLAY' EXPORTING it_fieldcat = gt_fcat "oluşturduğumuz fieldcatalog is_variant = variant "variantlar olsun mu ? i_save = 'A' "variantlar kaydedilebilsin mi ? i_callback_program = 'Programızın adı büyük harflerle' "program adı buraya
TABLES t_outtab = gt_itab. "ITAB adını buraya yazıyoruz
ENDFORM.
**************************************************************** Manuel olarak yarattığımız FieldCatalog'da daha bir sürü opsiyon mevcuttur. Örneğin, istediğiniz sütunu checkbox yapabilir, istediğiniz sütunu gizleyebilir, düzenlenebilir (editable) yapabilir, renklendirebilir ve daha bir çok opsiyonla değiştirebilirsiniz. Esnek olduğu için müdahele etmek çok basittir.
Fakat REUSE_ALV_FIELDCATALOG_MERGE metodunu kullanarak oluşturduğunuz fieldcataloglarda değişiklik yapmak için epey takla atmanız gerekecektir. Yine de ihtiyacınız ve zamanınız doğrultusunda istediğinizi seçebilirsiniz =).
Kur dönüşümü için kullanılabilecek birden fazla fonksiyon mevcuttur, bizim kullanacağımız ise "CONVERT_TO_LOCAL_CURRENCY" fonksiyonudur.
CALL FUNCTION 'CONVERT_TO_LOCAL_CURRENCY' EXPORTING date = '20080716' "buraya kur dönüşüm için baz alınacak tarih değişkeniniz gelecek foreign_amount = '1000' "buraya dönüştürülecek tutar girilecek foreign_currency = 'EUR' "hangi para biriminden dönüştürülüyor local_currency = 'TRY' "hangi para birimine dönüştürülüyor IMPORTING local_amount = p_local_amount"dönüştürülen tutarı tutacak olan değişkenimiz EXCEPTIONS no_rate_found = 1 overflow = 2 no_factors_found = 3 no_spread_found = 4 derived_2_times = 5 OTHERS = 6.
IF sy-subrc <> 0. MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4. ENDIF.
Daha önceden tanımladığımız "p_local_amount" değişkeninin 1000 EURO'nun TRY karşılığında ki değeri olduğunu fonksiyon bitiminde görürüz. ******** Sistemde EUR > TRY ve TRY > USD dönüşümü var ise ve biz 1000 EUR değerinin USD karşılığını istiyorsak, fonksiyonda ayrı ayrı önce EUR'dan TRY'ye daha sonra TRY'den de USD ye çevirmeye GEREK YOKTUR. Fonksiyon çapraz kur dönüşümünü kendisi yapacaktır.
******** Not : Eğer belirtilen tarihte bir kur girişi yapılmadı ise, sistem ona en yakın tarihi alacaktır. Eğer kur dönüşüm için hiç bir veri yoksa , fonksiyon hata verecektir.
* selection-screen leri tanımlarız select-options : s_matnr for marc-matnr, s_werks for marc-werks.
* Ana objelerimizi tanımlıyoruz DATA restrict TYPE sscr_restrict.
* Sınırlandırmada kullanacağımız değişkenler DATA : optlist TYPE sscr_opt_list, ass type sscr_ass.
INITIALIZATION.
* MATNR nin sadece EQ ve 'BT' olarak *seçilebilmesini sağlayalım. optlist-name = 'OBJECTKEY1'. optlist-options-eq = 'X'. optlist-options-bt = 'X'. APPEND optlist TO restrict-opt_list_tab.
ass-kind = 'S'. ass-name = 'S_MATNR'. ass-sg_main = 'I'. ass-sg_addy = space. ass-op_main = 'OBJECTKEY1'. APPEND ass TO restrict-ass_tab.
* WERK alanın da CP, GE, LT, NE ile sınırlayalım. optlist-name = 'OBJECTKEY2'. optlist-options-cp = 'X'. optlist-options-ge = 'X'. optlist-options-lt = 'X'. optlist-options-ne = 'X'. APPEND optlist TO restrict-opt_list_tab.
ass-kind = 'S'. ass-name = 'S_WERKS'. ass-sg_main = 'I'. ass-sg_addy = space. ass-op_main = 'OBJECTKEY2'. APPEND ass TO restrict-ass_tab.
CALL FUNCTION 'SELECT_OPTIONS_RESTRICT' EXPORTING restriction = restrict EXCEPTIONS TOO_LATE = 1 REPEATED = 2 SELOPT_WITHOUT_OPTIONS = 3 SELOPT_WITHOUT_SIGNS = 4 INVALID_SIGN = 5 EMPTY_OPTION_LIST = 6 INVALID_KIND = 7 REPEATED_KIND_A = 8 OTHERS = 9 . IF sy-subrc <> 0. MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4. ENDIF.
Birinci yol, 1000 ekranında daha raporumuzun içinde ki seçim durumları ekrana gelmeden çalışan "AT SELECTION-SCREENOUTPUT" sekmesinde yapılanıdır. ************************************************** select-options: SO_BELNR for bkpf-belnr modif id g1. ... ... AT SELECTION-SCREENOUTPUT. LOOPATSCREEN. CASEscreen-group1. WHEN'G1'. screen-active = '0'. MODIFYSCREEN. ENDCASE. ENDLOOP.
************************************************** İkinci yol ise, No-Display kullanmaktır.
Varolan bir değişkendeki içeriğin soluna , değişkenin uzunluğunu doldurana kadar sıfır koyar. Örneğin malzeme numarasını sorgulayacaksak ve elimizde o uzunluğa uygun bir veri yoksa , sorgulama başarısız olacaktır. Örneğin "123" ile malzeme numarası bazında sorgulama yapamayız, onu aşşağıda ki fonksiyonu kullanarak "0000000123" formatına çevirmemiz gerekir.
Aşşağıda "123" sayısının char18 tipinde tanımlanan bir değişken ile kullanılışı gösterilmektedir.
Aynı şekilde, "000000000000000123" olarak girilmiş bir değerin solundaki sıfırlardan kurtulmak istiyorsak; CONVERSION_EXIT_ALPHA_OUTPUT fonksiyonunu kullanabiliriz.
* Split işlemi DATA: LIST(40), NAME_1(25), NAME_2(25), NAME_3(25). LIST = 'Edison,Smith,Young'. SPLIT LIST AT ',' INTO NAME_1 NAME_2 NAME_3. WRITE: / NAME_1, NAME_2, NAME_3.
*Stringleri split ederek bir internal tabloya atma DATA NAMES LIKE NAME_1 OCCURS 10 WITH HEADER LINE. LIST = 'Edison,Smith,Young,Edwards'. SPLIT LIST AT ',' INTO TABLE NAMES. LOOP AT NAMES. WRITE / NAMES. ENDLOOP.
*Shift Up To kullanımı NAMES = 'Alexander Bill Charles'. SHIFT NAMES UP TO 'Bill'. WRITE / NAMES.
*Boşlukları silerek shift işlemi NAMES = 'Joanne___'. SHIFT NAMES RIGHT DELETING TRAILING SPACE. WRITE / NAMES.
* Replacing & translating . DATA: STRING(80), EXPRESSION(30). STRING = 'Variable: &. The variable & is substituted later.'. REPLACE '&' WITH 'X' INTO STRING. WRITE / STRING. TRANSLATE STRING USING '&X'. WRITE / STRING. EXPRESSION = 'a ** 2 + b ** 2 = c ** 2'. TRANSLATE EXPRESSION USING 'axbycz'. WRITE / EXPRESSION.
REPLACE ',' WITH '' INTO lv_degisken.
REPLACE ALL OCCURRENCES OF ',' IN lv_degisken WITH ''.
*ITAB da aradığımız string var mı ? DATA TEXT(100) VALUE 'Texas California New Mexico Louisiana Oregon'. SEARCH TEXT FOR 'California'. IF SY-SUBRC NE 0. WRITE 'Not found'. ENDIF. SEARCH TEXT FOR 'cAliforniA'. IF SY-SUBRC NE 0. WRITE 'Not found'. ENDIF. SEARCH TEXT FOR 'New M'. IF SY-SUBRC NE 0. WRITE 'Not found'. ENDIF.
*Fieldların belli parçalarını alma DATA: S(8) VALUE 'ABCDEFGH', T(8) VALUE '12345678', OFF1 TYPE I, OFF2 TYPE I, LEN1 TYPE I, LEN2 TYPE I.
OFF1 = 2. LEN1 = 3. OFF2 = 4. LEN2 = 3. MOVE S+OFF1(LEN1) TO T+OFF2(LEN2). WRITE / T.
*İşlemin ne kadarının tamamlandığını ve ne kadarının kaldığını gösterir
REPORT Z_Progress.
TYPES: BEGIN OF t_mara, matnr LIKE mara-matnr, END OF t_mara. DATA: it_mara TYPE STANDARD TABLE OF t_mara INITIAL SIZE 0, wa_mara TYPE t_mara. DATA: mara_lines TYPE i, gd_percent TYPE i.