lunes, 21 de enero de 2013

Concurrencia de usuarios en programa o transacción.

Objetivo: Queremos evitar que haya más de un usuario en el mismo programa.
Solución: Hemos creado, siguiendo los consejos de Jesús, 2 subrutinas. Con la de BLOQUEO bloquearíamos al ejecutarla antes de la selección de datos y con la de DESBLOQUEO dejaríamos que otros usuarios accediesen a la misma. Lo controlo por programa y si no hemos desbloqueado y salimos de él "a saco Paco"  también se desbloquearía.
Subrutinas:
&---------------------------------------------------------------------*
*&      Form  BLOQUEO
*&---------------------------------------------------------------------*
*      
* Bloqueamos programa para evitar concurrencia de usuarios en programa.
* Se recomienda usar antes de buscar datos.
* Se desbloquearà al salir o forzar con PERFORM desbloqueo.
*----------------------------------------------------------------------*
*
*----------------------------------------------------------------------*
FORM bloqueo.
  DATAw_funcname LIKE tfdir-funcname.
  w_funcname sy-cprog.
*
  CALL FUNCTION 'ENQUEUE_ESFUNCTION'
    EXPORTING
*     MODE_TFDIR     = 'E'
      funcname       w_funcname
*     X_FUNCNAME     = ' '
*     _SCOPE         = '2'
*     _WAIT          = ' '
*     _COLLECT       = ' '
    EXCEPTIONS
      foreign_lock   1
      system_failure 2
      OTHERS         3.
  IF sy-subrc <> 0.
* Implement suitable error handling here
    MESSAGE e001(zgen)."Programa bloqueado por otro usuario. Inténtelo más tarde.
  ELSE.
    MESSAGE i002(zgen)"Ha bloqueado el programa para otros usuarios. Téngalo en cuenta.
  ENDIF.
ENDFORM                   " BLOQUEO

*&---------------------------------------------------------------------*
*&      Form  desbloqueo
*&---------------------------------------------------------------------*
*  
* Desbloqueamos el programa que ha sido bloqueado previamente con bloqueo.
*----------------------------------------------------------------------*
FORM desbloqueo.
*
  DATAw_funcname LIKE tfdir-funcname.
  w_funcname sy-cprog.
*
  CALL FUNCTION 'DEQUEUE_ESFUNCTION'
    EXPORTING
*     MODE_TFDIR = 'E'
      funcname   w_funcname
*     X_FUNCNAME = ' '
*     _SCOPE     = '3'
*     _SYNCHRON  = ' '
*     _COLLECT   = ' '
    .
  IF sy-subrc 0.
    MESSAGE i003(zgen)"Programa desbloqueado. Otros usuarios pueden usarlo.
  ENDIF.
*
ENDFORM.                    "desbloqueo

miércoles, 16 de enero de 2013

Pasar datos del pedido a factura SD. Centro de coste.

Después de poner informar el centro de coste en el pedido queremos que pase a la factura. Vamos al INCLUDE RV60AFZC del grupo de funciones V60A vamos a la subrutina y editamos como con el include mv45afzz la subrutina

  • USEREXIT_FILL_VBRK_VBRP

En nuestro caso queremos rescatar el centro de coste de la posición:
VBRP-KOSTL VBAP-KOSTL.

Una vez más gracias a Laura

lunes, 14 de enero de 2013

USER. Centro de coste en Pedido SD.

Queremos pode informar el Centro de coste en el pedido SD (VA01, VA02). Para ello vamos al include MV45AFZB del programa y aanálogamente a como lo haríamos con la mv45afzz en las siguientes subrutinas:

  • USEREXIT_COBL_SEND_ITEM

Con este código podremos rellenar el campo.
    INT_COBLF-FDNAM 'KOSTL'.
    INT_COBLF-OUTPUT '1'.
    IF T180-TRTYP NE CHARA AND
    VBAP-KZVBR NE KZVBR_P.
      INT_COBLF-INPUT    '1'.
    ENDIF.
    INT_COBLF-ACTIVE '1'.
    APPEND INT_COBLF.

  • USEREXIT_MOVE_FIELD_TO_COBL

 CH_COBL-KOSTL US_VBAP-KOSTL.

  • USEREXIT_COBL_RECEIVE_VBAP

 VBAP-KOSTL COBL-KOSTL.

  • USEREXIT_MOVE_FIELD_TO_VBAPKOM.

 VBAP-KOSTL US_VBAPKOM-KOSTL.

Hacer notar que en la CH_COBL son los datos de pantalla para centro de coste, lo digo por si queremos rellenarlo para que se visualice directamente. 

jueves, 10 de enero de 2013

USER de factura SD a FI. Anotación.

User para pasar información de facturas SD a FI peleandome con Elena, me refiero junto a no contra.

Con EXIT_SAPLV60B_002 (SDVFX002 User exit for A/R line in transfer to accounting / User Exit AC Interface (Customer Line) ) podemos modificar en la posición del deudor. Include ZXVVFU02.

Con EXIT_SAPLV60B_004 (SDVFX004 User exit G/L line in transfer to accounting / User Exit AC Interface (GL Account Item)) podemos modificar en las posiciones de cuentas de mayor (claves de contabilización 40 y 50).

Ambas están el grupo de funciones XVVF (User Exits Billing Document / User-exits p. factura).

viernes, 4 de enero de 2013

Fecha de Vencimiento (SD) - SD_PRINT_TERMS_OF_PAYMENT

Para obtener la fechas de vencimiento de las facturas de Ventas se puede utilizar la Función SD_PRINT_TERMS_OF_PAYMENT. Con tan solo pasar la fecha de documento(BLDAT)  (habitualmente es la de factura), el idioma y la condición de pago.

      DATAl_baseline_date TYPE  vbrk-fkdat,

      lt_top_text TYPE STANDARD TABLE  OF vtopis,

      ls_top_text TYPE vtopis.

      CALL FUNCTION 'SD_PRINT_TERMS_OF_PAYMENT'
        EXPORTING
         bldat                              ls_vbrk-fkdat
*   BUDAT                              = 00000000
*   CPUDT                              = 00000000
         language                           sy-langu
          terms_of_payment                   ls_vbrk-zterm
*   COUNTRY                            = ' '
*   HOLDBACK                           = ' '
*   TOP_HOLDBACK_INFO                  = TOP_HOLDBACK_INFO
*   DOCUMENT_CURRENCY                  = ' '
* IMPORTING
*   BASELINE_DATE                      = BASELINE_DATE
*   PAYMENT_SPLIT                      = PAYMENT_SPLIT
*   ZFBDT                              = ZFBDT
        TABLES
          top_text                           top_text
       EXCEPTIONS
         terms_of_payment_not_in_t052       1
         OTHERS                             2
                .
      IF sy-subrc <> 0.
* Implement suitable error handling here
      ENDIF.