Hirdetés
 

Rajzolás ABAP-ban

PDF
Nyomtatás

Előre is leszögezném, hogy ez nem hagyományos értelemben vett tippek és trükkök írás, mert - hogy is mondjam - elég korlátozott felhasználással bír ez a konkrét implementáció. :) Azonban arra jó lehet, hogy a már õskövületnek számító ABAP "write-os" reportokat leporoljuk és új funkciókkal - TADAM! - "rajzolással" bővítsük.

 Mint a következő képen is jól látszik, ez bizony nagyon hasznos dolognak ígérkezik:

 

Szóval ilyen 21. századi ábrákat tudunk készíteni az írás végén található formok segítségével. És hogyan? Aki használt vagy látott életében LOGO programot, annak ismerõs lehet a következõ programstruktúra. Akik pedig nem, azok nem sokat veszítettek.

 

 

A programban a következõ metódusok (FORM-ok) vannak implementálva:

  • GOTO
  • WRITE
  • SQUARE
  • FILL_SQUARE
  • TRIANGLE
  • FILL_TRIANGLE
  • RECTANGLE
  • FILL_RECTANGLE
  • HORIZONTAL_LINE
  • VERTICAL_LINE
  • DIAGONAL_LINE

Végül következzen A Kód (nincs más dolgunk, mint egy üres programba bemásolni az egészet és örülni, hogy milyen remek eszközt kaptunk a kezünkbe, ingyen!):

*&----------------------------------------------------------------*
*& Report ZABAP_LOGO *
*&----------------------------------------------------------------*
REPORT zabap_logo.

*&----------------------------------------------------------------*
* TYPES *
*&----------------------------------------------------------------*
TYPES: BEGIN OF ty_lines,
line TYPE string,
END OF ty_lines.

*&----------------------------------------------------------------*
* VARIABLES *
*&----------------------------------------------------------------*
DATA: custom_container TYPE REF TO cl_gui_custom_container,
text_editor TYPE REF TO cl_gui_textedit,
w_ucomm TYPE sy-ucomm,
w_lines TYPE i,
w_tabix TYPE sy-tabix,
w_tabix_aux TYPE sy-tabix,
w_text(254) TYPE c,
w_file_name TYPE string.

DATA: pos_col TYPE i,
pos_line TYPE i,
p_newcol TYPE i,
value TYPE i,
value2 TYPE i,
draw_flag TYPE c.

*&----------------------------------------------------------------*
* INTERNAL TABLES *
*&----------------------------------------------------------------*
DATA: t_lines TYPE STANDARD TABLE OF ty_lines,
t_command TYPE TABLE OF string.

*&----------------------------------------------------------------*
* CONSTANTS *
*&----------------------------------------------------------------*
CONSTANTS: line_length TYPE i VALUE 254.

*&----------------------------------------------------------------*
* FIELD-SYMBOLS *
*&----------------------------------------------------------------*
FIELD-SYMBOLS: <fs_lines> LIKE LINE OF t_lines,
<fs_command> LIKE LINE OF t_command,
<fs_command_line> LIKE LINE OF t_command.

*&----------------------------------------------------------------*
* SELECTION-SCREEN *
*&----------------------------------------------------------------*
SELECTION-SCREEN BEGIN OF BLOCK file WITH FRAME.
PARAMETERS:
p_file TYPE rlgrap-filename.
SELECTION-SCREEN END OF BLOCK file.

*&----------------------------------------------------------------*
* AT SELECTION-SCREEN ON VALUE-REQUEST *
*&----------------------------------------------------------------*
AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_file.
PERFORM get_filename CHANGING p_file.

*-----------------------------------------------------------------*
* START-OF-SELECTION *
*-----------------------------------------------------------------*
START-OF-SELECTION.
CALL SCREEN 0100.

*&----------------------------------------------------------------*
*& Form GET_FILENAME *
*&----------------------------------------------------------------*
FORM get_filename CHANGING po_p_file.

DATA: ls_field_name TYPE dynpread-fieldname.

ls_field_name = 'P_FILE'.

CALL FUNCTION 'F4_FILENAME'
EXPORTING
program_name = syst-cprog
dynpro_number = syst-dynnr
field_name = ls_field_name
IMPORTING
file_name = po_p_file.

w_file_name = po_p_file.

ENDFORM. " GET_FILENAME

*&----------------------------------------------------------------*
*& Module STATUS_0100 OUTPUT *
*&----------------------------------------------------------------*
MODULE status_0100 OUTPUT.

SET PF-STATUS 'STATUS_MAIN'.
* SET TITLEBAR 'xxx'.

IF draw_flag EQ space.
PERFORM call_editor.
ELSE.
LEAVE TO LIST-PROCESSING.
ENDIF.

ENDMODULE. " STATUS_0100 OUTPUT

*&----------------------------------------------------------------*
*& Module USER_COMMAND_0100 INPUT *
*&----------------------------------------------------------------*
MODULE user_command_0100 INPUT.

w_ucomm = sy-ucomm.

CASE w_ucomm.
WHEN 'BACK' OR 'CANCEL' OR 'EXIT'.
SET SCREEN 0.
EXIT.
WHEN 'SHOW'.
PERFORM show_graphic.
draw_flag = 'X'.
ENDCASE.

ENDMODULE. " USER_COMMAND_0100 INPUT

*&----------------------------------------------------------------*
*& Form call_editor *
*&----------------------------------------------------------------*
FORM call_editor.

IF text_editor IS INITIAL.
CREATE OBJECT custom_container
EXPORTING
container_name = 'CUSTOM_CONTROL'
EXCEPTIONS
cntl_error = 1
cntl_system_error = 2
create_error = 3
lifetime_error = 4
lifetime_dynpro_dynpro_link = 5.

CREATE OBJECT text_editor
EXPORTING
wordwrap_mode
= cl_gui_textedit=>wordwrap_at_fixed_position
wordwrap_position = line_length
wordwrap_to_linebreak_mode = cl_gui_textedit=>true
parent = custom_container
EXCEPTIONS
error_cntl_create = 1
error_cntl_init = 2
error_cntl_link = 3
error_dp_create = 4
gui_type_not_supported = 5
OTHERS = 6.
ENDIF.

IF p_file NE space.
CALL FUNCTION 'GUI_UPLOAD'
EXPORTING
filename = w_file_name
TABLES
data_tab = t_lines.

IF NOT t_lines[] IS INITIAL.
CALL METHOD text_editor->open_local_file
EXPORTING
file_name = p_file.

CALL METHOD cl_gui_cfw=>flush.
ENDIF.
ENDIF.

ENDFORM. " call_editor

*&---------------------------------------------------------------*
*& Form show_graphic *
*&---------------------------------------------------------------*
FORM show_graphic.

IF t_lines[] IS INITIAL.
CLEAR: t_lines,w_lines.
REFRESH t_lines.

CALL METHOD text_editor->get_line_count
IMPORTING
lines = w_lines.

CALL METHOD cl_gui_cfw=>flush.

DO w_lines TIMES.
w_tabix = w_tabix + 1.
CALL METHOD text_editor->get_line_text
EXPORTING
line_number = w_tabix
IMPORTING
text = w_text.

CALL METHOD cl_gui_cfw=>flush.

APPEND INITIAL LINE TO t_lines
ASSIGNING <fs_lines>.
<fs_lines>-line = w_text.
ENDDO.
ENDIF.

CLEAR w_tabix.

LOOP AT t_lines ASSIGNING <fs_lines>.
SPLIT <fs_lines>-line AT space INTO TABLE t_command.
LOOP AT t_command ASSIGNING <fs_command>.
w_tabix = sy-tabix.
TRANSLATE <fs_command> TO UPPER CASE.
CASE <fs_command>.
WHEN 'GOTO'.
w_tabix = w_tabix + 1.
READ TABLE t_command INDEX w_tabix
INTO pos_col.
w_tabix = w_tabix + 1.
READ TABLE t_command INDEX w_tabix
INTO pos_line.
PERFORM goto USING pos_col pos_line.
WHEN 'DRAW'.
w_tabix = w_tabix + 1.
READ TABLE t_command INDEX w_tabix
ASSIGNING <fs_command_line>.
TRANSLATE <fs_command_line> TO UPPER CASE.
CASE <fs_command_line>.
WHEN 'CIRCLE'.
w_tabix = w_tabix + 1.
READ TABLE t_command INDEX w_tabix
INTO value.
PERFORM draw_circle USING value.
WHEN 'SQUARE'.
w_tabix = w_tabix + 1.
READ TABLE t_command INDEX w_tabix
INTO value.
PERFORM draw_square USING value.
WHEN 'TRIANGLE'.
w_tabix = w_tabix + 1.
READ TABLE t_command INDEX w_tabix
INTO value.
PERFORM draw_triangle USING value.
ENDCASE.
ENDCASE.
ENDLOOP.
ENDLOOP.

IF w_file_name NE space.
CALL FUNCTION 'GUI_DOWNLOAD'
EXPORTING
filename = w_file_name
TABLES
data_tab = t_lines.
ENDIF.

ENDFORM. " show_graphic

*&----------------------------------------------------------------*
*& Form goto *
*&----------------------------------------------------------------*
FORM goto USING p_col
p_line.

LEAVE TO LIST-PROCESSING.

SET CURSOR 0 0.
SKIP p_col.

ENDFORM. " goto

*&----------------------------------------------------------------*
*& Form draw_circle *
*&----------------------------------------------------------------*
FORM draw_circle USING p_value.

ENDFORM. " draw_circle

*&----------------------------------------------------------------*
*& Form draw_square *
*&----------------------------------------------------------------*
FORM draw_square USING p_value.

CLEAR w_tabix.

w_tabix_aux = pos_line - 1.

DO p_value TIMES.
w_tabix = w_tabix + 1.
IF w_tabix EQ 1.
DO p_value TIMES.
w_tabix_aux = w_tabix_aux + 1.
WRITE AT w_tabix_aux '*'.
ENDDO.
ELSEIF w_tabix EQ p_value.
WRITE:/ ''.
CLEAR w_tabix_aux.
w_tabix_aux = pos_line - 1.
DO p_value TIMES.
w_tabix_aux = w_tabix_aux + 1.
WRITE AT w_tabix_aux '*'.
ENDDO.
ELSE.
WRITE AT /pos_line '*'.
p_newcol = pos_line + p_value - 1.
WRITE AT p_newcol '*'.
ENDIF.
ENDDO.

ENDFORM. " draw_square

*&----------------------------------------------------------------*
*& Form draw_triangle *
*&----------------------------------------------------------------*
FORM draw_triangle USING p_value.

DATA: w_number TYPE i,
w_times TYPE i,
w_pos_col TYPE i,
w_pos_line TYPE i,
w_tabix_tri TYPE i,
w_end_value TYPE i.

CLEAR w_tabix.

w_tabix_aux = pos_line - 1.

w_number = p_value MOD 2.
w_end_value = p_value - 1.
IF w_number NE 0.
w_times = ( p_value + 1 ) / 2.
DO w_times TIMES.
w_tabix = w_tabix + 1.
IF w_tabix EQ 1.
w_tabix_aux = pos_line + w_times.
WRITE AT w_tabix_aux '*'.
ELSEIF w_tabix EQ w_end_value.
WRITE:/ ''.
w_tabix_aux = pos_line.
DO p_value TIMES.
w_tabix_aux = w_tabix_aux + 1.
WRITE AT w_tabix_aux '*'.
ENDDO.
ELSE.
w_tabix_aux = w_tabix_aux - w_tabix + 1.
WRITE AT /w_tabix_aux '*'.
w_tabix_tri = w_tabix_tri + 1.
w_tabix_aux = w_tabix_aux + w_tabix.
w_tabix = w_tabix + 1.
WRITE AT w_tabix_aux '*'.
ENDIF.
ENDDO.
ENDIF.

ENDFORM. " draw_triangle

Igérjük, a következõkben azért hasznosabb tippekkel is szolgálhatunk. De sokan szeretünk játszani, és ha a Workbench-ben éljük ezt ki, akkor még a team manager sem haragszik meg. ;)

(A kódért köszönet illeti meg Alvaro Tejada-t, aki szabadúszó ABAP programozó)

Bartha Levente - A szerző az SAP Hungary Kft.-nél mint CRM tanácsadó több éve foglalkozik SAP-val, főbb szakterületei Enterprise Portal, CRM Sales, E-selling, PCUI, CRM2007 UI.
Manapság többnyire külföldi projekteken dolgozik, illetve itthon SAP közösséget szervez.

További cikkek a szerzőtől


Nincs hozzászólása.
A téma megvitatása a fórumon. (0 hozzászólás)