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.

viernes, 20 de octubre de 2017

ACTUALIZAR TABLA ESTANDARD (CUIDADO)

http://www.mundosap.com/foro/showthread.php?t=29522

hice lo siguiente:

DATA: it_bseg TYPE TABLE OF bseg,
wa_bseg TYPE bseg.

IF BSEG-ZFBDT IS INITIAL.

* si el campo es vacio que no haga nada, de lo contrario me modifica el
* campo y lo guarda vacio.

ELSE.

SELECT SINGLE * 
FROM bseg
INTO wa_bseg "selecciono la posicion a modificar segun las condiciones
WHERE bukrs = payr-zbukr
AND belnr = payr-vblnr
AND gjahr = payr-gjahr
AND bschl = '39'
AND umskz = 'R'.

IF sy-subrc = 0.

wa_bseg-zfbdt = BSEG-ZFBDT. "copio de la screen a la WA
MODIFY bseg FROM wa_bseg. "grabo los cambios a la tabla BSEG

ENDIF.
ENDIF.

Para en caso sea mas de un registro, si quieres actualizar toda una tabla del registro
cambias el select...

INTO TABLE it_bseg


y en el modify usas el FROM TABLE
MODIFY bseg FROM TABLE it_bseg.

habiendo ya hecho los cambios a los campos de esa tabla it_bseg

viernes, 25 de agosto de 2017

APPEND MARA y CAMPO Z con AYUDA DE BUSQUEDA

La pagina de SAP dice que se puede hacer append directo y de paso te dice en que estructura hacerlo tambien por si quieren usar la bapi (en tu caso solo la MARA).

https://wiki.scn.sap.com/wiki/display/Snippets/How+to+append+MARA+and+call+BAPI_MATERIAL_SAVEDATA

Debes tener siempre primero el elemento de datos Z que tendrá tu nuevo campo ya que lo asignaras al campo que agregues.

Vas a la SE11 y le das clic a append, y en la hoja de nuevo para agregar una nueva estructura le ingresas el nombre y te llevara a otra pantalla donde agregaras el campo nuevo y en elemento de datos el que creaste, tener en cuenta que por practicas se pone al campo nuevo ZZ adelante de tal manera que se reconoce es de un append.


Una vez que actives todo demorara un poco ya que debe procesar todas las tablas relacionadas.


El nombre que llevara la estructura append

Aqui puedes ver como se guardo tu nombre

Una vez activado veras en primera el nombre de tu append y debajo el campo que agregaste,
no olvides crear tu elemento Z.

Ahora, para ese campo Z hay dos maneras de hacerle una ayuda de busqueda, te explicaré por aquí la más rapida en cuanto me de tiempo explico la segunda.


La primera consiste en que si la ayuda de busqueda tendrá valores fijos (que el usuario no manejara y se quedaran asi hasta un nuevo ticket, osea no necesite ayuda de busqueda) se creara la propiedad de busqueda a través del dominio.

En tu campo Z tienes un elemento de datos Z creado pero este  a su vez debe estar basado en un Dominio Z, y dentro del dominio en la pestaña ambito de valores tendrás la opcion de agregar valga redundancia valores los cuales cuando useas ese campo de la mara te aparecera el matchcode y al darle los valores que hayas ingresado a través del dominio Z.

Ves que tienes tu elemento de datos Z y tiene un dominio Z


Ese dominio Z tiene un tipo de dato pero en la pestaña ambito val.



Tiene valores los cuales se presentaran en el matchcode.

Ojo en caso los usuarios quieran modificar cada que puedan los valores del matcchcode se tendría que agregar una tabla z adicional y hacerle una vista cosa que el campo de la MARA agregado tenga relacionado esa ayuda de busqueda, algo más complicado. Pero depende de lo que requiera el usuario.

Exitos!!


martes, 22 de agosto de 2017

viernes, 18 de agosto de 2017

REPORTE DE STOCK - PGM


web donde esta el txt. con el código

https://www.dropbox.com/s/e8xnuhgm5bdebwo/reporte%20stock.txt?dl=0

imagenes del reporte





viernes, 11 de agosto de 2017

Guía Implementación Ampliación IWO10018 (ACTUALIZADO)

2:10 PM

Encontré esta página esta en inglés pero mira las imagenes de abajo

https://archive.sap.com/discussions/thread/3764254

la segunda página se ve (en ingles) que agregaron un campo en lo que parece pestaña adicionales

https://archive.sap.com/discussions/thread/3841016

https://archive.sap.com/discussions/thread/2069743


hay que seguir revisando, dale un ojo a la cmod, en tu caso busca esta ampliación CV110001 (en mi caso es la IWO10018 -segunda imagen-) mira las imagenes para que busques en la cmod.
si es similar debe haber un proyecto con esa ampliación y solo te quedaría hacer el append y dibujar en la tabla mira la imagen de mi dynpro mas abajo, ten en cuenta que pongo AUFK-ZZKILOMETRAJE porque ya esta agregado en mi tabla AUFK dentro de la estructura CI_AUFK y al ponerlo como nombre de mi FIELD en la dynpro reconocerá el campo y se ajustará.




-------------------------------------------------------------------------------------------------------
-------------------------------------------------------------------------------------------------------

1:30 PM

Te comparto la URL que me guio, esta entendible practicamente me guio al 90%
espero en tu caso sea similar solo que con otra exit y encontremos una guia, pero insisto
deberia haber documentacion de lo que hizo omnia porque sino así toda la vida dependeran de lo que ellos hicieron, deberías comentarle creo yo eso a carol cosa que ella ve si los llama de nuevo o no porque ya tienen la documentacion completa y uds mismos pueden hacer los cambios o revertirlos.

https://blogs.sap.com/2014/04/20/iwo10018-user-fields-in-maintenance-order/

Antes te comento lo que verás a continuación,

1. Me dieron la tabla AUFK que es donde debía agregar los campos Z, primero creo elemento de datos y luego busqué la estructura dentro de la AUFK la CI_AUFK que es donde me permitia agregar nuevos campos, campos personalizados, campos Z.




Se recomienda que los campos le pongas dos ZZ adelante o como lo hayan agregado.
En tu caso como ya hay un campo Z en la tabla / estructura que se declaro ese dato ahí deberías modificar nada mas y agregar lo que te piden.

2. Una vez agregado le di a activar y demora un poco porque compila no solo la estructura con el campo Z sino todas las tablas que dependen de esta estructura como la AUFK y otras. Y en lo que demora activar como aun estaban haciendo pruebas en desarrollo 110 algunos procesos se caian (DUMP) porque la aufk estaba siendo tratada. En tu caso no creo ocurra porque todos trabajan o bien QAS o PRD.

3. Luego en la CMOD cree un proyecto Z  tal como muestran en la pagina web en mi caso era un ZPM0001, Z por ser Z, PM que es el modulo y 0001 el primer proyecto. En tu caso si fuera todo similar debería haber tambien un proyecto Z en la CMOD, puedes buscarlo con el matchcode con Z* y ver si por ahi alguien dejo en la descripción algo que se relacione.

4. Luego una vez creado en el proyecto le asigne la ampliación IWO10018 (esta ampliación es explicitamente para campos dentro de la tx IW31, IW32 etc, hay otras ampliaciones para las mismas transacciones pero que son para otros procesos) que fue la que me pasaron, en tu caso como te comente si es el mismo procedimiento ya debería tener agregado esta ampliación o la que le corresponda.




5. Luego en componentes  estarían los exits permitidos para esa ampliación, pueden haber exits de funciones que en teoría dependiendo de la ampliación te servirán, en mi caso las dos exit de funcion que me pasaron solo las use para que pasen los campos de mi pestaña a la aufk. igualmente te habilitan una exit de pantalla que es donde creas la dynpro.



la otra exit de funcion es similar, en la web te explican, ese es todo el codigo mas que todo para que lo de mi dynpro z se pase a donde debería ir, claro puedo agregarle mas cosas, las estructuras que importan estas exits por ejemplo (COCI_AUFK_IMP) deberia traer los demas datos de la orden en general.

6. la otra exit que es de pantalla te permite crear una dynpro y en ella dibujas tus campos Z en tu caso esta en caso sea todo similar debería repetir el procedimiento.



y ya con eso funcionó y otros pasos que en la web te explican. buscaré más detalle de lo que te dieron a ver si encuentro algo.


tu puedes , exitos



domingo, 16 de julio de 2017

BLOQUES OCULTOS PANTALLA SELECCIÓN - EJEMPLO

El siguiente ejemplo muestra como crear un bloque dentro de otro de pantalla de selección y a su vez sea visible o no dependiendo del radio button escogido. Al igual que se hizo para generar este ejemplo se recomienda tener un pgm ZPRUEBA como obj. local para futuros ejemplos.

(link descarga código, igual esta abajo)

modelo pantalla selección

textos parámetros y radio buttons

código

*&---------------------------------------------------------------------*
*& Report  ZPRUEBA
*&
*&---------------------------------------------------------------------*
*&
*&
*&---------------------------------------------------------------------*

REPORT  zprueba.

TABLES: bsid,
vbrk.

"BLOQUE PRINCIPAL
SELECTION-SCREEN BEGIN OF BLOCK b1 WITH FRAME TITLE text-t01.

PARAMETERS:
r_a RADIOBUTTON GROUP r1 USER-COMMAND rbut DEFAULT 'X',
r_b RADIOBUTTON GROUP r1.

"BLOQUE A
SELECTION-SCREEN BEGIN OF BLOCK b2 WITH FRAME TITLE text-t02.
PARAMETERS:
r_a1 RADIOBUTTON GROUP r2 USER-COMMAND rbut DEFAULT 'X' MODIF ID zz1,
r_a2 RADIOBUTTON GROUP r2 MODIF ID zz1.

"BLOQUE A.1
SELECTION-SCREEN BEGIN OF BLOCK b4 WITH FRAME TITLE text-t04.
PARAMETERS:p_a10 TYPE bsid-bukrs MODIF ID za1,
 p_a11 TYPE bsid-bukrs MODIF ID za1,
 p_a12 TYPE bsid-bukrs MODIF ID za1.
SELECTION-SCREEN END OF BLOCK b4.

"BLOQUE A.2
SELECTION-SCREEN BEGIN OF BLOCK b5 WITH FRAME TITLE text-t05.
PARAMETERS:p_a20 TYPE bsid-bukrs MODIF ID za2,
 p_a21 TYPE bsid-bukrs MODIF ID za2.
SELECTION-SCREEN END OF BLOCK b5.

SELECTION-SCREEN END OF BLOCK b2.

"BLOQUE B
SELECTION-SCREEN BEGIN OF BLOCK b3 WITH FRAME TITLE text-t03.
PARAMETERS:
r_b1 RADIOBUTTON GROUP r3 USER-COMMAND rbut DEFAULT 'X' MODIF ID zz2,
r_b2 RADIOBUTTON GROUP r3 MODIF ID zz2.

"BLOQUE B.1
SELECTION-SCREEN BEGIN OF BLOCK b6 WITH FRAME TITLE text-t06.
PARAMETERS:p_b10 TYPE bsid-bukrs MODIF ID zb1,
 p_b11 TYPE bsid-bukrs MODIF ID zb1.
SELECTION-SCREEN END OF BLOCK b6.

"BLOQUE B.2
SELECTION-SCREEN BEGIN OF BLOCK b7 WITH FRAME TITLE text-t07.
PARAMETERS:p_b20 TYPE bsid-bukrs MODIF ID zb2,
 p_b21 TYPE bsid-bukrs MODIF ID zb2,
 p_b22 TYPE bsid-bukrs MODIF ID zb2.
SELECTION-SCREEN END OF BLOCK b7.

SELECTION-SCREEN END OF BLOCK b3.




SELECTION-SCREEN END OF BLOCK b1.

AT SELECTION-SCREEN OUTPUT.
  PERFORM ocultar_campos.

*&---------------------------------------------------------------------*
*&      Form  ocultar_campos
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
FORM ocultar_campos.

  "INPUT 0 = NO EDITABLE
  "INPUT 1 = EDITABLE
  "INVISIBLE 0 = VISIBLE
  "INVISIBLE 1 = NO VISIBLE

  IF r_a EQ 'X' AND r_a1 EQ 'X'"BLOQUE A

    LOOP AT SCREEN.

      IF screen-group1 = 'ZZ2'.
        screen-INPUT = 0.
        screen-invisible = 1.
        MODIFY SCREEN.
      ENDIF.

      IF screen-group1 = 'ZA2'.
        screen-INPUT = 0.
        screen-invisible = 1.
        MODIFY SCREEN.
      ENDIF.

      IF screen-group1 = 'ZB1'.
        screen-INPUT = 0.
        screen-invisible = 1.
        MODIFY SCREEN.
      ENDIF.
      IF screen-group1 = 'ZB2'.
        screen-INPUT = 0.
        screen-invisible = 1.
        MODIFY SCREEN.
      ENDIF.
    ENDLOOP.

  ELSEIF r_a EQ 'X' AND r_a2 EQ 'X'"BLOQUE A

    LOOP AT SCREEN.

      IF screen-group1 = 'ZZ2'.
        screen-INPUT = 0.
        screen-invisible = 1.
        MODIFY SCREEN.
      ENDIF.

      IF screen-group1 = 'ZA1'.
        screen-INPUT = 0.
        screen-invisible = 1.
        MODIFY SCREEN.
      ENDIF.

      IF screen-group1 = 'ZB1'.
        screen-INPUT = 0.
        screen-invisible = 1.
        MODIFY SCREEN.
      ENDIF.

      IF screen-group1 = 'ZB2'.
        screen-INPUT = 0.
        screen-invisible = 1.
        MODIFY SCREEN.
      ENDIF.
    ENDLOOP.


  ELSEIF r_b EQ 'X' AND r_b1 EQ 'X'"BLOQUE B
    LOOP AT SCREEN.
      IF screen-group1 = 'ZZ1'.
        screen-INPUT = 0.
        screen-invisible = 1.
        MODIFY SCREEN.
      ENDIF.

      IF screen-group1 = 'ZB2'.
        screen-INPUT = 0.
        screen-invisible = 1.
        MODIFY SCREEN.
      ENDIF.

      IF screen-group1 = 'ZA1'.
        screen-INPUT = 0.
        screen-invisible = 1.
        MODIFY SCREEN.
      ENDIF.

      IF screen-group1 = 'ZA2'.
        screen-INPUT = 0.
        screen-invisible = 1.
        MODIFY SCREEN.
      ENDIF.

    ENDLOOP.

  ELSEIF r_b EQ 'X' AND r_b2 EQ 'X'.

    LOOP AT SCREEN.
      IF screen-group1 = 'ZZ1'.
        screen-INPUT = 0.
        screen-invisible = 1.
        MODIFY SCREEN.
      ENDIF.

      IF screen-group1 = 'ZB1'.
        screen-INPUT = 0.
        screen-invisible = 1.
        MODIFY SCREEN.
      ENDIF.

      IF screen-group1 = 'ZA1'.
        screen-INPUT = 0.
        screen-invisible = 1.
        MODIFY SCREEN.
      ENDIF.

      IF screen-group1 = 'ZA2'.
        screen-INPUT = 0.
        screen-invisible = 1.
        MODIFY SCREEN.
      ENDIF.
    ENDLOOP.
  ENDIF.
ENDFORM" OCULTAR_CAMPOS


viernes, 14 de julio de 2017

Radio Button ocultar campos

PRIMER EJEMPLO:

https://www.google.com.pe/amp/s/abapers.wordpress.com/2016/03/15/mostrar-u-ocultar-campos-en-pantalla-de-seleccion/amp/


SEGUNDO EJEMPLO:

https://luislokox.wordpress.com/2012/11/08/mostrar-y-ocultar-campos-con-radiobuttons-abap/

Este ejemplo es más completo, de la misma página

https://luislokox.wordpress.com/2012/11/08/mostrar-y-ocultar-bloques-con-radiobuttons-abap/


tu puedes!

lunes, 22 de mayo de 2017

LUNES 22/05/2017

Enlace dropbox:
https://www.dropbox.com/sh/3a3k4tv01bmqkl5/AADJ5-Bd-PjCSxRfOSyoPNhUa?dl=0 


Se tienen dos grabaciones una con clase libre (Clase 9A00) y otra del ejemplo anterior, semana pasada. La primera con campo de nro. de orden libre y buscando generar el error de al procesar batch input desde la misma SM35 no jala los datos.

Para probar esto se va a la transacción SM35 y sobre la grabación se da click a procesar -> luego enter ->



nos llevará a la transacción tal cuál como si fueramos a crearla pero con los datos que usamos en la grabación inicial -> para esto solo se le da ENTER (la idea no es volver a llenar algún dato) seguidamente para ver como van jalando los datos que luego serán variables según nuestro RFC. Pero veamos dos casos donde usamos este botón PROCESAR:

1er caso... Se ingreso nuevamente al mandante cerrando nuestra sesión anterior, esta nueva sin haber ingresado o usado la transacción KO01 como se ve en imagenes al procesar la grabación te pide la sociedad CO la cuál nuestra grabación si contempla, ya que la hicimos en la sesión anterior. Te darás cuenta que los datos los jala sin problema alguno conforme se va dando enter (salvo el nro. de Orden que se explicará luego...)


2do caso... 
Se ejecuto la primera grabación con el botón procesar sin problema alguno (haciendo los cambios en el numero de orden que se explicará luego), luego el resto de los datos los jalo de la grabación modelo. Ahora sin salir de la sesión se vuelve a ejecutar la grabación desde la SM35 (tener en cuenta que para este momento la sociedad CO ya se fijo) y como se observa la pantalla siguiente, de los datos de la orden se quedaron en blanco, no se llenaron... el problema? se salto la dynpro de la sociedad CO.

Nuestro batch invoca a la pantalla pero SAP al no necesitarla crea un conflicto y ocurre lo ya mencionado.




Solución
Se encontró en la siguiente web una solución para hacer nuestro batch input dinámico, de manera que reconozca cuando el campo CO este fijado y de ser así se salte el bloque seleccionado en la imagen anterior del batch.

http://foros.consultoria-sap.com/t/problemas-con-batch-input-y-ventanas-dinamicas/3303/10



Como se observa se condiciona el bloque del llenado de la sociedad CO en caso este pre-fijado o no. Para el caso de la imagen se mantiene en la sesión de la nueva grabación por tanto ya esta fijado y se saltará dicho bloque.



Haciendo así, como se observa, que los datos del batch se jalen sin problemas. Ahora, tener en cuenta que el número de orden te lo reconoce en más de una vez por tanto se deberá considerar como dato a ingresar cuantas veces el batch lo registre.




Recomendaciones:
El pgm / función ya lo tienes preparado por tanto solo te quedaría añadir la parte de la lógica sombreada, al lado izquierdo tenemos el pgm creado por la SM35 y a la derecha el acondicionado con macros. La variable es creada al inicio de la función, antes del LOOP.

DATA: LV_KOKRS TYPE AUFK-KOKRS.
El código esta en el dropbox de igual manera y líneas más abajo.


éxitos, tu puedes!


FUNCTION ZPRUEBA_ORDEN_TRABAJO.
*"----------------------------------------------------------------------
*"*"Interfase local
*"  IMPORTING
*"     REFERENCE(PO_ORDENT) TYPE  ZAC_LORDENT
*"  EXPORTING
*"     REFERENCE(MESSAGE) TYPE  LS_MSG
*"----------------------------------------------------------------------
DATA: WA_LORDENT LIKE LINE OF PO_ORDENT.
*----------------------------------------------------------------------*
* DEFINICIONES PARA BATCH INPUT
*----------------------------------------------------------------------*
DATA: I_MSGBI      LIKE BAPIRET2 OCCURS 0 WITH HEADER LINE.
DATA: OPT          TYPE CTU_PARAMS.
DATA: I_LOG_HANDLE TYPE BALLOGHNDL.

DATABEGIN OF BDCDATA OCCURS 0.
        INCLUDE STRUCTURE BDCDATA.
DATAEND OF BDCDATA.

DATABEGIN OF MESSTAB OCCURS 10.
        INCLUDE STRUCTURE BDCMSGCOLL.
DATA END OF MESSTAB.

DATA: WA_PARAMETERS TYPE CTU_PARAMS.
DATA: WA_MESSTAB LIKE LINE OF MESSTAB.

DATA: LV_MESSAGE(250TYPE C,
      LV_MESSAGE_AUX(250TYPE C.
DATA: LV_AUFNR TYPE AUFK-AUFNR.
DATA: LV_USER7(10TYPE C.
DATA: LV_PROZS(6TYPE C.
DATA: LV_KOKRS TYPE AUFK-KOKRS.

            DATA: LV_CTU TYPE APQI-PUTACTIVE VALUE 'X'.
            DATA: LV_MODE TYPE APQI-PUTACTIVE VALUE 'N'.
            DATA: LV_UPD TYPE APQI-PUTACTIVE VALUE 'S'.
            DATA: GS_MESSTAB LIKE LINE OF MESSTAB.

            WA_PARAMETERS-DISMODE  = 'N'.
            WA_PARAMETERS-UPDMODE  = 'L'.
            WA_PARAMETERS-RACOMMIT = 'X'.
*----------------------------------------------------------------------*
*BDC_DYNPRO
*  CLEAR BDCDATA.
*  BDCDATA-PROGRAM  = PROGRAM.
*  BDCDATA-DYNPRO   = DYNPRO.
*  BDCDATA-DYNBEGIN = 'X'.
*  APPEND BDCDATA.

*BDC_FIELD
*  CLEAR BDCDATA.
*  BDCDATA-FNAM = FNAM.
*  BDCDATA-FVAL = FVAL.
*  APPEND BDCDATA.

DEFINE BDC_DYNPRO.
CLEAR BDCDATA.
BDCDATA-PROGRAM  = &1.
BDCDATA-DYNPRO   = &2.
BDCDATA-DYNBEGIN = &3.
APPEND BDCDATA.
END-OF-DEFINITION.

DEFINE BDC_FIELD.
CLEAR BDCDATA.
BDCDATA-FNAM = &1.
BDCDATA-FVAL = &2.
APPEND BDCDATA.
END-OF-DEFINITION.

LOOP AT PO_ORDENT INTO WA_LORDENT.
*----------------------------------------------------------------------*
* VALIDACIÓN EXISTENCIA ORDEN
*----------------------------------------------------------------------*
SELECT SINGLE AUFNR
  INTO LV_AUFNR
  FROM AUFK
  WHERE AUART EQ WA_LORDENT-AUART "Clase Orden
    AND AUTYP EQ WA_LORDENT-AUTYP "Tipo de Orden / por lo general amarrada a la Clase de Orden
    AND AUFEX EQ WA_LORDENT-AUFNR.
  IF LV_AUFNR IS NOT INITIAL.
          CONCATENATE 'Orden' WA_LORDENT-AUFNR
          'relacionada a Orden SAP: ' LV_AUFNR INTO
          LV_MESSAGE SEPARATED BY SPACE.
          MOVE LV_MESSAGE TO MESSAGE.
  CONTINUE.
  ELSE.
*----------------------------------------------------------------------*
* LLENADO BATCH INPUT
*----------------------------------------------------------------------*
            REFRESH : BDCDATA, MESSTAB.
            CLEAR   : BDCDATA, MESSTAB.
            CLEAR   : LV_MESSAGE, LV_MESSAGE_AUX.
            CLEAR     LV_USER7.
            CLEAR     LV_PROZS.

CONCATENATE WA_LORDENT-USER7+6(2)
            WA_LORDENT-USER7+4(2)
            WA_LORDENT-USER7+0(4)
            INTO LV_USER7 SEPARATED BY '.'.
WRITE WA_LORDENT-PROZS TO LV_PROZS.
CONDENSE LV_PROZS.

BDC_DYNPRO 'SAPMKAUF' '0100' 'X'.
BDC_FIELD 'BDC_CURSOR' 'COAS-AUART'.
BDC_FIELD 'BDC_OKCODE' '/00'.
BDC_FIELD 'COAS-AUART' WA_LORDENT-AUART.

*22.05.2017
CLEAR LV_KOKRS.
GET PARAMETER ID 'CAC' FIELD LV_KOKRS.
IF LV_KOKRS IS INITIAL.
BDC_DYNPRO 'SAPLSP04' '0300' 'X'.
BDC_FIELD 'BDC_CURSOR' 'SVALD-VALUE(01)'.
BDC_FIELD 'BDC_OKCODE' '=FURT'.
BDC_FIELD 'SVALD-VALUE(01)' 'EICL'.
ENDIF.
*22.05.2017

BDC_DYNPRO 'SAPMKAUF' '0600' 'X'.
BDC_FIELD 'BDC_OKCODE' '=BUT2'.
BDC_FIELD 'COAS-KTEXT' WA_LORDENT-KTEXT.
BDC_FIELD 'COAS-BUKRS' WA_LORDENT-BUKRS.
BDC_FIELD 'COAS-WERKS' WA_LORDENT-WERKS.
BDC_FIELD 'COAS-SCOPE' 'GG'"Gastos Generales "FIJO
BDC_FIELD 'COAS-PRCTR' WA_LORDENT-PRCTR.
BDC_FIELD 'COAS-KOSTV' WA_LORDENT-KOSTV.
BDC_FIELD 'COAS-AKSTL' WA_LORDENT-AKSTL.
BDC_FIELD 'COAS-ABUKR' WA_LORDENT-ABUKR.
BDC_FIELD 'COAS-AUFEX' WA_LORDENT-AUFNR. "Es la orden externa, que viene del otro sistema
*Antes de pasar a otra dynpro aquí se podría agregar otro campo de la misma dynpro, ejm División por ejemplo
*y lo mismo con otros campos que se encuentren dentro de un grupo de dynpro
*BDC_FIELD 'COAS-GSBER' WA_LORDENT-GSBER.
BDC_DYNPRO 'SAPMKAUF' '0600' 'X'.
BDC_FIELD 'BDC_OKCODE' '=BUT4'"Pestañas
BDC_FIELD 'COAS-WAERS' WA_LORDENT-WAERS. "Por lo general ya arrastra del sistema
BDC_DYNPRO 'SAPMKAUF' '0600' 'X'.
BDC_FIELD 'BDC_OKCODE' '=ABVO'.
BDC_FIELD 'COAS-USER0' WA_LORDENT-USER0.
BDC_FIELD 'COAS-USER2' WA_LORDENT-USER2.
BDC_FIELD 'COAS-USER6' WA_LORDENT-USER6.
BDC_FIELD 'COAS-USER7' LV_USER7.
BDC_FIELD 'COAS-USER9' 'X'.
BDC_DYNPRO 'SAPLKOBS' '0130' 'X'.
BDC_FIELD 'BDC_CURSOR' 'COBRB-EXTNR(01)'.
BDC_FIELD 'BDC_OKCODE' '/00'.
BDC_FIELD 'COBRB-KONTY(01)' WA_LORDENT-KONTY.
BDC_FIELD 'DKOBR-EMPGE(01)' WA_LORDENT-EMPGE.
BDC_FIELD 'COBRB-PROZS(01)' LV_PROZS.
BDC_FIELD 'COBRB-PERBZ(01)' WA_LORDENT-PERBZ.
BDC_FIELD 'COBRB-EXTNR(01)' WA_LORDENT-EXTNR.
BDC_DYNPRO 'SAPLKOBS' '0130' 'X'.
BDC_FIELD 'BDC_CURSOR' 'COBRB-KONTY(01)'.
BDC_FIELD 'BDC_OKCODE' '=SICH'.
*----------------------------------------------------------------------*
* EJECUCIÓN BATCH INPUT
*----------------------------------------------------------------------*
     CALL TRANSACTION 'KO01'
            USING  BDCDATA
            OPTIONS FROM WA_PARAMETERS
            MESSAGES INTO MESSTAB.
*----------------------------------------------------------------------*
* RECEPCIÓN MENSAJE
*----------------------------------------------------------------------*
IF MESSTAB[] IS NOT INITIAL"El batch input arrojo un mensaje
  READ TABLE  MESSTAB INTO GS_MESSTAB
  WITH KEY MSGTYP = 'S'
           MSGID = 'KO'
           MSGNR = 107.
  IF SY-SUBRC EQ 0"Encontró el mensaje que confirma creación
    CONCATENATE 'Se creo Orden CO SAP : ' GS_MESSTAB-MSGV1
    'para la Orden' WA_LORDENT-AUFNR
    INTO LV_MESSAGE
    SEPARATED BY space.
    MOVE LV_MESSAGE TO MESSAGE.
  ELSE"Lee el primer error
    READ TABLE  MESSTAB INTO GS_MESSTAB
    WITH KEY MSGTYP = 'E'.
      IF SY-SUBRC EQ 0.
          CALL FUNCTION 'MESSAGE_TEXT_BUILD'
            EXPORTING
              MSGID                     = GS_MESSTAB-MSGID
              MSGNR                     = GS_MESSTAB-MSGNR
              MSGV1                     = GS_MESSTAB-MSGV1
              MSGV2                     = GS_MESSTAB-MSGV2
              MSGV3                     = GS_MESSTAB-MSGV3
              MSGV4                     = GS_MESSTAB-MSGV4
            IMPORTING
             MESSAGE_TEXT_OUTPUT       = LV_MESSAGE.
             MOVE LV_MESSAGE TO MESSAGE.
*          IF SY-SUBRC <> 0. "No se genero el mensaje de la tx
*          CONCATENATE
*          'No se generó la Orden CO SAP para la orden '
*          WA_LORDENT-AUFNR
*          INTO LV_MESSAGE
*          SEPARATED BY SPACE.
*          MOVE LV_MESSAGE TO MESSAGE.
*          ELSE.
*          CONCATENATE 'Error SAP: ' LV_MESSAGE INTO
*          LV_MESSAGE SEPARATED BY SPACE.
*          MOVE LV_MESSAGE TO MESSAGE.
*          ENDIF.
      ELSE"Cualquier otro mensaje que no creo orden y no es tipo 'E'
*          CONCATENATE
*          'No se generó la Orden CO SAP para la orden '
*          WA_LORDENT-AUFNR
*          INTO LV_MESSAGE
*          SEPARATED BY SPACE.
*          MOVE LV_MESSAGE TO MESSAGE.
        READ TABLE  MESSTAB INTO GS_MESSTAB INDEX 1.
            CALL FUNCTION 'MESSAGE_TEXT_BUILD'
            EXPORTING
              MSGID                     = GS_MESSTAB-MSGID
              MSGNR                     = GS_MESSTAB-MSGNR
              MSGV1                     = GS_MESSTAB-MSGV1
              MSGV2                     = GS_MESSTAB-MSGV2
              MSGV3                     = GS_MESSTAB-MSGV3
              MSGV4                     = GS_MESSTAB-MSGV4
            IMPORTING
             MESSAGE_TEXT_OUTPUT       = LV_MESSAGE.

            READ TABLE  MESSTAB INTO GS_MESSTAB INDEX 2.
            IF sy-subrc EQ 0.
            CALL FUNCTION 'MESSAGE_TEXT_BUILD'
            EXPORTING
              MSGID                     = GS_MESSTAB-MSGID
              MSGNR                     = GS_MESSTAB-MSGNR
              MSGV1                     = GS_MESSTAB-MSGV1
              MSGV2                     = GS_MESSTAB-MSGV2
              MSGV3                     = GS_MESSTAB-MSGV3
              MSGV4                     = GS_MESSTAB-MSGV4
            IMPORTING
             MESSAGE_TEXT_OUTPUT       = LV_MESSAGE_AUX.
            ENDIF.

            CONCATENATE LV_MESSAGE LV_MESSAGE_AUX INTO LV_MESSAGE SEPARATED BY SPACE.
            MOVE LV_MESSAGE TO MESSAGE.
      ENDIF.
      "OJO!
      "En esta parte del codigo puede ingresarse la logica para guardar todo dentro de una tabla Z
      "ya que dentro de este ELSE es que se indica que no se generó la Orden CO
ENDIF.
ENDIF.
ENDIF"Validación existencia Orden Externa
ENDLOOP.
ENDFUNCTION.