viernes, 20 de noviembre de 2015

Modificar tablas transparentes en SAP


Lo que se va hacer aquí hacerlo en caso urgente solamente.

Por registro SE16

1 Modificaremos un registro de la tabla MARA, seleccionamos el registro a modificar:


2 Escribimos primero /h y luego h/, digitamos code cambiamos de show a edit y presionamos f8


3 Modificaremos los 3 primeros campos y guardamos. Listo



Para varios registros SE16N
1 Ingresamos la tabla a modificar y enter

2 Ingresamos al debug, modificamos las variablescomo en la imagen y f8


4 Podremos modificar los campos y listo



Habilitar material para varios almacenes en un centro determinado SAP MM


Este blog lo hice porque cuando estaba practicando con la transacción MIGO me salió este mensaje:



Cuando vamos a migo y verificamos nos sale lo siguiente por que el material no lo hemos habilitado en el almacén 117 del centro 1000.

Hay 2 formas, habilitando almacén por almacén o habilitando para varios almacenes en un solo paso.

Entrada uno por uno:
1 Vamos a la transacción MM01




2 Enter y seleccionamos


3 Niveles de organización

Seleccionamos el centro y almacén al cual queremos habilitar


Guardamos


5 Podemos ver que ya está habilitado con X para centro 006 y almacén 0002



Entrada masiva para almacenes:

1 Vamos a la transacción MM01: Habilitamos el centro para el material que necesitamos como se hizo en el paso anterios.

2 Vamos a la transacción MMSC: El centro 005 ya está habilitado


3 Habilitamos para los almacenes 0004, 0003 y 002


4 Guardamos.

miércoles, 30 de septiembre de 2015

Excluir botones ALV TOOLBAR


Declaramos:

DATA:       gs_exclude          TYPE ui_func,
                   gt_tlbr_excl       TYPE ui_functions.


En esta función se define los botones a eliminar, si se pone todos se eliminará todos los botones del toolbar ALV:

FORM excluir_botones .

*Exclude botón suma
  gs_exclude cl_gui_alv_grid=>mc_fc_sum.
  APPEND gs_exclude TO gt_tlbr_excl.

*Exclude botón promedio
  gs_exclude cl_gui_alv_grid=>mc_fc_average.
  APPEND gs_exclude TO gt_tlbr_excl.

*Exclude botón maximo
  gs_exclude cl_gui_alv_grid=>mc_fc_maximum.
  APPEND gs_exclude TO gt_tlbr_excl.

*Exclude botón minimo
  gs_exclude cl_gui_alv_grid=>mc_fc_minimum.
  APPEND gs_exclude TO gt_tlbr_excl.

*Exclude botón vistas
  gs_exclude cl_gui_alv_grid=>mc_mb_view.
  APPEND gs_exclude TO gt_tlbr_excl.

*Exclude botón variante
  gs_exclude cl_gui_alv_grid=>mc_fc_current_variant.
  APPEND gs_exclude TO gt_tlbr_excl.

* Exclude botón alv info
  gs_exclude cl_gui_alv_grid=>mc_fc_info.
  APPEND gs_exclude TO gt_tlbr_excl.

* Excluir botón grafico
  gs_exclude cl_gui_alv_grid=>mc_fc_graph.
  APPEND gs_exclude TO gt_tlbr_excl.

* Excluir botón imprimir
  gs_exclude cl_gui_alv_grid=>mc_fc_print.
  APPEND gs_exclude TO gt_tlbr_excl.

* Excluir botón filtrar
  gs_exclude cl_gui_alv_grid=>mc_fc_filter.
  APPEND gs_exclude TO gt_tlbr_excl.

* Excluir botón buscar
  gs_exclude cl_gui_alv_grid=>mc_fc_find.
  APPEND gs_exclude TO gt_tlbr_excl.

* Excluir botón orden ascendente
  gs_exclude cl_gui_alv_grid=>mc_fc_sort_asc.
  APPEND gs_exclude TO gt_tlbr_excl.

* Excluir botón ordenar descendente
  gs_exclude cl_gui_alv_grid=>mc_fc_sort_dsc.
  APPEND gs_exclude TO gt_tlbr_excl.

* Excluir botón detalles
  gs_exclude cl_gui_alv_grid=>mc_fc_detail.
  APPEND gs_exclude TO gt_tlbr_excl.

* Excluir botón abc
  gs_exclude cl_gui_alv_grid=>mc_fc_call_abc.
  APPEND gs_exclude TO gt_tlbr_excl.

* Excluir botón excel
  gs_exclude cl_gui_alv_grid=>mc_fc_view_excel.
  APPEND gs_exclude TO gt_tlbr_excl.

  gs_exclude cl_gui_alv_grid=>mc_fc_call_xml_export.
  APPEND gs_exclude TO gt_tlbr_excl.

  gs_exclude cl_gui_alv_grid=>mc_fc_call_xxl.
  APPEND gs_exclude TO gt_tlbr_excl.

  gs_exclude cl_gui_alv_grid=>mc_fc_excl_all.
  APPEND gs_exclude TO gt_tlbr_excl.

ENDFORM.                    " EXCLUIR_BOTONES

En el método set_table_for_first_display ponemos nuestra variable gt_tlbr_excl:

    CREATE OBJECT go_event_receiver.
    "SET HANDLER go_event_receiver->handle_toolbar FOR go_grid.
    "SET HANDLER go_event_receiver->handle_user_command FOR go_grid.

    CALL METHOD go_grid->set_table_for_first_display
      EXPORTING
*       I_BUFFER_ACTIVE      =
*       I_BYPASSING_BUFFER   =
*       I_CONSISTENCY_CHECK  =
        i_default            'X'
        i_save               'A'    "gs_save
        is_variant           gs_variant
        is_layout            gwa_layout
*       IS_PRINT             =
*       IT_SPECIAL_GROUPS    =
        it_toolbar_excluding gt_tlbr_excl
*       IT_HYPERLINK         =
*       IT_EXCEPT_QINFO      =
*       IR_SALV_ADAPTER      =
      CHANGING
        it_outtab            gtd_rend
        it_fieldcatalog      gtd_fieldcat
*       IT_SORT              =
*       IT_FILTER            =
      .
    IF sy-subrc <> 0.
*     Implement suitable error handling here
    ENDIF.

lunes, 9 de febrero de 2015

Uso de los eventos toolbar, menu_button, user_command

""Agregarlo a tu código


TYPE-POOLSSLIS.

TYPE-POOLS ICON.


DATACL_GUI_CONTAINER TYPE REF TO CL_GUI_CUSTOM_CONTAINER,
      GRID_ALV TYPE REF TO CL_GUI_ALV_GRID,


CLASS gcl_event definition.
 public section.

* Tool bar
METHODS:
       handle_toolbar
        FOR EVENT toolbar OF cl_gui_alv_grid
            IMPORTING e_object
                      e_interactive,

*handling menu buttons
handle_menu_button FOR EVENT menu_button of CL_GUI_ALV_GRID IMPORTING E_OBJECT E_UCOMM,

* Status bar
       handle_user_command
        FOR EVENT user_command OF cl_gui_alv_grid
            IMPORTING e_ucomm.
endclass.


*  create the relevant buttons on the toolbars
  METHOD handle_toolbar.
* This method handles the user interaction with the tool bar.
DATAls_toolbar TYPE stb_button.
CLEAR ls_toolbar.

"MOVE 2 TO LS_TOOLBAR-BUTN_TYPE.

MOVE 'REFRESH' TO ls_toolbar-function,"Function code = Codigo funcion
        ICON_REFRESH  TO ls_toolbar-icon,"Name of an Icon = Nombre del icono
        'Refrescar :) '  TO ls_toolbar-quickinfo,"Quickinfo for an icon = Texto cuando paso el mouse
         TO ls_toolbar-butn_type,"Toolbar button type
         '' TO ls_toolbar-disabled,"Disabled = Desabilitar el boton pero si se muestra 'X'
        'REFRESH' TO ls_toolbar-text."Text = Texto en el boton
 APPEND ls_toolbar TO e_object->mt_toolbar.

CLEAR ls_toolbar.

MOVE 'HELLO' TO ls_toolbar-function,"Function code = Codigo funcion
        ' ' TO ls_toolbar-icon,"Name of an Icon = Nombre del icono
        ' '  TO ls_toolbar-quickinfo,"Quickinfo for an icon = Texto cuando paso el mouse
        ' ' TO ls_toolbar-butn_type,"Toolbar button type
         '' TO ls_toolbar-disabled,"Disabled = Desabilitar el boton pero si se muestra 'X'
        'HELLO' TO ls_toolbar-text."Text = Texto en el boton
 APPEND ls_toolbar TO e_object->mt_toolbar.

CLEAR ls_toolbar.

MOVE 'BYE' TO ls_toolbar-function,"Function code = Codigo funcion
        ' ' TO ls_toolbar-icon,"Name of an Icon = Nombre del icono
        ' '  TO ls_toolbar-quickinfo,"Quickinfo for an icon = Texto cuando paso el mouse
        TO ls_toolbar-butn_type,"Toolbar button type
         '' TO ls_toolbar-disabled,"Disabled = Desabilitar el boton pero si se muestra 'X'
        'BYE' TO ls_toolbar-text."Text = Texto en el boton
 APPEND ls_toolbar TO e_object->mt_toolbar.

ENDMETHOD.


class gcl_event implementation.
METHOD handle_user_command.
CASE e_ucomm.
when 'REFRESH'.
MESSAGE s001(zalvWITH 'No. of rows selected'.
MESSAGE 'RERESHED DATA' TYPE 'I'.
WHEN 'HELLO'.
MESSAGE 'HELLO' TYPE 'I'.
WHEN 'REFRESH1'.
MESSAGE 'REFRESH' TYPE 'I'.
WHEN 'BYE1'.
MESSAGE 'Hasta la vista baby' TYPE 'I'.
ENDCASE.
    ENDMETHOD.

METHOD HANDLE_MENU_BUTTON" * handle own menubuttons
IF E_UCOMM 'REFRESH'.
CALL METHOD e_object->add_function
EXPORTING
fcode 'REFRESH1'
text 'Refrescando'.
ENDIF.

IF E_UCOMM 'BYE'.
CALL METHOD e_object->add_function
EXPORTING
fcode 'BYE1'
text 'Hasta la vista'.
ENDIF.
ENDMETHOD.

endclass.

" referencia a la clase glc_event creada en el anterior include
DATAGO_EVENT TYPE REF TO GCL_EVENT.

    CREATE OBJECT GO_EVENT" creando objeto go_event
    set handler GO_EVENT->handle_toolbar for GRID_ALV.
    set handler GO_EVENT->handle_user_command for GRID_ALV.
    set handler GO_EVENT->HANDLE_MENU_BUTTON for GRID_ALV.

miércoles, 4 de febrero de 2015

Reporte simple usando ABAP OO

REPORT  ZABAP_OO_01.


PARAMETERSP_EBELN TYPE EKKO-EBELN.



CLASS DEFINITION.
PUBLIC SECTION.
TYPESBEGIN OF TT,
  EBELN TYPE EKKO-EBELN,
  BUKRS TYPE EKKO-BUKRS,
  BSTYP TYPE EKKO-BSTYP,
  END OF TT.
  DATATI TYPE STANDARD TABLE OF TT.

METHODSGET_EKKO,
         DISPLAY_EKKO.
ENDCLASS.

CLASS IMPLEMENTATION.
METHOD GET_EKKO.
    SELECT EBELN BUKRS BSTYP FROM EKKO INTO TABLE TI WHERE EBELN P_EBELN.
ENDMETHOD.
METHOD DISPLAY_EKKO.
    FIELD-SYMBOLS<FS> TYPE TT.
LOOP AT TI ASSIGNING <FS>.
WRITE/ <FS>-EBELN,
      / <FS>-BUKRS,
      / <FS>-BSTYP.
ENDLOOP.
ENDMETHOD.
ENDCLASS.



START-OF-SELECTION.

DATAA1 TYPE REF TO A.
CREATE OBJECT A1.
A1->GET_EKKO(  )
A1->DISPLAY_EKKO).

domingo, 25 de enero de 2015

Número primo ABAP

*&---------------------------------------------------------------------*
" Numero primo
*&---------------------------------------------------------------------*

REPORT  ZPROGR_02.

PARAMETERSN1 TYPE I.

DATAI1 TYPE VALUE 1,
      B TYPE I,
      A TYPE I.

WHILE I1 <= N1 ).
 B N1 MOD I1.
IF B  ).
A + 1.
ENDIF.
I1 I1 + 1.
ENDWHILE.

IF A <2.
WRITE 'SI ES PRIMO'.
ELSE.
WRITE 'NO ES PRIMO'.
ENDIF.

Factorial de un número ABAP


*&---------------------------------------------------------------------*
*& Report  ZPROGR_01
*&
*&---------------------------------------------------------------------*
*&
"Factorial de un numero
*&---------------------------------------------------------------------*

REPORT  ZPROGR_01.

DATAN1 TYPE I,
      N3 TYPE I.

DATAAUX TYPE I.

N1 1.

SELECTION-SCREENBEGIN OF BLOCK B01 WITH FRAME TITLE TEXT-001.
  PARAMETERSN2 TYPE I.
SELECTION-SCREENEND OF BLOCK B01.

N3 N2.


WHILE N3 > 1.

    N1 N3 * N3 * N1.

    N3 N3 2.
ENDWHILE.


WRITE'El factorial de :  ' N2 .
WRITE:/ N1.

Convertir números a letras ABAP



REPORT  Z_NUM_LETRA.

DATA:  monto_en_letras TYPE spell,
       texto type string.

PARAMETERSmonto TYPE netwr.

 "Funcion ABAP para convertir numeros a letras:
 CALL FUNCTION 'SPELL_AMOUNT'
   EXPORTING
     amount   monto "Importe (valor) a convertir
     currency 'X'
     filler   ' '
     language sy-langu
   IMPORTING
     in_words monto_en_letras"Cantidad o importe en letras

 "Ejemplo de como leer el importe en letras
 concatenate monto_en_letras-word 'con'
             monto_en_letras-decimal(2)" 'decimales'
             into texto separated by space.

 WRITE texto.







¿Cómo se crea un programa en SAP?


Antes de empezar es importante saber que todos los programas a crear comienzan siempre con Y ó Z ya que con las demás letras son los programas estándar.

Se puede crear programas a través de 2 transacciones:

1 se38 -> Crear:


Escribimos un título cualquiera, tipo mayormente trabajo con programa ejecutable y grabar:


Nos preguntará en cuál paquete vamos a crear el programa, en este caso click en objeto local lo cual lo creará como un objeto interno del sistema:

Éste es el editor el cual comenzaremos a escribir nuestro programa:

2 De la misma manera en la transacción se80, podemos crear un programa directamente o hacerlo a través de nuestro paquete, en este caso crearé un paquete y el programa lo guardaré en el paquete creado:

En la lista desplegable escogemos paquete, escribimos el nombre del paquete y enter, nos pedirá crear el objeto:


Agregamos una descripción y crear:



Yo personalmente lo hago en la transacción se80..

FIN

Cambiar imagen logo SAP

Imagen incial:




Vamos a la transacción smw0  -> Búsqueda - > Ejecutar




Click en F5 (Crear), importar para seleccionar la ruta de la imagen y guardar:

Vamos a la transacción sm30, modificamos la tabla/vista SSM_CUST:




Modificamos el campo start_image por el objeto creado anteriormente y RESIZE_IMAGE en yes si queremos que la imagen se adapte a la pantalla y no para que sea en tamaño original:


Guardamos y entramos de vuelta:





lunes, 19 de enero de 2015

Agregar campos a la transacción ME21N ME22N ME23N





Sistemas - status y copiamos el nombre del programa:
T-se38 copiamos el nombre del programa, marcamos atributos y luego click en visulalizar:

T-smod para buscar el exit deseado, utilidades y buscar:



El exit  MM06E005 es el deseado:



T-cmod para crear un proyecto:



En asignación ampliación y colocar el nombre del exit seleccionado y enter.

Para usar campos adicionales necesitamos definir estos campos en las siguientes estructuras basado en el requerimiento:

CI_EKKODB -> Cabecera

CI_EKPODB -> Posición






El guardado de los campos en las estructuras se va a demorar un poco, ya que las tablas ekpo y ekko se están actualizando.

El siguiente paso es habilitar los screen dependiendo de los requerimientos:

SAPMM06E     0101 CUSTSCR1 SAPLXM06    0101 --> Cabecera


EKKO_CI-PROYECTO -> Nombre campo proyecto
EKKO_CI-PAGA -> Nombre campo paga

SAPMM06E       0111 CUSTSCR1 SAPLXM06        0111 --> Posición

EKPO_CI-CODIGO -> Nombre campo codigo
EKPO_CI-NOMBRE -> Nombre campo nombre
EKPO_CI-DNI -> Nombre campo DNI

Para pasar los datos datos tenemos que habiliar los function exit basados en el requerimiento:

 1 <b>EXIT_SAPMM06E_006</b> - Export Data to Customer Subscreen for Purchasing Document Header (PBO)

2<b>EXIT_SAPMM06E_008</b> - Import Data from Customer Subscreen for Header

<b>-> Item Screens :</b>

3<b>EXIT_SAPMM06E_016</b> - Export Data to Customer Subscreen for Item (PBO)

4<b>EXIT_SAPMM06E_018</b> - Import Data from Customer Subscreen for Item

Para guardar los datos en las tablas necesitamos habilitar EXIT_SAPMM06E_008 - "Import Data from Customer Subscreen for Purchasing Document Header" donde tu mueves los datos desde screenfileds a los campos de la estructura ( E_CI_EKKO) y EXIT_SAPMM06E_018 - "Import Data from Customer Subscreen for Purchasing Document Header" donde tu mueves lo datos desde screenfileds a los campos de la estructura ( E_CI_EKPO).

En EXIT_SAPMM06E_008 click en the include ZXM06U37 y poner el código :

E_CI_EKKO-PROYECTO = EKKO_CI-PROYECTO .
E_CI_EKKO-PAGA = EKKO_CI-PAGA .

En EXIT_SAPMM06E_018 click en the include ZXM06U40 y poner el código :

E_CI_EKPO-DNI = EKPO_CI-DNI .
E_CI_EKPO-CODIGO = EKPO_CI-CODIGO .
E_CI_EKPO-NOMBRE = EKPO_CI-NOMBRE .

Similarmente para leer los datos tenemos que habilitar EXIT_SAPMM06E_006 y EXIT_SAPMM06E_016.

En EXIT_SAPMM06E_016 click en the include ZXM06U36 y poner el código :

EKKO_CI-PROYECTO = I_CI_EKKO-PROYECTO .
EKKO_CI-PAGA = I_CI_EKKO-PAGA   .

En EXIT_SAPMM06E_006 click en the include ZXM06U41 y poner el código :

EKPO_CI-NOMBRE = I_CI_EKPO-NOMBRE.
EKPO_CI-DNI = I_CI_EKPO-DNI .
EKPO_CI-CODIGO = I_CI_EKPO-CODIGO .

Guardamos y activamos, nos debe quedar así:


Vamos a t-me22n, podemos que nos aparecen los campos que ingresamos en los screens:

Guardamos, para verificar que se guardaron los datos vamos a las tablas ekko y ekpo:


FIN..