Uzun bir aradan sonra bir ABAP raporu ile tekrar buradayım. Bu raporumuzda malzeme ana verisinde malzeme sınıfı altında girilen karakteristik değerlerini bir rapor şeklinde kullanıcıya göstermeye çalışacağız.
Yukarıdaki ekranlarda da görüldüğü üzere malzeme ana verisinde girilen karakteristikleri malzemelerde toplu görmek için malzemeleri dolaşmak bir problemdir. Bu soruna çözüm olarak aşağıdaki girdiyi alan;
Sonuç olarak aşağıdaki şekilde çıktı veren raporu yazacağız.
İlk adım olarak raporumuzda kullanacağımız değişkenleri ve tanımlamaları yapalım.
TYPE-POOLS: SLIS.
TABLES: MARA, MAKT, CABNT, CABN, T006A, AUSP.
DATA: BEGIN OF GT_METADATAS OCCURS 0,
MATNR LIKE MARA-MATNR, " Malzeme no
MAKTX LIKE MAKT-MAKTX, " Malzeme tanımı
atinn LIKE AUSP-ATINN, " karakteristik
ATBEZ LIKE CABNT-ATBEZ, " Karakteristik tanımı
MSEHI LIKE CABN-MSEHI, "Ölçü Birimi
ATWRT LIKE AUSP-ATWRT, " Karakter karakteristik değeri
ATFLV LIKE AUSP-ATFLV, " Sayısal Alt değer
ATFLB LIKE AUSP-ATFLB, " Sayısal üst değer
MSEH6 LIKE T006A-MSEH6, " Ölçü birimi teknik tanımı
SPRAS LIKE T006A-SPRAS, " dil
ATFOR LIKE CABN-ATFOR, " veri tipi
ANZST LIKE CABN-ANZST, " Karakter uzunluğu
ANZDZ LIKE CABN-ANZDZ, " ondalık karakter sayısı
DEGER1 TYPE C LENGTH 10, " numerik değer alt
DEGER2 TYPE C LENGTH 10, " numarik değer üst
END OF GT_METADATAS.
DATA: FCAT TYPE SLIS_T_FIELDCAT_ALV.
DATA: LAYOUT TYPE SLIS_LAYOUT_ALV.
DATA: VARYANT TYPE DISVARIANT.
VARYANT-REPORT = SY-REPID.
VARYANT-USERNAME = SY-UNAME.
Tanımlamaları yaptıktan sonra kullanıcıdan alacağımız parametre tanımlarını yapalım.
SELECTION-SCREEN BEGIN OF BLOCK PARAMETERS WITH FRAME TITLE TEXT-001.
SELECT-OPTIONS:
P_MATNR FOR MARA-MATNR,
P_MATKL FOR MARA-MATKL.
SELECTION-SCREEN END OF BLOCK PARAMETERS.
START-OF-SELECTION.
IF P_MATNR[] IS INITIAL AND P_MATKL[] IS INITIAL.
MESSAGE 'Malzeme numarası veya Mal Grubundan biri girilmeli'
TYPE 'S' DISPLAY LIKE 'E'.
CHECK 1 EQ 2.
ENDIF.
Burada START-OF-SELECTION kısmında malzeme numarası veya mal gruplarından birinin doldurulması şartını sorguluyoruz. İkisi de boş ise CHECK ile işlem iptal edilmektedir.
Daha sonra aşağıdaki sorgu ile gerekli veriler sorgulanarak GT_METADATAS tablosuna aktarılıyor.
SELECT
MR~MATNR MT~MAKTX AP~ATWRT
AP~ATFLV AP~ATFLB AP~ATINN
CN~ATFOR CN~ANZST CN~ANZDZ
CN~MSEHI CT~ATBEZ TA~MSEH6
TA~SPRAS
FROM MARA AS MR
JOIN MAKT AS MT ON MR~MATNR EQ MT~MATNR
JOIN AUSP AS AP ON MR~MATNR EQ AP~OBJEK
JOIN CABN AS CN ON AP~ATINN EQ CN~ATINN
JOIN CABNT AS CT ON CN~ATINN EQ CT~ATINN
LEFT JOIN T006A AS TA ON CN~MSEHI EQ TA~MSEHI
INTO CORRESPONDING FIELDS OF TABLE GT_METADATAS
WHERE AP~OBJEK IN P_MATNR
AND MR~MATKL IN P_MATKL.
DELETE GT_METADATAS WHERE SPRAS IS NOT INITIAL AND SPRAS NE SY-LANGU.
Sorgulama sonucunda karakteristik değerin ölçü birimi tanımını almak için T006A tablosuna gidilmektedir. Ancak bütün karakteristik değerlerin ölçü birimi olmadığından LEFT JOIN ile bağlamak gerekiyor. LEFT JOIN kuralı gereği sadece bir dile ait tanımı getir dile şart verilemediğinden 17. satırda dil tanımı boş olmayan ve kullanıcının giriş yaptığı dil dışındaki tanımlamaları GT_METADATAS tablosundan siliyoruz.
Verileri aldıktan sonra numerik değer 1,2000000000000000E+00 şeklinde bilimsel gösterimde olduğundan öncelikle bu değerlerin kullanıcının okuyabileceği 12.,00 gibi değerlere dönüştürülmesi gerekmektedir. Bu işlem için FLTP_CHAR_CONVERSION fonksiyonunu kullanıyoruz. Fonksiyonda yer alan DECIM parametresi virgülden sonra kaç karakter olacağını belirtiyor.
LOOP AT GT_METADATAS WHERE ATFOR EQ 'NUM'.
CALL FUNCTION 'FLTP_CHAR_CONVERSION'
EXPORTING
DECIM = GT_METADATAS-ANZDZ
EXPON = 0
INPUT = GT_METADATAS-ATFLV
IVALU = 'X'
* MASKN = ' '
IMPORTING
FLSTR = GT_METADATAS-DEGER1.
" Değerleri tek kolonda görmek için atama yapıldı
GT_METADATAS-ATWRT = GT_METADATAS-DEGER1.
CALL FUNCTION 'FLTP_CHAR_CONVERSION'
EXPORTING
DECIM = GT_METADATAS-ANZDZ
EXPON = 0
INPUT = GT_METADATAS-ATFLB
IVALU = 'X'
* MASKN = ' '
IMPORTING
FLSTR = GT_METADATAS-DEGER2.
MODIFY GT_METADATAS.
ENDLOOP.
Bu işlemlerden sonra verileri ekrana gösteriyoruz. Bu işlem için aşağıdaki kodu kullanıyoruz.
FORM SHOWDATA .
DATA: I_SORT TYPE SLIS_SORTINFO_ALV,
IT_SORT TYPE SLIS_T_SORTINFO_ALV.
I_SORT-SPOS = 1.
I_SORT-FIELDNAME = 'MATNR'.
APPEND I_SORT TO IT_SORT.
I_SORT-SPOS = 2.
I_SORT-FIELDNAME = 'MAKTX'.
APPEND I_SORT TO IT_SORT.
CALL FUNCTION 'REUSE_ALV_FIELDCATALOG_MERGE'
EXPORTING
I_PROGRAM_NAME = SY-REPID
I_INTERNAL_TABNAME = 'GT_METADATAS'
I_INCLNAME = SY-REPID
CHANGING
CT_FIELDCAT = FCAT[].
PERFORM SET_FCAT.
LAYOUT-COLWIDTH_OPTIMIZE = 'X'.
CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
EXPORTING
I_CALLBACK_PROGRAM = SY-REPID
IS_LAYOUT = LAYOUT
IT_FIELDCAT = FCAT[]
I_SAVE = 'A'
IS_VARIANT = VARYANT
IT_SORT = IT_SORT
TABLES
T_OUTTAB = GT_METADATAS.
ENDFORM. " SHOWDATA
*&---------------------------------------------------------------------*
*& Form SET_FCAT
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
FORM SET_FCAT .
DATA: FCATROW LIKE LINE OF FCAT.
LOOP AT FCAT INTO FCATROW.
CASE FCATROW-FIELDNAME.
WHEN 'MSEHI'.
FCATROW-TECH = 'X'.
WHEN 'SPRAS'.
FCATROW-TECH = 'X'.
WHEN 'ATFOR'.
FCATROW-TECH = 'X'.
WHEN 'ANZST'.
FCATROW-TECH = 'X'.
WHEN 'ANZDZ'.
FCATROW-TECH = 'X'.
WHEN 'ATFLB'.
FCATROW-TECH = 'X'.
WHEN 'ATFLV'.
FCATROW-TECH = 'X'.
WHEN 'DEGER1'.
FCATROW-SELTEXT_S = 'Alt Değer'.
FCATROW-SELTEXT_M = 'Alt Değer'.
FCATROW-SELTEXT_L = 'Alt Değer'.
FCATROW-REPTEXT_DDIC = 'Alt Değer'.
FCATROW-TECH = 'X'.
WHEN 'DEGER2'.
FCATROW-SELTEXT_S = 'Üst Değer'.
FCATROW-SELTEXT_M = 'Üst Değer'.
FCATROW-SELTEXT_L = 'Üst Değer'.
FCATROW-REPTEXT_DDIC = 'Üst Değer'.
FCATROW-TECH = 'X'.
ENDCASE.
MODIFY FCAT FROM FCATROW.
ENDLOOP.
ENDFORM. " SET_FCAT
IT_SORT tablosuna eklenen alanlar ile gösterilecek ALV’de var sayılan olarak neye göre sıralanacağını söylüyoruz.
SET_FCAT fonksiyonunda kullandığımız FCATROW-TECH = ‘X’. satırı ile ilgili alanın gösterilmeyeceğini söylüyoruz.
Kodun tamamına aşağıdaki linkten ulaşabilirsiniz.
https://github.com/saitorhan/ABAPRapor/blob/main/ZMalzemeKarakteristik.abap
Ek olarak tek bir malzeme için sorgulama yapmak için CLAF_CLASSIFICATION_OF_OBJECTS fonksiyonu da kullanılabilir. Bizim burada direk tablolardan okuma sebebimiz birden fazla malzeme için hızlı dönüş sağlamaktır.
Udemy üzerinde yer alan ABAP eğitimime kaydolmak için aşağıdaki linki kullanabilirsiniz.
https://www.udemy.com/course/sapabapprogramlama/?referralCode=4D0F06C484A69E9AF3AA