viernes, 19 de noviembre de 2010

batch input, call transaction y direct input

REPORT ZBATCHINPUT.
* -------------------------------------------------------------------- *
* En este programa se utiliza la transacción FB09 (modificar posición de
* documento) para ejemplificar el uso del Batch-Input y del Call-
* Transaction.
************************************************************************
* BATCH-INPUT *
************************************************************************
* En el juego de datos se introduce un campo que no existe (BSEG-ABCDE);
* sin embargo, este error no detiene el proceso cuando se ejecuta el
* batch-input aunque sí se refleja en el log. Sin embargo en un call-
* transaction sí se considera un error y no se actualiza esa transacción
* -------------------------------------------------------------------- *
* Resultado on-line *
* -------------------------------------------------------------------- *
* Se produce un JD. Éste contiene una transacción errónea, la primera.
* En el momento de procesar el JD podemos corregir la transacción o bien
* pasar a la siguiente (Sistema/Servicios/Batch_inp/Transacc.siguiente)
* en cuyo caso esta transacción quedará en el JD en el apartado de
* 'JD erróneos'.
* -------------------------------------------------------------------- *
* Resultado en background *
* -------------------------------------------------------------------- *
* Es el mismo que on-line.
*
************************************************************************
* CALL-TRANSACTION *
************************************************************************
* En un Call Transaction las transacciones correctas se actualizan, las
* erróneas no.
* Hay que lanzar un Call Transaction por cada registro de la tabla.
* El modo de actualización puede ser A(Asíncrono) S(Síncrono) y L(Local)
* Si el programa se lanza en fondo da igual el MODE ('A', 'E' o 'N') del
* Call-Transaction; en este caso, si se quiere ver una orden SPOOL con
* los errores es necesario hacer el LOOP sobre la tabla de los errores
* y escribirlos con WRITE.
* Se habilita un procedimiento para guardar en un juego de datos las
* transacciones (registros) incorrectas. Esto es muy útil si el CALL
* TRANSACTION tiene lugar en un job de fondo donde no se permite el
* procesamiento on-line de las transacciones incorrectas.
* -------------------------------------------------------------------- *
* Resultado on-line *
* -------------------------------------------------------------------- *
* El proceso depende del modo de visualización escogido.
* A: se procesan on-line todas las transacciones.
* E: sólo se procesan on-line las transacciones erróneas.
* N: no hay procesamiento on-line.
* Las transacc.incorrectas se pierden, salvo que se hayan corregido on-
* line. En el modo 'N' estas transacc. se pierden irremediablemente.
* Para evitar perder las transacc.erróneas éstas pueden almacenarse en
* un JD para procesarlas posteriormente on-line. Esto es lo que se ha
* hecho en este programa.
* -------------------------------------------------------------------- *
* Resultado en background *
* -------------------------------------------------------------------- *
* Independientemente del modo de visualización (A, E ó N), las transacc.
* correctas se actualizan en el sistema y las incorrectas se pierden
* salvo que se hayan guardado en un JD.
* El resultado es similar al on-line.
*
*
* -------------------------------------------------------------------- *
* Tanto si es batch-input como call-transaction, se tiene que limpiar la
* tabla BDCTAB al comienzo de cada transacción, sino se van acumulando
* las transacciones y siempre se ejecutaría la primera.
* -------------------------------------------------------------------- *
*
************************************************************************
* DIRECT INPUT *
************************************************************************
* Sólo está permitido para los programas estándar de transferencia de
* datos (ver transacción SXDA).
TABLES:
BGR00,
BBKPF,
BBSEG.

CONSTANTS:
CODE LIKE TSTC-TCODE VALUE 'FB09',
FICHERO_SALIDA LIKE FILEINFO-NAME VALUE '/tmp/roman_tmp/dir_inp.txt',
CTE_NODATA LIKE BGR00-NODATA VALUE '#'.

DATA:
MENSAJE LIKE T100-TEXT,
STR_TMP(255).

DATA:
BEGIN OF ITAB OCCURS 0,
BELNR LIKE BKPF-BELNR,
BUKRS LIKE BKPF-BUKRS,
GJAHR LIKE BKPF-GJAHR,
ZUONR LIKE BSEG-ZUONR,
SGTXT LIKE BSEG-SGTXT,
END OF ITAB,
BDC_TAB LIKE STANDARD TABLE OF BDCDATA WITH HEADER LINE,
ERR_BI LIKE STANDARD TABLE OF BDCMSGCOLL WITH HEADER LINE.


************************************************************************
* START-OF-SELECTION *
************************************************************************
START-OF-SELECTION.

* Llenado de la tabla interna con los datos
PERFORM FILL_ITAB.
*======================================================================*
* Batch-Input *
*======================================================================*
PERFORM BATCHINPUT.
*======================================================================*
* Call Transaction *
*======================================================================*
PERFORM CALLTRANSACTION.
*======================================================================*
* Direct Input *
*======================================================================*
PERFORM DIRECTINPUT.


************************************************************************
* END-OF-SELECTION *
************************************************************************
END-OF-SELECTION.

*&---------------------------------------------------------------------*
*& Form DYNPRO
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
FORM DYNPRO USING VALUE(DYNBEGIN)
VALUE(NAME)
VALUE(VALUE).

CLEAR BDC_TAB.
IF DYNBEGIN = 'X'.
BDC_TAB-PROGRAM = NAME.
BDC_TAB-DYNPRO = VALUE.
BDC_TAB-DYNBEGIN = 'X'.
ELSE.
BDC_TAB-FNAM = NAME.
BDC_TAB-FVAL = VALUE.
ENDIF.
APPEND BDC_TAB.
CLEAR BDC_TAB.

ENDFORM. " DYNPRO

*&---------------------------------------------------------------------*
*& Form BDC_OPEN
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
FORM BDC_OPEN.

CALL FUNCTION 'BDC_OPEN_GROUP'
EXPORTING
CLIENT = SY-MANDT
GROUP = 'Pruebas'
KEEP = 'X'
USER = SY-UNAME.

ENDFORM. " BDC_OPEN

*&---------------------------------------------------------------------*
*& Form BDC_INSERT
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
FORM BDC_INSERT.

CALL FUNCTION 'BDC_INSERT'
EXPORTING
TCODE = CODE
TABLES
DYNPROTAB = BDC_TAB.

ENDFORM. " BDC_INSERT

*&---------------------------------------------------------------------*
*& Form BDC_CLOSED
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
FORM BDC_CLOSED.

CALL FUNCTION 'BDC_CLOSE_GROUP'
EXCEPTIONS
NOT_OPEN = 1
QUEUE_ERROR = 2
OTHERS = 3.

ENDFORM. " BDC_CLOSED

*&---------------------------------------------------------------------*
*& Form FILL_ITAB
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
FORM FILL_ITAB.
MOVE:
'9900000001' TO ITAB-BELNR,
'TEL1' TO ITAB-BUKRS,
'2000' TO ITAB-GJAHR,
'Texto9 !!!' TO ITAB-ZUONR,
'=AC' TO ITAB-SGTXT.
APPEND ITAB.
MOVE:
'1900000002' TO ITAB-BELNR,
'TEL1' TO ITAB-BUKRS,
'2000' TO ITAB-GJAHR,
'Texto9 !!!' TO ITAB-ZUONR,
'=VI' TO ITAB-SGTXT.
APPEND ITAB.
MOVE:
'1900000003' TO ITAB-BELNR,
'TEL1' TO ITAB-BUKRS,
'2000' TO ITAB-GJAHR,
'Texto9 !!!' TO ITAB-ZUONR,
'=GU' TO ITAB-SGTXT.
APPEND ITAB.

ENDFORM. " FILL_ITAB

*&---------------------------------------------------------------------*
*& Form BATCHINPUT
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
FORM BATCHINPUT.

LOOP AT ITAB.
REFRESH BDC_TAB. " ------------------ Borrar la transacción anterior

AT FIRST.
PERFORM BDC_OPEN. " ------------------- Apertura del juego de datos
ENDAT.

REFRESH BDC_TAB. "<------------------ Borrar la transacción anterior
PERFORM DYNPRO USING:
'X' 'SAPMF05L' '0102',
' ' 'RF05L-BELNR' ITAB-BELNR,
' ' 'RF05L-BUKRS' ITAB-BUKRS,
' ' 'RF05L-GJAHR' ITAB-GJAHR,
' ' 'RF05L-XKSAK' 'X',
' ' 'BDC_OKCODE' '/00',
'X' 'SAPMF05L' '0300',
' ' 'BSEG-ABCDE' '21022000', " No existe !!!
' ' 'BSEG-ZUONR' ITAB-ZUONR,
' ' 'BSEG-SGTXT' ITAB-SGTXT,
' ' 'BDC_OKCODE' 'AE',
'X' 'SAPLKACB' '0002',
' ' 'BDC_OKCODE' 'ENTE'.
* Adición de la transacción a la tabla del juego de datos. Se añade
* una transacción por cada registro de datos de ITAB.
PERFORM BDC_INSERT. " --------------- Inserción en el juego de datos

AT LAST.
PERFORM BDC_CLOSED. " ------------------- Cierre del juego de datos
ENDAT.

ENDLOOP.

ENDFORM. " BATCHINPUT

*&---------------------------------------------------------------------*
*& Form CALLTRANSACTION
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
FORM CALLTRANSACTION.
DATA COPY_SYTABIX LIKE SY-TABIX.

LOOP AT ITAB.
MOVE SY-TABIX TO COPY_SYTABIX.

* Apertura de un JD para las transacciones erróneas
AT FIRST.
PERFORM BDC_OPEN.
ENDAT.

* Proceso de cada registro de ITAB (cada registro es una transacción)
REFRESH BDC_TAB. "<------------------ Borrar la transacción anterior
PERFORM DYNPRO USING:
'X' 'SAPMF05L' '0102',
' ' 'RF05L-BELNR' ITAB-BELNR,
' ' 'RF05L-BUKRS' ITAB-BUKRS,
' ' 'RF05L-GJAHR' ITAB-GJAHR,
' ' 'RF05L-XKSAK' 'X',
' ' 'BDC_OKCODE' '/00',
'X' 'SAPMF05L' '0300',
* ' ' 'BSEG-ABCDE' '21022000', " No existe !!!
' ' 'BSEG-ZUONR' ITAB-ZUONR,
' ' 'BSEG-SGTXT' ITAB-SGTXT,
' ' 'BDC_OKCODE' 'AE',
'X' 'SAPLKACB' '0002',
' ' 'BDC_OKCODE' 'ENTE'.
* Escribimos los mensajes de cada transacción para que salgan agrupa-
* dos con el mensaje de 'sin errores' o 'con errores' de su transacc.
* correspondiente. Para ello es necesario limpiar la tabla ERR_BI en
* cada transacción ya que el sistema no la limpia cuando llama a la
* transacción.
REFRESH ERR_BI.
CALL TRANSACTION 'FB09' USING BDC_TAB MODE 'A' MESSAGES INTO ERR_BI.
NEW-LINE.
IF SY-SUBRC = 0.
WRITE:'Transacción', COPY_SYTABIX LEFT-JUSTIFIED, ': sin errores'.
ELSE.
WRITE:'Transacción', COPY_SYTABIX LEFT-JUSTIFIED, ': con errores'.
* Adición de la transacción errónea al JD para procesarlo on-line
* PERFORM BDC_INSERT.
ENDIF.
* ERR_BI va acumulando todos los errores que se van produciendo en las
* transacciones (no la limpia el sistema en cada transacción).
LOOP AT ERR_BI.
SELECT SINGLE TEXT INTO MENSAJE
FROM T100
WHERE SPRSL = 'S' AND
ARBGB = ERR_BI-MSGID AND
MSGNR = ERR_BI-MSGNR.
NEW-LINE.
WRITE AT: 1 ERR_BI-DYNAME,
15 ERR_BI-DYNUMB,
20 ERR_BI-MSGTYP,
22 ERR_BI-MSGNR,
26 MENSAJE.
************************************************************************
* Con las siguientes líneas de código podemos concatenar todas *
* las variables del mensaje en el cuerpo del mensaje. *
*----------------------------------------------------------------------*
* DATA: MENSAJE1 ... MENSAJE4 LIKE MENSAJE.
* SPLIT MENSAJE AT '&' INTO MENSAJE1 MENSAJE2 MENSAJE3 MENSAJE4.
* CONCATENATE MENSAJE1 ERR_BI-MSGV1 MENSAJE2 ERR_BI-MSGV2
* MENSAJE3 ERR_BI-MSGV3 MENSAJE4 ERR_BI-MSGV4
* INTO MENSAJE SEPARATED BY SPACE.
* WRITE MENSAJE.
************************************************************************

ENDLOOP.

* Cierre del JD abierto para los errores. Hay que colocarlo al final
* pues si lo colocamos después del AT FIRST y por lo tanto antes del
* cuerpo del LOOP, si la tabla interna sólo tiene un registro el AT
* LAST se procesa en el mismo bucle e inmediatamente después del AT
* FIRST por lo que inmediatamente después de abrir el JD éste se es
* cerrado. Si ocurriera que ese registro fuera erróneo, al pretender
* hacer el INSERT al JD ocurriría un error ya que el JD se cerró.
AT LAST.
PERFORM BDC_CLOSED.
ENDAT.

ENDLOOP."<--------------------------- Siguiente transacción (registro)

ENDFORM. " CALLTRANSACTION

*&---------------------------------------------------------------------*
*& Form DIRECTINPUT
*&---------------------------------------------------------------------*
* Para hacer un Direct Input usaremos el programa estándar de transf. de
* datos RFBIBL00.
*----------------------------------------------------------------------*
FORM DIRECTINPUT.

PERFORM CREATEFILE.
PERFORM RUN_RFBIBL00.

ENDFORM. " DIRECTINPUT

*&---------------------------------------------------------------------*
*& Form CREATEFILE
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
FORM CREATEFILE.

DATA: NAME_JD LIKE BGR00-GROUP VALUE 'JD_DIR_INPUT'.
OPEN DATASET FICHERO_SALIDA FOR OUTPUT IN TEXT MODE.
PERFORM REC_NODATA USING BGR00.
MOVE:
'0' TO BGR00-STYPE,
NAME_JD TO BGR00-GROUP,
SY-MANDT TO BGR00-MANDT,
SY-UNAME TO BGR00-USNAM,
'X' TO BGR00-XKEEP.
TRANSFER BGR00 TO FICHERO_SALIDA.
PERFORM REC_NODATA USING BBKPF.
MOVE:
'1' TO BBKPF-STYPE,
'FB01' TO BBKPF-TCODE,
'TEL1' TO BBKPF-BUKRS,
'03032000' TO BBKPF-BLDAT,
'KR' TO BBKPF-BLART,
'ESP' TO BBKPF-WAERS,
'ABCDE' TO BBKPF-XBLNR,
'X' TO BBKPF-XMWST.
TRANSFER BBKPF TO FICHERO_SALIDA.
PERFORM REC_NODATA USING BBSEG.
MOVE:
'2' TO BBSEG-STYPE,
'BBSEG' TO BBSEG-TBNAM,
'31' TO BBSEG-NEWBS,
'2000000014' TO BBSEG-NEWKO,
'85000' TO BBSEG-WRBTR,
'1D' TO BBSEG-MWSKZ,
'BSIT' TO BBSEG-HBKID.
TRANSFER BBSEG TO FICHERO_SALIDA.
PERFORM REC_NODATA USING BBSEG.
MOVE:
'2' TO BBSEG-STYPE,
'BBSEG' TO BBSEG-TBNAM,
'40' TO BBSEG-NEWBS,
'6000000' TO BBSEG-NEWKO,
'85000' TO BBSEG-WRBTR,
'ZTEL100001' TO BBSEG-KOSTL,
'=AC' TO BBSEG-SGTXT.
TRANSFER BBSEG TO FICHERO_SALIDA.
CLOSE DATASET FICHERO_SALIDA.

ENDFORM. " CREATEFILE

*&---------------------------------------------------------------------*
*& Form REC_NODATA
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
FORM REC_NODATA USING REC_NAME.

DATA: COPY_SYSUBRC LIKE SY-SUBRC.
FIELD-SYMBOLS: .

WHILE COPY_SYSUBRC EQ 0.
ASSIGN COMPONENT SY-INDEX OF STRUCTURE REC_NAME TO .
MOVE SY-SUBRC TO COPY_SYSUBRC.
CHECK SY-SUBRC EQ 0.
MOVE CTE_NODATA TO .
ENDWHILE.

ENDFORM. " REC_NODATA

*&---------------------------------------------------------------------*
*& Form RUN_RFBIBL00
*&---------------------------------------------------------------------*
* Si se emplea el CALLMODE = 'D' (Direct Input) hay algunas operaciones
* que no se admiten (como el cálculo automático de impuestos) y darían
* lugar a errores.
* -------------------------------------------------------------------- *
* Resultado on-line *
* -------------------------------------------------------------------- *
* El programa creará un JD con las transacc.erróneas si así ha sido
* implementado en su código. El RFBIBL00 crea un JD con los errores en
* los CALLMODE 'C' y 'D'. En el 'B' crea un JD con todas las transacc.
* -------------------------------------------------------------------- *
* Resultado en background *
* -------------------------------------------------------------------- *
* El resultado depende del CALLMODE
* B: Se crea el JD.
* C: Ocurre un error si el job que lanza el ZBORRAR14 no es reiniciable.
* D: Ocurre un error si el job que lanza el ZBORRAR14 no es reiniciable.
* Si el job es reiniciable se crea un JD con las transacc.erróneas tanto
* en modo 'C' como en 'D'.
* Para crear un job reiniciable:
* Transacc.BMV0/Ejecutar-->Definición de job.
* Escribir el nombre del job que lanza a el ZBORRAR14.
*----------------------------------------------------------------------*
FORM RUN_RFBIBL00.

SUBMIT RFBIBL00 WITH DS_NAME = FICHERO_SALIDA
WITH CALLMODE = 'D' AND RETURN.

ENDFORM. " RUN_RFBIBL00


traido De la web sapabap.iespana.es por si es borrado de alla

martes, 9 de noviembre de 2010

Ejecutar programa externo abap en proceso de fondo

Si lo que necesitas es llamar un programa externo desde sap pero que se pueda ejecutar como proceso de fondo.

SM69
(F5) modificar
(f6) crear
nombre de comando: ztest
sistema operativo: windows nt
comando del sistema operativo: C:\test.bat
(Ctrl + S) guardar
(f3) back
(Ctrl + S) guardar

para mandar llamar este comando esta es la programacion


REPORT zpractica.

data begin of t_data1 occurs 0.
include structure BTCXPM.
data end of t_data1.

CALL FUNCTION 'SXPG_COMMAND_EXECUTE'
EXPORTING
COMMANDNAME = 'ZTEST'
TABLES
EXEC_PROTOCOL = T_DATA1.

jueves, 4 de noviembre de 2010

Abap eliminar caracteres de una cadena

Es para cuando no se puede usar el REPLACE ALL OCCURRENCES OF debido a que no lo tiene la version de sap, si se quiere insertar otro simbolo en vez de ese usar
translate donde elim nos dice que caracter sustituir por cual ej @ por ' '.


report zelcar.
data texto(5000) type c
value '@123"@=,<,>,~,/,”,,+,*,|,:,·$%&/()9876*1@)'.
data elim(4) value '@ * '.
write texto.
perform f_elimina_caracteres using texto.
*translate texto using elim.
write / texto.



**------------------------------------------------
** f_elimina_caracteres.
**------------------------------------------------
form f_elimina_caracteres changing texto.
data: len type i, caracter, va type i,texto2(5000) type c.
*creamos tabla interna con los caracteres a eliminar de el archivo
data: begin of i_careli occurs 0,
car,
end of i_careli.
*cuales caracteres queremos quitar =,<,>,~,/,”,’,+,*,|,:,
i_careli-car = '='.append i_careli.
i_careli-car = '<'.append i_careli.
i_careli-car = '>'.append i_careli.
i_careli-car = '~'.append i_careli.
i_careli-car = '/'.append i_careli.
i_careli-car = '+'.append i_careli.
i_careli-car = '*'.append i_careli.
i_careli-car = '|'.append i_careli.
i_careli-car = ':'.append i_careli.


write texto.
len = strlen( texto ).
while va <= len.

caracter = texto+va(+1).
loop at i_careli.
if i_careli-car = caracter.
caracter = ''.
endif.
endloop.
concatenate caracter texto2 into texto2.
va = va + 1.
endwhile.
texto = texto2.
endform.