Para tener el texto de un mensaje de forma entendible 'MESSAGE_TEXT_BUILD'. En mi caso tengo una tabla p_mensajes_out TYPE zws_mensajes_t con los datos necesarios.
DATA : p_mensajes_out TYPE zws_mensajes_t.
CONCATENATE sy-datum sy-uzeit INTO p_idpersona .
*
DATA: wa_mensajes_out TYPE zws_mensajes_l.
*
wa_mensajes_out-msgty = 'I'.
* WA_MENSAJES_OUT-TEXT = 'xxx'.
wa_mensajes_out-arbgb = 'VF'.
wa_mensajes_out-txtnr = '006'.
wa_mensajes_out-msgv1 = 'SRG'.
*wa_mensajes_out-MSGV2
*wa_mensajes_out-MSGV3
*wa_mensajes_out-MSGV4
*
CALL FUNCTION 'MESSAGE_TEXT_BUILD'
EXPORTING
msgid = wa_mensajes_out-arbgb
msgnr = wa_mensajes_out-txtnr
msgv1 = wa_mensajes_out-msgv1
msgv2 = wa_mensajes_out-msgv1
msgv3 = wa_mensajes_out-msgv1
msgv4 = wa_mensajes_out-msgv1
IMPORTING
message_text_output = wa_mensajes_out-text.
*
APPEND wa_mensajes_out TO p_mensajes_out.
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.
viernes, 8 de marzo de 2013
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.
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
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
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.
viernes, 21 de diciembre de 2012
Imagen subida con SE78 ¡se pone el fondo gris!
Frecuentemente los clientes nos remiten logos e imágenes para los formularios (SapScript o Smarform) en formatos que no son los que le gustan a SAP, son jpg, son demasiado grandes,.... Cuando he intentado editarlos o pasarlos a BMP he tenido problemas.
Recomiendo 2 cosas, por una parte usar Paint.Net para editarlas, es gratis y funciona bastante bien. Fácilmente podemos retocar ya sea en píxeles o centímetros. Me lo chivaron hace tiempo los de sistemas.
Por otra parte me pasa que veo la imagen en cualquier editor con fondo blanco pero al subirla a SAP con la SE78 y visualizarla me queda el fondo gris. Para solucionarlo debo abrirla con este editor de imagen, ir a Ajustes -> Autonivel y la vuelvo a subir SAP. Una vez más me ha funcionado.
Recomiendo 2 cosas, por una parte usar Paint.Net para editarlas, es gratis y funciona bastante bien. Fácilmente podemos retocar ya sea en píxeles o centímetros. Me lo chivaron hace tiempo los de sistemas.
Por otra parte me pasa que veo la imagen en cualquier editor con fondo blanco pero al subirla a SAP con la SE78 y visualizarla me queda el fondo gris. Para solucionarlo debo abrirla con este editor de imagen, ir a Ajustes -> Autonivel y la vuelvo a subir SAP. Una vez más me ha funcionado.
Suscribirse a:
Entradas (Atom)