lunes, 15 de abril de 2019

ejemplo SELECTION SCREEN DINAMICA

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


*&---------------------------------------------------------------------*
*& Report ZPRUEBA
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
REPORT zprueba.

DATAl_bloqueo  TYPE c,
      l_mantener TYPE c.

* Estructura para MATCHCODE
TYPESBEGIN OF gty_match,
         shlpname  LIKE ddshretval-shlpname,
         fieldname LIKE ddshretval-fieldname,
         recordpos LIKE ddshretval-recordpos,
         fieldval  LIKE ddshretval-fieldval,
         retfield  LIKE ddshretval-retfield,
       END OF gty_match.

* Estructura para Valores MATCHCODE
TYPESBEGIN OF lty_guia,
         nguia TYPE zmme_nrguia,
       END OF lty_guia,

* Estructura para datos internos a llenar según lo que escoga en
* MATCHCODE
* El campo EBELN decidirá si mi segundo bloque de campos se habilitará
* o no

       BEGIN OF lty_data,
         nguia TYPE zmme_nrguia,
         stcd1 TYPE stcd1,
         placa TYPE LENGTH 7,
         ebeln TYPE ebeln,
       END OF lty_data.

DATAltd_guia TYPE STANDARD TABLE OF lty_guia,
      ltd_data TYPE STANDARD TABLE OF lty_data,
      lwa_data TYPE lty_data.
DATA gtd_match TYPE TABLE OF gty_match.

* Tabla para actualizar valores DYNPRO
DATAlf_hierid     TYPE wrf_hier_cnt,
      lt_dynpfields TYPE TABLE OF dynpread WITH HEADER LINE.

*BLOQUE 1
SELECTION-SCREEN BEGIN OF BLOCK b02 WITH FRAME TITLE TEXT-b02.
PARAMETERSp_nguia TYPE zmmt_guia-nguia,
            p_stcd1 TYPE zmmt_guia-stcd1 MODIF ID nd,
            p_placa TYPE zmmt_guia-placa MODIF ID nd.
SELECTION-SCREEN END OF BLOCK b02.

*BLOQUE 2
SELECTION-SCREEN BEGIN OF BLOCK b01 WITH FRAME TITLE TEXT-b02.
PARAMETERSp_ebeln TYPE ebeln MODIF ID b1,
            p_usnam TYPE usnam MODIF ID b1,
            p_femod TYPE datum MODIF ID b1.
SELECTION-SCREEN END OF BLOCK b01.

*PBO
AT SELECTION-SCREEN OUTPUT.
  LOOP AT SCREEN.
*L_BLOQUEO DOBLE FUNCION: SI ENCONTRO DATOS
    IF l_bloqueo IS INITIAL.
      IF screen-group1 EQ 'B1'.
        screen-input 0.
        MODIFY SCREEN.
      ENDIF.
    ENDIF.
    IF l_mantener IS NOT INITIAL.
      IF screen-group1 EQ 'ND'.
        screen-input 0.
        MODIFY SCREEN.
      ENDIF.
    ENDIF.
  ENDLOOP.

AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_nguia.
  REFRESHgtd_match.

  SELECT nguia
    INTO TABLE ltd_guia
    FROM zmmt_guia
    WHERE bukrs EQ 1000
    AND pguia EQ 002.

  CALL FUNCTION 'F4IF_INT_TABLE_VALUE_REQUEST'
    EXPORTING
      retfield     'NGUIA'
      dynpprog     sy-repid
      dynpnr       sy-dynnr
      dynprofield  'P_NGUIA'
      window_title 'Guia'
      value_org    'S'
    TABLES
      value_tab    ltd_guia
      return_tab   gtd_match.

  READ TABLE gtd_match ASSIGNING FIELD-SYMBOL(<g_match>INDEX 1.
  IF sy-subrc EQ 0.
    p_nguia <g_match>-fieldval.

*VARIABLE QUE MANTENDRA CAMPOS PRIMER BLOQUE NO EDITABLE
*AL HABER ENCONTRADO DATA

    l_mantener abap_true.

    SELECT SINGLE nguia stcd1 placa ebeln
            INTO lwa_data
            FROM zmmt_guia
            WHERE bukrs EQ 1000
        AND pguia EQ 002
            AND nguia EQ p_nguia.

    IF sy-subrc IS INITIAL.
*SE PROCEDE A LLENAR EL RESTO DE CAMPOS DEL BLOQUE 1 PARA
*LLENARLO CON LOS VALORES ENCONTRADOS
      lt_dynpfields-fieldname 'P_STCD1'.
      lt_dynpfields-fieldvalue lwa_data-stcd1.
      APPEND lt_dynpfields.

      lt_dynpfields-fieldname 'P_PLACA'.
      lt_dynpfields-fieldvalue lwa_data-placa.
      APPEND lt_dynpfields.

      CALL FUNCTION 'DYNP_VALUES_UPDATE'
        EXPORTING
          dyname               sy-repid
          dynumb               sy-dynnr
        TABLES
          dynpfields           lt_dynpfields
        EXCEPTIONS
          invalid_abapworkarea 1
          invalid_dynprofield  2
          invalid_dynproname   3
          invalid_dynpronummer 4
          invalid_request      5
          no_fielddescription  6
          undefind_error       7
          OTHERS               8.

      LOOP AT SCREEN.
        IF screen-group1 EQ 'ND'.
          screen-input 0.
          MODIFY SCREEN.
        ENDIF.
      ENDLOOP.

*EBELN FUNCIONARA COMO DISPARADOR DE ENCONTRAR LLENO
*ACTIVARA LOS DATOS DEL SEGUNDO BLOQUE

      IF lwa_data-ebeln IS NOT INITIAL.
*FLAG PERMITIRA MANTENER DESBLOQUEADO SI ENCONTRO DATO EN EBEL,
*FALTA CASO CONTRARIO EN CASO NO ENCUENTRE.

        l_bloqueo abap_true.

        LOOP AT SCREEN.
          IF screen-group1 EQ 'B1'.
            screen-input 1.
            MODIFY SCREEN.
          ENDIF.
        ENDLOOP.

        lt_dynpfields-fieldname 'P_EBELN'.
        lt_dynpfields-fieldvalue lwa_data-ebeln.
        APPEND lt_dynpfields.

*SE AÑADE EL RESTO DE CAMPOS DEL BLOQUE 2 PARA QUE EN UNA SEGUNDA PASADA
*SE REFRESQUEN

        lt_dynpfields-fieldname 'P_USNAM'.
        lt_dynpfields-fieldvalue space.
        APPEND lt_dynpfields.


        lt_dynpfields-fieldname 'P_FEMOD'.
        lt_dynpfields-fieldvalue space.
        APPEND lt_dynpfields.

        CALL FUNCTION 'DYNP_VALUES_UPDATE'
          EXPORTING
            dyname               sy-repid
            dynumb               sy-dynnr
          TABLES
            dynpfields           lt_dynpfields
          EXCEPTIONS
            invalid_abapworkarea 1
            invalid_dynprofield  2
            invalid_dynproname   3
            invalid_dynpronummer 4
            invalid_request      5
            no_fielddescription  6
            undefind_error       7
            OTHERS               8.
      ELSE.

      CLEAR l_bloqueo.

      LOOP AT SCREEN.
          IF screen-group1 EQ 'B1'.
            screen-input 0.
            MODIFY SCREEN.
          ENDIF.
        ENDLOOP.


      lt_dynpfields-fieldname 'P_EBELN'.
        lt_dynpfields-fieldvalue SPACE.
        APPEND lt_dynpfields.

        lt_dynpfields-fieldname 'P_USNAM'.
        lt_dynpfields-fieldvalue space.
        APPEND lt_dynpfields.


        lt_dynpfields-fieldname 'P_FEMOD'.
        lt_dynpfields-fieldvalue space.
        APPEND lt_dynpfields.

        CALL FUNCTION 'DYNP_VALUES_UPDATE'
          EXPORTING
            dyname               sy-repid
            dynumb               sy-dynnr
          TABLES
            dynpfields           lt_dynpfields
          EXCEPTIONS
            invalid_abapworkarea 1
            invalid_dynprofield  2
            invalid_dynproname   3
            invalid_dynpronummer 4
            invalid_request      5
            no_fielddescription  6
            undefind_error       7
            OTHERS               8.


      ENDIF.
    ENDIF.

  ENDIF.

viernes, 23 de noviembre de 2018

ACTUALIZAR CAMPO DYNPRO - B01

El siguiente es un ejemplo básico para la actualización de campos en una dynpro.

Se declara el modulo PBO y PAI (LAS LINEAS DEL CHAIN AL FINAL NO SON NECESARIAS, LAS COMENTÉ Y SALIÓ AÚN SIN ESO, SIRVE MÁS QUE TODO PARA QUE ANTES DEL ENCHAIN PUEDAS CREAR UN MODULO Y EL CAMPO SI LO PONES COMO EDITABLE CADA QUE CAMBIES EL VALOR ENTRARA AL MODULO QUE CREES)


LA DYNPRO CONSTA DE UN FIELD TIPO STRING (COMO SE VE EN PESTAÑA DICT) EN TU CASO O EN OTROS EL TIPO DEPENDERÁ DEL REQUERIMIENTO, Y EN MODO NO EDITABLE Y EL BOTON CORRESPONDIENTE




PARA EL CASO DEL BOTON SOLO EL CODIGO DE FUNCION SE INGRESA PARA ESTE EJEMPLO SENCILLO




EN EL PAI SE DECLARA UN CAMPO CON EL MISMO NOMBRE QUE EL CAMPO DE LA DYNPRO Y EL OK_CODE PARA PROGRAMAR LA FUNCIONALIDAD AL PRESIONAR EL BOTON, COMO SE OBSERVA AL MOMENTO DEL BOTON TEST AL CAMPO DYNPRO TXT_FIELD LE ASIGNO VALOR 'HOLA'


Y EN LA PRUEBA FUNCIONA EN EL PRIMER INTENTO, RECOMENDACION EL NOMBRE DEL CAMPO A DECLARAR EN EL PAI Y EL QUE SE DIBUJA EN LA DYNPRO DEBE SER EL MISMO. IGUAL SE PUEDE HACER MAS EXTENSO EL TEMA



SUERTE




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