Ayuda SAP

Campo Obligatorio ZUONR tx FV60

Hola buen dia, soy nuevo en el foro. Y nuevo en programacion ABAP
Revise, y vi muchos temas interesantes.

Necesito realizar en la FV60 un control de obligatoriedad de un campo Asignacion (ZUONR) siempre y cuando el campo Via de Pago (ZLSCH) sea “J” o “I”, y que la Asignacion no sea nula.
Utilice la tx GGB0 de validacion, aplicando sobre un exit creado (Z005).
Logre validar mostrando un mensaje, pero éste me salta en modo informacion, me deja continuar, y grabar sin controlarlo. Y cada vez que me muevo de solapa me salta el popup.
Adjunto parte del codigo, Espero que sea entendible.

FORM z005 CHANGING b_result.

  DATA: lv_letra  LIKE DYNPREAD-FIELDVALUE,
        lv_asign  LIKE DYNPREAD-FIELDVALUE.

  CONSTANTS: c_ok    TYPE char1 VALUE 'T',
             c_error TYPE char1 VALUE 'F'.

  b_result = c_ok.

IF SYST-TCODE = 'FV60' .
  CALL FUNCTION 'UA_READ_FIELD_FROM_DYNPRO'
      EXPORTING
        id_program     =  'SAPLFDCB' "sy-cprog
        id_dynpro      =  '0020' "sy-dynnr
        id_field_name  = 'INVFO-ZLSCH'
      IMPORTING
        ed_field_value = lv_letra
      EXCEPTIONS
        failed         = 1
        OTHERS         = 2.

  CALL FUNCTION 'UA_READ_FIELD_FROM_DYNPRO'
      EXPORTING
        id_program     =  'SAPLFDCB' "sy-cprog
        id_dynpro      =  '0050' "sy-dynnr
        id_field_name  = 'INVFO-ZUONR'
      IMPORTING
        ed_field_value = lv_asign
      EXCEPTIONS
        failed         = 1
        OTHERS         = 2.
ENDIF.

 IF SYST-TCODE = 'FV60' OR SYST-TCODE = 'MIR7'.
   IF ( lv_letra = 'J' or lv_letra = 'I' ) AND lv_asign IS INITIAL.
     b_result = c_error.
     MESSAGE E010(zfi) RAISING error_value .
   ENDIF.
 ENDIF.
ENDFORM.

Desde ya muchas gracias.

Hola Claudio, no olvides darte una vuelta por #presentaciones como el resto de los mortales.

Respecto a tu duda, los @abapers de la comunidad seguramente podrán ayudarte, desde la semana que viene, dudo que haya alguien trabajando este fin de semana :wink:

Saludos!

Saludos @otha_pampas.

Considero que el mensaje se debe encontrar al nivel de la validación.

Validalo y comentas.

1 me gusta

Buenas.

  1. Tal como dice @David147, el mensaje de error no lo tienes que dar tu por programación, se da a nivel de validación, es decir, que debes eliminar una línea de código con la sentencia MESSAGE y en el nuevo paso que has creado para la validación configura el mensaje.

  2. Quieres que el error salte cuando estando en la pestaña de “Detalle” que es donde se introduce el campo asignación si se deja en blanco y la vía de pago de la pestaña “Pago” era “J” o “I”. ¿es así? Pues mira a ver si en la propia validación salta al cambiar de pestaña (el campo “OK-CODE” contiene el valor de la pestaña en la que estás) y si eso no se puede, siempre se puede hacer la validación en el momento de grabar el registro preliminar (ok-code = “BP”).

  3. Luego otra pregunta, ¿por que usas las funciones para traer el valor de los campos de las dynpros y no preguntas directamente por los nombres de dichos campos que serían INVFO-ZLSCH para la vía de pago y INVFO-ZUONR para asignación?

1 me gusta

Hola. Gracias por responder. Como les comente antes soy bastante nuevo en Abap, si tengo varios años en otros lenguajes de programacion. Y veo que abap es muy amplio
Sobre el punto 1, el control es asi, si la via de pago es J o I y el campo asignacion en blanco que no permita grabar, q sea obligatorio llenarlo. Creo entender como hacer lo que mencionar, probare esta opcion
Sobre el punto 2, Intente traerlo como mencionas y al debugear veia que venia en blanco el valor, por eso acudi a usar esas funciones, dentro del desarrollo. Lo que si no probe es utilizar los campos INVFO desde la validacion, Que en primera instancia no podia acceder a validar al campo BSEG-ZUONR, pero ahora pensadolo puede ser que a INVFO-ZUONR capaz que si. Lo verificare.
Muchas gracias a ambos.
Los mantengo al tanto

1 me gusta

Intente armar la validacion de esta manera, pero me da error de sintaxis que no puedo encontrar el error. Acomode los parentesis, que me suele pasara en abap.

Asi es como quedo

Los campos INVFO parece que no son accesibles a nivel de condición, por tanto una solución es que a ese nivel sólo preguntes por los campos de la syst y en la propia exits preguntes por los campos de la INVFO. Recuerda poner en el report donde están las validaciones la sentencia:
TABLES: INVFO.

De todas formas, los campos de la BSEG no se ven a nivel de cabecera de documento, deberías usar una validación a nivel de posición de documento o documento completo.

1 me gusta

Hola buen dia, volviendo a este tema, aun no puedo resolverlo. Le doy vueltas y nada. Paso como me quedo y ver si me pueden ayudar. No soy de bajar los brazos tan facilmente,

GGB0


Y el codigo del exit Z005

FORM z005 CHANGING b_result.

  DATA: lv_letra  LIKE DYNPREAD-FIELDVALUE,
        lv_asign  LIKE DYNPREAD-FIELDVALUE.

  CONSTANTS: c_ok    TYPE char1 VALUE 'T',
             c_error TYPE char1 VALUE 'F'.
  TABLES: INVFO.

  b_result = c_ok.

IF SYST-TCODE = 'FV60' .
  CALL FUNCTION 'UA_READ_FIELD_FROM_DYNPRO'
      EXPORTING
        id_program     =  'SAPLFDCB' "sy-cprog
        id_dynpro      =  '0020' "sy-dynnr
        id_field_name  = 'INVFO-ZLSCH'
      IMPORTING
        ed_field_value = lv_letra
      EXCEPTIONS
        failed         = 1
        OTHERS         = 2.

  CALL FUNCTION 'UA_READ_FIELD_FROM_DYNPRO'
      EXPORTING
        id_program     =  'SAPLFDCB' "sy-cprog
        id_dynpro      =  '0050' "sy-dynnr
        id_field_name  = 'INVFO-ZUONR'
      IMPORTING
        ed_field_value = lv_asign
      EXCEPTIONS
        failed         = 1
        OTHERS         = 2.
ENDIF.


 IF SYST-TCODE = 'FV60' OR SYST-TCODE = 'MIR7'.

   IF ( lv_letra = 'J' or lv_letra = 'I' ) AND lv_asign IS INITIAL.

     b_result = c_error.
*     MESSAGE E010(zfi) RAISING error_value .

   ENDIF.

 ENDIF.

ENDFORM.

Y cuando ejecuto la FV60 y Solo coloco la via de pago “J” salta esto, y al llenar el campo Asignacion no salta mas, hasta que voy y vengo por las solpas.
Ni siquiera sale el mensaje que cree. No se que estoy haciendo mal

Desde ya muchas gracias, eespero no complicarlos

Saludos

Quita la sentencia message de la exit, que de dar el mensaje ya se encarga la ggb0

Esta comentado la linea MESSAGE…

Ah ok, he visto el post en mi celular y aparecía un caracter que no era * y entonces pensé que no estaba comentado.
Entonces, recapitulando: has creado un nuevo paso en la sustitución a nivel de cabecera Z001 y después has ejecutado el report RGUGBR00?
Este report regenera las validaciones y sustituciones, no sirve sólo con crearlas en la GGB0 o GGB1.

1 me gusta

No regenere nada, que deberia marcar?

Muchas gracias

Normalmente el Area de la aplicación es FI y luego marca todas menos la última y lo ejecutas. Si todo va bien te saldrá un mensaje abajo indicándolo.

Buen dia. Regenere segun lo indicado, me indico q se regenero satifactoriamente. Pero me sigue funcionando igual. Mensaje popup informativo en blanco, y salta cuando te pasas de solapa en solapa.

A ver @otha_pampas . Lo he hecho en mi entorno, he creado un nuevo paso a nivel de cabecera igual que el tuyo. Lo único que el código es este:

FORM u913 CHANGING b_result.

  DATA: lc_OK TYPE c LENGTH 40 VALUE '(SAPMF05A)OK-CODE'.
  DATA: lc_ZLSCH TYPE c LENGTH 40 VALUE '(SAPLFDCB)INVFO-ZLSCH'.
  DATA: lc_ZUONR TYPE c LENGTH 40 VALUE '(SAPLFDCB)INVFO-ZUONR'.
  FIELD-SYMBOLS: <fs_OK> TYPE C.
  FIELD-SYMBOLS: <fs_ZLSCH> TYPE C.
  FIELD-SYMBOLS: <fs_ZUONR> TYPE C.

  b_result = b_true.

  ASSIGN (lc_ZLSCH) TO <fs_ZLSCH>.
  ASSIGN (lc_ZUONR) TO <fs_ZUONR>.
  
 IF ( <fs_ZLSCH> = 'J' OR <fs_ZLSCH> = 'I' ) AND <fs_ZUONR> IS INITIAL.
     ASSIGN (lc_OK) TO <fs_OK>.
     IF <FS_OK> EQ 'MORE'.
       b_result = b_false.
     ENDIF.

   ENDIF.

ENDFORM.                    "u913

Porque en tú código, lo que veo es que cuando estaba en la pestaña de “Detalle” y me movía a otra pestaña no leía bien el campo de la vía de pago de la pestaña “Pago”. Con este código siempre tendrás acceso a los valores correspondientes.

Como ves, además hago referencia al ok_code, para que sólo salte el aviso, cuando desde cualquier pestaña el usuario va a la pestaña “Detalle” que es donde debe rellenar el campo “Asignación”.

Por otra parte, ¿el entorno donde ejecutas la tx. FV60 es en desarrollo? Porque en principio se me ocurre que el mensaje sale en blanco, porque no existe en la se91, es como si lo hubieras subido al entorno de TEST y todavía no hubieras transporta el mensaje desde desarrollo. O puede ser un problema del idioma.

Como ves tampoco pregunto por el código de transacción porque ya lo has puesto en la validación.

1 me gusta

El entorno es desarrollo , un mandante (200) para programar y otro (310) para pruebas unitarias, en el mismo servidor. Puse el codigo que armaste, y me funciona casi igual, con la diferencia q no salta siempre el cartel cuando te pasas de solapas. Pero Sigue saliendo en blanco, y modo informativo, no obligatario, cosa que no te deje seguir.
En la se91 esta el mensaje 010 en el mandante 310.

Ahi revise por la GGB0 en 310 y me faltaba colocar el mensaje, lo habia hecho en 200. Digamos q con ese muetsra la leyenda del mensaje, pero sigue siendo informativo

  1. Me alegro que ya salga el texto del mensaje.
  2. Si lo que quieres es que el mensaje sólo aparezca cuando estando en la pestaña de “detalles” salte a otra pestaña, podrías hacer esto:
  DATA: lc_OK TYPE c LENGTH 40 VALUE '(SAPMF05A)OK-CODE'.
  DATA: lc_ZLSCH TYPE c LENGTH 40 VALUE '(SAPLFDCB)INVFO-ZLSCH'.
  DATA: lc_ZUONR TYPE c LENGTH 40 VALUE '(SAPLFDCB)INVFO-ZUONR'.
  FIELD-SYMBOLS: <fs_OK> TYPE C.
  FIELD-SYMBOLS: <fs_ZLSCH> TYPE C.
  FIELD-SYMBOLS: <fs_ZUONR> TYPE C.
  STATICS: LV_ok type c LENGTH 4.



  b_result = b_true.

  ASSIGN (lc_ZLSCH) TO <fs_ZLSCH>.
  ASSIGN (lc_ZUONR) TO <fs_ZUONR>.

 IF ( <fs_ZLSCH> = 'J' OR <fs_ZLSCH> = 'I' ) AND <fs_ZUONR> IS INITIAL.
     ASSIGN (lc_OK) TO <fs_OK>.
* esto debe saltar cuando estando en more (detalles) salte a otra
* pestaña
     if lv_ok EQ 'MORE' AND <FS_OK> NE 'MORE'.
       b_result = b_false.
     ENDIF.
     LV_OK = <FS_OK>.
   ENDIF.

Como puedes ver, se ha creado una variable de tipo estática, es como hacer trampas y declarar una variable global desde un entorno local. Así sabrás cual ha sido la pestaña anterior y cual la actual que está en OK-CODE.

  1. Por otra parte, efectivamente el mensaje que aparece es de tipo informativo, pero si te das cuenta es suficiente como para no poder contabilizar, que me imagino que es lo que quieres, en cuanto le des a contabilizar salta este mensaje y no te deja. Si quieres forzar a que salga de tipo erróneo, prueba con la tx. OBMSG para forzarlo.
1 me gusta

Hola. Si permite contabilizarlo. No he cambiado mas nada. Por eso te decia que era a modo informativo.
Gracias

Vaya fastidio! pues tienes razón permite contabilizarlo.

Buenas @otha_pampas, he realizado otra prueba y ha consistido que en lugar de crear el paso a nivel de cabecera de documento lo he creado a nivel de documento completo, como sugerí en algún post anterior, y ahora aunque sale el mensaje de tipo informativo ya no me deja contabilizar.

En el form, he quitado la validación de las pestañas ya que ahora no tiene sentido al ser documento completo y aunque sale el mensaje de información, al darle ok aparece el resumen de documentos (en el que no veo opción de contabilizar) y al ir hacia atrás dice que se borrarán las posiciones creadas y ya no contabiliza.

¿puedes probarlo tu?

1 me gusta