Ir al contenido

Mensajes recientes

#11
Programación ABAP / BAPI_SALESORDER_CHANGE - Ejemp...
Último mensaje por Carlos - 09 Ene 2020, 10:33
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.



#12
S/4HANA y ABAP Cloud / Conectarse a una base de datos...
Último mensaje por Carlos - 17 Abr 2019, 08:56
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.


#13
Programación ABAP / Re:Capturar errores en un módu...
Último mensaje por molaci - 20 Mar 2019, 09:14
¿Te refieres a esto?

Remarco en color la excepción "error_message" que la admiten todos los modulos de funciones.
Simplemente es añadirla y listo.

  CALL FUNCTION 'WS_REVERSE_GOODS_ISSUE'
    EXPORTING
      i_vbeln                         = p_vbeln
      i_budat                         = p_budat
      i_tcode                         = lv_tcode
      i_vbtyp                         = lv_vbtyp
    TABLES
      t_mesg                          = lt_mesg
      T_VBAPF                         = lt_vbapf
      T_VBFA                          = lt_vbfavb
   EXCEPTIONS
     error_reverse_goods_issue       = 1

     error_message                   = 2
     OTHERS                          = 3.



#14
Programación ABAP / Capturar errores en un módulo ...
Último mensaje por Carlos - 19 Mar 2019, 16:33
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.
#15
Código para compartir / Re:Informe: Flujo de documento...
Último mensaje por Ecabacksis - 24 Dic 2018, 11:24
I have come to read useful information that makes me feel good at this time.
#16
Programación ABAP / Re:Definición de work-area
Último mensaje por hserrano - 20 Nov 2018, 16:08
eso no es un Work Area
lo que estas obteniendo es una variable.
debes definir tu estructura o tipo .
types : begin of ty_matnr,
              matnr type matnr,
           end of ty_matnr.

data: wa_matnr type ty_matnr .

De esta forma si tienes un Work Area.

Cualquier duda,
hserrano@abap.es
Saludos.
#17
Programación ABAP / Re:Definición de work-area
Último mensaje por molaci - 19 Sep 2018, 10:04
¿Te vale declararlo así?

Por ejemplo...
DATA wa_matnr TYPE mara-matnr.

#18
Programación ABAP / Definición de work-area
Último mensaje por Federico - 18 Sep 2018, 20:02
Buenas a todos.

Estoy comenzando el estudio de la programación ABAP.

Como dice el título ¿Es posible definir una work area de un sólo campo de una tabla?

Ejemplo:

DATA wa_campo TYPE TABLE OF ztabla-campo

Gracias de antemano por la respuesta.

Saludos.
#19
Ampliaciones e integración / Re:SD_CUSTOMER_MAINTAIN_ALL - ...
Último mensaje por CekarC - 03 Sep 2018, 15:13
Estimado, buen día,

Necesito modificar los siguientes campos de clientes:

Tabla KNA1: NAME1, ORT01,  STRAS, MCOD3, NAME3 y ORT01
Tabla ADRC: NAME1, NAME3, CITY1, CITY2, STREET, HOUSE_NUM1 y MC_CITY1

Nota: Miré el ejemplo REPORT y_ebf_058 de este sitio, pero no logro dar con la solución.

Traté de modificar solo la tabla KNA1 de la siguiente forma, pero me da error 2:

CALL FUNCTION 'SD_CUSTOMER_MAINTAIN_ALL'
     EXPORTING
       I_KNA1 = gt_kna1
*      I_KNB1 =
*      I_KNVV =
*      I_BAPIADDR1 =
*      I_BAPIADDR2 =
      I_MAINTAIN_ADDRESS_BY_KNA1 = 'X'
*      I_KNB1_REFERENCE = ' '
*      I_FORCE_EXTERNAL_NUMBER_RANGE = 'X'
*      I_NO_BANK_MASTER_UPDATE = ' '
       I_CUSTOMER_IS_CONSUMER = 'X'
*      I_RAISE_NO_BTE = ' '
       PI_POSTFLAG = 'X'
*      PI_CAM_CHANGED = ' '
*    IMPORTING
*      E_KUNNR =
*      O_KNA1 =
*    TABLES
*      T_XKNAS =
*      T_XKNBK =
*      T_XKNB5 =
*      T_XKNEX =
*      T_XKNVA =
*      T_XKNVD =
*      T_XKNVI =
*      T_XKNVK =
*      T_XKNVL =
*      T_XKNVP =
*      T_XKNZA =
*      T_YKNAS =
*      T_YKNBK =
*      T_YKNB5 =
*      T_YKNEX =
*      T_YKNVA =
*      T_YKNVD =
*      T_YKNVI =
*      T_YKNVK =
*      T_YKNVL =
*      T_YKNVP =
*      T_YKNZA =
    EXCEPTIONS
       CLIENT_ERROR = 1
       KNA1_INCOMPLETE = 2
       KNB1_INCOMPLETE = 3
       KNB5_INCOMPLETE = 4
       KNVV_INCOMPLETE = 5
       KUNNR_NOT_UNIQUE = 6
       SALES_AREA_NOT_UNIQUE = 7
       SALES_AREA_NOT_VALID = 8
       INSERT_UPDATE_CONFLICT = 9
       NUMBER_ASSIGNMENT_ERROR = 10
       NUMBER_NOT_IN_RANGE = 11
       NUMBER_RANGE_NOT_EXTERN = 12
       NUMBER_RANGE_NOT_INTERN = 13
       ACCOUNT_GROUP_NOT_VALID = 14
       PARNR_INVALID = 15
       BANK_ADDRESS_INVALID = 16
       TAX_DATA_NOT_VALID = 17
       NO_AUTHORITY = 18
       COMPANY_CODE_NOT_UNIQUE = 19
       DUNNING_DATA_NOT_VALID = 20
       KNB1_REFERENCE_INVALID = 21
       CAM_ERROR = 22
    OTHERS = 23.

  IF sy-subrc EQ 0.
     CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
        EXPORTING
          wait = 'X'.
  ENDIF.



Consultas:

1. ¿Se puede hacer con la función SD_CUSTOMER_MAINTAIN_ALL para ambas tablas?
2. De ser si la respuesta a la consulta 1, ¿cómo debiera definir la función?

De antemano, gracias!

Atte.
CekarC
#20
Programación ABAP / Re:Asignación dinámica a tabla...
Último mensaje por Enrique.Borroni - 06 Jul 2018, 16:29
Aquí te dejo un ejemplo...

DATA  : lt_mara           TYPE STANDARD TABLE OF mara.
DATA  : ld_nomb_tabla     TYPE tabname.
DATA  : ld_tbi_dinamica   TYPE tabname.
DATA  : ld_condicion      TYPE string.
*
DATA  : ld_matnr          TYPE matnr.
DATA  : ld_matkl          TYPE matkl.
*
FIELD-SYMBOLS : <fs_tabla_interna> TYPE STANDARD TABLE.
*
ld_nomb_tabla     = 'MARA'.
ld_tbi_dinamica   = 'LT_MARA'.
ld_matnr          = '10050'.
ld_matkl          = '0001'.
*
CALL FUNCTION 'CONVERSION_EXIT_MATN1_INPUT'
  EXPORTING
    input        = ld_matnr
  IMPORTING
    output       = ld_matnr
  EXCEPTIONS
    length_error = 1
    OTHERS       = 2.
*
CONCATENATE 'MATNR EQ' 'LD_MATNR' 'AND'
            'MATKL EQ' 'LD_MATKL'
              INTO ld_condicion SEPARATED BY space.
*
ASSIGN (ld_tbi_dinamica) TO <fs_tabla_interna>.
IF ( sy-subrc EQ 0 ).
  SELECT *
    INTO TABLE <fs_tabla_interna>
      FROM (ld_nomb_tabla)
        WHERE (ld_condicion).
ENDIF.


Saludos.