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.
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
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.
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”).
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?
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
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.
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.
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
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.
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.
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
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.
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.
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.