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.
DATA: w_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.
*
DATA: w_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
Trozos y retales de código de ABAP (SAP)que encuentro de interés. Tanto para tenerlos a mano en cualquier sitio como para compatirlos.
lunes, 21 de enero de 2013
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
En nuestro caso queremos rescatar el centro de coste de la posición:
VBRP-KOSTL = VBAP-KOSTL.
Una vez más gracias a Laura.
- 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:
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.
CH_COBL-KOSTL = US_VBAP-KOSTL.
VBAP-KOSTL = COBL-KOSTL.
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.
- 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.
Etiquetas:
ABAP,
BAPI,
BAPI_SALESORDER_CREATEFROMDAT2,
MV45AFZB,
Pedido,
SD,
USER-EXIT,
USEREXIT_COBL_RECEIVE_VBAP,
USEREXIT_COBL_SEND_ITEM,
USEREXIT_MOVE_FIELD_TO_COBL,
USEREXIT_MOVE_FIELD_TO_VBAPKOM,
VA01,
VA02
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).
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.
DATA: l_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.
DATA: l_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.
Suscribirse a:
Entradas (Atom)