Teknoloji etiketine sahip kayıtlar gösteriliyor. Tüm kayıtları göster
Teknoloji etiketine sahip kayıtlar gösteriliyor. Tüm kayıtları göster

22 Nisan 2018 Pazar

BAPI Structure Dinamik Doldurma ve xStructure Dinamik İşaretleme


Bir çoğunuzun önceden de bildiği gibi BAPI'ler çoğu zaman ikili yapı kullanırlar.
İlk yapıda veri alınırken, ikinci yapıda alınan veri doğrulanır. Bu doğrulama işlemi çarpılayarak yapılır. Bu işlem o alanın güncelleneceği/yaratılacağı anlamına gelir.

Örneğin;

1
2
3
4
5
6
mystrucute-myfield = 0.005.
mystrucutex-myfield = 'X'.
mystrucute-yourfield = 'Ali'.
mystrucutex-yourfield = 'X'.
mystrucute-ourfield = '0085066996'.
mystrucutex-ourfield = ''.   //Ilk iki alan guncellenirken bu alan guncellemeyecek.

Veri alma ve doğrulama işlemi yüzlerce satırı bulabilir. Veritabanından alınan veriler tek tek BAPI structure ile eşlenir bunun yanında xStructure tek tek işaretlenir.

Örnek BAPI (Sadece bir kısmı)

Database tablolarına çok benzeyen BAPI structure'larını doldurmak için SAP'nin sunduğu Mapping fonksiyonları kullanılabilir.

Bu fonksiyonlar external->internal veya internal->external mantığı ile çalışır.

Örneğin; bapi_marc -> marc veya marc->bapi_marc şeklinde. Bu şekilde koca structure'ı kolaylıkla tamamlayabilirsiniz. Örneğin;

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
Select Single *
 From mard
 Into ls_mard
 Where matnr = lv_matnr
   And lgort = lv_lgort.

Check sy-subrc Is Initial.

Call Function 'MAP2E_MARD_TO_BAPI_MARD'
 Exporting
  mard      = ls_mard
 Changing
  bapi_mard = ls_bapi_mard.


Bu fonksiyonlar sistemde her zaman oluşturulmuş halde bulunamayabilirBDBS işlem kodundan kolaylık üretilebilir.

Ancak SAP dinamik işaretleme için bir fonksiyon sağlamıyor. Bunu kendimiz yapabiliriz. Benim çözümüm aşağıdaki gibi.

Local Interface:
Importing: iv_stname Type ddobjname
Changing: cv_structure ve cv_structurex


 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
DATA lt_fields TYPE STANDARD TABLE OF x031l WITH HEADER LINE.

FIELD-SYMBOLS: <st> TYPE ANY.
FIELD-SYMBOLS: <stx> TYPE ANY.
FIELD-SYMBOLS: <line> TYPE x031l.

CALL FUNCTION 'DDIF_NAMETAB_GET'
  EXPORTING
    tabname = iv_stname
  TABLES
    x031l_tab = lt_fields
  EXCEPTIONS
    not_found = 1
    OTHERS = 2.

CHECK sy-subrc = 0.

LOOP AT lt_fields ASSIGNING <line>.
  ASSIGN COMPONENT <line>-fieldname OF 
  STRUCTURE cv_structurex TO <stx>.
  CHECK <stx> IS ASSIGNED.
  ASSIGN COMPONENT <line>-fieldname OF 
  STRUCTURE cv_structure TO <st>.
  CHECK <st> IS ASSIGNED.
  IF <st> IS INITIAL.
    CLEAR <stx>.
  ELSE.
    <stx> = 'X'.
  ENDIF.
ENDLOOP.

ENDFUNCTION.

Örnek fonksiyon call ise;

1
2
3
4
5
6
CALL FUNCTION 'Z_XXXXXXXXXXXX'
  EXPORTING
    iv_stname = 'BAPI_MARD'
  CHANGING
    cv_structure = ls_bapi_mard
    cv_structurex = ls_bapi_mardx.

Eğer xStructure'da tipi char1 olmayan, anahtar alan var ise bunu doldurmayı unutmayın. Bu özelliği eklememiştim :)

Bu iki fonksiyonu kullanarak yüzlerce satır sürece doldurma ve doğrulama işlemini çok daha hızlı yapabilirsiniz :)

25 Kasım 2017 Cumartesi

Dynamic Dropdown List Values in ALV

I created an OO ALV which has a dropdown list column, for new custom screen. But the dropdown lists should be filled dynamically not statically. So I did a little research on the internet and no result :) Some people even says, it does not seem possible. I made and want to share :)

I used demo tables SFLIGHT and SBOOK. The program lists flights and customers for the each flight but in dropdown list. Look at the screenshots you will get it what i try to explain.

Dinamik Dropdown List 1

Dinamik Dropdown List 2

Dinamik Dropdown List 3


It is easier to unterstand code by runnig than by reading. Because of that reason, I wrote the sample code as copy, past and run code. Dont forget to create Screen 0100 and Container CONT0100.


  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
REPORT z_xxxx.
"Extended version of sflight table. results for the dropdown values and keyc for the differention of the values 
DATA: BEGIN OF gt_flights_extended OCCURS 0.
            INCLUDE STRUCTURE sflight.
            DATA:  result(15).
            DATA:   keyc TYPE int4,
      END OF gt_flights_extended.
*Container definitions
DATA: r_container100 TYPE REF TO cl_gui_custom_container,
      r_grid100      TYPE REF TO cl_gui_alv_grid.
*table for the dropdown data
DATA: gt_dropdown  TYPE lvc_t_drop,
      gs_dropdown  TYPE lvc_s_drop.
*variable as a counter. it helps to differentiate
DATA: gv_counter TYPE int4 VALUE 0.
*Catalog/layout 
DATA: gt_fieldcat  TYPE lvc_t_fcat WITH HEADER LINE,
      gs_layout    TYPE lvc_s_layo.

INITIALIZATION.

  PERFORM retrieve_data.
  PERFORM create_catalog.
  PERFORM show_alv_and_screen.

*&---------------------------------------------------------------------*
*&      Form  retrieve_data
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
FORM retrieve_data.

  SELECT * FROM sflight INTO CORRESPONDING FIELDS OF gt_flights_extended UP TO 50 ROWS.
*use counter for each row
    gv_counter = gv_counter + 1.
    gt_flights_extended-keyc = gv_counter.
    APPEND gt_flights_extended.
*retrieve customer id for each row
    SELECT customid FROM sbook INTO (gs_dropdown-value) UP TO 10 ROWS
      WHERE carrid = gt_flights_extended-carrid AND connid = gt_flights_extended-connid AND  fldate = gt_flights_extended-fldate.
*use counter while saving customerid for coupling
      gs_dropdown-handle = gv_counter.
      APPEND gs_dropdown TO gt_dropdown.

    ENDSELECT.

  ENDSELECT.

ENDFORM.                    "retrieve_data

*&---------------------------------------------------------------------*
*&      Form  create_catalog
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
FORM create_catalog.

  gt_fieldcat-fieldname  = 'CARRID'.
  gt_fieldcat-coltext = 'CARRID'.
  APPEND gt_fieldcat .

  gt_fieldcat-fieldname  = 'CONNID'.
  gt_fieldcat-coltext = 'CONNID'.
  APPEND gt_fieldcat .

  gt_fieldcat-fieldname  = 'FLDATE'.
  gt_fieldcat-coltext = 'DATE'.
  APPEND gt_fieldcat .
*Dropdown list tanımı böyle yapılmalı
  gt_fieldcat-fieldname  = 'RESULT'.
  gt_fieldcat-coltext = 'Results'.
  gt_fieldcat-checktable = '!'.
  gt_fieldcat-edit  = 'X'.
  gt_fieldcat-drdn_hndl = 1.
  gt_fieldcat-drdn_field = 'KEYC'.
  APPEND gt_fieldcat .

  gs_layout-zebra = 'X'.
  gs_layout-no_toolbar = 'X'.

ENDFORM.                    "create_catalog

FORM show_alv_and_screen.

 CREATE OBJECT r_container100
    EXPORTING
      container_name = 'CONT100'.

  CREATE OBJECT r_grid100
    EXPORTING
      i_parent = r_container100.
*we let it know we will use this table for dropdown list
  CALL METHOD r_grid100->set_drop_down_table
    EXPORTING
      it_drop_down = gt_dropdown.

  CALL METHOD r_grid100->set_ready_for_input
    EXPORTING
      i_ready_for_input = 1.

  CALL METHOD r_grid100->set_table_for_first_display
    EXPORTING
      i_structure_name = 'GT_FLIGHTS_EXTENDED'
      is_layout        = gs_layout
    CHANGING
      it_outtab        = gt_flights_extended[]
      it_fieldcatalog  = gt_fieldcat[].

  CALL SCREEN '0100'.

ENDFORM.