jueves, 2 de noviembre de 2017

SHDB - VERSION 2 (ACTUALIZADO 2:45 PM)

Primero antes que todo,

fijate si en verdad el batch no te graba el =P+, entra a un material
y modifica algo de una caracteristica y prueba bajando hasta donde de verdad
debes bajar y al final no lo guardes simplemente cancelas e igual te va a quedar la grabación.












Yo hice eso con una hoja de ruta donde modifico operaciones e igual me queda grabado el =P+

                                      


**************actualización 03:03 pm ************************


***************************************
explicación aritmetica:

posicion. scroll
01 al 15 - 0
16 al 30 - 1
31 al 45 - 2
46 al 60 - 3
61 al 75 - 4

si necesito apunta a la posicion 45, 45/15, mi resto será 0 y cociente 3
pero segun la tabla vemos que solo necesito 2 scroll para llegar a la posición 45
por tanto cuando resto sea cero el cociente se le disminuira en 1.
******************************************


TODO ESTO DENTRO DE TU LOOP PARA LO CUAL DEBES LIMPIAR LAS VARIABLES QUE SE
DECLARARAN.


*      VARIABLE_CARACT TYPE I. "esta debe ser una variable tuya donde sepas que numero de caracteristica hay que grabar
*                              "ejm: grabar la descripcion de la caracteristica nro. 25


DATA:  VARIABLE_SCROLL TYPE I, "ESTA VARIABLE CONTROLARA CUANTOS SCROLL HAREMOS
       VARIABLE_POS    TYPE I, "ESTA VARIABLE INDICARA LA POSICION A LA QUE APUNTAREMOS
       VARIABLE_CONST  TYPE I VALUE 15, "ESTA VARIABLE ES LA CONSTANTE DE CUANTAS FILAS POR PANTALLA VEMOS, EN MI CASO 15
       VARIABLE_SCROLL_N(3) TYPE N, "EN ESTA VARIABLE SE IMPRIMIRA LA DEL NOMBRE SIMILAR PARA EL BATCH, YA QUE EL CONCATENATE SOLO ADMITE NUMC
       VARIABLE_POS_N(3) TYPE N, "SIMILAR A DESCRIPCION ANTERIOR,
       VARIABLE_FNAM   TYPE fnam_____4. "EN ESTA VARIABLE HAREMOS EL CONCATENATE DE LA POSICION ENTRE ( ) CON EL CAMPO DEL BATCH


LOOP AT T_MATERIALES INTO S_MATERIALES.

VARIABLE_SCROLL = VARIABLE_CARACT DIV VARIABLE_CONST.  "DIV SE USA PARA OBTENER EL COCIENTE (EN ESTE CASO EL COCIENTE ENTERO)
VARIABLE_POS = VARIABLE_CARACT MOD VARIABLE_CONST. "MOD SE USA PARA OBTENER EL RESIDUO (ENTERO)


" SI SE HACE LAS DIVISIONES IDEALES TALES COMO 15/15, 30/15, 45/15 TENDREMOS RESIDUO 0.
" SI ES ASI ENTONCES LA POSICION A APUNTAR SERÁ LA 15 Y EL SCROLL LE RESTAREMOS 1.
" PARA EL PRIMER ESCENARIO 15/15, AL SER VARIABLE_SCROLL 1 Y RESTARLE 1 SE HACE CERO POR TANTO NO HABRÍA SCROLL
" PARA EL RESTO DE CASOS DE DIVISIONES IDEALES CON RESTO CERO EL RESTARLE 1 TAMBIEN AYUDARÁ A APUNTAR LA CANTIDAD CORRECTA DE SCROLL
" PARA EL CASO DEL EJEMPLO SI QUEREMOS GRABAR LA DESCRIPCION DE CARACTERISTICA 25 Y SE NOS MUESTRA DE 15 EN 15
" SERIA, VARIABLE_POS = 25 / 15 = 10
"        VARIABLE_SCROLL = 25 / 15 = 1
" POR TANTO EN NUESTRA PANTALLA HAREMOS 1 SCROLL, APUNTANDO A LA POSICION 10 DE LA PANTALLA.


IF VARIABLE_POS = 0.

VARIABLE_POS = 15.
VARIABLE_SCROLL = VARIABLE_SCROLL - 1.

ENDIF.

WRITE VARIABLE_POS TO VARIABLE_POS_N. " PASAMOS LA VARIABLE TIPO I A UNA TIPO N PARA QUE NOS DEJE HACER EL CONCATENATE
WRITE VARIABLE_SCROLL_N TO VARIABLE_SCROLL_N. ""


IF VARIABLE_SCROLL GT 0.
DO VARIABLE_SCROLL TIMES.

bdc_field 'BDC_OKCODE' '=P+'.

ENDOO.
ENDIF.


"EN MI CASO DEBIA CAMBIAR EL CAMPO STEUS AL VALOR ZAV3 DE UNA 'X' POSICION, PARA EL EJEMPLO LA POSICION 10

CONCATENATE 'STEUS(' VARIABLE_POS ')' INTO VARIABLE_FNAM.
CONDENSE VARIABLE_FNAM.

bdc_field VARIABLE_FNAM 'ZAV3'.


"Y CONTINUAS TU BATCH, ESTO LO USARAS PARA CADA QUE EN TU BATCH VEAS HA RECONOCIDO UNA POSICIÓN ENTRE ( ).
"AHORA, EL PROBLEMA ES CUANDO TU POSICION A CAMBIAR CORRESPONDA A NUMERO DE PANTALLAS DISTINTOS
"ES DECIR, LAS DOS ULTIMAS DE LA PRIMERA PANTALLA Y POR TANTO LAS DOS PRIMERAS DE LA SEGUNDA PANTALLA
"EN ESE CASO DEBES TRATAR POSICION POR POSICION DENTRO DEL MATERIAL
"ESTE EJEMPLO ES SOLO PARA UNA POSICION YA QUE EN TU CASO ES MODIFICAR 4

ENDLOOP.





********************************************
********** Si me da el tiempo te ayudo con el resto pero te podría ir adelantando que si tienes que modificar la posicion 25, 26, 27, 28 las trates como un batch independiente cada una. por tanto en una sola grabacion modifica 1 posicion y ese mismo hará para cada material. Es engorroso pero imagina que te toca modificar las posiciones 29, 30, 31 y 32 son distintos scroll por tanto no es simplemente saber desde ue posicion y que pantalla y mandar el resto.

OSEA ALGO ASI, SI SE QUE TENGO 32 CARACTERISTICAS Y POR TANTO TENGO QUE DE ESAS 32 LAS ULTIMAS 4 LE TENGO QUE CAMBIAR EL TEXTO HAGO LO SIGUIENTE.


LOOP AT T_MATERIALES INTO S_MATERIALES.
DONDE 32 ES EL NUMERO DE CARACTERISTICAS QUE TIENES POR MATERIAL.


VARIABLE = 32 - 3.

"aqui se resta 3 y daria un valor de 29, por tanto al entrar al DO 4 TIMES,
"se consumira 29, 30, 31, 32.


DO 4 TIMES.

(AQUI APLICAS TODA LA LOGICA EXPLICADA ANTES Y ESTARIAS TRATANDO
CADA VARIABLE COMO UNA INDIVIDUAL)

y al final de cada uno, a esa variable le restas 1,

VARIABLE_CARACTERISTICA = VARIABLE_CARACTERISTICA - 1.

ENDDO.

*con esto por cada material dentro de tu reporte tendrias 4 lineas del log, pero te asegurarias
*de que se apuntaron correctamente y no te de mucho problema el tema del scroll.

ENDLOOP.



suerte, si te dan un tiempo mas seria genial.


GUIA SHDB - CASO RECORDING TAMAÑO VENTANA STANDARD.

Primero, al momento de hacer la grabación marcar el check de tamaño estandard para que puedas ver dentro de la grabacion el scroll



Ahora en mi caso en el reporte tenia el numero de hoja de ruta y sub numero y el mensaje que iba a mostrar,  te dejo la captura por si necesitas saber el tamaño del texto (campo message).



Asi mismo en el mismo top se declaro las siguientes tablas y estructuras que servirian para el batch tanto los parametros a enviar como recepcionar.


en un batch anterior ya vimos lo que son macros en sap con la sentencia DEFINE esto hace que puedas reusar el como si fueran sub rutinas, y lineas abajo del bloque enmarcado ves
los valores que le asigno como parametros a la estructura gs_parameters que luego enviare al batch (en este caso enviamos un X a la variable de parametro defsize que hace que nuestro programa al llamar al batch se marque la opcion de tamaño estandar) de esta manera respetara lo que hayamos hecho en nuestra grabacion en cuanto a tamaño de ventana.


usando las macros es como usar sub rutinas, en la imagen de la grabacion del batch ves que el macro bdc_dynpro la uso cada que en el batch hace referencia a un numero de screen y bdc_field cuando hace referencia al resto, ya lo hemos visto antes.


una vez hecho todo y luego del call transaction se hace un read table a la tabla gs_messtab creada antes y se lee para aquello cuyo tipo de mensaje sea 'E' y de encontrarlo enviar los demas valores de ese registro de error y capturar el mensaje en la gs_reporte-message que luego agregare a mi tabla gt_reporte.


 recuerda que con cada call transaction debes refrescar la tabla gt_bdcdata y gt_messtab ya que estas cambian con cada grabación ese decir si por material vas a usar el batch , luego de cada loop refrescar estas tablas y hacer los mismos pasos ya que los valores del batch cambian asi como los resutlados.
 como ves en el codigo hay un else y se repite el llamado a la funcion para obtener el mensaje, se entendería que el caso contrario es cuando el tipo de mensaje es 'S' lo cual sería un proceso concluido.


Espero te ayude, tu puedes, saludos.

No olvides refrescar tus valores (Excepto los parametros que siempre se repiten) de la tabla bdc_data y messtab.


al igual que tu alv log puedes guardar numero de material y mensaje.


EJEMPLO:


LOOP AT TI_MATERIAL INTO ST_MATERIAL.

REFRESH  GT_ BDCDATA, GT_MESSTAB.

GS_REPORTE-MATERIAL = ST_MATERIAL-MATNR.


(LOGICA DEL BATCH)


GS_REPORTE-MESSAGE = (LO CAPTURADO DE LA FUNCION CON CADA BATCH)

APPEND GS_REPORTE TO GT_REPORTE.

ENDLOOP.