пятница, 19 октября 2012 г.

Создание динамических таблиц, динамическая выборка

  Создание динамической таблицы будет основано на классах CL_ABAP_ELEMDESCR - этот класс используется для описания и создания элементарных типов данных (С, N, D, и другие), CL_ABAP_STRUCTDESCR - этот класс используется для описания и создания структур, CL_ABAP_TABLEDESCR - этот класс используется для описания и создания внутренних таблиц, из набора классов RTTS.
  Допустим, нам необходимо сделать выборку, неизвестно каких строк, неизвестное их количество, неизвестно из какой таблицы и вывести это все на экран. Какие поля, сколько полей и из какой таблицы, будет решать пользователь. Для этого нам потребуется, создать динамическую выборку и создать динамическую таблицу в которую будут выбираться все данные.



report  z_test_lna1.
"Описание параметров СЭ
parameters
  
p_name     type fieldname
  
p_type     type c
  
p_len      type i
  
p_tbnam    type string
  
.
"Описание данных
data "Структура таблицы в которой будут храниться
     
"введенные пользователем описания полейдинамической табл.
  
begin   of   gs_task
  
,   name  like p_name имя поля
  
,   type  like p_type тип поля
  
,   len   like p_len  длина поля
  
end     of   gs_task
  
gt_task like standard table of gs_task
            
with key name
  
gt_fld  type standard table of fieldname список полей для выборки
  
gr      type ref to data
  
.
field-symbols
  
<table> type standard table
  
.
at selection-screen.
  gs_task
-name p_name .
  gs_task
-type p_type .
  gs_task
-len  p_len  .
  
"Заполняем таблицу данными c СЭ
  
append gs_task to gt_task.

start
-of-selection.
  
perform table_creationсоздание таблицы
  
perform table_reading.  заполнение и вывод на экран
*&---------------------------------------------------------------------*
*&      Form  table_creation
*&---------------------------------------------------------------------*
form table_creation.
  
data
    
lo_struct  type ref to cl_abap_structdescr
    
lo_table   type ref to cl_abap_tabledescr
    
ls_comp    type abap_componentdescr
    
lt_comp    type abap_component_tab
    
.
  
sort gt_task.
  
delete adjacent duplicates from gt_task.
  
loop at gt_task into gs_task.
    ls_comp
-name gs_task-nameимя поля
    
case gs_task-type.
    
" используем методы (get_iget_dget_cget_n) класса cl_abap_elemdescr
    
" которые возвращают тип объекта для элементарного типа, так же
    
" используем значение gs_task-len внутри метода для указания длины типа данных

      
when 'I'Числовое поле
        ls_comp
-type cl_abap_elemdescr=>get_i( ).
      
when 'D'Поле типа ДАТА
        ls_comp
-type cl_abap_elemdescr=>get_d( ).
      
when 'C'Текстовое поле с переменной длиной
        ls_comp
-type cl_abap_elemdescr=>get_cgs_task-len ).
      
when 'N'Текстовое поле(для хранения чиселс переменной длиной
        ls_comp
-type cl_abap_elemdescr=>get_ngs_task-len ).
    
endcase.
    
append ls_comp to lt_comp.
    
append gs_task-name to gt_fld.
  
endloop.
  lo_struct 
cl_abap_structdescr=>createlt_comp ).  создаем объект структуру
  lo_table  
cl_abap_tabledescr=>createlo_struct )создаем объект таблицу
  
create data gr  type handle lo_table" создаем обект-данных полученного типа
  
assign gr->to <table>"создаем таблицу
endform.                    "table_creation
*&---------------------------------------------------------------------*
*&      Form  table_reading
*&---------------------------------------------------------------------*
form table_reading.
  
Выборка
  
select (gt_fld)  поля указанные пользователем на СЭ
    
from (p_tbnamтаблица указанная пользователем на СЭ
         
into corresponding fields of table <table>.

  
field-symbols
    
<ls_wa> type any
    
<comp> type any
    
.
Вывод выбранных записей
  
loop at <table> assigning <ls_wa>.
    
new-line.
    
do.
      
assign component sy-index of structure <ls_wa> to <comp>.
      
if sy-subrc ne 0.
        
exit.
      
endif.
      
write <comp>.
    
enddo.
  
endloop.
endform.                    "table_reading