Cálculo del Dígito Verificador del CDC

28 06 2023

En Facturación Electrónica de Paraguay, a fin de mantener una única identificación para cada documento electrónico, la SET implementó el código de control o CDC.
El completo glosario, lo pueden ubicar en el siguiente link a partir de la página 214:
https://ekuatia.set.gov.py/portal/rest/jcr/repository/collaboration/sites/ekuatia/documents/documentacion/documentacion-tecnica/Manual%20T%C3%A9cnico%20Versi%C3%B3n%20150.pdf?version=2


Básicamente el CDC es la concatenación de 11 campos:



Código ABAP para la obtención del Dígito Verificador del CDC en Módulo 11:

DATA: 
lv_cdc(43)       TYPE c, «Primeros diez campos
lv_dv_cdc        TYPE c, «Dígito Verificador
lv_cdc_final(44) TYPE c. «CDC completo (los once campos concatenados)


* 1ro – Hay que concatenar los primeros 10 campos del CDC en una variable de 43 caracteres.
CONCATENATE campo1 campo2 campo3 campo4 campo5 campo6 campo7 campo8 campo9 campo10 into lv_cdc.


* 2do – Pasar esa variable de 43 caracteres al siguiente PERFORM que devuelve como resultado el Dígito Verificador en Módulo 11
PERFORM calcula_dv_del_cdc USING     lv_cdc
                              CHANGING lv_dv_cdc.

*&———————————————————————*
*&      Form  CALCULA_DV_DEL_CDC
*&———————————————————————*
FORM calcula_dv_del_cdc  USING     fw_cdc    TYPE char43
                          CHANGING fw_dv_cdc TYPE char1.
  DATA: lv_cdc    TYPE char43,
        lv_veces  TYPE i,
        lv_factor TYPE i,
        lv_suma   TYPE i,
        lv_pos    TYPE i.

  lv_cdc = fw_cdc.
  CONDENSE lv_cdc NO-GAPS.
  lv_veces = strlen( lv_cdc ).

  lv_factor = 2.
  CLEAR lv_suma.
  lv_pos = lv_veces – 1.

  DO lv_veces TIMES.
    lv_suma = lv_suma + ( lv_cdc+lv_pos(1) * lv_factor ).
    lv_pos = lv_pos – 1.
    lv_factor = lv_factor + 1.
    IF lv_factor > 11.
      lv_factor = 2.
    ENDIF.
  ENDDO.

  lv_factor = lv_suma MOD 11.

  IF lv_factor > 1.
    lv_factor = 11 – lv_factor.
    fw_dv_cdc = lv_factor.

  ELSE.
    fw_dv_cdc = ‘0’.
  ENDIF.

ENDFORM.                    » CALCULA_DV_DEL_CDC

* 3ro – Finalmente se arma el CDC completo (los once campos concatenados):
  CONCATENATE lv_cdc lv_dv_cdc INTO lv_cdc_final.


Technorati tags: sdn blogger





Agregar íconos en pantalla de selección

21 06 2016

En nuestra pantalla de selección podemos agregar íconos al costado de cada parámetro:
Dibujo

 

Para esto simplemente hay que agregar una «combinación de caracteres» (código ID) al comienzo de los textos de selección:
Dibujo
Ruta: Goto –> Text Elements –> Selection texts

 

Cada ícono tiene su propia combinación de caracteres:
Dibujo

 

Y con este programa podemos conocer todos los íconos y su respectivo ID:
DATA :
gs_icon TYPE ICON,
gt_icon TYPE TABLE OF ICON.
SELECT * FROM icon INTO TABLE gt_icon.
LOOP AT gt_icon INTO gs_icon.
WRITE :/
gs_icon-name,
33 '@',
34 gs_icon-id+1(2),
36 '@',
40 gs_icon-id.
ENDLOOP.

 


Technorati tags:





Matchcode Browser Server (buscador de directorios del servidor)

13 08 2008

Con la siguiente función vamos a poder habilitar el matchcode para que abra un browser file (explorador de directorios) del servidor. Esto nos va a servir para hacer upload y download de archivos.

Acá el código que debemos ingresar en nuestros programas:

* Constantes locales
  CONSTANTS:lc_p TYPE c VALUE ‘P’,
                      lc_a TYPE dxfields-location VALUE ‘A’.

* Variables locales
  DATA: li_host TYPE STANDARD TABLE OF msxxlist,
             lw_host TYPE msxxlist,
             lv_path TYPE dxfields-longpath,
             lv_ubicacion(1) TYPE c,
             lv_abend  TYPE c.

*En P_FILE va a quedar guardada la ruta del archivo del servidor
PARAMETERS: P_FILE LIKE RLGRAP-FILENAME.

*- Machcode busqueda de archivo del servidor
AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_file.

*-Nombre del servidor
  CALL FUNCTION ‘RFC_GET_LOCAL_SERVERS’
    TABLES
      hosts         = li_host
    EXCEPTIONS
      not_available = 1
      OTHERS        = 2.

  IF sy-subrc IS INITIAL.

*-Nombre del servidor a la estructura
    CLEAR lw_host.
    READ TABLE li_host
               INTO lw_host
               INDEX 1.

*-Obtengo el path
    CALL FUNCTION ‘F4_DXFILENAME_TOPRECURSION’
      EXPORTING
        i_location_flag = lc_a
        i_server        = lw_host-name
      IMPORTING
        o_location_flag = lv_ubicacion
        o_path          = lv_path
        abend_flag      = lv_abend
      EXCEPTIONS
        rfc_error       = 1
        error_with_gui  = 2
        OTHERS          = 3.

*-Si se obtiene un path
    IF sy-subrc    IS INITIAL AND
       NOT lv_path IS INITIAL AND
       lv_abend    IS INITIAL.

*-Devuelvo ruta al parametro de selección
      p_file = lv_path.

    ENDIF.

  ENDIF.


Technorati tags:





Ayudas (matchcodes) para entradas en base al tipo de datos

27 11 2007

Generalmente cuando queremos agregar ayudas (matchcodes) vamos a la transacción SE11 y nos fijamos qué «Ayuda para búsqueda» tiene asociado el campo.

Pero muchas veces el matchcode es del tipo «Ayudas para entradas en base al tipo de datos». En esos casos la ayuda se genera con una función.
Por tal motivo la solución es buscar alguna transacción que tenga el matchcode del campo que necesitamos y debuggueamos al momento de abrir la ayuda para encontrar la función.

A continuación voy a dejar un ejemplo para los campos LAUFD (Fecha de Ejecución) y LAUFI (ID Ejecución). Son parámetros muy comunes (Ej: transacción F110).


DATA: TLAUFK LIKE ILAUFK OCCURS 0 WITH HEADER LINE.

PARAMETERS:
            P_LAUFD LIKE F110V-LAUFD OBLIGATORY,   «Fecha de Ejecución
            P_LAUFI LIKE F110V-LAUFI OBLIGATORY.     «ID Ejecución

**Habilito con la tecla F4 el matchcode para el campo LAUFI
AT SELECTION-SCREEN ON VALUE-REQUEST FOR P_LAUFI.
  REFRESH TLAUFK.
  TLAUFK-LAUFK = SPACE.
  TLAUFK-SIGN = ‘I’.
  APPEND TLAUFK. 

  CALL FUNCTION ‘F4_ZAHLLAUF’
    EXPORTING
      F1TYP = ‘D’
      F2NME = ‘P_LAUFI’
    IMPORTING
      LAUFD = P_LAUFD
      LAUFI = P_LAUFI
    TABLES
      LAUFK = TLAUFK.

 

**Habilito con la tecla F4 el matchcode para el campo LAUFD
AT SELECTION-SCREEN ON VALUE-REQUEST FOR P_LAUFD.
  REFRESH TLAUFK.
  TLAUFK-LAUFK = SPACE.
  TLAUFK-SIGN = ‘I’.
  APPEND TLAUFK. 

CALL FUNCTION ‘F4_ZAHLLAUF’
    EXPORTING
      F1TYP = ‘D’
      F2NME = ‘P_LAUFI’
    IMPORTING
      LAUFD = P_LAUFD
      LAUFI = P_LAUFI
    TABLES
      LAUFK = TLAUFK.


Technorati tags:





ALV Tree Orientado a Objetos

26 11 2007

Hace unos días en el trabajo me tocó hacer un reporte ALV Tree .
image 

No encontré mucha información ni manuales al respecto, mucho menos en español. Pero por suerte pude encontrar un ejemplo que me sirvió mucho. Es un post de ALV Tree orientado a objetos del conocido Alvaro Tejada Galindo (http://atejada.blogspot.com/2007/05/alv-tree-orientado-objetos.html#links)

Por lo tanto aprovecho para hacer referencia de ese post con algunas cosas que faltaban y cambios en la sintaxis para que active. Y además voy a describir en detalle como crear una Dynpro y el Custom Control necesarios para correr el reporte ALV Tree.


1º) Desde la transacción SE38 creamos el reporte Z_ALV_TREE y pegamos el siguiente código:

*&———————————————————————*
*& Report  Z_ALV_TREE                                                  *
*&                                                                     *
*&———————————————————————*
*&                                                                     *
*&                                                                     *
*&———————————————————————*

REPORT Z_ALV_TREE.

*——————————————————————*
*  DECLARACION DE TYPES                                            *
*——————————————————————*

TYPES: BEGIN OF TY_SPFLI,
       CARRID TYPE SPFLI-CARRID,
       CONNID TYPE SPFLI-CONNID,
       COUNTRYFR TYPE SPFLI-COUNTRYFR,
       CITYFROM TYPE SPFLI-CITYFROM,
       AIRPFROM TYPE SPFLI-AIRPFROM,
       COUNTRYTO TYPE SPFLI-COUNTRYTO,
       CITYTO TYPE SPFLI-CITYTO,
       END OF TY_SPFLI.

TYPES: BEGIN OF TY_HEADER,
       CARRID TYPE SPFLI-CARRID,
       END OF TY_HEADER.

*—————————————————————–*
*  DECLARACION DE TABLAS INTERNAS                                 *
*—————————————————————–*

DATA: T_SPFLI TYPE STANDARD TABLE OF TY_SPFLI
      WITH HEADER LINE,
      TAB_TREE TYPE STANDARD TABLE OF TY_SPFLI
      WITH HEADER LINE,
      T_TREE TYPE STANDARD TABLE OF TY_SPFLI
      WITH HEADER LINE,
      T_HEADER TYPE STANDARD TABLE OF TY_HEADER
      WITH HEADER LINE.

*—————————————————————–*
*  DECLARACION DE VARIABLES                                       *
*—————————————————————–*

DATA: G_ALV_TREE TYPE REF TO CL_GUI_ALV_TREE,
      L_HIERARCHY_HEADER TYPE TREEV_HHDR,
      GS_FIELDCAT TYPE LVC_S_FCAT,
      GT_FIELDCAT_TREE TYPE LVC_T_FCAT,
      G_CUSTOM_CONTAINER TYPE REF TO CL_GUI_CUSTOM_CONTAINER.

*—————————————————————–*
*  DECLARACION DE FIELD-SYMBOLS                                   *
*—————————————————————–*

FIELD-SYMBOLS:  <HEADER> LIKE LINE OF T_HEADER,
                <SPFLI> LIKE LINE OF T_SPFLI.

*—————————————————————–*
*   SELECTION-SCREEN                                              *
*—————————————————————–*

SELECTION-SCREEN BEGIN OF SCREEN 1001.
SELECTION-SCREEN END OF SCREEN 1001.

*—————————————————————–*
*   START-OF-SELECTION                                            *
*—————————————————————–*

START-OF-SELECTION.

  PERFORM OBTENER_DATOS.

  IF G_ALV_TREE IS INITIAL.
    PERFORM INIT_TREE.

    CALL METHOD CL_GUI_CFW=>FLUSH
            EXCEPTIONS CNTL_SYSTEM_ERROR = 1
                       CNTL_ERROR        = 2.
  ENDIF.

  CALL SCREEN 100.

*—————————————————————–*
*       FORM init_tree                                            *
*—————————————————————–*

FORM INIT_TREE.

  DATA: L_TREE_CONTAINER_NAME(30) TYPE C.

  L_TREE_CONTAINER_NAME = ‘TREE_CONTROL’.

  CREATE OBJECT G_CUSTOM_CONTAINER
      EXPORTING
            CONTAINER_NAME = L_TREE_CONTAINER_NAME
      EXCEPTIONS
            CNTL_ERROR                  = 1
            CNTL_SYSTEM_ERROR           = 2
            CREATE_ERROR                = 3
            LIFETIME_ERROR              = 4
            LIFETIME_DYNPRO_DYNPRO_LINK = 5.

  CREATE OBJECT G_ALV_TREE
    EXPORTING
        PARENT              = G_CUSTOM_CONTAINER
        NODE_SELECTION_MODE = CL_GUI_COLUMN_TREE=>NODE_SEL_MODE_SINGLE
        ITEM_SELECTION      = »
        NO_HTML_HEADER      = ‘X’
        NO_TOOLBAR          = »
    EXCEPTIONS
        CNTL_ERROR                   = 1
        CNTL_SYSTEM_ERROR            = 2
        CREATE_ERROR                 = 3
        LIFETIME_ERROR               = 4
        ILLEGAL_NODE_SELECTION_MODE  = 5
        FAILED                       = 6
        ILLEGAL_COLUMN_NAME          = 7.

  PERFORM FILL_CATALOG_TREE.
  PERFORM BUILD_HIERARCHY_HEADER CHANGING L_HIERARCHY_HEADER.

  CALL METHOD G_ALV_TREE->SET_TABLE_FOR_FIRST_DISPLAY
       EXPORTING
                 IS_HIERARCHY_HEADER  = L_HIERARCHY_HEADER
       CHANGING
                 IT_OUTTAB        = T_TREE[]
                 IT_FIELDCATALOG  = GT_FIELDCAT_TREE.

  PERFORM CREATE_HIERARCHY.

ENDFORM.

*—————————————————————–*
*   FORM FILL_CATALOG_TREE                                        *
*—————————————————————–*

FORM FILL_CATALOG_TREE.

  DATA: GS_FIELDCAT_ADD TYPE LVC_S_FCAT.

  CLEAR GS_FIELDCAT.
  GS_FIELDCAT-COL_POS   = 1.
  GS_FIELDCAT-REPTEXT   = ‘Flight’.
  GS_FIELDCAT-SCRTEXT_S = ‘Flight’.
  GS_FIELDCAT-FIELDNAME = ‘CONNID’.
  GS_FIELDCAT-TABNAME = ‘T_SPFLI’.
  APPEND GS_FIELDCAT TO GT_FIELDCAT_TREE.

  CLEAR GS_FIELDCAT.
  GS_FIELDCAT-COL_POS   = 2.
  GS_FIELDCAT-REPTEXT   = ‘Country’.
  GS_FIELDCAT-SCRTEXT_S = ‘Country’.
  GS_FIELDCAT-FIELDNAME = ‘COUNTRYFR’.
  GS_FIELDCAT-TABNAME = ‘T_SPFLI’.
  APPEND GS_FIELDCAT TO GT_FIELDCAT_TREE.

  CLEAR GS_FIELDCAT.
  GS_FIELDCAT-COL_POS   = 3.
  GS_FIELDCAT-REPTEXT   = ‘Dep.City’.
  GS_FIELDCAT-SCRTEXT_S = ‘Dep.City’.
  GS_FIELDCAT-FIELDNAME = ‘CITYFROM’.
  GS_FIELDCAT-TABNAME = ‘T_SPFLI’.
  GS_FIELDCAT-OUTPUTLEN = ’15’.
  APPEND GS_FIELDCAT TO GT_FIELDCAT_TREE.

  CLEAR GS_FIELDCAT.
  GS_FIELDCAT-COL_POS   = 4.
  GS_FIELDCAT-REPTEXT   = ‘Dep.Airp’.
  GS_FIELDCAT-SCRTEXT_S = ‘Dep.Airp’.
  GS_FIELDCAT-FIELDNAME = ‘AIRPFROM’.
  GS_FIELDCAT-TABNAME = ‘T_SPFLI’.
  GS_FIELDCAT-OUTPUTLEN = ’20’.
  APPEND GS_FIELDCAT TO GT_FIELDCAT_TREE.

  CLEAR GS_FIELDCAT.
  GS_FIELDCAT-COL_POS   = 5.
  GS_FIELDCAT-REPTEXT   = ‘Country’.
  GS_FIELDCAT-SCRTEXT_S = ‘Country’.
  GS_FIELDCAT-FIELDNAME = ‘COUNTRYTO’.
  GS_FIELDCAT-TABNAME = ‘T_SPFLI’.
  GS_FIELDCAT-OUTPUTLEN = ’15’.
  APPEND GS_FIELDCAT TO GT_FIELDCAT_TREE.

  CLEAR GS_FIELDCAT.
  GS_FIELDCAT-COL_POS   = 6.
  GS_FIELDCAT-REPTEXT   = ‘Arr.City’.
  GS_FIELDCAT-SCRTEXT_S = ‘Arr.City’.
  GS_FIELDCAT-FIELDNAME = ‘CITYTO’.
  GS_FIELDCAT-TABNAME = ‘T_SPFLI’.
  GS_FIELDCAT-OUTPUTLEN = ’20’.
  APPEND GS_FIELDCAT TO GT_FIELDCAT_TREE.

ENDFORM.

*———————————————————————*
*       FORM build_hierarchy_header                                   *
*———————————————————————*

FORM BUILD_HIERARCHY_HEADER CHANGING
                               P_HIERARCHY_HEADER TYPE TREEV_HHDR.

  CLEAR P_HIERARCHY_HEADER.
  P_HIERARCHY_HEADER-HEADING = ‘Airline carrier'(300).
  P_HIERARCHY_HEADER-WIDTH = 18.
  P_HIERARCHY_HEADER-WIDTH_PIX = ‘ ‘.

ENDFORM.

*———————————————————————*
*       FORM create_hierarchy                                         *
*———————————————————————*

FORM CREATE_HIERARCHY.

  DATA: L_ROOT_KEY TYPE LVC_NKEY,
        L_NEXT_KEY TYPE LVC_NKEY,
        L_LAST_KEY TYPE LVC_NKEY,
        HEADER TYPE STRING,
        W_MENGE_TEXT(13) TYPE C.

  CLEAR L_ROOT_KEY.

  LOOP AT T_HEADER ASSIGNING <HEADER>.
    CLEAR L_ROOT_KEY.
    CLEAR L_NEXT_KEY.
    PERFORM ADD_NODE USING <HEADER>-CARRID L_ROOT_KEY
                     CHANGING L_NEXT_KEY.
    LOOP AT T_SPFLI ASSIGNING <SPFLI>
    WHERE CARRID EQ <HEADER>-CARRID.

      MOVE-CORRESPONDING  <SPFLI> TO TAB_TREE.

      PERFORM ADD_LEAF USING TAB_TREE L_NEXT_KEY
                       CHANGING L_LAST_KEY.
    ENDLOOP.
  ENDLOOP.

  CALL METHOD G_ALV_TREE->FRONTEND_UPDATE.

ENDFORM.

*———————————————————————*
*       FORM ADD_NODE                                                 *
*———————————————————————*

FORM ADD_NODE USING L_NAME L_ROOT_KEY
              CHANGING L_NEXT_KEY.

  DATA: L_NODE_TEXT TYPE LVC_VALUE,
        LS_TREE TYPE TY_SPFLI.

  L_NODE_TEXT =  L_NAME.
  CALL METHOD G_ALV_TREE->ADD_NODE
    EXPORTING
          I_RELAT_NODE_KEY = L_ROOT_KEY
          I_RELATIONSHIP   = CL_GUI_COLUMN_TREE=>RELAT_LAST_CHILD
          I_NODE_TEXT      = L_NODE_TEXT
          IS_OUTTAB_LINE   = LS_TREE
    IMPORTING
          E_NEW_NODE_KEY   = L_NEXT_KEY.

ENDFORM.

*———————————————————————*
*       FORM ADD_LEAF                                                 *
*———————————————————————*

FORM ADD_LEAF USING L_TREE TYPE TY_SPFLI
                    L_NEXT_KEY
              CHANGING L_LAST_KEY.

  CALL METHOD G_ALV_TREE->ADD_NODE
    EXPORTING
          I_RELAT_NODE_KEY = L_NEXT_KEY
          I_RELATIONSHIP   = CL_GUI_COLUMN_TREE=>RELAT_LAST_CHILD
          IS_OUTTAB_LINE   = TAB_TREE
       IMPORTING
          E_NEW_NODE_KEY = L_LAST_KEY.

ENDFORM.

*———————————————————————*
*       FORM OBTENER_DATOS                                            *
*———————————————————————*

FORM OBTENER_DATOS.

  SELECT CARRID CONNID COUNTRYFR CITYFROM
         AIRPFROM COUNTRYTO CITYTO
  INTO TABLE T_SPFLI
  FROM SPFLI.

  IF SY-SUBRC EQ 0.
    LOOP AT T_SPFLI ASSIGNING <SPFLI>.
      MOVE <SPFLI>-CARRID TO T_HEADER-CARRID.
      APPEND T_HEADER.
    ENDLOOP.

    SORT T_HEADER.
    DELETE ADJACENT DUPLICATES FROM T_HEADER.

  ENDIF.

ENDFORM.

2º) Luego de activar el reporte vamos a la transacción SE80:
Buscamos nuestro programa Z_ALV_TREE. Nos paramos sobre la carpeta con mismo nombre, click con el botón derecho del mouse… opción Crear y luego Dynpro: 
image
Ingresamos como número de dynpro 100. Ponemos la descripción que queramos y luego de activar apretamos el botón «Dispos.«

A continuación se va a abrir el Screen Painter: 
Clickeamos en el botón Custom Control (image ) y creamos un cuadrado con el nombre TREE_CONTROL
image
Simplemente falta guardar, activar… cerrar el Screen Painter. Y por último en la transacción SE80 doble click en la carpeta Z_ALV_TREE y ejecutamos.
Cabe aclarar que este ejemplo trabaja con la tabla SPFLI que se usa comúnmente en los ejemplos.


Technorati tags:





Programa para listar el contenido de un IDOC

25 11 2007

Con el siguiente reporte vamos a poder mostrar el contenido de un IDOC y luego guardarlo en un fichero.
Simplemente corremos el programa con el número de IDOC y luego que se liste el contenido, podemos grabar un fichero desde el menú Lista —> Grabar/Enviar —> Fichero…


REPORT Z_DISPLAY_IDOC LINE-SIZE 275.

DATA: IDOC_CONTROL LIKE EDIDC,
      NUMBER_OF_DATA_RECORDS LIKE SY-DBCNT,
      NUMBER_OF_STATUS_RECORDS LIKE SY-DBCNT,
      INT_EDIDS LIKE EDIDS OCCURS 0 WITH HEADER LINE,
      INT_EDIDD LIKE EDIDD OCCURS 0 WITH HEADER LINE.

TYPE-POOLS :  LEDID.

DATA: STRUCT_TYPE TYPE  LEDID_STRUCT_TYPE ,
      IDOC_STRUCT TYPE  LEDID_T_IDOC_STRUCT,
      SEGMENTS TYPE  LEDID_T_SEGMENT,
      SEGMENT_STRUCT TYPE  LEDID_T_SEGMENT_STRUCT,
      EXCEL_TAB(2000) OCCURS 0 WITH HEADER LINE.

PARAMETER: DOCNUM LIKE EDIDC-DOCNUM OBLIGATORY, «»Idoc Number
           SAP_REL LIKE SY-SAPRL DEFAULT SY-SAPRL OBLIGATORY,
           PI_VER LIKE EDI_VERREC-VERSION DEFAULT ‘3’ OBLIGATORY.

START-OF-SELECTION.
  PERFORM READ_IDOC.
  PERFORM PROCESS_IDOC.

END-OF-SELECTION.

*&———————————————————————*
*&      Form  read_idoc
*&———————————————————————*
*       text
*———————————————————————-*

FORM READ_IDOC.
  CALL FUNCTION ‘IDOC_READ_COMPLETELY’
    EXPORTING
      DOCUMENT_NUMBER          = DOCNUM
    IMPORTING
      IDOC_CONTROL             = IDOC_CONTROL
      NUMBER_OF_DATA_RECORDS   = NUMBER_OF_DATA_RECORDS
      NUMBER_OF_STATUS_RECORDS = NUMBER_OF_STATUS_RECORDS
    TABLES
      INT_EDIDS                = INT_EDIDS
      INT_EDIDD                = INT_EDIDD
    EXCEPTIONS
      DOCUMENT_NOT_EXIST       = 1
      DOCUMENT_NUMBER_INVALID  = 2
      OTHERS                   = 3.
  IF SY-SUBRC <> 0.
    MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
            WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
  ENDIF.

ENDFORM.                    «» read_idoc

*&———————————————————————*
*&      Form  process_idoc
*&———————————————————————*
*       text
*———————————————————————-*

FORM PROCESS_IDOC.
  PERFORM READ_IDOC_STRUCTURE.
  PERFORM DISPLAY_DATA_RECORDS.
ENDFORM.                    «» process_idoc

*&———————————————————————*
*&      Form  display_data_records
*&———————————————————————*
*       text
*———————————————————————-*

FORM DISPLAY_DATA_RECORDS.

  DATA: PE_SEG_HEADER LIKE EDI_SAPI01,
        SEGNAME LIKE EDI_IAPI12-SEGMENTTYP,
        PREV_SEGNAME LIKE EDI_IAPI12-SEGMENTTYP VALUE ‘ ‘,
        PT_FIELDS2 LIKE EDI_IAPI12 OCCURS 0 WITH HEADER LINE,
        PT_FVALUES2 LIKE EDI_IAPI14 OCCURS 0 WITH HEADER LINE,
        BYTE_FIRST TYPE I,
        BYTE_LAST TYPE I,
        FIELD_VAL(50),
        TMP_STR(15),
        TMP_STR3(15),
        SEG_REPEATS TYPE I VALUE 0,
        TMP_STR2(15),
        TAB_CR(2) TYPE C VALUE ’09’,
        TOT_CTR TYPE I VALUE 0,
        CTR TYPE I VALUE 0,
        MSG(40) TYPE C.

  DATA: IDOC_STRUCT_WA TYPE  LEDID_IDOC_STRUCT.

  SORT INT_EDIDD BY SEGNUM.
  DESCRIBE TABLE INT_EDIDD LINES TOT_CTR.
  LOOP AT INT_EDIDD.
    MOVE INT_EDIDD-SEGNAM TO SEGNAME.
    CLEAR MSG.
    CONCATENATE ‘Reading segment ‘ SEGNAME
                INTO MSG SEPARATED BY SPACE.
    IF TOT_CTR <> 0.
      CTR = ( 100 * SY-TABIX ) / TOT_CTR.
    ENDIF.
    CALL FUNCTION ‘SAPGUI_PROGRESS_INDICATOR’
      EXPORTING
        PERCENTAGE = CTR
        TEXT       = MSG.
    ADD 1 TO SEG_REPEATS.
    CLEAR TMP_STR2.
    IF INT_EDIDD-SEGNAM <> PREV_SEGNAME.
      SEG_REPEATS = 1.
      CLEAR: PE_SEG_HEADER, PT_FIELDS2, PT_FVALUES2.
      REFRESH: PT_FIELDS2, PT_FVALUES2.
      CALL FUNCTION ‘SEGMENT_READ_COMPLETE’
        EXPORTING
          PI_SEGTYP                 = SEGNAME
          PI_RELEASE                = SAP_REL
          PI_VERSION                = PI_VER
        IMPORTING
          PE_HEADER                 = PE_SEG_HEADER
        TABLES
          PT_FIELDS                 = PT_FIELDS2
          PT_FVALUES                = PT_FVALUES2
        EXCEPTIONS
          SEGMENT_UNKNOWN           = 1
          SEGMENT_STRUCTURE_UNKNOWN = 2
          OTHERS                    = 3.
      IF SY-SUBRC <> 0.
        MESSAGE ID SY-MSGID TYPE ‘I’ NUMBER SY-MSGNO
                WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
      ENDIF.
      PREV_SEGNAME = INT_EDIDD-SEGNAM.
    ENDIF.
    READ TABLE IDOC_STRUCT INTO IDOC_STRUCT_WA WITH KEY
                           SEGMENT_TYPE = INT_EDIDD-SEGNAM.
    IF SY-SUBRC = 0.
      IF IDOC_STRUCT_WA-SYNTAX_ATTRIB-MUSTFL = ‘X’.
        TMP_STR = ‘Mandatory’.                  «»Mandatory
      ELSE.
        TMP_STR = ‘Optional’.                  «»Optional
      ENDIF.
      IF IDOC_STRUCT_WA-SEGMENT_TYPE_ATTRIB-QUALIFIER = ‘X’.
        TMP_STR3 = ‘Qualified’.
      ELSE.
        TMP_STR3 = ‘Non-Qualified’.
      ENDIF.
      SHIFT IDOC_STRUCT_WA-SYNTAX_ATTRIB-OCCMAX
                                 LEFT DELETING LEADING ‘0’.
      MOVE SEG_REPEATS TO TMP_STR2.
      CONDENSE: IDOC_STRUCT_WA-SYNTAX_ATTRIB-OCCMAX, TMP_STR2.
      CONCATENATE TMP_STR2 ‘of’  IDOC_STRUCT_WA-SYNTAX_ATTRIB-OCCMAX
          INTO TMP_STR2 SEPARATED BY SPACE.

      WRITE :/ IDOC_STRUCT_WA-SEGMENT_TYPE,
           TMP_STR,
           TMP_STR3,
           TMP_STR2,
           IDOC_STRUCT_WA-SYNTAX_ATTRIB-HLEVEL,
           IDOC_STRUCT_WA-SEGMENT_TYPE_ATTRIB-PLAST,
           IDOC_STRUCT_WA-SEGMENT_TYPE_ATTRIB-DESCRP.
    ENDIF.
    SORT PT_FIELDS2 BY FIELD_POS.
    BYTE_FIRST = 0.
    LOOP AT PT_FIELDS2.
      CLEAR: FIELD_VAL.
      BYTE_LAST = PT_FIELDS2-EXTLEN.
      WRITE INT_EDIDD-SDATA+BYTE_FIRST(BYTE_LAST) TO
            FIELD_VAL LEFT-JUSTIFIED.
      SHIFT PT_FIELDS2-EXTLEN LEFT DELETING LEADING ‘0’.
      SHIFT PT_FIELDS2-BYTE_FIRST LEFT DELETING LEADING ‘0’.
      SHIFT PT_FIELDS2-BYTE_LAST LEFT DELETING LEADING ‘0’.
      WRITE:/ ‘   ‘, PT_FIELDS2-FIELDNAME,
              PT_FIELDS2-DATATYPE,
              PT_FIELDS2-EXTLEN,
              PT_FIELDS2-BYTE_FIRST ,
              PT_FIELDS2-BYTE_LAST,
              PT_FIELDS2-DESCRP,
              FIELD_VAL.
      READ TABLE PT_FVALUES2 WITH KEY FIELDNAME = PT_FIELDS2-FIELDNAME
                    FLDVALUE_L = FIELD_VAL.
      ADD BYTE_LAST TO BYTE_FIRST.
      IF SY-SUBRC = 0.
        WRITE : PT_FVALUES2-DESCRP.
      ELSE.
        CLEAR PT_FVALUES2-DESCRP.
      ENDIF.
    ENDLOOP.
  ENDLOOP.
ENDFORM.                    «» display_data_records

*&———————————————————————*
*&      Form  read_idoc_structure
*&———————————————————————*
*       text
*———————————————————————-*

FORM READ_IDOC_STRUCTURE.
  DATA: IDOCTYPE TYPE LEDID_IDOCTYPE.

  IF NOT IDOC_CONTROL-CIMTYP IS INITIAL.
    STRUCT_TYPE = ‘E’. «»Extended
    IDOCTYPE = IDOC_CONTROL-CIMTYP.
  ELSE.
    STRUCT_TYPE = ‘B’. «»Basic
    IDOCTYPE = IDOC_CONTROL-IDOCTP.
  ENDIF.

  CALL FUNCTION ‘IDOC_TYPE_COMPLETE_READ’
       EXPORTING
            RELEASE              = SAP_REL
            STRUCT_TYPE          = STRUCT_TYPE
            IDOCTYPE             = IDOCTYPE
            VERSION              = PI_VER
*       IMPORTING
*            IDOC_TYPE            = idoctype
       TABLES
            IDOC_STRUCT          = IDOC_STRUCT
            SEGMENTS             = SEGMENTS
            SEGMENT_STRUCT       = SEGMENT_STRUCT
       EXCEPTIONS
            IDOCTYPE_UNKNOWN     = 1
            IDOCSTRUCT_UNKNOWN   = 2
            SEGMENT_DATA_MISSING = 3
            ILLEGAL_STRUCT_TYPE  = 4
            OTHERS               = 5.
  IF SY-SUBRC <> 0.
    MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
            WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
  ENDIF.

ENDFORM.                    «» read_idoc_structure


Technorati tags:





Calculadora en un POP-UP

24 11 2007

image

El siguiente código nos generará una calculadora en una ventana (POP-UP). La función ‘FITRV_CALCULATOR’ nos devolverá en la variable X_VALUE el resultado del cálculo que haya hecho el usuario para luego utilizarlo como queramos en nuestro programa.


*——————————————–
* Calculadora para usuarios
*——————————————–

REPORT ZCALCULADORA.

DATA: X_VALUE(15) TYPE C.

CALL FUNCTION ‘FITRV_CALCULATOR’
* EXPORTING
*   INPUT_VALUE                =
*   CURRENCY                   =
*   START_COLUMN               = ’10’
*   START_ROW                  = ’10’
  IMPORTING
    OUTPUT_VALUE               = X_VALUE
  EXCEPTIONS
    INVALID_INPUT              = 1
    CALCULATION_CANCELED       = 2
    OTHERS                     = 3.

IF SY-SUBRC = 0. «En este ejemplo imprimimos por pantalla el resultado
  WRITE:/ ‘Output Value ‘, X_VALUE.
ENDIF.


Technorati tags:





Matchcode Browser (buscador de directorios)

22 11 2007

Con la siguiente función vamos a poder habilitar el matchcode para que abra un browser file (explorador de directorios). Esto nos va a servir para hacer upload y download de archivos.


Acá el código que debemos ingresar en nuestros programas:

*En P_FILE va a quedar guardada la ruta del archivo
PARAMETERS: P_FILE LIKE RLGRAP-FILENAME.

*Llamamos a la función que abre el browser apretando el matchcode
AT SELECTION-SCREEN ON VALUE-REQUEST FOR P_FILE.
   CALL FUNCTION ‘F4_FILENAME’
      EXPORTING
         PROGRAM_NAME = SY-REPID
         DYNPRO_NUMBER = SY-DYNNR
         FIELD_NAME = ‘PATH’
      IMPORTING
         FILE_NAME = P_FILE .


Technorati tags:





Download de archivo con formato CSV (campos separados por coma)

21 11 2007

Usando el módulo de función SAP_CONVERT_TO_CSV_FORMAT vamos a poder convertir nuestra tabla interna en una tabla con formato de separación por coma. Para luego poder generar un archivo.


Veamos el siguiente ejemplo:

*Declaramos el Type pool para la tabla de salida
TYPE-POOLS: truxs.

*Declaración de la tabla interna donde vamos poner los datos
DATA: BEGIN OF IT_TABLA1 OCCURS 0,
                  campo1  LIKE tabla-campo1,
                  campo2  LIKE tabla-campo2,
                  campo3  LIKE tabla-campo3,
           END OF IT_TABLA1.

*Declaración de la tabla con formato CSV
DATA: IT_TABLA2 TYPE truxs_t_text_data.

 

*Luego de llenar la tabla IT_TABLA1 con los datos
*Convertimos la tabla a formato CSV
CALL FUNCTION ‘SAP_CONVERT_TO_CSV_FORMAT’
    EXPORTING
       i_field_seperator = ‘;’
    TABLES
       i_tab_sap_data = IT_TABLA1

    CHANGING
       i_tab_converted_data = IT_TABLA2
    EXCEPTIONS
       conversion_failed = 1
       others = 2.
IF sy-subrc <> 0.
   MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
   WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ENDIF.

*Hacemos la bajada del archivo utilizando la tabla
*que obtuvimos en el paso anterior.
CALL FUNCTION ‘GUI_DOWNLOAD’
    EXPORTING
       filename = ‘C:\prueba.txt’
    TABLES
       data_tab = IT_TABLA2

    EXCEPTIONS
       FILE_WRITE_ERROR = 1
       NO_BATCH = 2
       GUI_REFUSE_FILETRANSFER = 3
       INVALID_TYPE = 4
       NO_AUTHORITY = 5
       UNKNOWN_ERROR = 6.


Technorati tags:





Función para sumarle meses a una fecha

17 11 2007

La siguiente función sirve para sumarle/agregarle meses a una fecha.

A la función le pasamos como parámetros una fecha de entrada (inicial) y un número de meses. La función nos devolverá una fecha que será el resultado de agregar el número de meses a la fecha inicial.


*——————————————————————————-
*LV_DATE_ENT : Fecha de entrada a la que le calculo los meses
*LV_MES: Cantidad de meses que le sumo a LV_DATE_ENT
*LV_DATE_SAL : Fecha que me devuelve la función

*——————————————————————————-

CALL FUNCTION ‘HR_PSD_DATES_ADD_MONTHS’
    EXPORTING
      V_DATE       = LV_DATE_ENT
      V_MONTHS     = LV_MES
    IMPORTING
      E_DATE       = LV_DATE_SAL
    EXCEPTIONS
      NOT_POSITIVE = 1
      OTHERS       = 2.
  IF SY-SUBRC <> 0.
    MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
            WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
  ENDIF.


Technorati tags:





Demos Workbench – Centro de Presentaciones Enjoy

16 11 2007

Con la transacción DWDM accedemos al Centro de Presentaciones Enjoy. Allí podremos ver distintos ejemplos para agregar en nuestro programas.

Encontraremos diversos desarrollos (Controles, elementos de interfase de usuario, integración Office, etc).
A la izquierda de la pantalla veremos el listado de demos y haciendo doble click sobre cualquiera de ellos ejecutaremos el ejemplo. Luego, apretando el botón Cód.fte. nos llevará al código fuente del demo.
image 

Entre uno de los tantos ejemplos, nos encontraremos con un navegador web:
image


Technorati tags:





ZVPN – Reporte que mantiene activa una VPN

14 11 2007

Es común que para trabajar con nuestros clientes utilicemos una VPN (Red privada virtual) para conectarnos.

Muchas veces cuando no hay actividad, la VPN se cae. Para evitarlo podemos dejar corriendo el siguiente reporte en otro modo.  


REPORT zvpn.

DATA: l_cont TYPE i,
      l_texto(80),
      l_hora(8),
      l_tiempo(8),
      l_horaini LIKE sy-uzeit,
      l_difhora LIKE sy-uzeit.

l_horaini = sy-uzeit.
DO.
  l_difhora = sy-uzeit – l_horaini.
  WRITE l_difhora TO l_tiempo.
  WRITE sy-uzeit TO l_hora.
  WRITE sy-index TO l_texto(5).
  concatenate l_texto(5) ‘Hora:’ l_hora ‘Tiempo transcurrido’ l_tiempo
              into l_texto separated by space.
  CALL FUNCTION ‘SAPGUI_PROGRESS_INDICATOR’
       EXPORTING
            text   = l_texto
       EXCEPTIONS
            OTHERS = 1.
  WAIT UP TO 30 SECONDS.
  COMMIT WORK AND WAIT.
ENDDO.


Technorati tags:





Creación de IDOCs de Orden de Compra

13 11 2007

El siguiente documento explica como generar IDOCs de Orden de Compra (Purchase order) con “Punteros de Modificación” (Changer Pointers).
Con las siguientes configuraciones una vez creada una orden de compra desde la transacción ME21N se generará un archivo de salida (OUTBOUND) de formato XML con el contenido de la orden de compra (IDOC).

Primero un poco de teoría para entender qué es un IDOC y para qué se utilizan:
Los IDocs permiten intercambiar información entre distintos sistemas. Se lo puede ver como un archivo de texto plano, con registros. Un Idoc es por ejemplo los datos de un proveedor, o una oferta.
Contiene una cabecera y posiciones, pero todos los datos pertenecen a la misma entidad. O sea, para transmitir datos de más de un proveedor, haría falta más de un Idoc.
Los IDocs se crean y luego se envían. Este envío se realiza en un segundo paso; o sea que podría haber IDocs que todavía no se hayan enviado.

Un Idoc está formato por tres bloques:

  • Un registro de Control.
  • Una tabla con los datos del IDoc.
  • Varios registros de Estado

    El registro de control contiene toda la información administrativa del IDoc, como el origen y el destinatario, y qué tipo de IDoc es. Sería algo así como el sobre que acompaña a cualquier carta.
    Este registro es muy importante ya que es necesario para saber, entre otras cosas, cuál será el destinatario del IDoc. La tabla SAP donde se guardan es la EDIDC.

    Los registros de datos se guardan en la tabla EDID4 en un campo de 1000 caracteres. Para saber interpretar esa cadena, el registro cuenta con un campo que informa cuál es la estructura con la que se deben interpretar los datos.

    Generalmente, varios registros de estado se adjuntan a un IDoc. El sistema
    automáticamente asigna registros de estado durante todo el proceso, a medida que el IDoc va alcanzando diversos puntos de control.
    Contienen información de estado, tal como código de estado, fecha y hora en que el punto de control es alcanzado. Estos registros de estado existen solamente en SAP y no son almacenados en el archivo de salida.La estructura de los registros de estado está definida por la estructura del DDIC EDI_DS40. La tabla es EDIDS.

    Desde la transacción WE30 se puede ver el formato de los Idocs.


    IDOCs para órdenes de compra:

    Tipo Base de IDoc:
    El primer paso es verificar que contemos en el sistema con el Tipo Base de Idoc ORDERS05.

    Transacción: WE30
    clip_image003
    Ingresamos el tipo base ORDERS05 y clickeamos en “visualizar”.

    clip_image005
    Debemos obtener algo así.

     

    Tipo de Mensaje en SAP:
    En este paso verificamos que tengamos creado el Tipo de Mensaje ORDERS.

    Transacción: WE81
    Tenemos que encontrar esto.

    clip_image007

     

    Relación entre un tipo de Mensaje y un Tipo de IDoc:
    Ahora tenemos que controlar que exista la relación entre el tipo de base Idoc y la clase de mensaje.

    Transacción: WE82
    Controlamos que figure la siguiente línea:
    clip_image009

     

    Definición de puerta:
    Los Idocs pueden ser enviados y recibidos a través de diferentes medios. Con el objetivo de no acoplar la definición de las características del medio con la aplicación que lo está utilizando, el medio es accedido vía puertos. En otras palabras, un puerto es un nombre lógico para un dispositivo de entrada/salida. Los programas se comunican con un puerto a través de una interfaz estándar.
    En vez de definir el medio de comunicación directamente en el Acuerdo de Interlocutor (Partner Profile), se asigna un número de puerto, y es este puerto el que designa realmente al medio. Esto permite definir las características de los puertos individualmente y usar un puerto en múltiples Acuerdos de Interlocutores. Los cambios en un puerto se reflejarán automáticamente en todos los acuerdos que lo estén utilizando.
    Al menos un puerto debe existir para cada sistema externo.

    Los tipos de puertos más comunes son los siguientes:
    Ficheros (File Interface)
    Permite intercambiar Idocs a través de archivos del sistema operativo.
    El sistema que envía el IDoc crea un archivo en el file system. Luego notifica al sistema receptor vía RFC sincrónico que el archivo ha sido transferido, que está localizado en un determinado directorio, y que tiene un determinado nombre.
    SAP recomienda no usar nombres de archivos estáticos, dado que el archivo es sobre escrito cada vez que el Idoc se envía. Se recomienda usar el módulo de funciones EDI_PATH_CREATE_CLIENT_DOCNUM, el cual genera el nombre del archivo a partir del mandante y nro. de Idoc.

    RFC Transaccional
    Se usa para escenarios de distribución ALE. El nombre del puerto se puede definir a mano o dejar que SAP lo elija. Además del puerto, hay que definir el destino RFC.

    Archivo XML Envía documentos en formato XML. Para utilizar este tipo de puerto, es necesario definir el nombre del puerto, el formato del XML, y el nombre del archivo a generar. Al igual que con el tipo de puerto Fichero, se puede invocar a la función EDI_PATH_CREATE_CLIENT_DOCNUM para que genere los nombres del archivo en forma dinámica.

    XML-HTTP
    En vez de definir el nombre del archivo XML, se especifica un destino RFC.

    Para nuestro ejemplo vamos a elegir como salida un Archivo XML. Por lo cual invocaremos a la función EDI_PATH_CREATE_CLIENT_DOCNUM para que genere los nombres del archivo en forma dinámica.

    Transacción: WE21
    Dentro de la carpeta Fichero XML debemos crear y configurar nuestra Puerta de salida de la siguiente manera.
    clip_image011
    El Directorio físico lo podemos elegir a nuestro gusto, tiene que ser un directorio del servidor. Los directorios disponibles los podemos visualizar desde la transacción AL11.
    clip_image013

     

    Definición de sistemas lógicos:

    Transacción: BD54
    clip_image015
    Creamos un Sistema Lógico con el nombre y la descripción que queramos.

     

    Creación de los acuerdos de interlocutores:
    Un interlocutor ALE es un sistema SAP remoto o un sistema legacy con el que se intercambian datos.
    El acuerdo de interlocutor especifica varias de las características
    de los datos que se intercambian incluyendo el modo de operación y la organización o persona responsable por el manejo de los errores.
    Cuando los datos son
    intercambiados entre interlocutores, es importante que el emisor y el receptor estén de acuerdo en la sintaxis y semántica de los datos intercambiados.
    Este acuerdo es lo que
    se llama Acuerdo de Interlocutor, y es lo que le informa al receptor de la estructura de los datos enviados y cómo los contenidos deben ser interpretados.

    Los datos definidos en un acuerdo de interlocutor son:

    – Tipo de Idoc y Tipo de mensaje, los cuales son el identificador clave del acuerdo de interlocutor.

    – Nombre del Emisor y Receptor que intercambiarán los Idocs para el tipo de Idoc y mensaje.

    – Puerto por el cual el emisor y el receptor se comunicarán.

    En el interlocutor se definen datos específicos de cada mensaje a transmitir en los parámetros de salida o entrada según corresponda.
    Mediante la transacción WE20 se crea el acuerdo de interlocutor con el sistema lógico.

     

    Transacción: WE20
    Dentro de la carpeta Tp.interlocutor EDI Proveedor/Acreedor creamos lo siguiente:
    clip_image017
    El “Nº interl.EDI” debe llevar el mismo nombre del “Sistema Lógico” que creamos en el paso anterior.
    El “Tp.int.EDI” tiene que ser LI (Proveedor/Acreedor).
    Luego en la tabla “Parámetros salida” agregamos en Tipo mensaje: ORDERS.

    A continuación hacemos doble click sobre ORDERS y llenamos como muestra esta imagen:
    clip_image019
    En la solapa “Opciones salida”, ponemos la Puerta destino que definimos anteriormente y completamos los campos marcados con línea roja.

    En la solapa “Control de mensajes” completamos como se muestra en la imagen:
    clip_image021
    En “Aplicación” ponemos EF (Pedido de compras)
    Clase mensaje: NEU
    Código de operación: ME10

    Hacemos doble click sobre ME10 y chequeamos:
    clip_image023
    El módulo de función IDOC_OUTPUT_ORDERS es la función que se va a encargar de recolectar los datos y formar nuestro IDOC.

     

    Activación de punteros de modificación en forma global:

    Transacción: BD61
    Activamos nuestro puntero de modificación:
    clip_image025

     

    Activación de punteros de modificación por Tipo de Mensaje:

    Transacción: BD50
    Agregamos una entrada para el mensaje deseado, y la marcamos como activa.
    clip_image027

     

    Creación de una orden de compra:

    Transacción: ME21N
    Creamos un Pedido estándar (NB) y luego clickeamos en «Mensajes« 

    Generamos una clase de mensaje como esta:
    clip_image033
    Clase de mensaje: NEU
    Medio: EDI
    Función: PV

    Interlocutor: ORDERIDOC (nombre del interlocutor que creamos en la definición de sistemas lógicos)

    Chequeamos que en «Datos adicionales« tengamos esto:

    clip_image037

    Apretamos en el botón GUARDAR  y nos saldrá el mensaje:

    clip_image041


    Con todo esto, nuestro IDOC ya tiene que estar creado!!!. Para verificar vamos a la

    Transacción: WE02
    Al apretar el botón ejecutar nos listará nuestro IDOC:
    clip_image043
    La cantidad de registros de datos puede variar según la orden que hayamos creado.

    Sólo nos resta ir a buscar nuestro IDOC en formato XML en el directorio físico que hayamos definido en la parte de “Definición de puerta”


    Technorati tags:





    Campo password (******) en pantalla de selección

    11 11 2007

    Si deseamos mostrar un campo de entrada como password o contraseña. Es decir que aparezcan asteriscos (****).

    Entonces debemos ingresar lo siguiente:

      SELECTION-SCREEN BEGIN OF BLOCK BLQ1 WITH FRAME TITLE TEXT-T01.
        PARAMETERS: P_PASSWD(8).
      SELECTION-SCREEN END OF BLOCK BLQ1.

      AT SELECTION-SCREEN OUTPUT.
        LOOP AT SCREEN.
          IF SCREEN-NAME EQ ‘P_PASSWD’.
            SCREEN-INVISIBLE = ‘1’.
           MODIFY SCREEN.
          ENDIF.
        ENDLOOP.
      END-OF-SELECTION.

    El resultado es:

    image


    Technorati tags:





    Eliminar PARAMETERS y SELECT-OPTIONS creados en base de datos lógicas y programas de control

    10 11 2007

    Algunas veces nos piden que hagamos una copia Z de un programa estándar para realizar distintos cambios. Uno de esos cambios puede ser que saquemos SELECT-OPTIONS (opciones de selección) y/o PARAMETERS (parámetros) de la pantalla de selección.

    En principio parece algo sencillo pero es posible que los filtros que debemos eliminar no estén declarados en nuestra copia Z. Esto se debe a que seguramente fueron definidos en programas de control o base de datos lógicas:

    image


    A continuación voy mostrar como sacar el filtro Sociedad de la pantalla.

    Primero tenemos que saber el nombre del campo (Campo dynpro). Para eso nos paramos sobre el campo, apretamos F1 y observamos los «datos técnicos«:

    image

    Y por último vamos a nuestro programa Z y agregamos el siguiente código antes del START-OF-SELECTION:

    AT SELECTION-SCREEN OUTPUT.
      LOOP AT SCREEN.
        IF SCREEN-NAME EQ BR_BUKRS-LOW‘ OR
            SCREEN-NAME EQ ‘BR_BUKRS-HIGH‘ OR
            SCREEN-NAME EQ ‘%_BR_BUKRS_%_APP_%-TEXT‘ OR
            SCREEN-NAME EQ ‘%_BR_BUKRS_%_APP_%-OPTI_PUSH‘ OR
            SCREEN-NAME EQ ‘%_BR_BUKRS_%_APP_%-VALU_PUSH‘.

                              SCREEN-ACTIVE = 0.
                         SCREEN-INPUT   = 0.
                         MODIFY SCREEN.

                  ENDIF.
                ENDLOOP.


    Technorati tags:





    WS_EXECUTE – Función para ejecutar un programa desde SAP

    7 11 2007

    WS_EXECUTE es una función que nos permite ejecutar cualquier programa instalado en nuestra computadora desde SAP. Cabe aclarar que aquel programa que queramos correr debe permitir parámetros MS-DOS.

    En el siguiente ejemplo voy a mostrar como zippear (comprimir) dos archivos desde SAP. Como resultado obtendremos un archivo WinZip que contendrá dos archivos de texto.
    Comprimiremos el archivo 1.txt y el archivo 2.txt, y el resultado será el archivo destino.zip.

    Parámetros que acepta WinZip desde MS-DOS: http://www.memecode.com/docs/winzip.html

    Rutas de los archivos:

    • C:1.txt
    • C:2.txt
    • C:destino.zip

     

    Código:

    CALL FUNCTION ‘WS_EXECUTE’
        EXPORTING
           * DOCUMENT = ‘ ‘
           * CD = ‘ ‘
           COMMANDLINE = ‘ -min -a c:destino.zip c:1.txt c:2.txt’
           * INFORM = ‘ ‘
           PROGRAM = ‘winzip32.exe’
           * STAT = ‘ ‘
           * WINID = ‘ ‘
           * OSMAC_SCRIPT = ‘ ‘
           * OSMAC_CREATOR = ‘ ‘
           * WIN16_EXT = ‘ ‘
           * EXEC_RC = ‘ ‘
        * IMPORTING
           * RBUFF =
        EXCEPTIONS
           FRONTEND_ERROR = 1
           NO_BATCH = 2
           PROG_NOT_FOUND = 3
           ILLEGAL_OPTION = 4
           GUI_REFUSE_EXECUTE = 5
           OTHERS = 6 .

    IF SY-SUBRC <> 0.
      MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
      WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.

    ENDIF.


    Technorati tags:





    Programa que lista USER-EXITS de una transacción

    6 11 2007

    El siguiente reporte muestra un listado de las USER EXITS de una transacción determinada. Sólo basta ingresar el nombre de la transacción en la pantalla principal, y como resultado mostrará tanto el nombre como la descripción de la USER EXIT.


    *&———————————————————————*
    *& Report ZUSER_EXIT
    *&
    *&———————————————————————*
    *&
    *&
    *&———————————————————————*

    REPORT  ZUSER_EXIT.
    tables : tstc, tadir, modsapt, modact, trdir, tfdir, enlfdir.
    tables : tstct.
    data : jtab like tadir occurs 0 with header line.
    data : field1(30).
    data : v_devclass like tadir-devclass.
    parameters : p_tcode like tstc-tcode obligatory.

    select single * from tstc where tcode eq p_tcode.
    if sy-subrc eq 0.
      select single * from tadir where pgmid = ‘R3TR’
                       and object = ‘PROG’
                       and obj_name = tstc-pgmna.
      move : tadir-devclass to v_devclass.
      if sy-subrc ne 0.
        select single * from trdir where name = tstc-pgmna.
        if trdir-subc eq ‘F’.
          select single * from tfdir where pname = tstc-pgmna.
          select single * from enlfdir where funcname =
          tfdir-funcname.
          select single * from tadir where pgmid = ‘R3TR’
                             and object = ‘FUGR’
                             and obj_name eq enlfdir-area.

          move : tadir-devclass to v_devclass.
        endif.
      endif.
      select * from tadir into table jtab
                    where pgmid = ‘R3TR’
                      and object = ‘SMOD’
                      and devclass = v_devclass.
      select single * from tstct where sprsl eq sy-langu and
                                       tcode eq p_tcode.
      format color col_positive intensified off.
      write:/(19) ‘Transaction Code – ‘,
           20(20) p_tcode,
           45(50) tstct-ttext.
      skip.
      if not jtab[] is initial.
        write:/(95) sy-uline.
        format color col_heading intensified on.
        write:/1 sy-vline,
               2 ‘Exit Name’,
              21 sy-vline ,
              22 ‘Description’,
              95 sy-vline.
        write:/(95) sy-uline.
        loop at jtab.
          select single * from modsapt
                 where sprsl = sy-langu and
                        name = jtab-obj_name.
          format color col_normal intensified off.
          write:/1 sy-vline,
                 2 jtab-obj_name hotspot on,
                21 sy-vline ,
                22 modsapt-modtext,
                95 sy-vline.
        endloop.
        write:/(95) sy-uline.
        describe table jtab.
        skip.
        format color col_total intensified on.
        write:/ ‘No of Exits:’ , sy-tfill.
      else.
        format color col_negative intensified on.
        write:/(95) ‘No User Exit exists’.
      endif.
    else.
      format color col_negative intensified on.
      write:/(95) ‘Transaction Code Does Not Exist’.
    endif.

    at line-selection.
      get cursor field field1.
      check field1(4) eq ‘JTAB’.
      set parameter id ‘MON’ field sy-lisel+1(10).
      call transaction ‘SMOD’ and skip first   screen.


    Technorati tags:





    Editar registros de una tabla sin permisos

    27 10 2007

    diablo.jpg El usuario es responsable del mal uso de lo siguiente diablo.jpg

    Lo que voy a explicar a continuación permite modificar cualquier registro de una tabla desde la transacción SE16 siempre y cuando los campos no sean claves. Con esto no es necesario pasar por alguna transacción ni tener permisos especiales para cambiar un campo del algún registro específico.


    Pasos a seguir:
    Ir a la transacción SE16 (Browser de datos), ingresar a la tabla que se quiera y buscar el registro que se quiere modificar.
    Una vez que estamos visualizando el registro en cuestión, seleccionarlo… poner /h y hacer doble click sobre el registro.
    Avanzar en el debugg hasta llegar al Form SET_STATUS_VAL. Encontrarán un IF para la variable CODE. Antes de entrar al ciclo IF, modificarle el valor a la variable CODE de SHOW a EDIT utilizando el ícono del lapiz.
    Solo resta apretar F8 para terminar el debugg. Y en la siguiente pantalla vamos a poder editar los campos del registro. Por último apretar el botón guardar para conservar los cambios.


    Technorati tags:





    Convertir Sapscript en archivo de texto

    25 10 2007

    Hace un tiempo en el trabajo me pidieron que a un formulario sapscript lo pase a texto y que le de formato para luego bajarlo en un archivo. Acá dejo los pasos necesarios para hacerlo.


    Primero vamos a tener que hacer una copia del programa impresor del sapscript en cuestión.
    Una vez hecho, hay que agregar en la parte de las declaraciones la tabla interna donde van a quedar guardadas las lineas del formulario:
         DATA: BEGIN OF INT_TLINE1 OCCURS 100.
           INCLUDE STRUCTURE TLINE.
         DATA: END OF INT_TLINE1.

    El siguiente paso es encontrar en el impresor la llamada a la función ‘OPEN_FORM’ y modificarle el campo DEVICE y ponerle ‘OTF_MEM’:
         CALL FUNCTION ‘OPEN_FORM’
          DEVICE = ‘OTF_MEM’

    Por último luego de la llamada CALL FUNCTION ‘CLOSE_FORM’. tenemos que insertar la función ‘CONVERT_OTF_MEMORY’ de la siguiente manera:
         CALL FUNCTION ‘CONVERT_OTF_MEMORY’
          EXPORTING
           FORMAT = ‘ASCII’
           MAX_LINEWIDTH = 132
          *IMPORTING
           *BIN_FILESIZE =
          TABLES
           LINES = INT_TLINE1
          EXCEPTIONS
           MEMORY_EMPTY = 1
           ERR_MAX_LINEWIDTH = 2
           ERR_FORMAT = 3
           ERR_CONV_NOT_POSSIBLE = 4.

    Con esto ya tenemos nuestro formulario sapscript cargado en nuestra tabla interna INT_TLINE1. Ahora a esta tabla le podemos modificar, agregar o quitar lineas a nuestro gusto; y de ser necesario podemos bajarla a un archivo.


    Technorati tags:





    AL11 – Directorios SAP (Archivos en el servidor)

    22 10 2007

    Con la transacción AL11 podemos acceder a los directorios de SAP (del servidor) e incluso abrir los archivos.

    Ingresando a la transacción AL11 nos listará todos los directorios disponibles; haciendo doble click sobre cualquiera de ellos podremos ver los archivos que hay adentro. Y si los archivos son de texto incluso podemos ver su contenido haciendo nuevamente dobleclick.


    Technorati tags: