:::: MENU ::::

este blog tiene como objetivo de compartir los conocimientos prácticos de cada lenguaje de programación más conocidos.

  • Lo mejor está por suceder

  • Easy to Customize

  • Customizable fonts.

Mostrando entradas con la etiqueta Abap Avanzado. Mostrar todas las entradas
Mostrando entradas con la etiqueta Abap Avanzado. Mostrar todas las entradas

miércoles, 12 de abril de 2017

jueves, 1 de septiembre de 2016


En el siguiente programa podremos transferir un xml a una tabla interna.

El código es el siguiente:

DATA: gcl_xml       TYPE REF TO cl_xml_document.
DATA: gv_subrc      TYPE sy-subrc.
DATA: gv_xml_string TYPE xstring.
DATA: gv_size       TYPE sytabix.
DATA: gt_xml_data   TYPE TABLE OF smum_xmltb.
DATA: gwa_xml_data  TYPE smum_xmltb.
DATA: gt_return     TYPE TABLE OF bapiret2.
DATA: gv_tabix      TYPE sytabix.
DATA: gt_student    TYPE TABLE OF ty_xml.
DATA: gwa_student   TYPE ty_xml.

 CREATE OBJECT gcl_xml.

*Upload XML File
  CALL METHOD gcl_xml->import_from_file
    EXPORTING
      filename = p_p_filout
    RECEIVING
      retcode  = gv_subrc.

  IF gv_subrc = 0.
    CALL METHOD gcl_xml->render_2_xstring
      IMPORTING
        retcode = gv_subrc
        stream  = gv_xml_string
        size    = gv_size.
    IF gv_subrc = 0.
* Convert XML to internal table
      CALL FUNCTION 'SMUM_XML_PARSE'
        EXPORTING
          xml_input = gv_xml_string
        TABLES
          xml_table = gt_xml_data
          return    = gt_return.
    ENDIF.
  ENDIF.


  WRITE:/ 'fecha',6 'moneda',26 'compra', 33 'venta'.
*Convert XML internal table to Target Student table
  LOOP AT gt_xml_data INTO gwa_xml_data WHERE hier EQ 2.
    IF gwa_xml_data-type is INITIAL.

       gv_tabix = sy-tabix + 1.

       READ TABLE gt_xml_data INTO gwa_xml_data INDEX gv_tabix.
       gwa_student-fecha = gwa_xml_data-cvalue.

       gv_tabix = gv_tabix + 1.

       READ TABLE gt_xml_data INTO gwa_xml_data INDEX gv_tabix.
       gwa_student-moneda = gwa_xml_data-cvalue.

       gv_tabix = gv_tabix + 1.

       READ TABLE gt_xml_data INTO gwa_xml_data INDEX gv_tabix.
       gwa_student-tccompra = gwa_xml_data-cvalue.

        gv_tabix = gv_tabix + 1.

       READ TABLE gt_xml_data INTO gwa_xml_data INDEX gv_tabix.
       gwa_student-tcventa = gwa_xml_data-cvalue.

       APPEND gwa_student to gt_student.
    ENDIF.
    CLEAR: gwa_xml_data, gwa_student.
  ENDLOOP.

*Display data
  LOOP AT gt_student INTO gwa_student.
    WRITE:/ gwa_student-fecha,11 gwa_student-moneda,27 gwa_student-tccompra,
            33 gwa_student-tcventa.
    CLEAR: gwa_student.
  ENDLOOP.

A veces queremos mostrar más información que la que podemos mostrar en un popup, para ello tenemos la opción de mostrar una tabla como popup, donde podamos visualizar más de un dato.

El código a implementar es el siguiente:

mostrar alv como popup
======================

FORM f_layout_build_det  USING pi_layout TYPE slis_layout_alv.
  CLEAR: pi_layout.
  pi_layout-zebra                 = ''.
  pi_layout-colwidth_optimize     = 'X'.
  pi_layout-box_fieldname         = space.
  pi_layout-no_input              = 'X'.
  pi_layout-no_vline              = ' '.
  pi_layout-no_colhead            = ' '.
  pi_layout-lights_condense       = 'X'.
  pi_layout-confirmation_prompt   = ''.
  pi_layout-detail_popup          = 'X'.
  pi_layout-detail_initial_lines  = ''.
  pi_layout-detail_titlebar       = 'RECLASIFICACIÓN DE RETENCIONES POR GARANTÍA'.
ENDFORM.                    " f_layout_build


FORM f_build_struct_det .
  REFRESH gtd_fiel_det.
  PERFORM f_define_campo2 USING:
  'TIPOM' '' '' '4' 'GTD_LISTMES' '' '' 'TipoM' 'TipoM' 'TipoM' '' '' '',
  'BUKRS' '' '' '' 'BKPF' 'BUKRS' '' 'Sociedad' 'Sociedad' 'Sociedad' '' '' 'X',
  'AUGBL' '' '' '' 'BKPF' 'BELNR' '' 'Doc.Pago' 'Doc.Pago' 'Doc.Pago' '' '' '',
  'BELNR' '' '' '' 'BKPF' 'BELNR' '' 'Doc Fi' 'Doc Fi' 'Doc Fi' '' '' '',
  'DOCGE' 'C500' '' '' 'BKPF' 'BELNR' '' 'Doc.Reclasif.' 'Doc.Reclasif.' 'Doc.Reclasif.' '' '' '',
  'EJEGE' 'C500' '' '' 'BKPF' 'BELNR' '' 'Ejercicio Recl.' 'Ejercicio Recl.' 'Ejercicio Recl.' '' '' '',
  'TEXTO' '' '' '200' 'GTD_LISTMES' '' '' 'Mensaje' 'Mensaje' 'Mensaje' '' '' ''.
ENDFORM.                    " F_BUILD_STRUCT_DET

ALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
    EXPORTING
      i_callback_program    = gv_repid
      is_layout             = gwa_layout
      it_fieldcat           = gtd_fiel_det[]
      i_screen_start_column = 15
      i_screen_start_line   = 6
      i_screen_end_column   = 150
      i_screen_end_line     = 25
    TABLES
      t_outtab              = gtd_listmes
    EXCEPTIONS
      program_error         = 1
      OTHERS                = 2.

para regresar a la pantalla anterior se debe agregar:

 SET SCREEN 0.
La siguiente publicación nos ayudará a debuger popus o ventanas modales en las que el famoso /h no puede.

Es necesario copiar el siguiente código en un txt y grabarlo, luego arrastramos el archivo txt hacia el popup o la ventana que necesitemos debuger.

[FUNCTION]
Command=/H
Title=Debugeando
Type=SystemCommand

Es muy importante manejar el try-catch como parte estándar de un desarrollo. Se utiliza para capturar un error, que no se genere un dump y los usuarios no salgan corriendo, creyendo que el programa exploto (es mi parte irónica).... en fin, una forma de arreglar este problemilla es capturar dichos errores y mostrarlos como mensajes.

El código es el siguiente:


TRY.

     SELECT *
     INTO TABLE g_ti_marc
     FROM           marc
     FOR ALL ENTRIES IN g_ti_mara    
     WHERE matnr EQ g_ti_mara-matnr.

*.Capturamos el error y lo llevamos a la instancia lr_cx_root.
   CATCH CX_ROOT INTO lr_cx_root.

*.....Luego extraemos el mensaje de error que arroja el sistema accediendo al metodo *.....if_message~get_longtext( ).

       l_c_message = lr_cx_root->if_message~get_longtext( ).

*.....Por ultimo podremos realizar ya lo que queramos con el mensaje de error por ejemplo *.....imprimirlo.

       MESSAGE l_c_message TYPE 'E'.

  END TRY.
Muchas veces he tenido que desarrollar ALV's dinámicos, los casos en lo que lo he necesitado es cuando he tenido que mostrar data con meses como columnas o días, tipo calendario donde muestre valores o importes por mes, años o días.

Para dar un ejemplo de como implementar he desarrollado un código de prueba que pueden probar y adaptar según sus necesidades.

El código es el siguiente:

TYPE-POOLS: slis.


 FIELD-SYMBOLS: <t_dyntable>   TYPE STANDARD TABLE,
                <t_prueba>     TYPE STANDARD TABLE,     " Dynamic internal table name
                <fs_dyntable>,
                <t_dinamic>,                          " Field symbol to create work area
                <fs_fldval>    TYPE any.                " Field symbol to assign values

 PARAMETERS: p_cols(5) TYPE c,                          " Input number of columns
             p_rows(5) TYPE c.


 DATA: t_newtable   TYPE REF TO data,
       t_newline    TYPE REF TO data,
       t_newline2   TYPE REF TO data,
       fs_fldcat    TYPE slis_t_fieldcat_alv,
       t_fldcat     TYPE lvc_t_fcat,
       wa_it_fldcat TYPE lvc_s_fcat,
       wa_colno(2)  TYPE n,
       wa_flname(5) TYPE c.


* Create fields .

     wa_it_fldcat-fieldname = 'CAMPO1'.
     wa_it_fldcat-datatype  = 'CHAR'.
     wa_it_fldcat-intlen    = 10.

     APPEND wa_it_fldcat TO t_fldcat.

     wa_it_fldcat-fieldname = 'CAMPO2'.
     wa_it_fldcat-datatype  = 'CHAR'.
     wa_it_fldcat-intlen    = 10.

     APPEND wa_it_fldcat TO t_fldcat.

  DO p_cols TIMES.

     CLEAR wa_it_fldcat.

     MOVE sy-index TO wa_colno.
     CONCATENATE 'COL'
                  wa_colno
            INTO  wa_flname.

     wa_it_fldcat-fieldname = wa_flname.
     wa_it_fldcat-datatype  = 'CHAR'.
     wa_it_fldcat-intlen    = 10.

     APPEND wa_it_fldcat TO t_fldcat.

  ENDDO.

* Crea tabla interna dinamica y asigna a FieldSymbols

  CALL METHOD cl_alv_table_create=>create_dynamic_table
  EXPORTING
  it_fieldcatalog = t_fldcat
  IMPORTING
  ep_table = t_newtable.

  ASSIGN t_newtable->* TO <t_dyntable>.
* Create dynamic work area and assign to FS
  CREATE DATA t_newline LIKE LINE OF <t_dyntable>.
  ASSIGN t_newline->*   TO <fs_dyntable>.

************************
** Tablas

************************

  DATA: fieldname(20) TYPE c.
  DATA: fieldvalue(10) TYPE c.
  DATA: lv_numcol TYPE i.
  DATA: lv_numfil TYPE i.
  DATA: INDEX2    TYPE char3,
        acu       TYPE CHAR3,
        lv_acu    TYPE i.
data: x_filcat LIKE LINE OF t_fldcat.

DATA : ti_details TYPE abap_compdescr_tab, "<- Aqui tenemos la estructura.
        wa_details TYPE abap_compdescr.

DATA : ref_table_des TYPE REF TO cl_abap_structdescr.

types: BEGIN OF TY_PRUEBA,
      INDEx TYPE CHAR5,
      codigo type char1,
      END OF TY_PRUEBA.

types: itty TYPE ty_prueba.

DATA:   IT TYPE TY_PRUEBA,
        TB TYPE STANDARD TABLE OF ITTY,
        WA LIKE LINE OF tb.

FIELD-SYMBOLS: <f> LIKE LINE OF t_fldcat.

ref_table_des ?= cl_abap_typedescr=>describe_by_data( IT ).
*ref_table_des ?= cl_abap_typedescr=>DESCRIBE_BY_NAME( wa-index ).
ti_details[] = ref_table_des->components[].

  DESCRIBE TABLE t_fldcat LINES lv_numcol.
  READ TABLE t_fldcat into x_filcat INDEX 1.
  DO p_rows TIMES.
      index2 = sy-index.
       lv_acu = 0.
       DO p_cols TIMES.

       while lv_acu < lv_numcol.
             lv_acu = lv_acu + 1.
             acu = lv_acu.

      condense ACU NO-GAPS.
        READ TABLE t_fldcat into wa_it_fldcat index lv_acu.
        ASSIGN COMPONENT lv_acu OF STRUCTURE t_fldcat TO <f>.
        " Se Asigna el valor
        CONCATENATE 'VALUE '
                    index2
                    '-'
                    acu
              INTO  fieldvalue.

        CONDENSE fieldvalue NO-GAPS.

        ASSIGN COMPONENT wa_it_fldcat-fieldname
            OF STRUCTURE <fs_dyntable>
                      TO <fs_fldval>.

        <fs_fldval> = fieldvalue.
        ENDWHILE.

       ENDDO.

       APPEND <fs_dyntable> TO <t_dyntable>.
  ENDDO.


************************
** Muestra tabla interna
************************

DATA: wa_cat LIKE LINE OF fs_fldcat.

  wa_cat-fieldname = 'CAMPO1'.
  wa_cat-seltext_s = 'CAMPO1'.
  wa_cat-outputlen = '10'.
  APPEND wa_cat TO fs_fldcat.

  wa_cat-fieldname = 'CAMPO2'.
  wa_cat-seltext_s = 'CAMPO2'.
  wa_cat-outputlen = '10'.
  APPEND wa_cat TO fs_fldcat.

  DO p_cols TIMES.
  CLEAR wa_cat.
  MOVE sy-index TO wa_colno.
  CONCATENATE 'COL'
  wa_colno
  INTO wa_flname.
  wa_cat-fieldname = wa_flname.
  wa_cat-seltext_s = wa_flname.
  wa_cat-outputlen = '10'.
  APPEND wa_cat TO fs_fldcat.
  ENDDO.

* Muestra lista

  CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
  EXPORTING
  it_fieldcat = fs_fldcat
  TABLES
  t_outtab = <t_dyntable>."<t_dyntable>.

Muchas veces en FI, se desear realizar la sustitución del valor de un determinado campo, pero resulta que al querer realizar la sustitución (tx obbh) no encontramos el campo que queremos sustituir y esto normalmente se debe a que el campo está marcado (excluido )para no ser sustituido, para solucionar es inconveniente se debe desactivar un flag (check) para que este campo sea sustituible.



Para ello se realizan los siguiente simples pasos.

1.-  Revisar si el campo se encuentra como campo sustituible o si tiene permisos de ser sustituible (flag no marcado quiere decir que si esta listo para ser sustituido)

ir a la TABLA ==> GB01


en la imagen vemos que el campo HKONT (cuenta contable)  si es sustituible

2.-  en caso de que se encuentre pero que no tenga marcado el flag de sustituible nos vamos a la vista y marcamos el flag.

VISTA DE ACT. ==> V_GB01C


vemos en la siguiente imagen que sólo se listan los campos sustituibles, para poder sustituir un campo se debe ir a la tabla GB01 y quitar la X del registro q queremos sustituir.

3.- para que los cambios se vean reflejados tenemos que ingresas al siguiente programa y ejecutarlo, esto regenerará nuevamente los campos que estén listos para ser sustituidos y agregará nuestro campo.

Programa de Regeneración ==> RGUGBR00

al ejecutar solo se debe marcar el flag de sustitución.




Muchas veces hemos tenido inconvenientes para agregar objetos a un SAPSCRIPT, en esta ocasión vamos a agregar un Logo para mostrarlo por SAPSCRIPT.


tamaño de imagen en sapscript:

BITMAP 'IMAGEN' OBJECT GRAPHICS ID BMAP TYPE BCOL DPI 600

SUBIR LOGO PARA SAPSCRIPT:

1. Ir a la SE38, introduzca el nombre del programa "RSTXLDMC" y ejecutarlo.
2. En la ejecución de este programa se muestra una nueva sesión en la que es necesario mencionar su nombre de Logo. 
   Para ello, introduzca su nombre en el selecto Logo opción "Param para el estándar de texto> Texto Nombre.". 
   El nombre dado aquí debe comenzar con 'Y' o 'Z' Ej:. YLOGO o ZLOGO.   
   En executin este le pedirá la ubicación en su logotipo es stored.The logotipo debe ser de tipo. Extensión TIFF.
   Una vez se especifica la ubicación del archivo TIFF. Se carga y se almacena como un elemento de texto en SO10 y
   una nueva sesión se muestra que diga si el logo se guarda o no con éxito. 
3. Para ver su logo ir a la tx SO10 mencionar el nombre del archivo, es decir, YLOGO o ZLOGO y haga clic en visualización
   de impresión y verá la imagen subida.
4. A continuación, introduzca la línea de comandos (/ :) en la "Columna Tag" y recorrer a través de el siguiente menú: 
   Insertar -> Texto -> Estándar. 
   Mencione el nombre del logotipo en nuestro caso es bien YLOGO o ZLOGO.On hacer esto, 
   el logo se insertará en los elementos de texto con el mensaje de la siguiente manera: 
   INCLUIR ZLOGO TEXTO OBJETO ID ST.  
Estos botones normal mente se crear ya sea para ejecutar un proceso adicional o realizar la descargar de algún formato que se arme de la data del reporte generado. Para agregar el botón realizamos lo siguiente:

  METHOD handle_toolbar.

    DATA: e_toolbar  TYPE stb_button.

*  >>>> Agrega separador

   MOVE 3 TO e_toolbar-butn_type.
    APPEND e_toolbar TO e_object->mt_toolbar.

    CLEAR e_toolbar.

    MOVE: 'FC_FILE'           TO e_toolbar-function,
                     icon_activity      TO e_toolbar-icon,
                'Generar archivo'  TO e_toolbar-quickinfo,
                'Generar archivo'  TO e_toolbar-text.
              APPEND e_toolbar TO e_object->mt_toolbar.


  ENDMETHOD.  


miércoles, 31 de agosto de 2016

LECTURA Y ESCRITURA DE INFOTIPOS - HCM

 CASO

 Se requiere insertar registros a un infotipo para una sola persona y luego obtener a nivel de consulta los registros ingresados.

El Problema:

que al ingresar o eliminar registros para una persona, el programa no está obteniendo dichos registros. Ejemplo:

 en tabla:
                Registro 1
                Registro 2
                Registro 3

 Se quiere agregar el Registro 4 y el Registro 5, pero al consultar desde la misma función los registros consultados, sólo se muestran los Registros 1,2 y 3.

El porqué?...

Esto se debe a que cuando se está ejecutando la función para obtener datos  (  HR_READ_INFOTYPE,) luego de haber insertado algunos más (ambas lógicas en la misma función), se está ejecutando a nivel de BUFFER, por ello sólo trae los datos que se cargaron al BUFFER y no desde la tabla (que ya tiene los datos agregados).

La solución:

Para ello se agrega un parámetro más a la función HR_READ_INFOTYPE.












A call-to-action text Contact us