miércoles, 31 de diciembre de 2014

Función para obtener atributos de un ELEMENTO DE DATOS o campos de una TABLA (SAP-ABAP-Funciones)

Estimados, esta función puede ser útil:

  lv_tabname = 'MARA'. "(o BUKRS por ejemplo)

  CALL FUNCTION 'DDIF_FIELDINFO_GET'
    EXPORTING

      tabname        = lv_tabname  " Elemento de datos o tabla
      langu          = sy-langu
      all_types      = 'X'
    IMPORTING
      dfies_wa       = ls_dfies_wa " Retorna atributos del obejto
    TABLES
      dfies_tab      = lt_dfies_tab[] " Retorna campos de una tabla
    EXCEPTIONS
      not_found      = 1
      internal_error = 2
      OTHERS         = 3.
  IF sy-subrc NE 0.
*  Implement suitable error handling here
  ENDIF.

lunes, 13 de octubre de 2014

FORM para formatear RUT (ABAP... RUT= identificador fiscal)



Llamada ejemplo:


paval = '112272682'.

PERFORM f_rut  USING  paval  CHANGING rut.

La variable rut será igual a 11.227.268-2.


viernes, 25 de julio de 2014

Trabajando con Ordenes de Trasporte de Copia (SAP-ABAP-Funcionalidad)

A menudo debemos transportar Ordenes de Transporte al ambiente de QAS desde Dasarrollo para hacer pruebas. Para no liberar la Orden que hemos creado, la cual posteriormente pasara también a QAS y luego a Producción, podemos crear una OT de "Copia", la cual tiene la particularidad que termina su ciclo en el sistema de destino elegido al crearla, para ello haremos lo siguiente:

1)  Creamos la OT de Copia (Trx SE09 o SE10):





    Debemos poner el sistema destino con su mandante correspondiente y grabamos....



    

   Por otra parte, tenemos la OT Original o Principal..... de esta
, tomamos la tarea o tareas, la(s) cual(es) incluiremos en nuestra OT de Copia....     



    Se incluye la tarea en la OT de Copia....y aceptar...


     
    Finalmente liberamos la OT de Copia.....(F9)


     

Este procedimiento lo podemos ejecutar cuantas veces sea necesario, así cuando liberemos la OT Original, será solo una OT para el proyecto o mejora que incluirá todos los objetos necesarios.




jueves, 24 de julio de 2014

Función para obtener las Ordenes de Transporte asociadas a un Objeto (SAP-ABAP-Funciones)

Primero, debemos crear la siguiente estructura (si cambian el nombre de la estructura, deberán cambiarlo en el código también):



Esto es solo para agregar la descripción de la OT.

Ahora creamos un grupo de funciones y un módulo de funciones:




En el "Import" del módulo:





En "Tablas" del módulo:




Y finalmente agregamos este código en "Cód.fte.":

  FIELD-SYMBOLS:
  <fs_head> TYPE zcfcl_es_e070,
  <fs_e070> TYPE e070.
  DATA:
  lt_e070      TYPE TABLE OF e070,
  lt_e071      TYPE TABLE OF e071,
  lt_e07t       TYPE STANDARD TABLE OF e07t,
  ls_e07t      TYPE e07t,
  ls_head     TYPE zcfcl_es_e070.

  CHECK iv_obj_name IS NOT INITIAL.
  REFRESH: lt_e071[], et_detail[], lt_e070, et_head[].
  SELECT * FROM e071 INTO TABLE lt_e071
  WHERE obj_name EQ iv_obj_name.
  IF sy-subrc EQ 0.
    SELECT * FROM e071 INTO TABLE et_detail
    FOR ALL ENTRIES IN lt_e071
    WHERE trkorr EQ lt_e071-trkorr.
    IF sy-subrc EQ 0.
      SELECT * FROM e070 INTO TABLE lt_e070
      FOR ALL ENTRIES IN lt_e071
      WHERE trkorr EQ lt_e071-trkorr.
      IF sy-subrc EQ 0.
        SELECT * FROM e070 INTO CORRESPONDING FIELDS OF TABLE et_head
        FOR ALL ENTRIES IN lt_e070
        WHERE trkorr EQ lt_e070-strkorr.
        IF sy-subrc NE 0.
          UNASSIGN: <fs_e070>.
          CLEAR: ls_head.
          LOOP AT lt_e070 ASSIGNING <fs_e070>.
            MOVE-CORRESPONDING <fs_e070> TO ls_head.
            APPEND ls_head TO et_head.
            CLEAR: ls_head.
          ENDLOOP.
        ENDIF.

        SELECT * FROM e07t INTO TABLE lt_e07t
        FOR ALL ENTRIES IN et_head
        WHERE trkorr EQ et_head-trkorr
          AND langu  EQ sy-langu.
        IF sy-subrc EQ 0.
          UNASSIGN <fs_head>.
          LOOP AT et_head ASSIGNING <fs_head>.
            CLEAR: ls_e07t.
            READ TABLE lt_e07t INTO ls_e07t WITH KEY trkorr = <fs_head>-trkorr.
            IF sy-subrc EQ 0.
              <fs_head>-as4text = ls_e07t-as4text.
            ENDIF.
          ENDLOOP.
        ENDIF.

      ENDIF.
    ENDIF.
  ENDIF.



martes, 17 de junio de 2014

Form para separar prefijo y folio del campo XBLNR (SAP - ABAP - Funciones)

Para algunos países se utilizan los folio pre-impresos o pre-numerados, a continuación una form que nos hace el split del prefijo y el folio sobre el campo XBLNR:

DATA: lv_xblnr TYPE xblnr_v1.


lv_xblnr = <fs_vbrk>-xblnr.

PERFORM f_split_xblnr USING    lv_bukrs  " Sociedad
                      CHANGING lv_xblnr. " Nro. Docto. Ref.


*&--------------------------------------------------------------*
*&      Form  F_SPLIT_XBLNR
*&--------------------------------------------------------------*
 FORM f_split_xblnr USING    p_v_bukrs TYPE t001-bukrs
                    CHANGING p_v_folio.
 

 DATA: lv_rgtno TYPE idcn_loma-rgtno,
       lv_invno TYPE idcn_loma-invfr,
       lv_xblnr TYPE bkpf-xblnr,
       lv_invtp TYPE idcn_loma-invtp.
 CHECK p_v_folio IS NOT INITIAL. 

  lv_xblnr = p_v_folio.

  CALL FUNCTION 'XBLNR_BUILD_AND_SPLIT_PECL'  " PECL = Perú y Chile
    EXPORTING
      i_bukrs            = p_v_bukrs
*     I_BUILD            =
*     I_RGTNO            =
*     I_INVNO            =
      i_xblnr            = lv_xblnr
*     I_INVTP            =
    IMPORTING
      e_rgtno            = lv_rgtno   " Nos retorna el prefijo 
      e_invno            = lv_invno   " Nos retorna el folio 
*     e_xblnr            =
      e_invtp            = lv_invtp
    EXCEPTIONS
*     PARAMETER_WRONG    = 1
      not_found          = 2
      xblnr_format_wrong = 3
      OTHERS             = 4.
  IF sy-subrc <> 0 OR lv_invno IS INITIAL. " Note 356790
    RAISE lot_not_found.
  ELSE.
    p_v_folio = lv_invno.
  ENDIF.

ENDFORM.                    " F_SPLIT_XBLNR


También existe una función que no es específica para algún país:

XBLNR_BUILD_AND_SPLIT


martes, 1 de abril de 2014

Reemplazar caracteres en una cadena con TRANSLATE (SAP-ABAP)

Ejemplo:
DATA:
lv_ean(10)    VALUE 'A1D1B1C1A1',
lv_change(54) VALUE 'A B C D '.



La sentencia TRANSLATE, para este caso, reemplaza cada caracter contenido en la variable LV_CHANGE, por el caracter que le sigue (espacio para todas las letras):

TRANSLATE lv_ean USING lv_change.


El resultado inicial sería: lv_ean = ' 1 1 1 1 1'

CONDENSE lv_ean NO-GAPS.


El resultado final sería: lv_ean = '11111'

lunes, 24 de marzo de 2014

Visualizar formulario sin cuadro de diálogo (SAP - ABAP - SMARTFORMS)

      La siguiente parametrización permite la visualización previa de un formulario sin cuadro de diálogo:

ls_control_param-no_dialog  = abap_on.  " SIN VENTANA DIALOGO
ls_control_param-preview    = abap_on.  " CON VISUALIZAC.PREVIA
ls_control_param-device     = 'PRINTER'.
ls_output_options-tddest    = 'LCL'.    " DISPOSITIVO DE SALIDA
ls_output_options-tdnoprint = abap_off. " IMPRIMIR
ls_output_options-tdarmod   = '1'.      " SOLO IMPRIMIR 

      
CALL FUNCTION lv_fm_name
        
EXPORTING
*         ARCHIVE_INDEX        =
*         ARCHIVE_INDEX_TAB    =
*         ARCHIVE_PARAMETERS   =

          control_parameters   
= ls_control_parameters
*         MAIL_APPL_OBJ        =
*         MAIL_RECIPIENT       =
*         MAIL_SENDER          =

          output_options       
= ls_output_options
          user_settings        
= abap_off
          is_xekko             
= p_s_xekko
          is_xpekko            
= p_s_xpekko
*        IMPORTING
*         DOCUMENT_OUTPUT_INFO =
*          job_output_info      = ls_job_output_info
*         JOB_OUTPUT_OPTIONS   =

        
TABLES
          it_xekpa             
= p_t_xekpa[]
          it_xekpo             
= p_t_xekpo[]
          it_xpekpo            
= p_t_xpekpo[]
          it_xeket             
= p_t_xeket[]
          it_xekkn             
= p_t_xekkn[]
          it_xekek             
= p_t_xekek[]

          it_xekeh             = p_t_xekeh[]
          it_xtkomv            
= p_t_xtkomv[]
          it_detocn            
= p_t_detcon[]
          it_serv              
= p_t_detser[]
        
EXCEPTIONS
          formatting_error     
= 1
          internal_error       
= 2
          send_error           
= 3
          user_canceled        
= 4
          
OTHERS               = 5.

Imprimir SMARTFORMS solo en SPOOL (SAP - ABAP - SMARTFORMS)

      Esta parametrización permite imprimir un formulario directamente al SPOOL sin opción a previsualización:

ls_composer_param-tdnoprev  = abap_on.  " SIN VISUALIZ. PREVIA
ls_composer_param
-tdnoprint = abap_off. " NO IMPRIMIR
ls_composer_param
-tdnoarch  = abap_off. " NO ARCHIVAR
ls_composer_param
-tddest    = 'LOCAL'.  " DISPOSITIVO DE SALIDA
ls_composer_param
-tdimmed   = abap_off. " SIN SALIDA INMEDIATA
ls_composer_param
-tddelete  = abap_off. " NO BORRAR TRAS SALIDA
ls_composer_param
-tdnewid   = abap_on.  " NUEVA ORDEN SPOOL
ls_composer_param
-tdfinal   = abap_on.  " CERRAR ORDEN DE SPOOL
ls_composer_param
-tdarmod   = '1'.      " SOLO IMPRIMIR
ls_composer_param
-tdcopies  = '001'.    " CANTIDAD DE COPIAS

ls_control_param
-no_dialog  = abap_on.  " SIN VENTANA DIALOGO
ls_control_param
-preview    = abap_off. " SIN VISUALIZ. PREVIA
ls_control_param
-device     = 'PRINTER'." DISPOSITIVO


      
CALL FUNCTION lv_fname
        
EXPORTING
*         archive_index      = toa_dara
*         archive_parameters = arc_params

          control_parameters 
= ls_control_param
          output_options     
= ls_composer_param
          user_settings      
= abap_off
          p_gjahr            
= p_gjahr
        
TABLES
          gt_cabecera        
= gt_head[]
          gt_detalle         
= gt_detail[]
        
EXCEPTIONS
          formatting_error   
= 1
          internal_error     
= 2
          send_error         
= 3
          user_canceled      
= 4
          
OTHERS             = 5.

      
IF sy-subrc <> 0.
        
MESSAGE e006(zcfcl_fi_0003).
      
ENDIF.

lunes, 27 de enero de 2014

Función para obtener los impuestos según país (SAP-ABAP)

Import de la función:



Tabla de retorno de la función:






Creación de estructura en la SE11:





Código fuente de la función:

 DATA: lt_data TYPE STANDARD TABLE OF zcfcl_fi_es_tax,
        ls_data TYPE zcfcl_fi_es_tax.

  DATA: ls_t007a TYPE t007a,
        lt_t007a TYPE STANDARD TABLE OF t007a,
        lt_ftaxp TYPE STANDARD TABLE OF ftaxp,
        ls_ftaxp TYPE ftaxp,
        lv_kalsm TYPE t005-kalsm,
        lv_txjcd TYPE txjcd.

  DATA: lv_valor TYPE p DECIMALS 2.

  CONSTANTS: lc_fix_kappl TYPE kappl VALUE 'TX'.

  CLEAR lv_kalsm.
  REFRESH: lt_t007a[], lt_ftaxp[], et_data[].
  SELECT SINGLE kalsm FROM t005 INTO lv_kalsm
  WHERE land1 EQ iv_land1.
  IF sy-subrc EQ 0.
    CLEAR lv_txjcd.
    SELECT SINGLE txjcd FROM ttxj INTO lv_txjcd
    WHERE kalsm EQ lv_kalsm.
    IF sy-subrc NE 0 OR lv_txjcd IS INITIAL.
      MOVE 'X' TO lv_txjcd.
    ENDIF.

    SELECT * FROM t007a INTO TABLE lt_t007a
    WHERE kalsm EQ lv_kalsm.
    IF sy-subrc EQ 0.
      CLEAR ls_t007a.
      LOOP AT lt_t007a INTO ls_t007a.

        CALL FUNCTION 'GET_TAX_PERCENTAGE'
          EXPORTING
            aland   = iv_land1
            datab   = sy-datum
            mwskz   = ls_t007a-mwskz
            txjcd   = lv_txjcd
          TABLES
            t_ftaxp = lt_ftaxp.

        IF lt_ftaxp[] IS NOT INITIAL.
          CLEAR ls_ftaxp.
          READ TABLE lt_ftaxp INTO ls_ftaxp INDEX 1.
          IF sy-subrc EQ 0.
            MOVE-CORRESPONDING ls_ftaxp TO ls_data.
            MOVE ls_t007a-mwskz TO ls_data-mwskz.
            lv_valor = ls_ftaxp-kbetr / 10.
            WRITE  lv_valor TO ls_data-tax DECIMALS 2 .
            REPLACE ALL OCCURRENCES OF '.' IN ls_data-tax WITH ','.
            CONDENSE ls_data-tax.
            APPEND ls_data TO lt_data.
          ENDIF.
        ENDIF.

      ENDLOOP.

    ENDIF.

  ENDIF.

  MOVE lt_data[] TO et_data[].

Form para obtener texto (SAP-ABAP... FM READ_TEXT)

*&---------------------------------------------------------------------*
*&      Form  F_GET_TEXT
*&---------------------------------------------------------------------*
FORM f_get_text  USING    p_v_obj      TYPE tdobject
                                               p_v_id        TYPE tdid
                                               p_v_langu   TYPE spras
                                               p_v_name   TYPE tdobname
                    CHANGING      p_v_string   TYPE string.

  DATA: lt_lines_tab    TYPE  efg_tab_tline,
              ls_line_es       TYPE  tline,
              lv_texto_line   TYPE  string.

  CALL FUNCTION 'READ_TEXT'
    EXPORTING
      id                          = p_v_id
      language                = p_v_langu
      name                     = p_v_name
      object                   = p_v_obj
    TABLES
      lines                      = lt_lines_tab
    EXCEPTIONS
      id                      = 1
      language                = 2
      name                    = 3
      not_found               = 4
      object                  = 5
      reference_check         = 6
      wrong_access_to_archive = 7
      OTHERS                  = 8.
  IF sy-subrc <> 0.
* Implement suitable error handling here
  ELSE.
    LOOP AT lt_lines_tab INTO ls_line_es.
      IF sy-tabix EQ 1.
        p_v_string = ls_line_es-tdline.
      ELSE.
        CONDENSE ls_line_es-tdline.
        CONCATENATE p_v_string ls_line_es-tdline INTO p_v_string SEPARATED BY space.
      ENDIF.
    ENDLOOP.
  ENDIF.

ENDFORM.                    " F_GET_TEXT


LLAMADA A LA FORM: en este caso es un texto de posición.


      DATA:   lv_string         TYPE string,

                     lv_name         TYPE tdobname,       CLEAR: lv_string, lv_name.
      CONCATENATE <fs_item>-vbeln <fs_item>-vbpos INTO lv_name.


      PERFORM f_get_text    USING 'VBBP'
                                                          '0001'
                                                          syst-langu
                                                          lv_name
                                    CHANGING lv_string.