Mostrar Mensajes

Esta sección te permite ver todos los posts escritos por este usuario. Ten en cuenta que sólo puedes ver los posts escritos en zonas a las que tienes acceso en este momento.


Temas - Carlos

Páginas: [1] 2 3
1
Programación ABAP / BAPI_SALESORDER_CHANGE - Ejemplo
« en: 09 de Enero de 2020, 10:33:20 am »
Esto es un ejemplo de como actualizar el motivo del rechazo (VBAP-ABGRU) y la cantidad de pedido (VBAP-WMENG) para todos los artículos en un pedido de ventas. "BAPI_SALESORDER_CHANGE"



REPORT ztestbapiso2.
*&--------------------------------------------------------------------&*
*& Program Description:                                               &*
*& -----------------------                                            &*
*& This demo program will update the reason for rejection and the     &*
*& order quantity for all items in a selected sales order.            &*
*&                                                                    &*
*& The program demonstrate the use of the 'BAPI_SALESORDER_CHANGE'.   &*
*&                                                                    &*
*& Author:  ABAPCOOKBOOK          <------                             &*
*& Website: www.abapcookbook.com  <------                             &*
************************************************************************

************************************************************************
* DATA DECLARATIONS                                                    *
************************************************************************
*Tables:
TABLES:
  vbap.

*Internal tables:
DATA:
  gt_vbap               TYPE STANDARD TABLE OF vbap,
  gt_vbep               TYPE STANDARD TABLE OF vbep,
  gt_item_in            TYPE STANDARD TABLE OF bapisditm,
  gt_item_inx           TYPE STANDARD TABLE OF bapisditmx,
  gt_schedule_lines     TYPE STANDARD TABLE OF bapischdl,
  gt_schedule_linesx    TYPE STANDARD TABLE OF bapischdlx,
  gt_return             TYPE STANDARD TABLE OF bapiret2.

*Field Symbols:
FIELD-SYMBOLS:
  <fs_vbap>             TYPE vbap,
  <fs_vbep>             TYPE vbep.

*Structures:
DATA:
  gst_item_hedx         TYPE bapisdh1x,
  gst_item_in           TYPE bapisditm,
  gst_item_inx          TYPE bapisditmx,
  gst_schedule_lines    TYPE bapischdl,
  gst_schedule_linesx   TYPE bapischdlx.

*Variables:
DATA:
  gv_msg                TYPE string,
  gv_tabix              TYPE sy-tabix.

*Constants:
CONSTANTS:
  gc_error              TYPE string
        VALUE ': An error occured, no change done to the sales order.',
  gc_success            TYPE string
        VALUE ': Sales order changed successfully.'.

************************************************************************
* SELECTION SCREEN                                                     *
************************************************************************
SELECT-OPTIONS:
*  Sales Order Number.
   s_vbeln FOR vbap-vbeln OBLIGATORY.

PARAMETERS:
* Reason for Rejection.
  p_abgru TYPE vbap-abgru OBLIGATORY,

* Order Quantity.
  p_wmeng TYPE vbep-wmeng OBLIGATORY.


************************************************************************
* CODE LOGIC                                                           *
************************************************************************

*Select sales order data from table VBAP.
SELECT *
  FROM vbap
  INTO TABLE gt_vbap
  WHERE vbeln IN s_vbeln.

IF sy-subrc EQ 0.

* Rules 'For All Entries'.
* Not necessary as 'VBELN' and 'POSNR' is already primary key, this
*                                                              logic
* just to demonstrate 'For All Entries' rule.
  SORT gt_vbap BY vbeln posnr.
  DELETE ADJACENT DUPLICATES FROM gt_vbap COMPARING vbeln posnr.

* Retrieving schedule lines entries.
  SELECT *
    FROM vbep
   INTO TABLE gt_vbep
 FOR ALL ENTRIES IN gt_vbap
   WHERE vbeln EQ gt_vbap-vbeln
     AND posnr EQ gt_vbap-posnr.

  IF sy-subrc EQ 0.

*   Sorting for binary search.
    SORT gt_vbep BY vbeln posnr.

    LOOP AT gt_vbap ASSIGNING <fs_vbap>.

*     ........................
*     BAPI Data for updating the reason for rejection.
*     ........................
*     (Order Header Level)
*     Setting the update flag at order header level to update mode.
      gst_item_hedx-updateflag = 'U'.

*     (Order Item Level)
*     Setting of the material number(MATNR) at order item level.
      gst_item_in-material = <fs_vbap>-matnr.

*     Setting of the item number(POSNR) at order item level.
      gst_item_in-itm_number  = <fs_vbap>-posnr.
      gst_item_inx-itm_number = <fs_vbap>-posnr.

*     Setting of the reason for rejection(ABGRU) at order item level.
      gst_item_in-reason_rej  = p_abgru.
      gst_item_inx-reason_rej = 'X'.

*     Setting the update flag at order item level to update mode.
      gst_item_inx-updateflag = 'U'.

*     BAPI items level tables:
      APPEND:
        gst_item_in  TO gt_item_in,
        gst_item_inx TO gt_item_inx.

*     ........................
*     BAPI Data for updating the order quantity.
*     ........................
*     Adding the schedule lines items.
      READ TABLE gt_vbep TRANSPORTING NO FIELDS
      WITH KEY  vbeln = <fs_vbap>-vbeln
                posnr = <fs_vbap>-posnr
                BINARY SEARCH.

      IF sy-subrc EQ 0.

        gv_tabix = sy-tabix.

*       Index looping for better performance.
        LOOP AT gt_vbep ASSIGNING <fs_vbep> FROM gv_tabix.

          IF  <fs_vbep>-vbeln EQ <fs_vbap>-vbeln
          AND <fs_vbep>-posnr EQ <fs_vbap>-posnr.

*           (Schedule Line Level)
*           Setting of the item number(POSNR) at schedule line level.
            gst_schedule_lines-itm_number  = <fs_vbep>-posnr.
            gst_schedule_linesx-itm_number = <fs_vbep>-posnr.

*           Setting of the schedule line number(ETENR) at schedule
*                                                        line level.
            gst_schedule_lines-sched_line  = <fs_vbep>-etenr.
            gst_schedule_linesx-sched_line = <fs_vbep>-etenr.

*           Setting the update flag at schedule line level to update
*                                                                mode.
            gst_schedule_linesx-updateflag = 'U'.

*           Setting the new order quantity(WMENG).
            gst_schedule_lines-req_qty  = p_wmeng.
            gst_schedule_linesx-req_qty = 'X'.

*           BAPI schedule lines level tables:
            APPEND:
              gst_schedule_lines  TO gt_schedule_lines,
              gst_schedule_linesx TO gt_schedule_linesx.

          ELSE.

*           Clear index
            CLEAR gv_tabix.

*           Move out of the loop.
            EXIT.

          ENDIF.

*         Clearing of work areas.
          CLEAR:
            gst_schedule_lines,
            gst_schedule_linesx.

        ENDLOOP.

      ENDIF.

*     Calling BAPI to update reason for rejection and the
*     schedule line order quantity in the selected sales order.
      CALL FUNCTION 'BAPI_SALESORDER_CHANGE'
        EXPORTING
          salesdocument    = <fs_vbap>-vbeln
          order_header_inx = gst_item_hedx
        TABLES
          return           = gt_return
          order_item_in    = gt_item_in
          order_item_inx   = gt_item_inx
          schedule_lines   = gt_schedule_lines
          schedule_linesx  = gt_schedule_linesx.

*     Preparing the result message.
      CONCATENATE <fs_vbap>-vbeln   " Sales Order Number
                  <fs_vbap>-posnr   " Item Number
             INTO gv_msg            " Message
     SEPARATED BY space.            " Space

*     Check if at least one error was raised by the BAPI. Loop inside
*     loop is not advise, however, the return table will contains small
*     amount of entries. We can use that for our demo.
      LOOP AT gt_return TRANSPORTING NO FIELDS
      WHERE type EQ 'E'
         OR type EQ 'A'.

*       Exit and rollback changes.
        EXIT.

      ENDLOOP.

*     If error found, rollback database changes.
      IF sy-subrc EQ 0.

*       Rollback changes.
        CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.

*       Preparing error message.
        CONCATENATE gv_msg        "Sales Order and Item Number
                    gc_error      "Error Message
               INTO gv_msg
       SEPARATED BY space.

*       Output message.
        WRITE / gv_msg.

*     Else, no error found, commit database changes.
      ELSE.

*       Commit changes.
        CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
          EXPORTING
            wait = abap_true.

*       Preparing success message.
        CONCATENATE gv_msg        "Sales Order and Item Number
                    gc_success    "Success Message
               INTO gv_msg
       SEPARATED BY space.

*       Output message.
        WRITE / gv_msg.

      ENDIF.

*     Write a line after each sales order.
      AT END OF vbeln.
        WRITE: sy-uline.
      ENDAT.

*     Clearing of variables and structures:
      CLEAR:
*       Variables:
        gv_msg,
        gv_tabix,
*       Structures:
        gst_item_hedx,
        gst_item_in,
        gst_item_inx.

*     Refreshing internal tables:
      REFRESH:
        gt_item_in,
        gt_item_inx,
        gt_schedule_lines,
        gt_schedule_linesx,
        gt_return.

    ENDLOOP.

  ENDIF.

ENDIF.




2
HANA / Conectarse a una base de datos SAP HANA (Power Query)
« en: 17 de Abril de 2019, 08:56:14 am »
Interesante artículo que comparto...

Para conectarse a una base de datos SAP HANA desde Excel:

1.- Haga clic en datos > nueva consulta > desde base de datos > desde base de datos SAP Hana.




2.- En el cuadro de diálogo base de datos SAP Hana, especifique el servidor al que desea conectarse. El nombre del servidor debe seguir el formato ServerName: Port.




3.- Opcionalmente, si desea importar datos mediante una consulta de base de datos nativa, haga clic en Opciones avanzadas y, en el cuadro instrucción SQL, escriba la consulta.

4.- Haga clic en Aceptar.

5.- Si el servidor SAP Hana requiere credenciales de usuario de base de datos, en el cuadro de diálogo obtener acceso a una base de datos SAP Hana, haga lo siguiente:

  a. Haga clic en la pestaña base de datos y escriba su nombre de usuario y contraseña.

  b. Haga clic en Conectar.



3
Programación ABAP / Capturar errores en un módulo de funciones estándar.
« en: 19 de Marzo de 2019, 04:33:04 pm »
Hola,

Estoy utilizando en un programa un módulo de funciones estándar y este me está devolviendo un error que me impide continuar.

Recuerdo que existe una forma de capturar el error, pero no recuerdo como era.



Gracias.

4
Todos los informes ALV de activos fijos tienen una estructura de catálogo predefinida con la nomenclatura:

            FIAA_SALVTAB_xxxxxx*

Ejemplos:

Patrimonio de activos fijos  > FIAA_SALVTAB_RABEST (Report: RABEST_ALV01)
Cuadro de activos fijos      > FIAA_SALVTAB_RAGITT (Report: RAGITT_ALV01)
Movimientos activos fijos    > FIAA_SALVTAB_RABEWG (Report: RABEWG_ALV01)
Amortizaciones               > FIAA_SALVTAB_RAHAFA (Report: RAHAFA_ALV01)


Cada catálogo de campo predefinido FIAA_SALVTAB_XXXXXX incluye una estructura tipo:

  CI_REPxxxxxx*

Ejemplos:

FIAA_SALVTAB_RABEST  .include > CI_REPRABEST  (Report: RABEST_ALV01)
FIAA_SALVTAB_RAGITT  .include > CI_REPRAGITT  (Report: RAGITT_ALV01)
FIAA_SALVTAB_RABEWG  .include > CI_REPRABEWG  (Report: RABEWG_ALV01)
FIAA_SALVTAB_RAHAFA  .include > CI_REPRAHAFA  (Report: RAHAFA_ALV01)



Procedimiento ejemplo del programa RABEST_ALV01 (de la nota 335065):

1.- Vamos al Diccionario (Tx. SE11) y en 'Tipo de datos' introducimos la estructura FIAA_SALVTAB_RABEST.
2.- Seleccionamos el  .Include > CI_REPRABEST (doble clic).
3.- En la estructura append añadimos los campos que deseamos al informe.
4.- Activamos el cambio.
5.- La próxima vez que ejecutemos el programa, modificamos el Layout y añadimos el nuevo campo al informe ALV.


Restricciones
Podemos incluir solo los campos que la base de datos lógica transfiere al informe.
 -ANLA (Segm.reg.maestro inmov.)
 -ANLZ (Asignaciones de activos fijos con fecha valor)
 -ANLU (Registro maestro de activos fijos: Campos de usuario)
 -ANLB (Parámetros de amortización)


-> Este método no está disponible para el informe RASIMU02. Lea la Nota 427827 para una mejora de RASIMU02.

Recomendaciones
-> Transfiera solo los campos realmente requeridos ya que cada campo agregado afecta el rendimiento.
-> Los campos que se incluyen adicionalmente se suministran con valores dentro del programa mediante una instrucción MOVE-CORRESPONDING. Es por eso que es necesario designar los campos agregados a los campos exactos correspondientes de las tablas originales o estructuras originales.
-> El tipo de componente también tiene que aceptar garantizar un formato correcto . Por lo tanto, siempre verifique los nombres de los campos en las estructuras iniciales (ANLAV, ANLB) y de qué tipo son. Luego, copie las entradas a la estructura CI_REPRA ... de forma idéntica.
-> Para los campos que contienen importes de moneda o especificaciones de cantidad, debe especificar tablas de referencia y campos de referencia. Puede asignar los campos de referencia en la pestaña de la pestaña Moneda / cantidad.
-> La activación de la estructura CI_REPRA ...- generalmente genera mensajes de advertencia, porque inserta campos en el espacio de nombres SAP en una estructura propiedad del cliente. Puede ignorar estas advertencias aquí y activar la estructura aún así.



5
Programación ABAP / SM35 - ¿Como descargar el LOG de un Batch Input?
« en: 10 de Enero de 2018, 11:05:53 am »
De esta forma sencilla podemos descargarnos el LOG de un Batch Input

1. Usamos la transacción SM35P y seleccionamos el LOG para visualizar.
2. Le damos al icono de la impresora, lo que te mostrará el LOG como un ALV_LIST.
3. En el menú superior vamos a... Sistema -> Lista -> Grabar -> Fichero local



6
Links / Descargar SAP GUI o parches
« en: 17 de Noviembre de 2016, 05:39:52 pm »
Hay un sitio WEB llamado Easy Service Marketplace, donde están los links necesarios para descargar el SAP GUI y sus parches.

El link al sitio es: http://www.easymarketplace.de

Específicamente el SAPGUI se encuentra en: http://www.easymarketplace.de/SAPgui-Patches.php


7
Programación ABAP / Pasar un SELECT OPTIONS a un Módulo de Función (SE37)
« en: 17 de Octubre de 2016, 03:47:49 pm »
Alguna vez nos han indicado volcar un programa a una función y a la hora de pasar los Select Options de la pantalla de selección nos entra la duda de como hacerlo.

En principio es bastante sencillo.

Nos imaginamos que tenemos en nuestra pantalla de selección de nuestro programa:

SELECT-OPTIONS: so_bukrs   FOR ekpo-bukrs,
                so_matnr   FOR mara-matnr.


Nos declaramos en nuestra función y en la pestaña de tablas lo siguiente:

s_bukrs LIKE BAPI_RANGESBUKRS
s_matnr LIKE BAPI_RANGESMATNR


Y realizamos la llamada...



 CALL FUNCTION 'ZTU_FUNCION'
    TABLES
      s_bukrs = so_bukrs
      s_matnr = so_matnr
      ti_alv  = gt_alv.



Y dentro de nuestra nueva función ya podemos copiar y pegar nuestro programa y devolver "por ejemplo" nuestra tabla interna del ALV.




Puedes buscar este tipo de estructuras en la SE11...

BAPI_RANGESAUDAT
BAPI_RANGESBLDAT
BAPI_RANGESBSTKD
BAPI_RANGESBSTNK
BAPI_RANGESBUKRS
BAPI_RANGESCASVBELN
BAPI_RANGESEKGRP
BAPI_RANGESEKORG
BAPI_RANGESEQTYP
BAPI_RANGESEQUNR
BAPI_RANGESKDMAT
BAPI_RANGESKIDNO
BAPI_RANGESKTAAR
BAPI_RANGESKTAST
BAPI_RANGESKUNNR
BAPI_RANGESLFART
BAPI_RANGESLIFNR
BAPI_RANGESMATNR
BAPI_RANGESPARNR
BAPI_RANGESPOSTX
BAPI_RANGESRFBSK
BAPI_RANGESSETTLDATE
BAPI_RANGESSPART
BAPI_RANGESUSECASE
BAPI_RANGESVKBUR


etc...

8
Links / Curso SAP BW y SD gratis
« en: 23 de Febrero de 2016, 08:49:37 am »
Hola!
Les escribo para compartirles un sitio web con cursos gratis de diferentes módulos SAP. Si bien por el momento hay solo dos cursos, por lo que dice el sitio web tienen pensado ir agregando mas.

El sitio web es InforSAP.

Dentro del sitio web esta el Curso de SAP BW y el Curso de SAP SD

Espero les sea de utilidad para todos aquellos principiantes en el aprendizaje de este gran ERP! :)

Saludos!

9
Reports / Flujo de documentos... Factura - Entrega - Pedido...
« en: 15 de Abril de 2014, 01:23:29 pm »
Al programa le informamos de la factura y nos devuelve su flujo de documentos



*&---------------------------------------------------------------------*
*& Report  ZFLUJO_DOC
*&
*&---------------------------------------------------------------------*
*&
*&
*&
*&---------------------------------------------------------------------*

REPORT  ZFLUJO_DOC.


************************************************************************
*INCLUDE
************************************************************************
INCLUDE zalv.
INCLUDE zsdin01.

TABLES: *vbrk.

************************************************************************
*DATA
************************************************************************
DATA: BEGIN OF gt_salida_alv OCCURS 0,
        vbeln              LIKE vbrk-vbeln,
        sfakn              LIKE vbrk-sfakn,
        fkdat              LIKE vbrk-fkdat,
        fkart              LIKE vbrk-fkart,
        vkorg              LIKE vbrk-vkorg,
        vtweg              LIKE vbrk-vtweg,
        kunrg              LIKE vbrk-kunrg,
        kunrg_txt          LIKE kna1-name1,
        posnr              LIKE vbrp-posnr,
        matnr              LIKE vbrp-matnr,
        matnr_txt          LIKE makt-maktx,
        entrega            LIKE likp-vbeln,
        posicion_entrega   LIKE lips-posnr,
        kunwe              LIKE likp-kunnr,
        kunwe_txt          LIKE kna1-name1,
        wadat_ist          LIKE likp-wadat_ist,
        ntgew              LIKE lips-ntgew,
        brgew              LIKE lips-brgew,
        gewei              LIKE lips-gewei,
        pedido             LIKE vbak-vbeln,
        posicion_pedido    LIKE vbap-posnr,
        bstnk              LIKE vbak-bstnk,
        bstdk              LIKE vbak-bstdk,
        ntgew_pedido       LIKE vbap-ntgew,
        brgew_pedido       LIKE vbap-brgew,
        gewei_pedido       LIKE vbap-gewei,
        werks              LIKE vbap-werks,
        werks_txt          LIKE t001w-name1,
        pedido_compras     LIKE ekko-ebeln,
        pos_pedido_compras LIKE ekpo-ebelp,
        reswk              LIKE ekko-reswk,
        reswk_txt          LIKE t001w-name1,
        augbl              LIKE bseg-augbl,       " ODJ 16.11.2010
        dmbtr              LIKE bseg-dmbtr,       " ODJ 16.11.2010
        pswsl              LIKE bseg-pswsl,       " ODJ 16.11.2010

      END   OF gt_salida_alv.


************************************************************************
*SELECT-OPTIONS
************************************************************************
SELECTION-SCREEN BEGIN OF BLOCK b1 WITH FRAME.
SELECT-OPTIONS: s_vbeln FOR gt_salida_alv-vbeln,
                s_fkart FOR gt_salida_alv-fkart,
                s_fkdat FOR gt_salida_alv-fkdat,
                s_vkorg FOR gt_salida_alv-vkorg,
                s_vtweg FOR gt_salida_alv-vtweg,
                s_kunrg FOR gt_salida_alv-kunrg,
                s_matnr FOR gt_salida_alv-matnr.

SELECTION-SCREEN SKIP 1.

PARAMETERS: p_gewei  LIKE mara-gewei DEFAULT 'KG' OBLIGATORY.

SELECTION-SCREEN SKIP 1.
PARAMETERS: p_agru RADIOBUTTON GROUP  r1 DEFAULT 'X',
            p_det  RADIOBUTTON GROUP r1.
SELECTION-SCREEN END OF BLOCK b1.

SELECTION-SCREEN SKIP 2.

PARAMETERS: p_vari    LIKE variant-variant.

************************************************************************
*AT SELECTION-SCREEN ON VALUE-REQUEST
************************************************************************
AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_vari.

  DATA: spec_layout TYPE disvariant,
         g_exit TYPE c.

  CLEAR variant.
  variant-report = sy-repid.

  CALL FUNCTION 'LVC_VARIANT_F4'
    EXPORTING
      is_variant = variant
      i_save     = 'A'
    IMPORTING
      e_exit     = g_exit
      es_variant = spec_layout
    EXCEPTIONS
      not_found  = 1
      OTHERS     = 2.
  IF sy-subrc NE 0.
    MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
            WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
  ELSE.
    IF g_exit NE 'X'.
      p_vari    = spec_layout-variant.
      variant = spec_layout.
    ENDIF.
  ENDIF.


************************************************************************
*START-OF-SELECTION
************************************************************************
START-OF-SELECTION.

  PERFORM tomar_datos.



************************************************************************
*END-OF-SELECTION
************************************************************************
END-OF-SELECTION.

  PERFORM salida_alv.





************************************************************************
*FORMS
************************************************************************
*&---------------------------------------------------------------------*
*&      Form  tomar_datos
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
FORM tomar_datos .

  DATA: lt_salida_alv         LIKE gt_salida_alv OCCURS 0
                                                 WITH HEADER LINE.

  DATA: lt_likp               LIKE likp OCCURS 0 WITH HEADER LINE.
  DATA: lt_lips               LIKE lips OCCURS 0 WITH HEADER LINE.
  DATA: lt_vbak               LIKE vbak OCCURS 0 WITH HEADER LINE.
  DATA: lt_vbap               LIKE vbap OCCURS 0 WITH HEADER LINE.
  DATA: lt_ekko               LIKE ekko OCCURS 0 WITH HEADER LINE.
  DATA: lt_kna1               LIKE kna1 OCCURS 0 WITH HEADER LINE.
  DATA: lt_t001w              LIKE t001w OCCURS 0 WITH HEADER LINE.
  DATA: lt_makt               LIKE makt OCCURS 0 WITH HEADER LINE.


  DATA:   lf_subrc              LIKE sy-subrc.
  DATA:   lf_vkorg_error        LIKE zyte81-x_vkorg.

  PERFORM validar_organizacion_ventas
                     TABLES   s_vkorg
                     USING    ''
                     CHANGING lf_subrc
                              lf_vkorg_error.
  IF lf_subrc <> 0.
*   Sin autorización para organización de ventas ....
    MESSAGE i151(jgbp) WITH lf_vkorg_error.
    EXIT.
  ENDIF.


  SELECT vbeln fkart fkdat vkorg vtweg kunrg sfakn
  INTO CORRESPONDING FIELDS OF TABLE lt_salida_alv
  FROM vbrk
  WHERE vbeln IN s_vbeln
    AND fkart IN s_fkart
    AND fkdat IN s_fkdat
    AND vkorg IN s_vkorg
    AND vtweg IN s_vtweg
    AND kunrg IN s_kunrg.





  LOOP AT lt_salida_alv.
    MOVE-CORRESPONDING lt_salida_alv TO gt_salida_alv.

    SELECT posnr matnr
    INTO (gt_salida_alv-posnr, gt_salida_alv-matnr)
    FROM vbrp
    WHERE vbeln =  lt_salida_alv-vbeln
      AND matnr IN s_matnr.


      CLEAR: gt_salida_alv-entrega,
             gt_salida_alv-posicion_entrega,
             gt_salida_alv-pedido,
             gt_salida_alv-posicion_pedido.

      SELECT SINGLE vbelv posnv
      INTO (gt_salida_alv-entrega, gt_salida_alv-posicion_entrega)
      FROM vbfa
      WHERE vbeln   = gt_salida_alv-vbeln
        AND posnn   = gt_salida_alv-posnr
        AND vbtyp_v = 'J'.
      IF sy-subrc <> 0.
        SELECT SINGLE vbelv posnv
        INTO (gt_salida_alv-pedido, gt_salida_alv-posicion_pedido)
        FROM vbfa
        WHERE vbeln   = gt_salida_alv-vbeln
          AND posnn   = gt_salida_alv-posnr
          AND stufe   = '0'.
        IF sy-subrc <> 0.

          SELECT SINGLE vgbel vgpos aubel aupos
           INTO (gt_salida_alv-entrega, gt_salida_alv-posicion_entrega,
                 gt_salida_alv-pedido,  gt_salida_alv-posicion_pedido)
          FROM vbrp
          WHERE vbeln = lt_salida_alv-vbeln
            AND posnr = gt_salida_alv-posnr
            AND vgtyp = 'J'.

        ENDIF.
      ELSE.
        SELECT SINGLE vbelv posnv
        INTO (gt_salida_alv-pedido, gt_salida_alv-posicion_pedido)
        FROM vbfa
        WHERE vbeln   = gt_salida_alv-entrega
          AND posnn   = gt_salida_alv-posicion_entrega
          AND stufe   = '0'.
        IF sy-subrc <> 0.
          SELECT SINGLE vgbel vgpos
          INTO (gt_salida_alv-pedido_compras,
                gt_salida_alv-pos_pedido_compras)
          FROM lips
        WHERE vbeln = gt_salida_alv-entrega
          AND posnr = gt_salida_alv-posicion_entrega.
        ENDIF.
      ENDIF.

      APPEND gt_salida_alv.
    ENDSELECT.

  ENDLOOP.

  SORT gt_salida_alv BY vbeln           posnr
                        entrega         posicion_entrega
                        pedido          posicion_pedido
                        pedido_compras  pos_pedido_compras.




  IF NOT gt_salida_alv[] IS INITIAL.

*   Datos entrega, cabecera
    SELECT vbeln kunnr wadat_ist
    INTO CORRESPONDING FIELDS OF TABLE lt_likp
    FROM likp
    FOR ALL ENTRIES IN gt_salida_alv
    WHERE vbeln = gt_salida_alv-entrega.

    LOOP AT lt_likp.
      gt_salida_alv-kunwe     = lt_likp-kunnr.
      gt_salida_alv-wadat_ist = lt_likp-wadat_ist.
      MODIFY gt_salida_alv TRANSPORTING kunwe wadat_ist
                           WHERE entrega = lt_likp-vbeln.
    ENDLOOP.

*   Datos entrega, posición
    SELECT vbeln posnr matnr ntgew brgew gewei
    INTO CORRESPONDING FIELDS OF TABLE lt_lips
    FROM lips
    FOR ALL ENTRIES IN gt_salida_alv
    WHERE vbeln = gt_salida_alv-entrega
      AND posnr = gt_salida_alv-posicion_entrega.

    LOOP AT lt_lips.
      gt_salida_alv-gewei = p_gewei.

      IF p_gewei <> lt_lips-gewei.

        CALL FUNCTION 'Z_FT_CONVERTIR_UNIDADES'
          EXPORTING
            matnr    = lt_lips-matnr
            meinh    = lt_lips-gewei
            meins    = p_gewei
            cantidad = lt_lips-brgew
          IMPORTING
            salida   = gt_salida_alv-brgew.
        CALL FUNCTION 'Z_FT_CONVERTIR_UNIDADES'
          EXPORTING
            matnr    = lt_lips-matnr
            meinh    = lt_lips-gewei
            meins    = p_gewei
            cantidad = lt_lips-ntgew
          IMPORTING
            salida   = gt_salida_alv-ntgew.
      ELSE.
        gt_salida_alv-ntgew = lt_lips-ntgew.
        gt_salida_alv-brgew = lt_lips-brgew.
      ENDIF.

      MODIFY gt_salida_alv TRANSPORTING ntgew brgew gewei
                           WHERE entrega          = lt_lips-vbeln
                             AND posicion_entrega = lt_lips-posnr.
    ENDLOOP.


*   Datos pedido ventas, cabecera
    SELECT vbeln bstnk bstdk
    INTO CORRESPONDING FIELDS OF TABLE lt_vbak
    FROM vbak
    FOR ALL ENTRIES IN gt_salida_alv
    WHERE vbeln = gt_salida_alv-pedido.

    LOOP AT lt_vbak.
      gt_salida_alv-bstnk = lt_vbak-bstnk.
      gt_salida_alv-bstdk = lt_vbak-bstdk.
      MODIFY gt_salida_alv TRANSPORTING bstnk bstdk
                           WHERE pedido = lt_vbak-vbeln.
    ENDLOOP.


*   Datos pedido ventas, posición
    SELECT vbeln posnr ntgew brgew gewei werks
    INTO CORRESPONDING FIELDS OF TABLE lt_vbap
    FROM vbap
    FOR ALL ENTRIES IN gt_salida_alv
    WHERE vbeln = gt_salida_alv-pedido
      AND posnr = gt_salida_alv-posicion_pedido.

    LOOP AT lt_vbap.

      gt_salida_alv-werks        = lt_vbap-werks.
      gt_salida_alv-gewei_pedido = p_gewei.

      IF p_gewei <> lt_vbap-gewei.
        CALL FUNCTION 'Z_FT_CONVERTIR_UNIDADES'
          EXPORTING
            matnr    = lt_lips-matnr
            meinh    = lt_lips-gewei
            meins    = p_gewei
            cantidad = lt_vbap-brgew
          IMPORTING
            salida   = gt_salida_alv-brgew_pedido.
        CALL FUNCTION 'Z_FT_CONVERTIR_UNIDADES'
          EXPORTING
            matnr    = lt_lips-matnr
            meinh    = lt_lips-gewei
            meins    = p_gewei
            cantidad = lt_vbap-ntgew
          IMPORTING
            salida   = gt_salida_alv-ntgew_pedido.
      ELSE.
        gt_salida_alv-ntgew_pedido = lt_vbap-ntgew.
        gt_salida_alv-brgew_pedido = lt_vbap-brgew.
      ENDIF.

      MODIFY gt_salida_alv TRANSPORTING ntgew_pedido
                                        brgew_pedido
                                        gewei_pedido
                                        werks
                           WHERE pedido           = lt_vbap-vbeln
                             AND posicion_pedido  = lt_vbap-posnr.
    ENDLOOP.


    SELECT ebeln reswk
    INTO CORRESPONDING FIELDS OF TABLE lt_ekko
    FROM ekko
    FOR ALL ENTRIES IN gt_salida_alv
    WHERE ebeln = gt_salida_alv-pedido_compras.

    LOOP AT lt_ekko.
      gt_salida_alv-reswk = lt_ekko-reswk.
      MODIFY gt_salida_alv TRANSPORTING reswk
                           WHERE pedido_compras = lt_ekko-ebeln.
    ENDLOOP.





*   Descripción de Resp. Pago, Dest. Mercancía
    SELECT kunnr name1
    INTO CORRESPONDING FIELDS OF TABLE lt_kna1
    FROM kna1
    FOR ALL ENTRIES IN gt_salida_alv
    WHERE kunnr = gt_salida_alv-kunrg
       OR kunnr = gt_salida_alv-kunwe.

    LOOP AT lt_kna1.
      gt_salida_alv-kunrg_txt = lt_kna1-name1.
      MODIFY gt_salida_alv TRANSPORTING kunrg_txt
                           WHERE kunrg = lt_kna1-kunnr.
      gt_salida_alv-kunwe_txt = lt_kna1-name1.
      MODIFY gt_salida_alv TRANSPORTING kunwe_txt
                           WHERE kunwe = lt_kna1-kunnr.
    ENDLOOP.


*   Datos asociados a los centros
    SELECT werks name1
    INTO CORRESPONDING FIELDS OF TABLE lt_t001w
    FROM t001w
    FOR ALL ENTRIES IN gt_salida_alv
    WHERE werks = gt_salida_alv-werks
       OR werks = gt_salida_alv-reswk.

    LOOP AT lt_t001w.
      gt_salida_alv-werks_txt = lt_t001w-name1.
      MODIFY gt_salida_alv TRANSPORTING werks_txt
                           WHERE werks = lt_t001w-werks.
      gt_salida_alv-reswk_txt = lt_t001w-name1.
      MODIFY gt_salida_alv TRANSPORTING reswk_txt
                           WHERE reswk = lt_t001w-werks.
    ENDLOOP.

*   Textos de material
    SELECT matnr maktx
    INTO CORRESPONDING FIELDS OF TABLE lt_makt
    FROM makt
    FOR ALL ENTRIES IN gt_salida_alv
    WHERE matnr = gt_salida_alv-matnr
      AND spras = sy-langu.

    LOOP AT lt_makt.
      gt_salida_alv-matnr_txt = lt_makt-maktx.
      MODIFY gt_salida_alv TRANSPORTING matnr_txt
                           WHERE matnr = lt_makt-matnr.
    ENDLOOP.


*   Añadimos el doc. compensado y el importe
    DATA: lf_vbeln LIKE gt_salida_alv-vbeln.
    LOOP AT gt_salida_alv.
      SELECT SINGLE bukrs INTO *vbrk-bukrs FROM *vbrk
                     WHERE vbeln = gt_salida_alv-vbeln.

      SELECT SINGLE augbl dmbtr pswsl
               INTO (gt_salida_alv-augbl, gt_salida_alv-dmbtr,
                     gt_salida_alv-pswsl)
               FROM bseg
              WHERE bukrs = *vbrk-bukrs
                AND belnr = gt_salida_alv-vbeln
                AND augbl <> space
                AND bschl = '01'.     " Facturas

      IF gt_salida_alv-vbeln <> lf_vbeln.
        lf_vbeln = gt_salida_alv-vbeln.   " Solo una vez por factura
      ELSE.
        CLEAR gt_salida_alv-dmbtr.
      ENDIF.

      MODIFY gt_salida_alv.
    ENDLOOP.

  ENDIF.


ENDFORM.                    " tomar_datos

*&---------------------------------------------------------------------*
*&      Form  SALIDA_ALV
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
FORM salida_alv .

  DATA: lf_alv_repid          LIKE sy-repid.

  DATA: ls_alv_doc_layout     TYPE slis_layout_alv,
        lt_alv_doc_fieldcat   TYPE slis_t_fieldcat_alv,
        ls_alv_doc_fieldcat   TYPE slis_fieldcat_alv.
  DATA: ls_alv_doc_variant    LIKE disvariant.

  DATA: lt_salida_alv         LIKE gt_salida_alv OCCURS 0
                                                 WITH HEADER LINE.

  lf_alv_repid = 'ZFLUJO_DOC'.


* Tomamos el catálogo de campos.
  PERFORM obt_descrip_campos_tabla USING lf_alv_repid
                                         'GT_SALIDA_ALV'.


  PERFORM cambio_descripcion USING:
  'POSNR'               text-001  text-001  text-001  text-001,
  'POSICION_ENTREGA'    text-002  text-002  text-002  text-002,
  'POSICION_PEDIDO'     text-003  text-003  text-003  text-003,
  'POS_PEDIDO_COMPRAS'  text-004  text-004  text-004  text-004.


  PERFORM copia_descripcion USING: 'KUNRG_TXT'  'KUNRG',
                                   'KUNWE_TXT'  'KUNWE',
                                   'WERKS_TXT'  'WERKS',
                                   'RESWK_TXT'  'RESWK'.


  PERFORM carac_gen_listado.

  PERFORM asign_o_quitar_campo_clave USING: 'VBELN'              ' ',
                                            'POSNR'              ' ',
                                            'ENTREGA'            ' ',
                                            'POSICION_ENTREGA'   ' ',
                                            'PEDIDO'             ' ',
                                            'POSICION_PEDIDO'    ' ',
                                            'PEDIDO_COMPRAS'     ' ',
                                            'POS_PEDIDO_COMPRAS' ' '.

  PERFORM activar_hotspot USING: 'VBELN'           'X',
                                 'SFAKN'           'X',
                                 'ENTREGA'         'X',
                                 'PEDIDO'          'X',
                                 'PEDIDO_COMPRAS'  'X'.


  ls_alv_doc_variant-report  = lf_alv_repid.
  ls_alv_doc_variant-variant = p_vari.



  IF p_det IS INITIAL.

    LOOP AT gt_salida_alv.
      lt_salida_alv = gt_salida_alv.

      CLEAR: lt_salida_alv-posnr,
             lt_salida_alv-matnr,
             lt_salida_alv-matnr_txt,
             lt_salida_alv-posicion_entrega,
             lt_salida_alv-posicion_pedido,
             lt_salida_alv-pos_pedido_compras.
      COLLECT lt_salida_alv.
    ENDLOOP.

    gt_salida_alv[] = lt_salida_alv[].

    PERFORM eliminar_campos USING: 'POSNR',
                                   'MATNR',
                                   'MATNR_TXT',
                                   'POSICION_ENTREGA',
                                   'POSICION_PEDIDO',
                                   'POS_PEDIDO_COMPRAS'.

  ENDIF.

  PERFORM eliminar_campos USING: 'NTGEW',
                                 'BRGEW',
                                 'GEWEI',
                                 'NTGEW_PEDIDO',
                                 'BRGEW_PEDIDO',
                                 'GEWEI_PEDIDO',
                                 'WERKS',
                                 'WERKS_TXT',
                                 'PEDIDO_COMPRAS',
                                 'POS_PEDIDO_COMPRAS',
                                 'ERSWK',
                                 'RESWK_TXT'.

  CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
    EXPORTING
      i_callback_program      = lf_alv_repid
      is_layout               = layout
      it_fieldcat             = fieldtab
      i_callback_user_command = 'USER_COMMAND'
      i_default               = 'X'
      i_save                  = 'A'
      is_variant              = ls_alv_doc_variant
    TABLES
      t_outtab                = gt_salida_alv
    EXCEPTIONS
      program_error           = 1
      OTHERS                  = 99.



ENDFORM.                    " SALIDA_ALV

*&---------------------------------------------------------------------*
*&      Form  USER_COMMAND
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
FORM user_command USING pf_ucomm    TYPE sy-ucomm
                        ps_selfield TYPE slis_selfield.

  DATA: lf_ebeln              LIKE  ekko-ebeln.

  CASE pf_ucomm.
    WHEN '&IC1'.
      CASE ps_selfield-fieldname.
        WHEN 'VBELN' OR 'SFAKN'.
          CHECK NOT ps_selfield-value IS INITIAL.
          SET PARAMETER ID 'VF' FIELD ps_selfield-value.
          CALL TRANSACTION 'VF03' AND SKIP FIRST SCREEN.

        WHEN 'ENTREGA'.
          CHECK NOT ps_selfield-value IS INITIAL.
          SET PARAMETER ID 'VL' FIELD ps_selfield-value.
          CALL TRANSACTION 'VL03N' AND SKIP FIRST SCREEN.

        WHEN 'PEDIDO'.
          CHECK NOT ps_selfield-value IS INITIAL.
          SET PARAMETER ID 'AUN' FIELD ps_selfield-value.
          CALL TRANSACTION 'VA03' AND SKIP FIRST SCREEN.

        WHEN 'PEDIDO_COMPRAS'.
          CHECK NOT ps_selfield-value IS INITIAL.

          CLEAR gt_salida_alv.
          READ TABLE gt_salida_alv INDEX ps_selfield-tabindex.
          CHECK sy-subrc = 0.

          CALL FUNCTION 'ME_DISPLAY_PURCHASE_DOCUMENT'
            EXPORTING
              i_ebeln              = gt_salida_alv-pedido_compras
              i_ebelp              = gt_salida_alv-pos_pedido_compras
              i_enjoy              = 'X'
              i_display_only       = 'X'
            EXCEPTIONS
              not_found            = 1
              no_authority         = 2
              invalid_call         = 3
              preview_not_possible = 4
              OTHERS               = 5.

      ENDCASE.
  ENDCASE.

ENDFORM.                    "USER_COMMAND

*&---------------------------------------------------------------------*
*&      Form  cambio_descripcion
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
FORM cambio_descripcion USING pf_fieldname
                              pf_scrtext_l
                              pf_scrtext_m
                              pf_scrtext_s
                              pf_coltext.

  READ TABLE fieldtab WITH KEY fieldname = pf_fieldname ASSIGNING <fs>.
  IF sy-subrc EQ 0.
    <fs>-seltext_l    = pf_scrtext_l.
    <fs>-seltext_m    = pf_scrtext_m.
    <fs>-seltext_s    = pf_scrtext_s.
    <fs>-reptext_ddic = pf_coltext.
  ENDIF.

ENDFORM.                    " cambio_descripcion

*&---------------------------------------------------------------------*
*&      Form  copia_descripcion
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
FORM copia_descripcion USING pf_fieldname_destino
                             pf_fieldname_origen.

  FIELD-SYMBOLS: <lfs_fieldtab> TYPE slis_fieldcat_alv.

  READ TABLE fieldtab WITH KEY fieldname = pf_fieldname_origen
                      ASSIGNING <lfs_fieldtab>.

  CHECK sy-subrc = 0.

  READ TABLE fieldtab WITH KEY fieldname = pf_fieldname_destino
                      ASSIGNING <fs>.
  IF sy-subrc EQ 0.
    <fs>-seltext_l    = <lfs_fieldtab>-seltext_l.
    <fs>-seltext_m    = <lfs_fieldtab>-seltext_m.
    <fs>-seltext_s    = <lfs_fieldtab>-seltext_s.
    <fs>-reptext_ddic = <lfs_fieldtab>-reptext_ddic.
  ENDIF.

ENDFORM.                    " cambio_descripcion

*&---------------------------------------------------------------------*
*&      Form  activar_hotspot
*&---------------------------------------------------------------------*
FORM eliminar_campos USING p1 TYPE slis_fieldname.

  READ TABLE fieldtab WITH KEY fieldname = p1 ASSIGNING <fs>.
  IF sy-subrc = 0.
    <fs>-no_out = 'X'.
    <fs>-tech   = 'X'.
  ENDIF.

ENDFORM.                    " activar_hotspot

10
Reports / Duplicidad en tabla EKKI
« en: 05 de Diciembre de 2012, 12:06:08 pm »
Cuando nos pega un DUMP por duplicidad en la tabla EKKI... SAPSQL_ARRAY_INSERT_DUPREC

Se le puede pasar este programa 'Z' para eliminar esos registros. Se le indica el pedido que da problemas y listo.




*&---------------------------------------------------------------------*
*& Report  ZZEKKI01
*&
*&---------------------------------------------------------------------*
*&
*&
*&---------------------------------------------------------------------*
*&---------------------------------------------------------------------*
*& Title: Delete EKKI records for items before correction              *
*&---------------------------------------------------------------------*

REPORT zzekki01.

TABLES: ekki, komk, ekko.

PARAMETERS: p_ebeln LIKE ekko-ebeln.

DATA: tekki LIKE ekki OCCURS 0 WITH HEADER LINE.
DATA: tkomv LIKE komv OCCURS 0 WITH HEADER LINE.

CHECK NOT p_ebeln IS INITIAL.
SELECT SINGLE * FROM  ekko
       WHERE  ebeln       = p_ebeln        .
CHECK sy-subrc EQ 0.
CHECK ( ekko-bstyp EQ 'F' OR ekko-bstyp EQ 'L' ) AND
      ekko-stako EQ space AND ekko-knumv NE space.
REFRESH tekki.
CLEAR komk.
komk-knumv = ekko-knumv.
CALL FUNCTION 'RV_KONV_SELECT'
  EXPORTING
    comm_head_i  = komk
    general_read = 'X'
  TABLES
    tkomv        = tkomv.

LOOP AT tkomv WHERE kntyp EQ 'B'.
  CLEAR tekki.
  tekki-mandt = sy-mandt.
  tekki-eknty = 'B'.
  tekki-klief = tkomv-lifnr.
  tekki-lifnr = ekko-lifnr.
  tekki-reswk = ekko-reswk.
  tekki-ebeln = ekko-ebeln.
  tekki-ebelp = tkomv-kposn.
  tekki-knumv = ekko-knumv.
  READ TABLE tekki.
  IF sy-subrc NE 0.
    APPEND tekki.
  ENDIF.
ENDLOOP.

DESCRIBE TABLE tekki LINES sy-tfill.
IF sy-tfill GT 0.
  DELETE ekki FROM TABLE tekki.
ENDIF.





11
Includes / INCLUDE para realizar ALV con Objetos
« en: 08 de Julio de 2011, 11:56:54 am »
Aquí dejo un Include para realizar ALV con Objetos

  • 1REP -> Primera llamada en Report (previa a CALL SCREEN).
  • 2REP -> Cambios en la descripción de los campos de la cab. del listado
  • 3REP -> Asignar o quitar la propiedad 'Campo Clave'
  • 1PBO -> Primera llamada en PBO. Container, Status y Título.
  • 2PBO -> Realización de un SPLIT en el listado.
  • 3PBO -> Listado simple.
  • 4PBO -> Picture en un container.


************************************************************************
********************** INCLUDE ZMETODOS ********************************
************************************************************************
*
* Índice
*
* 1REP -> Primera llamada en Report (previa a CALL SCREEN).
* 2REP -> Cambios en la descripción de los campos de la cab. del listado
* 3REP -> Asignar o quitar la propiedad 'Campo Clave'
*
* 1PBO -> Primera llamada en PBO. Container, Status y Título.
* 2PBO -> Realización de un SPLIT en el listado.
* 3PBO -> Listado simple.
* 4PBO -> Picture en un container.
*
*---------------------------------------------------------------------*
*       CLASS LCL_EVENT_RECEIVER DEFINITION
*---------------------------------------------------------------------*
*       ........                                                      *
*---------------------------------------------------------------------*
  CLASS lcl_event_receiver DEFINITION.
    PUBLIC SECTION.

*      methods handle_data_changed
*        for event data_changed of cl_gui_alv_grid
*        importing er_data_changed.

  ENDCLASS.

*---------------------------------------------------------------------*
*       CLASS lcl_event_receiver IMPLEMENTATION
*---------------------------------------------------------------------*
*       ........                                                      *
*---------------------------------------------------------------------*
*  class lcl_event_receiver implementation.
*
*    method handle_data_changed.
*      perform data_changed using er_data_changed.
*    endmethod.
*
*  endclass.

************************************************************************
* Declaraciones.
************************************************************************
  TYPE-POOLS: slis.

  DATA: repname LIKE sy-repid.

* Declaraciones generales para métodos.
  DATA: go_custom_container TYPE REF TO cl_gui_custom_container,
        lo_event_receiver   TYPE REF TO lcl_event_receiver,
        go_grid_listado     TYPE REF TO cl_gui_alv_grid,
        g_container_listado TYPE scrfname.

* Declaraciones Layout.
  DATA: gs_layout    TYPE lvc_s_layo,
        gs_variant   TYPE disvariant,
        gt_fieldcat  TYPE lvc_t_fcat,
        gt_fieldcat2 TYPE lvc_t_fcat,
        gt_sort      TYPE lvc_t_sort,
        fieldtab TYPE slis_t_fieldcat_alv,
        gs_fieldcat TYPE lvc_s_fcat,
        gs_fieldtab TYPE slis_fieldcat_alv.

  FIELD-SYMBOLS: <fieldcat> TYPE lvc_s_fcat,
                 <fs> TYPE LVC_S_FCAT.

* Variables para hacer el split del container.
*    data: container TYPE REF TO cl_gui_custom_container,
  DATA: container_1 TYPE REF TO cl_gui_container,
        container_2 TYPE REF TO cl_gui_container,
        splitter TYPE REF TO cl_gui_splitter_container.

* Variables para añadir el logo en el listado.
  TYPE-POOLS cndp.
  DATA: url(132),
        query_table LIKE w3query OCCURS 1 WITH HEADER LINE,
        html_table LIKE w3html OCCURS 1,
        return_code LIKE  w3param-ret_code,
        content_type LIKE  w3param-cont_type,
        content_length LIKE  w3param-cont_len,
        pic_data LIKE w3mime OCCURS 0,
        pic_size TYPE i,
        picture_1 TYPE REF TO cl_gui_picture,
        picture_2 TYPE REF TO cl_gui_picture.

************************************************************************
* Primera llamada en Report (previa a CALL SCREEN). (*)
************************************************************************
  FORM 1rep USING p_repname
                  p_tablename TYPE slis_tabname
                  indicador.

* Recogida de atributos de todos los campos de la tabla interna.
*
* Importante!!: La tabla interna no se tiene que definir como un data
* referenciado a una estructura type (Si se hace de este modo no
* reconocerá ningún campo). Utilizar siempre:
* Data begin of .....  occurs 0.
* Data end of ......
* No utilizar tampoco: Data: itab type standard table of ...............
*
    CLEAR: fieldtab.
    REFRESH: fieldtab.

    CALL FUNCTION 'REUSE_ALV_FIELDCATALOG_MERGE'
         EXPORTING
              i_program_name     = p_repname
              i_internal_tabname = p_tablename
              i_inclname         = p_repname
         CHANGING
              ct_fieldcat        = fieldtab.

* Asignación de atributos.

* El indicador nos dice si se trata de 1 tabla o de 2 tablas
* principalmente para utilizarlo en un listado tipo SPLIT.
    CASE indicador.
      WHEN '1'.
        CLEAR: gt_fieldcat.
        REFRESH: gt_fieldcat.
      WHEN '2'.
        CLEAR: gt_fieldcat2.
        REFRESH: gt_fieldcat2.
    ENDCASE.

    LOOP AT fieldtab INTO gs_fieldtab.
      CLEAR: gs_fieldcat.
      gs_fieldcat-fieldname  = gs_fieldtab-fieldname.
      gs_fieldcat-ref_table  = gs_fieldtab-ref_tabname.
      gs_fieldcat-outputlen  = gs_fieldtab-outputlen.
      gs_fieldcat-key        = gs_fieldtab-key.
      gs_fieldcat-tabname    = p_tablename.
      gs_fieldcat-scrtext_l  = gs_fieldtab-seltext_l.
      gs_fieldcat-scrtext_m  = gs_fieldtab-seltext_m.
      gs_fieldcat-scrtext_s  = gs_fieldtab-seltext_s.
      gs_fieldcat-coltext    = gs_fieldtab-seltext_m.
      gs_fieldcat-selddictxt = 'L'.
*    gs_fieldcat-edit       = gs_fieldtab-edit.
*    gs_fieldcat-auto_value = 'X'.

      CASE indicador.
        WHEN '1'.
          APPEND gs_fieldcat TO gt_fieldcat.
        WHEN '2'.
          APPEND gs_fieldcat TO gt_fieldcat2.
      ENDCASE.

    ENDLOOP.

  ENDFORM.

************************************************************************
* Segunda llamada en Report (previa a CALL SCREEN).
* Cambios en la descripción de los campos de la cabecera del listado.
************************************************************************
  FORM 2rep USING var1
                  pf_fieldname
                  pf_coltext
                  pf_scrtext_l
                  pf_scrtext_m
                  pf_scrtext_s.

    CASE var1.
      WHEN '1'.
        READ TABLE gt_fieldcat WITH KEY fieldname = pf_fieldname
           ASSIGNING <fieldcat>.
      WHEN '2'.
        READ TABLE gt_fieldcat2 WITH KEY fieldname = pf_fieldname
           ASSIGNING <fieldcat>.
    ENDCASE.

    IF sy-subrc EQ 0.
* Si el cuarto campo vale 'X' entonces todas las descripciones serán
* iguales.
      IF pf_scrtext_l = 'X'.
        <fieldcat>-scrtext_l    = pf_coltext.
        <fieldcat>-scrtext_m    = pf_coltext.
        <fieldcat>-scrtext_s    = pf_coltext.
        <fieldcat>-coltext      = pf_coltext.

      ELSE.
        <fieldcat>-scrtext_l    = pf_scrtext_l.
        <fieldcat>-scrtext_m    = pf_scrtext_m.
        <fieldcat>-scrtext_s    = pf_scrtext_s.
        <fieldcat>-coltext      = pf_coltext.
      ENDIF.
    ENDIF.

  ENDFORM.

************************************************************************
* Tercera llamada en Report (previa a CALL SCREEN).
* Asignar o quitar la propiedad 'Campo Clave'.
************************************************************************
  FORM 3rep USING var1 TYPE fieldname
                  var2 TYPE char1.

* Esta form asigna o quita la propiedad de campo clave. Los campos clave
* aparecen en color azul a la izquierda de la pantalla, y se quedan
* bloqueados sin que se puedan mover.
    TRANSLATE var1 TO UPPER CASE.
    READ TABLE gt_fieldcat WITH KEY fieldname = var1 ASSIGNING <fs>.
    IF sy-subrc EQ 0.
      <fs>-key = var2.
    ENDIF.

  ENDFORM.

************************************************************************
* Primera llamada en PBO. Container, Status y Título. (*)
************************************************************************
  FORM 1pbo USING var1 var2 var3.

    SET PF-STATUS var2.
    SET TITLEBAR var3.

    MOVE: var1 TO g_container_listado.

* Refrescamos el container si no estaba vacío.
    IF NOT go_custom_container IS INITIAL.
      CALL METHOD go_custom_container->free.
    ENDIF.

* Creamos el container.
    CREATE OBJECT go_custom_container
                 EXPORTING container_name = g_container_listado.

  ENDFORM.

************************************************************************
* Segunda llamada en PBO.  (*)
* Realización de un SPLIT en el listado.
* Este form es NO COMPATIBLE con el 3PBO (uno u otro).
************************************************************************
  FORM 2pbo TABLES tab1 tab2.

    CREATE OBJECT splitter
                      EXPORTING parent = go_custom_container
                                rows    = 1
                                columns = 2.

    CALL METHOD splitter->get_container
                      EXPORTING row      = 1
                                column   = 1
                      RECEIVING container = container_1.

    CALL METHOD splitter->get_container
                  EXPORTING row      = 1
                            column   = 2
                  RECEIVING container = container_2.

    CREATE OBJECT go_grid_listado
               EXPORTING i_parent = container_1.

    CREATE OBJECT lo_event_receiver.

    CALL METHOD go_grid_listado->register_edit_event
            EXPORTING i_event_id = cl_gui_alv_grid=>mc_evt_enter.

    gs_layout-zebra      = 'X'.
    gs_layout-cwidth_opt = 'X'.
*    gs_layout-ctab_fname = 'COLOR_CELDAS'.
    gs_variant-report = repname.

    CALL METHOD go_grid_listado->set_table_for_first_display
         EXPORTING                     " i_buffer_active = 'X'
                   i_save          = 'A'
                   is_variant      = gs_variant
                   is_layout       = gs_layout
         CHANGING  it_fieldcatalog = gt_fieldcat
                   it_sort         = gt_sort
                   it_outtab       = tab1[].


    CREATE OBJECT go_grid_listado
                   EXPORTING i_parent = container_2.

    CREATE OBJECT lo_event_receiver.

    CALL METHOD go_grid_listado->register_edit_event
            EXPORTING i_event_id = cl_gui_alv_grid=>mc_evt_enter.

    gs_layout-zebra      = 'X'.
    gs_layout-cwidth_opt = 'X'.
*    gs_layout-ctab_fname = 'COLOR_CELDAS'.
    gs_variant-report = repname.

    CALL METHOD go_grid_listado->set_table_for_first_display
            EXPORTING                     " i_buffer_active = 'X'
                      i_save          = 'A'
                      is_variant      = gs_variant
                      is_layout       = gs_layout
            CHANGING  it_fieldcatalog = gt_fieldcat2
                      it_sort         = gt_sort
                      it_outtab       = tab2[].

  ENDFORM.

************************************************************************
* Tercera llamada en PBO.  (*)
* Listado simple.
* Este form es NO COMPATIBLE con el 2PBO (uno u otro).
************************************************************************
  FORM 3pbo TABLES tab1.

    CREATE OBJECT go_grid_listado
               EXPORTING i_parent = go_custom_container.

    CREATE OBJECT lo_event_receiver.

    CALL METHOD go_grid_listado->register_edit_event
            EXPORTING i_event_id = cl_gui_alv_grid=>mc_evt_enter.

    gs_layout-zebra      = 'X'.
    gs_layout-cwidth_opt = 'X'.
*    gs_layout-ctab_fname = 'COLOR_CELDAS'.
    gs_variant-report = repname.

    CALL METHOD go_grid_listado->set_table_for_first_display
         EXPORTING                     " i_buffer_active = 'X'
                   i_save          = 'A'
                   is_variant      = gs_variant
                   is_layout       = gs_layout
         CHANGING  it_fieldcatalog = gt_fieldcat
                   it_sort         = gt_sort
                   it_outtab       = tab1[].

  ENDFORM.

************************************************************************
* Cuarta llamada en PBO.
* *.gif en un container.
*
* Crear la picture en SE38 -> Entorno -> Repository SAP Web ->
* -> Pincho datos Binarios... -> Crear
* Actualizar tb. los tipos MIME si fuera necesario (para añadir *.gif).
* Actualizar tb. el editor MIME para ese tipo si fuera necesario.
*
* Llamar con nombre de la picture creada y con la variable container.
* Ejemplo:
*   PERFORM gif_en_container USING 'ZLOGO' go_custom_container.
*
************************************************************************
  FORM gif_en_container USING var1 var2.

* Creamos la "picture" correspondiente.
    CREATE OBJECT picture_1
                  EXPORTING parent  = var2.

* Extracción de la URL.
    REFRESH query_table.
    query_table-name = '_OBJECT_ID'.
    query_table-value = var1.
    APPEND query_table.

    CALL FUNCTION 'WWW_GET_MIME_OBJECT'
         TABLES
              query_string        = query_table
              html                = html_table
              mime                = pic_data
         CHANGING
              return_code         = return_code
              content_type        = content_type
              content_length      = content_length
         EXCEPTIONS
              object_not_found    = 1
              parameter_not_found = 2
              OTHERS              = 3.
    IF sy-subrc = 0.
      pic_size = content_length.
    ENDIF.

    CALL FUNCTION 'DP_CREATE_URL'
         EXPORTING
              type     = 'image'
              subtype  = cndp_sap_tab_unknown
              size     = pic_size
              lifetime = cndp_lifetime_transaction
         TABLES
              data     = pic_data
         CHANGING
              url      = url
         EXCEPTIONS
              OTHERS   = 1.

* Cargamos la imagen en el listado.
    CALL METHOD picture_1->load_picture_from_url
            EXPORTING url = url.

    CALL METHOD cl_gui_cfw=>flush
            EXCEPTIONS cntl_system_error = 1
                       cntl_error = 2.
    IF sy-subrc <> 0.
    ENDIF.

  ENDFORM.


12
Reports / Como leer los Textos de los Infotipos
« en: 28 de Abril de 2011, 11:47:39 am »
Para los que no estamos muy puestos en la programación de HR (yo incluido), muchas veces nos cuesta buscar ciertas cosas.

La pista para empezar a buscar me la dio que en los infotipos existe el campo ITXEX que indica cuando existe un texto para ese infotipo.

En uno de los manuales que tengo encontré la forma de recuperarlo.

Adjunto un ejemplo del código... Hay que utilizar el INCLUDE rpc1tx00.

Código: [Seleccionar]
INCLUDE: rpc1tx00.           "Definition Cluster TX

...

IF NOT p0015-itxex IS INITIAL.
  CLEAR tx-key.
  MOVE-CORRESPONDING p0015 TO tx-key.
  rp-imp-c1-tx.
  IF sy-subrc NE 0.
*    WRITE: / 'Cluster tx wurde geloescht.'(001).
  ENDIF.


  LOOP AT ptext.
    CONCATENATE ptext-line i_listado-cluster_tx
           INTO i_listado-cluster_tx SEPARATED BY space.
*    WRITE: / ptext-line.
  ENDLOOP.
ENDIF.

13
Varios / Explicación de búsquedas
« en: 18 de Abril de 2011, 12:12:52 pm »
Para los que tenemos mala memoria...  :D

EQ (=)
NE (<>)
GT (>)
LT (<)
GE (>=)
LE (<=)

BT (Between)
NB (Not Between)
CP (like '*' o '+')   "Contiene...
NP (not like '*' o '+')  "No contiene...
CO (contiene sólo ...)
CN (no contiene sólo ...)
CA (contiene algún ...)
NA (no contiene algún ...)
CS (contiene el string ...)
NS (no contiene el string ...)



14
Programación ABAP / Simbolo EURO € en un report
« en: 01 de Junio de 2010, 11:03:51 am »
Hola,

¿alguien sabe si se puede poner el símbolo del Euro () en un Report de los antiguos?

No veo la forma de hacerlo...

Muchas gracias de antemano.


15
Varios / Tablas: Línea, Segmento, Familia...
« en: 24 de Junio de 2009, 01:22:16 pm »
Dejo este pequeño post como recordatorio... así cada vez que tenga que buscarlo ya se donde tengo que ir.

Tablas que hay detrás de los campos de la jerarquía y como recuperar sus descripciones.
Línea, Segmento, Familia, Marca, etc...

Código: [Seleccionar]
NOMBRE TABLA CAMPO TABLA DENOMINACIÓN
------------ ----- ----- ------------
Marca WW005 T2504 T25A4
Línea WW007 T2506 T25A6
Segmento WW008 T2507 T25A7
Familia WW009 T2508 T25A8
Submarca WW010 T2509 T25A9
Envase WW011 T2510 T25B0
Formato WW021 T2518 T25B8
Subfamilia WW022 T2519 T25B9

Código: [Seleccionar]
mara-prdha.         " JERARQUIA
mara-prdha+0(3).    " Línea
mara-prdha+3(3).    " Segmento
mara-prdha+6(3).    " Familia
mara-prdha+9(3).    " Submarca
mara-prdha+12(3).   " Formato
mara-prdha+15(3).   " Envase
mara-blatt.         " Subfamilia
mara-zeiar.         " Marca

Un saludo.

Páginas: [1] 2 3