Programa para la regeneración de fórmulas

Luego de Crear alguna formula o de algún cambio a nivel de activación. Necesitaremos correr el siguiente reporte

RV80HGEN

Este regenera las fórmulas, al no hacer esto seguramente nos aparezcan Dump al momento de usar fórmulas nuevas. Como buena práctica siempre que se agregan fórmulas debería de correrse.

Fórmulas de SD - VOFM - Agrupación y separación

En la transacción VOFM encontramos varios menues donde entrar esto sirve para el uso de rutinas, que sirven para agrupaciones, calculo de condiciones, etc.

La agrupación y separación sirve para que al momento de facturar pedidos o entregas por ejemplo tenga un cierto criterio de agrupación. Por ejemplo se desea que si varias entregas tienen mismo destinatario (cliente) se agrupen en una sola factura para no hacer una por por cada entrega.

 

Se va a la sección

image

 

La rutina que elegimos tiene que estar seteada en el customizing por el funcional SD

 

FORM DATEN_KOPIEREN_901.
*Criterio de Agrupamiento
  DATA: BEGIN OF ZUK,
          KUNNR TYPE LIKP-KUNNR,
        END OF ZUK.

ZUK-KUNNR = LIKP-KUNNR.

VBRK-ZUKRI = ZUK.

ENDFORM.

Con esta subrutina se va a agrupar las entregas por cliente (KUNNR). Todos los campos que se agreguen a la estrutura ZUK (ZUKRI) van a ser criterios de agrupación. Si dos entregas no coinciden en alguno de los campos especificados se hace una separación.

Tabla útiles de CRM

  • CRMD_ORDERADM_H - Cabecera de Orden
  • CRMD_ORDERADM_I - Posición
  • BUT000 -La tabla de donde salen los nombres de los códigos de Partner, se accede por el código de Partner.
  • SCPRIOT - Prioridades de una Orden
  • QPCT - Texto de Categorías
  • AGR_1251 - Clase de operación, entrando por roles - Function para ver roles de un user "/OSP/GET_R3_ROLES"
  • TJ30T - Textos para status de usuarios

 

Generalmente las tablas comienzan con CRMD* las que tienen que ver con ordenes.

 

También se puede usar la función CRM_ORDER_READ para obtener todos los detalles de una determinada orden.

Bajada de PDF de forma local

Si bien existen las funciones para bajar un OTF (SapScript o Smartforms) a PDF de esta manera es mucho más sencilla, este programa ya tiene el proceso de conversión a  PDF, simplemente le pasamos la orden de SPOOL y la ruta donde queremos el archivo y listo.

 

SUBMIT rstxpdft4
USING SELECTION-SCREEN '1000'
WITH spoolno EQ w_spool_num
WITH download EQ 'X'
WITH p_file EQ 'c:\download.pdf'
EXPORTING LIST TO MEMORY
AND RETURN.

Ejecutar un comando en el application server

Con la sentencia CALL 'SYSTEM' ID 'COMMAND' ejecutamos un comando del servidor. El siguiente ejemplo creaba un determinado directorio en el mismo.

CONCATENATE 'mkdir' ' ' v_ruta ls_bil_invoice-HD_GEN-PAYER '\' ls_bil_invoice-HD_ORG-SALESORG '\' ls_bil_invoice-HD_GEN-BIL_DATE+4(2) '\'
INTO l_text.

CALL 'SYSTEM' ID 'COMMAND' FIELD l_text.

Crear ComboBox en reportes

En SAP tenemos el Matchcode, pero muchas veces es tedioso ya que tarda. De esta forma tendremos un combobox.

El parámetro ps_parm tendrá la opción elejida.

 

TYPE-POOLS: vrm.
DATA: name TYPE vrm_id, list TYPE vrm_values, value LIKE LINE OF list.
PARAMETERS: ps_parm(10) AS LISTBOX VISIBLE LENGTH 10.
AT SELECTION-SCREEN OUTPUT.
  name = 'PS_PARM'.
  value-key = '1'. value-text = 'Linea 1'. APPEND value TO list.
  value-key = '2'. value-text = 'Linea 2'. APPEND value TO list.
  value-key = '3'. value-text = 'Linea 3'. APPEND value TO list.
  value-key = '4'. value-text = 'Linea 4'. APPEND value TO list.
  value-key = '5'. value-text = 'Linea 5'. APPEND value TO list.
  value-key = '6'. value-text = 'Linea 6'. APPEND value TO list.
  CALL FUNCTION 'VRM_SET_VALUES'
       EXPORTING
            id     = name
            values = list.
START-OF-SELECTION.
  WRITE: / 'Parametros : ', ps_parm.

Bug - Smartforms sin valores en la interfaz

A veces suele suceder que al modificar un smartforms, al problarlo hay datos que desaparecen como por arte de magia. Esto es un bug, por no usar el verificar y solamente el activar.

 

Si sucede esto, Verificar y luego Activar. Y se soluciona.

Creación de IDOCs

El menu WEDI e SALE sirve para la administración de IDOCs.

 

En la WE20 creamos el IDOC base. Un IDOC está formado por segmentos, con la estructura especifica de los campos a transladar, suele ser una de cabecera y otra posición.

 

Con la WE81, luego debemos crear el tipo de mensaje. Esto es el evento que trasnsmite en si al IDOC un tipo de mensaje puede tener varios IDOCs base (sería ALGO similar a las clases de mensajes en las impresiones en SAP).

 

Cuando tenemos el IDOC y el tipo de mensaje debemos relacionarlos para unirlos usamos la WE82.

En la trx BD64 debemos ingresar el tipo de mensaje creado en el sistema lógico y enlace correspondiente. (todo este seteo de enlaces todavia no lo vi, solamente agregue un IDOC a un ambiente ya creado.

 

En la WE02 podemos visualizar los IDOCs, ves su estado y contenido.

 

Dejo el código fuente de la parte de envió de IDOC de un programa que ya tiene en la tabla TI_HEADER los datos de cabecera y en TI_TABLE los datos de las posiciones.

 

form enviar_idocs .
DATA:        edidd_rec  TYPE edidd.

v_msgtype = 'ZEXTBNK'.  "Nombre de tipo de mensaje
v_idoctp  = 'ZEXTBANK'.  "Nombre de IDOC base
CLEAR v_cont.

* Por cada registro en la cabecera
  LOOP AT ti_header. "INTO header_rec.

    ADD 1 TO v_cont.
    MOVE 'ZFII039_HS' TO v_segnam.

    MOVE: ti_header-bukrs TO v_ZFII039_H-bukrs,
          ti_header-DISKB TO v_ZFII039_H-DISKB.

    CLEAR edidd_rec.
    edidd_rec-segnum = v_cont.
    edidd_rec-segnam = v_segnam.
    edidd_rec-mandt  = sy-mandt.
    edidd_rec-sdata  = v_ZFII039_H.
    APPEND edidd_rec TO it_edidd.

    LOOP AT ti_table WHERE bukrs = ti_header-bukrs
                       AND diskb = ti_header-diskb.

      ADD 1 TO v_cont.
      v_segnam       = 'ZFII039_DS'.

      MOVE: ti_table-bukrs TO v_ZFII039_D-bukrs,
            ti_table-diskb TO v_ZFII039_D-diskb,
            ti_table-azdat TO v_ZFII039_D-azdat,
            ti_table-aznum TO v_ZFII039_D-aznum,
            ti_table-waers TO v_ZFII039_D-waers,
            ti_table-esbtr TO v_ZFII039_D-esbtr.

      edidd_rec-segnum = v_cont.
      edidd_rec-segnam = v_segnam.
      edidd_rec-mandt  = sy-mandt.
      edidd_rec-sdata  = v_ZFII039_D.
      APPEND edidd_rec TO it_edidd.

    ENDLOOP.

    CLEAR v_edidc.
    v_edidc-mestyp = v_msgtype.
    v_edidc-idoctp = v_idoctp.
    CLEAR v_edidc-rcvpfc.
    CLEAR v_edidc-sndpfc.
    CLEAR v_cont.

    CALL FUNCTION 'MASTER_IDOC_DISTRIBUTE'
      EXPORTING
        master_idoc_control            = v_edidc
      TABLES
        communication_idoc_control     = it_edidc
        master_idoc_data               = it_edidd
      EXCEPTIONS
        error_in_idoc_control          = 01
        error_writing_idoc_status      = 02
        error_in_idoc_data             = 03
        sending_logical_system_unknown = 04.

    REFRESH it_edidc.
    REFRESH it_edidd.

  ENDLOOP. "Por cada registro en la cabecera
endform.                    " enviar_idocs

 

Declaraciones

DATA: v_edidc    LIKE edidc,
      v_msgtype  LIKE tbdme-mestyp,
      v_segnam   LIKE edidd-segnam,
      v_idoctp   LIKE bdaledc-idoctp,
      v_cont     TYPE i.

* Variables para ALV
DATA:
  lv_fieldcat  TYPE slis_t_fieldcat_alv,
  lv_layout    TYPE slis_layout_alv,
  lv_repid     TYPE sy-repid,
  lv_sorted    TYPE slis_t_sortinfo_alv,
  t_events     TYPE slis_t_event,         " Eventos.
  gt_header    TYPE slis_t_listheader,    " Tabla con el Titulo
  gt_sort      TYPE slis_t_sortinfo_alv,  "tabla con orden y subtot
  wa_header    TYPE slis_listheader.      " Work Area con el Titulo

TYPES: BEGIN OF TYPE_FEBKO,
         HKONT TYPE FEBKO-HKONT, "Cuenta
         BUKRS TYPE FEBKO-BUKRS, "Sociedad
         AZDAT TYPE FEBKO-AZDAT, "Fecha extracto
         AZNUM TYPE FEBKO-AZNUM, "Numero extracto
         WAERS TYPE FEBKO-WAERS, "Moneda
         ESBTR TYPE FEBKO-ESBTR, "Importe
         ESVOZ TYPE FEBKO-ESVOZ, "Debe/Haber
         HBKID TYPE FEBKO-HBKID, "Banco
         HKTID TYPE FEBKO-HKTID, "Cuenta
         EFART TYPE FEBKO-EFART, "Tipo extracto M o E
         DISKB TYPE T035D-DISKB, "Codigo
       END OF TYPE_FEBKO.

TYPES: BEGIN OF TYPE_HEADER,
         BUKRS TYPE FEBKO-BUKRS, "Sociedad
         DISKB TYPE T035D-DISKB, "Codigo
       END OF TYPE_HEADER.

DATA: TI_FEBKO TYPE STANDARD TABLE OF TYPE_FEBKO.
DATA: TI_FEBKO_AUX TYPE STANDARD TABLE OF TYPE_FEBKO WITH HEADER LINE.
DATA: TI_TABLE TYPE STANDARD TABLE OF TYPE_FEBKO WITH HEADER LINE.
DATA: TI_HEADER TYPE STANDARD TABLE OF TYPE_HEADER WITH HEADER LINE.

DATA: WA_FEBKO TYPE TYPE_FEBKO.
DATA: WA_FEBKO_AUX TYPE TYPE_FEBKO.

DATA: v_ZFII039_H LIKE ZFII039_H,
      v_ZFII039_D LIKE ZFII039_D.

DATA: it_edidd TYPE STANDARD TABLE OF edidd,
           it_edidc TYPE STANDARD TABLE OF edidc.

FIMA_DAYS_AND_MONTHS_AND_YEARS

Esta función nos devuelve la diferencia en dias, meses y años entre dos fechas.

    CALL FUNCTION 'FIMA_DAYS_AND_MONTHS_AND_YEARS'       
      EXPORTING                                          
        i_date_from          = s_badat2-low               
        i_date_to            = s_badat2-high              
     IMPORTING                                           
        e_days               = gv_dias2                 
*       E_MONTHS             =                          
*       E_YEARS              =                          

Refrescar un ALV luego de una Ejecuación de proceso que modifica la tabla interna

Cuando en un ALV tenemos algún botón que ejecute un Batch Input o algún, proceso al Salvar y la información de la tabla interna del ALV debe refrescarse, para reflejar el proceso ejecutado, podemos usar este peqúeño truco.

 

*&---------------------------------------------------------------------*
*&      Form  PF_USER_COMMAND
*&---------------------------------------------------------------------*
FORM user_command1 USING p_okcode LIKE sy-ucomm        "ok-code
                       w_selfield TYPE slis_selfield. "estruct. de linea
* Se selecciona que el ALV se actualice al mostrarse.

w_selfield-refresh = 'X'.

CASE p_okcode.

  WHEN '&DATA_SAVE'.
    PERFORM arma_datos_bapi_1.
      IF g_cant_error IS INITIAL. "ROGI08102008
        PERFORM ejecutar_bapi1.
      ENDIF.                      "ROGI08102008
ENDCASE.


ENDFORM.                    " PF_STATUS

En el USER_COMMAND Form agregamos lo que esta en negrita, esto hace que al ejecutar un botón del ALV se refresque la tabla interna, por lo tanto podemos directamente modificar la tabla interna a nuestro gusto que se vera refrejado en el ALV.