BATCH_INPUT haciendo pruebas

Hola a todos, este es mi primer post y no soy nada experto en SAP, aparte de lo que pueda ir rascando x ahi, asi que perdonad mi incultura SAPera…

el caso es que me ha caido la tarea de automatizar pantallas de introduccion de datos y de exportacion a excel, y mirando he visto diversas opciones, desde innowera, winshuttle, hasta scripts VBS interactuando con SAPGUI, pero lo mas pro parecen los batch-input (quitando hacer un programa ABAP exprofeso supongo)

el tema:
siguiendo un tuto cree un recording de la SU01, luego modifique el programa haciendo que leyera un txt tabulado para que añadiera los nuevos usuarios.
Luego lo ejecute y me pidio un nombre de sesion…el caso es que me ha creado 1 sesion por cada linea del txt (x cada usuario)

preguntas:

  1. Como hago para que me cree una sesion en vez de x?
  2. es este el procedimiento adecuado para meter datos en transacciones?
  3. vale para todas las transacciones? o me voy a encontrar muchos casos particulares segun cual sea?
  4. Las sesiones de SM35, estan pensadas para ejecutarse manualmenete o via job?..es decir como hacemos un scheduling de eso?

saludos y gracias

Hola, cómo estás?
No entendi bien, estás ejecutando directamente el recording en lugar de crear un programa que contenga el batch input? Si estás haciendo un programa, podrías pasarnos el codigo?.
En cuanto a tu pregunta de si es el procedimiento adecuado, te diria que no, que lo ideal es un programa que llame a BAPIS (puedes buscar en este foro su uso y definición). Por lo menos en mi caso como programador los batch inputs se usan cuando no hay otra opción viable.
Saludos!

2 Me gusta

muchas gracias

No, estoy ejecutando el programa generado en base al codigo del recording…
Ya arregle, lo de las sesiones…era un tema de un LOOP mal cerrado.

Ahora el tema es que no esta bien automatizado…al lanzarlo, tengo q meter input para campos:
BDC_OKCODE’ ‘=CREA’. and ‘BDC_OKCODE’ ‘=LOGO’.
Es decir, al ejecutar me salen en pantalla ya rellenos, pero el programa no avanza si no le doy a aceptar, con lo que no se puede ejecutar en background… ¿?

En cuanto a los BAPIS, ya estuve viendo que son la opcion mas Pro, pero obviamenete parecen mas complicados para un profano. Mirare en el foro para ver si logro hacer alguno.

gracias

report Z_JPF_RUSER
       no standard page heading line-size 255.

include bdcrecx1.

* TABLA INTERNA PARA CONTENER EL TXT
DATA: BEGIN OF int_jpf_users_table OCCURS 0,

    a(30),
    b(5),
    c(30),
    d(30),
    e(30),
    f(30),
    g(15),
    h(15),
    i(30),
    j(10),

END OF int_jpf_users_table.

PARAMETERS:
p_user LIKE apqi-userid OBLIGATORY DEFAULT sy-uname,
p_fich LIKE rlgrap-filename OBLIGATORY DEFAULT
'C:\temp\users_sap.txt'.


start-of-selection.

CALL FUNCTION 'UPLOAD'
EXPORTING
   FILENAME                      = p_fich
   FILETYPE                      = 'DAT'
  TABLES
    DATA_TAB                     = int_jpf_users_table
    .

perform open_group.

LOOP AT int_jpf_users_table.

perform bdc_dynpro      using 'SAPLSUID_MAINTENANCE' '1050'.
perform bdc_field       using 'BDC_CURSOR'
                              'SUID_ST_BNAME-BNAME'.
perform bdc_field       using 'SUID_ST_BNAME-BNAME'
                              int_jpf_users_table-a.
perform bdc_field       using 'BDC_OKCODE'
                              '=CREA'.
*                               '/00'.
*                               '=ENTR'.

perform bdc_dynpro      using 'SAPLSUID_MAINTENANCE' '1100'.
perform bdc_field       using 'BDC_OKCODE'
*                              '=LOGO'.
*                               '/00'.
                               '=ENTR'.
perform bdc_field       using 'BDC_CURSOR'
                              'SUID_ST_NODE_WORKPLACE-DEPARTMENT'.
perform bdc_field       using 'SUID_ST_NODE_PERSON_NAME_EXT-TITLE_MEDI'
                              int_jpf_users_table-b.
perform bdc_field       using 'SUID_ST_NODE_PERSON_NAME-NAME_LAST'
                              int_jpf_users_table-c.
perform bdc_field       using 'SUID_ST_NODE_PERSON_NAME-NAME_FIRST'
                              int_jpf_users_table-d.
perform bdc_field       using 'SUID_ST_NODE_WORKPLACE-FUNCTION'
                              int_jpf_users_table-e.
perform bdc_field       using 'SUID_ST_NODE_WORKPLACE-DEPARTMENT'
                              int_jpf_users_table-f.
perform bdc_dynpro      using 'SAPLSUID_MAINTENANCE' '1100'.
perform bdc_field       using 'BDC_OKCODE'
                              '=UPD'.
perform bdc_field       using 'BDC_CURSOR'
                              'SUID_ST_NODE_LOGONDATA-GLTGV'.
perform bdc_field       using 'SUID_ST_NODE_LOGONDATA-USTYP'
                              'A'.
perform bdc_field       using 'SUID_ST_NODE_PASSWORD_EXT-PASSWORD'
                              int_jpf_users_table-g.
perform bdc_field       using 'SUID_ST_NODE_PASSWORD_EXT-PASSWORD2'
                              int_jpf_users_table-h.
perform bdc_field       using 'SUID_ST_NODE_LOGONDATA-CLASS'
                              int_jpf_users_table-i.
perform bdc_field       using 'SUID_ST_NODE_LOGONDATA-GLTGV'
                              int_jpf_users_table-j.
perform bdc_transaction using 'SU01'.


ENDLOOP.

perform close_group.

Hola,
Si se puede ejecutar en background.

revisate el perform bdc_transaction using ‘SU01’

Ahi dentro debes tener algo parecido a esto:

REFRESH messtab.
CALL TRANSACTION tcode USING bdcdata
MODE ctumode
UPDATE cupdate
MESSAGES INTO messtab.

y la clave, está en MODE ctumode.
ya que:
MODE : Indica el tipo de ejecución: A (en visible. Se ven todas las pantallas por las que se pasa. Útil para testeo), E (visualización sólo errores), N (invisible).

Espero que te sirva
Saludos.

1 me gusta

Genial! Muchas gracias

antes de cerrar el loop he añadido:
call transaction ‘SU01’
using bdcdata
update ‘A’
mode ctumode
messages into messtab.
REFRESH bdcdata. --> sin esto…me añadia solo el primer registro y luego creo que me lo intentaba volver a añadir…fallaba obviamenete y se paraba)

Ahora solo necesito saber como se ejecuta este programa desde un job…o cuales son las instrucciones para que otro usuario lo ejecute cuando haya modificado el TXT correspondiente…

ah no habia visto eso de ejecutar en fondo.
Para hacerlo, todavia te falta adaptar un poco el codigo, porque esa funcion UPLOAD es para subir archivos locales, de la PC del usuario, y eso no se puede ejecutar de fondo.
ahi tendrias que tener el archivo en el servidor, colocar la ruta en un parametro de seleccion, y hacer la lectura del mismo con OPEN DATASET…READ DATASET…
Y para saber si se esta ejecutando de fondo o no, la variable sy-batch te lo indica.
Saludos.

1 me gusta

muchas gracias…ahora lo estoy haciendo mediante script vbs…supongo q es menos elegante, pero es terriblemente mas facil…no se que contras tendrá contra el metodo batch-input…o un BAPI

Hola.
Los batchs son procedimientos válidos, pero con bapis es mucho más fácil la programación si obviamente se tiene identificada cuál es la que se debe usar.
La desventaja de los batchs es que si hay algún cambio en el dynpro, ya no va a funcionar el código fuente con el batch.
Si es válido para todas las transacciones, te diría que sí, salvo en pantallas que tienen subscreens dinámicos, que no salen en la grabación.
Se pueden ejecutar en programas, tanto en diálogo como en job, según sea la necesidad.