Recientemente encontré un artículo sobre "[Cómo interceptar las funciones interactivas para guardar y eliminar informes en APEX] [1]", ¡muy útil! pero necesito hacer algunas validaciones antes de estos eventos y no se como hacerlo, quisiera saber si me pueden ayudar a solucionarlo.
El objetivo principal es restringir la cantidad de informes privados que puede guardar un usuario, por ejemplo, límite de 1 informe privado guardado por usuario.
Este es el código para interceptar estos eventos:
$(document).ready(function() { $.widget("apex.interactiveReport", $.apex.interactiveReport, { // Saving a Default report _saveDefault: function () { console.log("_saveDefault"); console.log(this); console.log(this._getId("report_name")); console.log('stopping'); // return this._super(); }, // Saving a Public or Private reports _save: function () { console.log('_save'); console.log(this); console.log(this._getId("report_name")); console.log('stopping'); // return this._super(); }, // Deleting a report (user clicking the "X") _remove: function () { console.log('_remove'); console.log(this); console.log(this._getId("report_name")); console.log('stopping'); // return this._super(); } }); });``` [1]: https://www.talkapex.com/2019/02/how-to-intercept-interactive-report-save-and-delete-functions-in-apex/Tenga en cuenta que la publicación de blog a la que hace referencia utiliza funciones no documentadas. No hay garantía de que esa funcionalidad no cambie en versiones futuras y no son compatibles. Puede hacer esto de una manera diferente (compatible), usando las vistas del diccionario de datos y la API APEX_IR . No es tan limpio como hacerlo javascript (que por cierto, no sé cómo implementar).
Esto es lo que hice (mi aplicación es 28183 y la página es 7). La lógica es que después de actualizar el IR (si guarda un informe privado, la región se actualiza), verifique en pl/sql si se excede la cantidad máxima de informes privados. Si es así, elimina la última e informa al usuario con una alerta.
BEGIN select COUNT(report_id) INTO :P7_MAX_REACHED from APEX_APPLICATION_PAGE_IR_RPT where application_id = 28183 AND page_id = 7 AND report_type ='PRIVATE'; EXCEPTION WHEN OTHERS THEN :P7_MAX_REACHED := 0; END; BEGIN FOR r IN (SELECT report_id, ROW_NUMBER() OVER (ORDER BY created_on ASC) AS rn FROM APEX_APPLICATION_PAGE_IR_RPT where application_id = 28183 AND page_id = 7 AND report_type ='PRIVATE' ) LOOP IF r.rn > 1 THEN APEX_IR.DELETE_REPORT(p_report_id => r.report_id); END IF; END LOOP; END;