Archive for ABAP

Programa que sube un fichero delimitado por tabuladores a una tabla interna.

Muy buenas, muchas veces nos encontramos con querer llevarse una tabla z del equipo de producción al de desarrollo o al de test. Bien pues yo lo hago de la siguiente forma. Mediante sql exporto el contenido de la tabla a un fichero delimitado por tabuladores.

Ejemplo: select * from zprueba

Digo * porque te tienes que llevar también el mandante. Y después la cargo mediante este programa

Read the rest of this entry »

Comentarios (1)

Nuevo libro de ABAP Objects!!!

El maestro Horst Keller acaba de terminar su nuevo libro de ABAP Objects, el cual será publicado en Marzo en SAP PRESS.


Para mas información lean su blog en el SDN Something’s Coming

Saludos,

Blag.

Comentarios

Include para hacer listados ALV de forma muy sencilla

Desde que descubrí los listados ALV, y creo que eso fue por el año 2002, practicamente el 90% de los informes que he hecho son de este estilo. Para automizar el desarrollo de los mismos, y poder concentrarme en la lógica funcional del programa cree el include ZBCIALV que encapsulaba las engorrosas funciones que necesitaba.
Eso me permite hacer listados ALV de forma muy rápida, como muestra el siguiente ejemplo:

REPORT ZALV_FACIL.
 
include ZBCIALV.
 
data: begin of i_listado occurs 0,
bukrs like t001-bukrs,
butxt like t001-butxt,
end of i_listado.
 
start-of-selection.
 
select * from t001
into corresponding fields of table i_listado.
 
v_alv_pf_status = ''.
PERFORM listado_tabla_alv TABLES i_listado
USING 'I_LISTADO'
alv_fieldtab.

Comentarios (3)

CLOI_PUT_SIGN_IN_FRONT…

Si alguna vez han querido cambiar la posición del signo negativo en ABAP (El standard es 100-) para que quede así -100, habrán buscado y encontrado la función CLOI_PUT_SIGN_IN_FRONT y claro, se habrán dado cuenta de que no sirve para todos los casos e inclusive no funciona en modo de test…Por eso, hice un pequeño form para solucionar los pequeños inconvenientes -;)

REPORT z_dummy_atg_3.

DATA: value TYPE p DECIMALS 2,
value_text(18) TYPE c,
text1(18) TYPE c.

value = ‘15.2-’.
WRITE value TO value_text.

PERFORM cambiar_signo CHANGING value_text.

WRITE:/ value_text.

*&————————————————–*
*& Form CAMBIAR_SIGNO
*&————————————————–*
* Cambia la posición del signo
*—————————————————*
FORM cambiar_signo CHANGING value_text.

SEARCH value_text FOR ‘-’.
IF sy-subrc = 0 AND sy-fdpos <> 0.
SPLIT value_text AT ‘-’ INTO value_text text1.
CONDENSE value_text.
CONCATENATE ‘-’ value_text INTO value_text.
ELSE.
CONDENSE value_text.
ENDIF.

ENDFORM. “CAMBIAR_SIGNO

Saludos,

Blag.

Comentarios

¿CONVERSION_EXIT_ALPHA_OUTPUT?

La función CONVERSION_EXIT_ALPHA_OUTPUT es muy útil cuando queremos eliminar los ceros de una cadena…Por ejemplo si tenemos 0000012345, nos devuelve 12345…Pero…que pasa cuando tenemos 00000E12345, simple…el resultado va a seguir siendo 00000E12345.
Por lo tanto y puesto que ayer me ví en un problema muy similar, decidí crear un form muy simple -;)

*&———————————————————-*
*& Form quitar_ceros *
*&———————————————————-*
* Quitamos les ceros del inicio *
*———————————————————–*
FORM quitar_ceros CHANGING t_codigo.

DATA: long TYPE i,
char TYPE c,
cero TYPE c,
counter TYPE i,
new_text(18) TYPE c,
flag TYPE c.

cero = ‘0′.
long = STRLEN( t_codigo ).

DO long TIMES.
counter = counter + 1.
IF counter EQ long.
EXIT.
ENDIF.
char = t_codigo+counter(1).
IF char NE cero.
CONCATENATE new_text t_codigo+counter(1)
INTO new_text.
flag = ‘X’.
ELSE.
IF flag EQ space.
CONTINUE.
ELSE.
CONCATENATE new_text t_codigo+counter(1)
INTO new_text.
ENDIF.
ENDIF.
ENDDO.

t_codigo = new_text.

ENDFORM. “quitar_ceros

Lo que logramos con esto, es obtener el valor E12345

Saludos,

Blag.

Comentarios (3)

Verificar UNICODE

Gracias a un post de Rahul Kavuri del SDN me he enterado de una transacción muy interesante: UCCHECK.

Y que hace tan especial a esta transacción? Pues es muy simple…Nos permite verificar si nuestros programas son compatibles con el modelo UNICODE.


Una excelente herramienta que todos deberíamos utilizar para evitar trabajo adicional al momento de trabajar en proyectos de migración.

Saludos,

Blag.

Technorati tags:

Comentarios

Inner Join Dinámico

Este es el código para un FM que genera un Inner Join Dinámico

FUNCTION zdynamic_inner_join.
*”———————————————————————-
*”*”Interfase local
*” IMPORTING
*” VALUE(TAB1) TYPE DD02L-TABNAME
*” VALUE(TAB2) TYPE DD02L-TABNAME
*” TABLES
*” FILTER STRUCTURE RFC_DB_OPT
*” WHERE_TABLE STRUCTURE RFC_DB_OPT
*” DATA STRUCTURE TAB512
*” EXCEPTIONS
*” NOT_TABLE
*”———————————————————————-

DATA: descr_struct_ref TYPE REF TO cl_abap_structdescr,
wa_fcat TYPE lvc_s_fcat,
it_fieldcatalog TYPE lvc_t_fcat,
dataref TYPE REF TO data,
my_tab LIKE dd02l-tabname,
tabname TYPE dd03l-tabname,
fieldname TYPE dd03l-fieldname,
position TYPE dd03l-position,
inttype TYPE dd03l-inttype,
tab_one TYPE string,
tab_two TYPE string,
campos TYPE string,
inner_field TYPE string,
where_condition TYPE string,
where_string TYPE string,
condition_one TYPE string,
condition_two TYPE string,
field TYPE string,
l_date_extern(30) TYPE c,
w_tabix TYPE sy-tabix,
field_one TYPE string,
field_two TYPE string,
field_three TYPE string.

DATA: BEGIN OF fields OCCURS 0,
field TYPE dd03l-fieldname,
END OF fields.

DATA: BEGIN OF fields_box OCCURS 0,
field TYPE dd03l-fieldname,
END OF fields_box.

DATA: BEGIN OF global_fields OCCURS 0,
field TYPE dd03l-fieldname,
END OF global_fields.

DATA: fieldsym TYPE TABLE OF rfieldlist WITH HEADER LINE,
fieldlist TYPE TABLE OF rstrucinfo WITH HEADER LINE.

TYPES: BEGIN OF type_data,
data TYPE crmch4000,
END OF type_data.

DATA: data_line TYPE type_data.

DATA: fieldnames LIKE fieldlist-compname,
l_type.

FIELD-SYMBOLS: TYPE ANY TABLE,
TYPE LINE OF lvc_t_fcat,

TYPE STANDARD TABLE,
TYPE STANDARD TABLE,
TYPE abap_compdescr,
TYPE ANY,
TYPE ANY.CREATE DATA dataref TYPE char3000.

IF tab1 EQ space.
RAISE not_table.
ENDIF.

tab_one = tab1.
TRANSLATE tab_one TO UPPER CASE.

SELECT tabname fieldname position inttype
INTO (tabname,fieldname,position,inttype)
FROM dd03l
WHERE tabname EQ tab_one
ORDER BY position.
wa_fcat-fieldname = fieldname.
wa_fcat-ref_table = tabname.
wa_fcat-ref_field = fieldname.
wa_fcat-inttype = inttype.
fields_box-field = fieldname.
APPEND wa_fcat TO it_fieldcatalog.
APPEND fields_box.
ENDSELECT.

IF tab2 EQ space.
RAISE not_table.
ENDIF.

tab_two = tab2.
TRANSLATE tab_two TO UPPER CASE.

SELECT tabname fieldname position inttype
INTO (tabname,fieldname,position,inttype)
FROM dd03l
WHERE tabname EQ tab_two
ORDER BY position.
wa_fcat-fieldname = fieldname.
wa_fcat-ref_table = tabname.
wa_fcat-ref_field = fieldname.
wa_fcat-inttype = inttype.
READ TABLE it_fieldcatalog WITH KEY fieldname = wa_fcat-fieldname
ASSIGNING .
IF sy-subrc EQ 0.
fields-field = wa_fcat-fieldname.
APPEND fields.
ELSE.
fields_box-field = fieldname.
APPEND wa_fcat TO it_fieldcatalog.
APPEND fields_box.
ENDIF.
ENDSELECT.

IF NOT filter[] IS INITIAL.
LOOP AT fields_box.
w_tabix = sy-tabix.
READ TABLE filter WITH KEY text = fields_box-field.
IF sy-subrc NE 0.
DELETE fields_box INDEX w_tabix.
ENDIF.
ENDLOOP.
ENDIF.

global_fields[] = fields_box[].

CALL METHOD cl_alv_table_create=>create_dynamic_table
EXPORTING
it_fieldcatalog = it_fieldcatalog
IMPORTING
ep_table = dataref
EXCEPTIONS
generate_subpool_dir_full = 1
OTHERS = 2.

ASSIGN dataref->* TO .

LOOP AT fields.
DELETE fields_box WHERE field EQ fields-field.
CONCATENATE tab_one ‘~’ fields-field
INTO inner_field.
CONCATENATE campos inner_field
INTO campos SEPARATED BY space.
ENDLOOP.

LOOP AT fields_box.
CONCATENATE campos fields_box-field
INTO campos SEPARATED BY space.
ENDLOOP.

CONCATENATE ‘(’ tab1 ‘inner join’ tab2 ‘ON’
INTO where_condition SEPARATED BY space.

LOOP AT fields.
CONCATENATE tab_one ‘~’ fields-field
INTO condition_one.
CONCATENATE tab_two ‘~’ fields-field
INTO condition_two.
CONCATENATE where_condition condition_one ‘EQ’
condition_two ‘AND’ INTO where_condition
SEPARATED BY space.
ENDLOOP.

SHIFT where_condition RIGHT DELETING TRAILING ‘AND’.
CONDENSE where_condition.

CONCATENATE where_condition ‘)’
INTO where_condition
SEPARATED BY space.

IF NOT where_table[] IS INITIAL.
LOOP AT where_table.
SPLIT where_table-text AT space
INTO field_one field_two field_three.
READ TABLE fields WITH KEY field = field_one.
IF sy-subrc EQ 0.
CONCATENATE tab1 ‘~’ where_table-text
INTO where_table-text.
ENDIF.
CONCATENATE where_string where_table-text ‘AND’
INTO where_string SEPARATED BY space.
ENDLOOP.
ENDIF.
SHIFT where_string RIGHT DELETING TRAILING ‘AND’.
CONDENSE where_string.

IF where_string NE space.
SELECT (campos)
INTO CORRESPONDING FIELDS OF TABLE
FROM (where_condition)
WHERE (where_string).
ELSE.
SELECT (campos)
INTO CORRESPONDING FIELDS OF TABLE
FROM (where_condition).
ENDIF.

ASSIGN TO

.LOOP AT
ASSIGNING .LOOP AT global_fields.
fieldnames = global_fields-field.
ASSIGN COMPONENT fieldnames OF STRUCTURE TO .
DESCRIBE FIELD TYPE l_type.
IF l_type EQ ‘I’ OR l_type EQ ‘b’.
field = .
CONCATENATE data_line field INTO data_line
SEPARATED BY ‘/’.
ELSEIF l_type EQ ‘P’.
WRITE TO l_date_extern.
CONCATENATE data_line l_date_extern INTO data_line
SEPARATED BY ‘/’.
ELSEIF l_type EQ ‘D’.
CALL FUNCTION ‘CONVERT_DATE_TO_EXTERNAL’
EXPORTING
date_internal =
IMPORTING
date_external = l_date_extern
EXCEPTIONS
OTHERS = 4.
IF sy-subrc EQ 0.
CONCATENATE data_line l_date_extern INTO data_line
SEPARATED BY ‘/’.
ENDIF.
ELSE.
CONCATENATE data_line INTO data_line
SEPARATED BY ‘/’.
ENDIF.
SHIFT data_line LEFT DELETING LEADING ‘/’.
SHIFT data_line RIGHT DELETING TRAILING ‘/’.
ENDLOOP.
APPEND data_line TO data.
CLEAR data_line.

ENDLOOP.

ENDFUNCTION.

Gracias especiales a Abapito, puesto que la idea fué suya.

Saludos,
Blag.

Comentarios (1)

Ocultar Selection-Screens

Más de una vez (Yo incluído), me ha preguntado como hacer para ocultar o mostrar un Selection-Screen…Tal como hacen algunas transacciones de SAP…La respuesta es más sencilla de lo que parece -;)

**************************************************************
* Programa: ZDUMMY_TEST. *
* Consultor ABAP: Alvaro Tejada Galindo *
**************************************************************
REPORT ZPRUEBA_ATG.

DATA: FLAG TYPE C VALUE ‘X’,
COUNTER TYPE I.

SELECTION-SCREEN BEGIN OF BLOCK B1.
SELECTION-SCREEN PUSHBUTTON 1(10) BUTTON USER-COMMAND GOCFG.
SELECTION-SCREEN END OF BLOCK B1.

SELECTION-SCREEN BEGIN OF BLOCK B2 WITH FRAME TITLE TEXT-T01.
PARAMETERS:
CARRID TYPE SPFLI-CARRID MODIF ID SC1,
CONNID TYPE SPFLI-CONNID MODIF ID SC1,
CITYFROM TYPE SPFLI-CITYFROM MODIF ID SC1.
SELECTION-SCREEN END OF BLOCK B2.

*&———————————————————–&*
*& START-OF-SELECTION &*
*&———————————————————–&*
START-OF-SELECTION.

AT SELECTION-SCREEN OUTPUT.

LOOP AT SCREEN.
IF SCREEN-GROUP1 = ‘SC1′ AND FLAG EQ ‘X’.
COUNTER = COUNTER + 1.
WRITE ‘Ocultar’ TO BUTTON.
SCREEN-ACTIVE = ‘1′.
MODIFY SCREEN.
IF COUNTER EQ 6.
CLEAR COUNTER.
FLAG = SPACE.
ENDIF.
CONTINUE.
ELSEIF SCREEN-GROUP1 = ‘SC1′ AND FLAG EQ SPACE.
COUNTER = COUNTER + 1.
WRITE ‘Mostrar’ TO BUTTON.
SCREEN-ACTIVE = ‘0′.
MODIFY SCREEN.
IF COUNTER EQ 6.
CLEAR COUNTER.
FLAG = ‘X’.
ENDIF.
CONTINUE.
ENDIF.
ENDLOOP.



Saludos,

Blag.

Comentarios (3)

Cargar imagenes en Dynpros

Muchas personas se preguntan como pueden hacer esto…Cargar imagenes para que sus dynpros se vean más atractivos…O quizás simplemente para impresionar a los clientes…Utilizando ABAP Objects, esto es más fácil de lo que parece…Además, podemos cargar cualquier gráfico que hayamos subido al R/3 vía la transacción SE78.


Veamos el código (Para esto necesitamos crear un Custom Control en un Dynpro, y llamarlo PICTURE).

**************************************************************
* Programa: ZDUMMY_TEST. *
* Consultor ABAP: Alvaro Tejada Galindo *
**************************************************************
REPORT ZPRUEBA_ATG.

TYPES: PICT_LINE(256) TYPE C.
DATA: PICT_TAB TYPE TABLE OF PICT_LINE,
URL(255) TYPE C.

DATA: CONTAINER1 TYPE REF TO CL_GUI_CUSTOM_CONTAINER,
PICTURE TYPE REF TO CL_GUI_PICTURE.

DATA: L_BYTECOUNT TYPE I,
L_TDBTYPE LIKE STXBITMAPS-TDBTYPE,
L_CONTENT TYPE STANDARD TABLE OF BAPICONTEN
INITIAL SIZE 0.

DATA: GRAPHIC_SIZE TYPE I.

DATA: BEGIN OF GRAPHIC_TABLE OCCURS 0,
LINE(255) TYPE X,
END OF GRAPHIC_TABLE.

*&———————————————————–&*
*& START-OF-SELECTION &*
*&———————————————————–&*
START-OF-SELECTION.
CALL SCREEN 100.

*&———————————————————–*
*& Module STATUS_0100 OUTPUT *
*&———————————————————–*
* PBO *
*————————————————————*
MODULE STATUS_0100 OUTPUT.
PERFORM LOAD_IMAGE.
ENDMODULE. ” STATUS_0100 OUTPUT

*————————————————————*
* FORM LOAD_IMAGE *
*————————————————————*
* Cargamos la imagen *
*————————————————————*
FORM LOAD_IMAGE.

CREATE OBJECT: CONTAINER1 EXPORTING CONTAINER_NAME = ‘PICTURE’,
PICTURE EXPORTING PARENT = CONTAINER1.

CALL FUNCTION ‘SAPSCRIPT_GET_GRAPHIC_BDS’
EXPORTING
I_OBJECT = ‘GRAPHICS’
I_NAME = ‘ENJOY’
I_ID = ‘BMAP’
I_BTYPE = ‘BCOL’
IMPORTING
E_BYTECOUNT = L_BYTECOUNT
TABLES
CONTENT = L_CONTENT
EXCEPTIONS
NOT_FOUND = 1
BDS_GET_FAILED = 2
BDS_NO_CONTENT = 3
OTHERS = 4.

CALL FUNCTION ‘SAPSCRIPT_CONVERT_BITMAP’
EXPORTING
OLD_FORMAT = ‘BDS’
NEW_FORMAT = ‘BMP’
BITMAP_FILE_BYTECOUNT_IN = L_BYTECOUNT
IMPORTING
BITMAP_FILE_BYTECOUNT = GRAPHIC_SIZE
TABLES
BDS_BITMAP_FILE = L_CONTENT
BITMAP_FILE = GRAPHIC_TABLE
EXCEPTIONS
OTHERS = 1.

CALL FUNCTION ‘DP_CREATE_URL’
EXPORTING
TYPE = ‘IMAGE’
SUBTYPE = ‘BMP’
TABLES
DATA = GRAPHIC_TABLE
CHANGING
URL = URL.

CALL METHOD PICTURE->LOAD_PICTURE_FROM_URL EXPORTING URL = URL.
CALL METHOD PICTURE->SET_DISPLAY_MODE
EXPORTING DISPLAY_MODE = PICTURE->DISPLAY_MODE_FIT_CENTER.

ENDFORM.

Saludos,

Blag.

Comentarios (4)

Cerrar
E-mail It