Completar o quitar ceros a la izquierda de una variable

30 08 2012

* Función que saca los ceros a la izquierda de una variable

CALL FUNCTION ‘CONVERSION_EXIT_ALPHA_OUTPUT’
EXPORTING
INPUT = VG_VARIABLE
IMPORTING
OUTPUT = VG_VARIABLE.

* Función que completa con ceros a la izquierda de una variable
CALL FUNCTION ‘CONVERSION_EXIT_ALPHA_INPUT’
EXPORTING
INPUT = VG_VARIABLE
IMPORTING
OUTPUT = VG_VARIABLE.





Tabstrip – Solapas en reportes

22 08 2012

Una manera de organizar distintos grupos de parámetros de selección es escondiendo y mostrando los parámetros con un radio buton dinámico por ejemplo como se explica en la siguiente entrada.

Radio Buttons dinámicos – ocultar/mostrar grupos de parámetros de selección

Otra forma es dividir la pantalla de selección con TabStrip sin tener que usar Module Pool

image

En el ejemplo de abajo si corremos el reporte en la primer solapa mostrará 20 clientes, si se ejecuta en la segunda solapa mostrará 20 acreedores y si se ejecuta en la tercera mostrará un simple ‘Hola Mundo’.

REPORT  zreport_tab.

*———————————————————————*
*   Declaraciones                                                     *
*———————————————————————*
TABLES: kna1, lfa1.
DATA: ti_kna1 TYPE TABLE OF kna1 WITH HEADER LINE,
ti_lfa1 TYPE TABLE OF lfa1 WITH HEADER LINE,
g_tab(1) VALUE ’1′.

*———————————————————————*
*   selection screen                                                  *
*———————————————————————*
* Primer Tab
SELECTION-SCREEN BEGIN OF SCREEN 101 AS SUBSCREEN.
SELECTION-SCREEN BEGIN OF BLOCK b1 WITH FRAME TITLE text-t00.
SELECT-OPTIONS so_kunnr FOR kna1-kunnr.
SELECTION-SCREEN END OF BLOCK b1.
SELECTION-SCREEN END OF SCREEN 101.

* Segundo Tab
SELECTION-SCREEN BEGIN OF SCREEN 102 AS SUBSCREEN.
SELECTION-SCREEN BEGIN OF BLOCK b2 WITH FRAME TITLE text-t02.
SELECT-OPTIONS so_lifnr FOR lfa1-lifnr.
SELECTION-SCREEN END OF BLOCK b2.
SELECTION-SCREEN END OF SCREEN 102.

* Tercer Tab
SELECTION-SCREEN BEGIN OF SCREEN 103 AS SUBSCREEN.
SELECTION-SCREEN BEGIN OF BLOCK b3 WITH FRAME TITLE text-t03.

SELECTION-SCREEN END OF BLOCK b3.
SELECTION-SCREEN END OF SCREEN 103.

* Pantalla de Tabs
SELECTION-SCREEN BEGIN OF TABBED BLOCK t1 FOR 20 LINES.
SELECTION-SCREEN TAB (10) name1 USER-COMMAND ucomm1 DEFAULT SCREEN 101.
SELECTION-SCREEN TAB (20) name2 USER-COMMAND ucomm2 DEFAULT SCREEN 102.
SELECTION-SCREEN TAB (30) name3 USER-COMMAND ucomm3 DEFAULT SCREEN 103.
SELECTION-SCREEN END OF BLOCK t1.

INITIALIZATION.
* Nombre de los Tabs
name1 = ‘Primer Tab ‘.
name2 = ‘Segundo Tab’.
name3 = ‘Tercer Tab’.

AT SELECTION-SCREEN.
* Control de que tab fue elegido
CHECK sy-ucomm = ‘UCOMM1′
OR sy-ucomm = ‘UCOMM2′
OR sy-ucomm = ‘UCOMM3′.
CASE sy-ucomm.
WHEN ‘UCOMM1′.
g_tab = ’1′.
WHEN ‘UCOMM2′.
g_tab = ’2′.
WHEN ‘UCOMM3′.
g_tab = ’3′.
ENDCASE.

START-OF-SELECTION.
* Al ejecutar el reporte, dependiendo del tab seleccionado
* Correrá una lógica o la otra.
CASE g_tab.
* Primer Tab
WHEN ’1′.
SELECT * UP TO 20 ROWS FROM kna1 INTO TABLE ti_kna1.

CALL FUNCTION ‘REUSE_ALV_GRID_DISPLAY’
EXPORTING
i_callback_program = sy-repid
i_structure_name   = ‘KNA1′
i_grid_title       = ‘Datos de Clientes’
TABLES
t_outtab           = ti_kna1
EXCEPTIONS
program_error      = 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.
* Segundo Tab
WHEN ’2′.
SELECT * UP TO 20 ROWS FROM lfa1 INTO TABLE ti_lfa1.

CALL FUNCTION ‘REUSE_ALV_GRID_DISPLAY’
EXPORTING
i_callback_program = sy-repid
i_structure_name   = ‘LFA1′
i_grid_title       = ‘Datos de Acreedores’
TABLES
t_outtab           = ti_lfa1
EXCEPTIONS
program_error      = 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.
* Tercer Tab
WHEN ’3′.
WRITE ‘Hola Mundo’.
ENDCASE.





22 08 2012

Crear transacción que ejecute directamente una vista de actualización.

 

Primero debemos tener echa una vista de actualización. Luego, si deseamos que el usuario ingrese una transacción y que le aparezca directamente la vista de actualización (modo update) para ya realizar cambios.

En la SE93 (creación de Transacciones) Creamos una tx y elegimos el tipo Parámetros y la seteamos de la siguiente manera.

Lo que estamos haciendo es llamar a la SM30, salteando la primer pantalla y abajo seteamos el nombre de la vista a actualizar y el modo de Update, si queremos que se visualice solamente hay que modificar ese parametro.





22 08 2012

Opciones de formatos en SapScript

 

Estas son las opciones de formateos disponibles cuando trabajamos con SapScripts: 

Offset &symbol+offset&
Output Length &symbol(length)&
Omitting the Leading Sign &symbol(S)&
Leading Sign to the Left and Right &symbol(<)& , &symbol(>)&
Omitting Leading Zeros &symbol(Z)&
Space Compression &symbol(C)&
Number of Decimal Places &symbol(.N)&
Omitting the Separator for ‘Thousands’ &symbol(T)&
Specifying an Exponent for Floating Point Numbers &symbol(EN)&
Right-Justified Output &symbol(R)&
Fill Characters &symbol(F f )&
Suppressing Output of Initial Values &symbol(I)&
Ignoring Conversion Routines &symbol(K)&
Local Dates (Currently Only for Japan) &symbol(L)&
Changing the Value of a Counter &SAPSCRIPT-COUNTER_x(+)& – Increase counter by 1
&SAPSCRIPT-COUNTER_x(-)& – Decrease counter by 1
Preceding and Subsequent Texts (Pre-Text / Post-Text) &’pre-text’symbol’post-text’&
Country-Dependent Formatting /: SET COUNTRY country_key
Date Mask /: SET DATE MASK = ‘date_mask’
Time Mask /: SET TIME MASK = ‘time_mask’




22 08 2012

User exits en IDOCs

 

Listado de ampliaciones y exits para IDOCs

IDOC Message – Description – Direction – Enhancement

BLAOCH Contract change. I/O MM06E002

BLAORD Contract. I/O MM06E002

BLAREL Contract release. I/O MM06E002

COND_A Pricing conditions. O VKOE0001

COND_A Pricing conditions. I VKOI0001

CREMAS Vendor master. I/O VSV00001

DEBMAS Customer master. I/O VSV00001

DELINS Scheduling agreement. O MM06E001

DESADV Advance shipment notice. I MM06E001

FIDCMT Distributed general ledger. I/O F050S001

INFREC Purchasing information record. OMMAL0003

INFREC Purchasing information record. I MMAL0004

INVOIC Invoice. O LVEDF001

INVOIC FI Invoice. I FEDI0001

MATMAS Material master. I/O MGV00001

ORDCHG Purchase order change. O MM06E001

ORDCHG Sales order change. I VEDB0001

ORDERS Purchase order. O MM06E001

ORDERS Sales order. I VEDA0001

ORDRSP Order confirmation. O SDEDI001

ORDRSP Order response for a purchase order. I MM06E001

PAYEXT Payment order. I FEDI0002

PAYEXT Payment order. O FEDI0003

REMADV Remittance advice. I FEDI0002

REMADV Remittance advice. O FEDI0003

REQOTE Incoming request for quote. I VEDQ0001

SDPACK Error handling for input IDoc. I VMDE0001

SDPACK Packing. I VMDE0004

SDPICK Error handling for input IDoc. I VMDE0001

User Exits in the IDoc Programs

SDPICK Picking. O VMDE0002

SDPICK Picking. I VMDE0003

SRCLST Source list. O MMAL0001

SRCLST Source list. I MMAL0002

SRVMAS Service master. O BASO0001

SRVMAS Service master. I BASI0001

WMBBIN Error handling for input IDoc. I MWMIDI01

WMBBIN Block storage type. I MWMIDI04

WMCATO Error handling for input IDoc. I MWMIDI01

WMCATO Cancel request transfer order. I MWMIDI03

WMCATO Cancel request transfer order. O MWMIDO02

WMINVE Error handling for input IDoc. I MWMIDO07

WMINVE Count data inventory. I MWMIDO09

WMINVE Count data inventory. O MWMIDO04

WMMBXY Error handling for input IDoc. I MWMIDO07

WMMBXY Goods movement. I MWMIDO08

WMRREF Release reference number. O MWMIDO03

WMSUMO Error handling for input IDoc. I MWMIDI01

WMSUMO Move storage unit. I MWMIDI06

WMTOCO Error handling for input IDoc. I MWMIDI01

WMTOCO Confirm transfer order. I MWMIDI02

WMTORD Error handling for input IDoc. I MWMIDO07

WMTORD Create transfer order. I MWMIDO10

WMTORD Create transfer order. O MWMIDO01

WMTREQ Error handling for input IDoc. I MWMIDI01

WMTREQ Create transfer request. I MWMIDI05

User Exits in the IDoc Interface: User Exit Include Programs

ORDERS Sales order. I LVEDAF0U

ORDCHG Sales order change. I LVEDBF0U

DESADV Advance shipment notice. O LVED2FZZT





22 08 2012

SAPGUI_SET_FUNCTIONCODE – Simulación enter o cualquier comando en browser.

Esta función permite ejecutar comandos en el browser de SAP, el =00 simulará un enter. Pero por ejemplo si ponemos el comando /i se cerrará la ventana.

Nos puede ser útil en alguna situación done hay que obtener algún valor que aparece luego de un enter, para disparar alguna validación o abrir otra tx.

CALL FUNCTION ‘SAPGUI_SET_FUNCTIONCODE’
EXPORTING
functioncode = ‘=00′
EXCEPTIONS
function_not_supported = 1
OTHERS = 2.

IMPORTANTE: si se usa en un module pool cuidado con el loop infinito, porque el enter disparará un PAI, se mostrará el PBO y luego el enter nuevamente disparará el PAI y así sucesivamente.

Y tampoco sirve para programas ejecutados de fondo, ya que usa el GUI.

FIMA_DAYS_AND_MONTHS_AND_YEARS – Diferencia de días, meses años entre dos fechas

Con la función FIMA_DAYS_AND_MONTHS_AND_YEARS podremos ver la diferencia en días, meses y años que tienen dos fechas ingresadas como parámetro.

El ejemplo que sigue saca la diferencia entre el LOW y HIGH de un select option.

DATA: l_dif TYPE VTBBEWE-ATAGE.

CALL FUNCTION ‘FIMA_DAYS_AND_MONTHS_AND_YEARS’

EXPORTING

I_DATE_FROM          = so_AIDAT-LOW

I_DATE_TO            = so_AIDAT-HIGH

IMPORTING

E_DAYS               = l_dif.

BAPI_SALESDOCUMENT_COPY – Creación Pedido con referencia a una factura

Si usamos la BAPI_SALESORDER_CREATEFROMDAT2 el pedido creado sufrirá una redeterminación de precio. Si nosotros necesitamos que el pedido tenga las mismas condiciones que la factura debemos utilizar la bapi BAPI_SALESDOCUMENT_COPY

image

Si bien el parámetro dice salesdocument ahí introducimos el número de factura de referencia y en documenttype pondremos la clase de pedido que deseamos crear.

‘RKE_DELETE_REPORT’ Función que elimina un programa report

Está función sirve para cuando necesitamos ejecutar un programa que se debe correr una sola vez (inicialización de alguna tabla o borrar registros erroneos).

Al final del programa llamamos a la función que tiene un único parámetro que es el nombre del programa.

Por lo cual el programa se ejecuta y luego es borrado, de esta forma se evita que se vuelva a correr o dejar un programa innecesario.

‘GET_JOB_RUNTIME_INFO’ – Función que nos devuelve el nombre del job ejecutándose (runtime)

Si por algún motivo necesitamos saber el nombre del job con el cual un report está siendo ejecutado podemos usar la siguiente función. Útil cuando se necesita usar una lógica particular si el reporte es ejecutado con determinado nombre.

DATA: l_job TYPE ZRPT_HPARAM1-DESCRIPCION.

CALL FUNCTION ‘GET_JOB_RUNTIME_INFO’
IMPORTING
JOBNAME                       = l_jobname
EXCEPTIONS
NO_RUNTIME_INFO               = 1
OTHERS                        = 2 .

LT_DBDATA_READ_FROM_LTDX – Catálogo de una variante de disposición

Con esta función se podrá leer el catálogo de una variante de disposición.

A mi particularmente me fue útil al tener que bajar en .xls un reporte grid que era corrido de fondo.

DATA: l_varkey    TYPE LTDXKEY,
TI_LTDXDATA TYPE TABLE OF LTDXDATA WITH HEADER LINE,
WA_LTDXDATA TYPE LTDXDATA,

l_variante = ‘Nombre_variante’

l_varkey-REPORT = sy-repid.
l_varkey-VARIANT = l_variante.
l_varkey-TYPE = ‘F’.

* Se lee el catálogo de la variante
CALL FUNCTION ‘LT_DBDATA_READ_FROM_LTDX’
EXPORTING
I_TOOL             = ‘LT’
IS_VARKEY          = l_varkey
TABLES
T_DBFIELDCAT       = TI_LTDXDATA
EXCEPTIONS
NOT_FOUND          = 1
WRONG_RELID        = 2
OTHERS             = 3 .
IF SY-SUBRC = 0.

Conversión de unidades (UOM)

EDIT: descubrí que otra opción más sencilla es usar la función: “MD_CONVERT_MATERIAL_UNIT”  a la cual tan solo le tenemos que pasar MATNR, Unidad Origen, Unidad Destina y Cantidad

La función que utilizamos para convertir unidades es la “MATERIAL_UNIT_CONVERSION”

Navegando por inet encontre una subrutina que hizo un chico para que sea más entendible. Simplemente pasamos el material, cantidad y unidad origen y nos devuelve la cantidad y unidad destino que deseemos.

form convert_to_base_uom
  using    pf_matnr     type matnr
           pf_menge_in  type gsmng
           pf_meins_in  type meins
  changing pf_menge_out type gsmng
           pf_meins_out type meins. 

* define internal table to cache the base UOM
  types: begin of lty_meins_rec,
             matnr type matnr,
             meins type meins,
           end of lty_meins_rec. 

  types:
    lty_meins_tab type hashed table of lty_meins_rec
          with unique key matnr.
  data:
    ls_wa type lty_meins_rec. 

  statics:
    lt_meins type lty_meins_tab. 

* first, find the base UOM
  clear pf_meins_out.
  read table lt_meins into ls_wa
    with table key matnr = pf_matnr.
  if sy-subrc = 0.
    pf_meins_out = ls_wa-meins.
  else.
    select single meins
      from mara
      into ls_wa-meins
      where matnr = pf_matnr.
    if sy-subrc  0.  "doesn't exist. try PC
      ls_wa-meins = 'ST'.
    endif.
    ls_wa-matnr = pf_matnr.
    pf_meins_out = ls_wa-meins.
    insert ls_wa into table lt_meins.
  endif. 

* now convert the qty
  if pf_meins_in = pf_meins_out.
    pf_menge_out = pf_menge_in.
  else.
    call function 'MATERIAL_UNIT_CONVERSION'
         exporting
              input                = pf_menge_in
              kzmeinh              = 'X'
              matnr                = pf_matnr
              meinh                = pf_meins_in
              meins                = pf_meins_out
              type_umr             = '3'
         importing
              output               = pf_menge_out
         exceptions
              conversion_not_found = 1
              input_invalid        = 2
              material_not_found   = 3
              meinh_not_found      = 4
              meins_missing        = 5
              no_meinh             = 6
              output_invalid       = 7
              overflow             = 8
              others               = 9. 

  endif. 

endform.

Valores fijos de un dominio – DDIF_DOMA_GET

Si se desea obtener los valores fijos de un dominio podemos usar la función DDIF_DOMA_GET

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
    DATA l_name LIKE dcobjdef-name.
    DATA it_dd07v LIKE dd07v OCCURS 0 WITH HEADER LINE.

    REFRESH: it_dd07v.
    l_name = 'STATV'.
    CALL FUNCTION 'DDIF_DOMA_GET'
         EXPORTING
              name          = l_name
              langu         = sy-langu
         TABLES
              dd07v_tab     = it_dd07v
         EXCEPTIONS
              illegal_input = 1
              OTHERS        = 2.
    IF sy-subrc = 0.
       SORT it_dd07v BY domvalue_l.
       READ TABLE it_dd07v WITH KEY  domvalue_l = TI_TABLE-GBSTK.
       IF sy-subrc = 0.
         TI_TABLE-ESTADO = it_dd07v-DDTEXT.
       ENDIF.
    ENDIF.

Leer un set de Datos

Muchas veces en lugar de utilizar una tabla Z para leer datos variables, podemos usar un set de datos (G02, GS02, GS03). El cual se lee de la siguiente forma.

Primero usamos la función G_SET_GET_ID_FROM_NAME para obtener el nombre “interno” del set y luego la función G_SET_FETCH nos devuelve los valores del set.

image

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
CALL FUNCTION 'G_SET_GET_ID_FROM_NAME'
  EXPORTING
    shortname                      = 'CME_RET_IMP_CUENTAS'
  IMPORTING
    NEW_SETID                      = lv_setid
  EXCEPTIONS
    NO_SET_FOUND                   = 1
    NO_SET_PICKED_FROM_POPUP       = 2
    WRONG_CLASS                    = 3
    WRONG_SUBCLASS                 = 4
    TABLE_FIELD_NOT_FOUND          = 5
    FIELDS_DONT_MATCH              = 6
    SET_IS_EMPTY                   = 7
    FORMULA_IN_SET                 = 8
    SET_IS_DYNAMIC                 = 9
    OTHERS                         = 10.

IF sy-subrc = 0.
  CALL FUNCTION 'G_SET_FETCH'
    EXPORTING
      setnr                     = lv_setid
    TABLES
      SET_LINES_BASIC           = TI_RGSBV
    EXCEPTIONS
      NO_AUTHORITY              = 1
      SET_IS_BROKEN             = 2
      SET_NOT_FOUND             = 3
      OTHERS                    = 4.
ENDIF.




22 08 2012

User exit salvar factura

La ampliación que posee la exit al momento de salvar una factura, para poder hacer chequeos y validaciones antes de grabarse:

SDVFX001 -> FUNCTION EXIT_SAPLV60B_001 -> INCLUDE ZXVVFU01

NOTA: Recordar que no solo la VF01 es usada en esta exit, por ej, la tx VF11 (anulación de facturas) tmb llama a esta exit así que debemos restringir el user exit condicionando por el SY-TCODE.








Seguir

Recibe cada nueva publicación en tu buzón de correo electrónico.