Mostrando entradas con la etiqueta Oracle EBS R11. Mostrar todas las entradas
Mostrando entradas con la etiqueta Oracle EBS R11. Mostrar todas las entradas

viernes, 16 de octubre de 2015

FORMS R12 PROGRESS BAR THE DEFINITIVE GUIDE

Long time ago I always complained about long time operations  without any feedback ( silly me, i didn't know about big companies volume ) and Suddenly a requirement appears. We have a screen that takes a loot of time to make some action and after reviewing we realize that the screen does a loooot of stuff  so I can't actually make that screen faster (may be I'm i keep looking) but en the meanwhile. And the worst part the user's are really hyperactive, what a nightmare they found how reduce the time . . . by closing the window  and reducing their time by well they didn't but you get it, so how make them realize that the screen is working. Simple

adding a progress bar

so where is the code:

APP_WINDOW.PROGRESS( 0,'First Message..... ');
    synchronize

/*Long time operation*/
APP_WINDOW.PROGRESS(.1,'Second Message..... ');
    synchronize;
/*Long time operation*/ 
 APP_WINDOW.PROGRESS(.3,'Third Message..... ');
    synchronize

/*Long time operation*/ 
 APP_WINDOW.PROGRESS(.4,'YOU GET IT .... ');/*Long time operation*/ 
     synchronize; 
  APP_WINDOW.PROGRESS(100);


Has simple has that well why write this article if this is on the documentation  basically because on the documentation talks about closing when the parameter is greater than 99% but they didn't tell you that they move the percentage in a value between 0 and 1 so 50% equal to .5 .

So have fun.

 

lunes, 12 de mayo de 2014

How know to which responsibilities it's associated a function?

The following query extracts the information from the setup on the E-Business Suite and receives has parameter the USER_FUNCTION_NAME  it returns the resposibilities related to that user function name.

/*
get Responsibilities associated to Funtions
Only the funtions not Excluded
*/
WITH DAT
              AS (SELECT 'FND_FORM_FUNCTIONS-' || fff.function_id ID,
                         FUNCTION_NAME,
                         USER_FUNCTION_NAME,
                         DESCRIPTION,
                         'FUNCTION' DATA_TYPE,
                         APPLICATION_ID,
                         CAST (NULL AS DATE) START_DATE,
                         CAST (NULL AS DATE) END_DATE,
                         CREATION_DATE,
                         CREATED_BY,
                         LAST_UPDATED_BY,
                         LAST_UPDATE_DATE,
                         CAST (NULL AS VARCHAR2 (480)) ASOCIATED_function_name,
                         CAST (NULL AS NUMBER) function_application_id,
                         'FND_FORM_FUNCTIONS-' || fff.function_id EXC
                    FROM FND_FORM_FUNCTIONS_VL fff
                  UNION ALL
                  SELECT 'FND_MENUS-' || MENU_ID,
                         MENU_NAME,
                         USER_MENU_NAME,
                         DESCRIPTION,
                         'MENU' DATA_TYPE,
                         NULL APPLICATION_ID,
                         CAST (NULL AS DATE) START_DATE,
                         CAST (NULL AS DATE) END_DATE,
                         CREATION_DATE,
                         CREATED_BY,
                         LAST_UPDATED_BY,
                         LAST_UPDATE_DATE,
                         CAST (NULL AS VARCHAR2 (480)) function_name,
                         CAST (NULL AS NUMBER) function_application_id,
                         'FND_MENUS-' || MENU_ID
                    FROM fnd_menus_VL fm
                  UNION ALL
                  SELECT 'FND_RESPONSIBILITY-' || RESPONSIBILITY_ID || '-' || APPLICATION_ID,
                         RESPONSIBILITY_KEY,
                         RESPONSIBILITY_NAME,
                         DESCRIPTION,
                         'RESPONSIBILITY',
                         APPLICATION_ID,
                         START_DATE,
                         END_DATE,
                         CREATION_DATE,
                         CREATED_BY,
                         LAST_UPDATED_BY,
                         LAST_UPDATE_DATE,
                         CAST (NULL AS VARCHAR2 (480)) function_name,
                         CAST (NULL AS NUMBER) function_application_id,
                         'FND_RESPONSIBILITY-' || RESPONSIBILITY_ID || '-' || APPLICATION_ID
                    FROM fnd_responsibility_vl
                   UNION ALL
                  SELECT 'FND_MENU_ENTRIES-' || MENU_ID || '-' || ENTRY_SEQUENCE,
                         CAST (ENTRY_SEQUENCE AS VARCHAR2 (4000)),
                         PROMPT,
                         ent.DESCRIPTION,
                         'MENU ITEM  ' || NVL2 (fun.TYPE, '-' || fun.TYPE, '-SUBMENU'),
                         NULL APPLICATION_ID,
                         CAST (NULL AS DATE) START_DATE,
                         CAST (NULL AS DATE) END_DATE,
                         ent.CREATION_DATE,
                         ent.CREATED_BY,
                         ent.LAST_UPDATED_BY,
                         ent.LAST_UPDATE_DATE,
                         FUN.function_name,
                         FUN.APPLICATION_ID function_application_id,
                         'FND_FORM_FUNCTIONS-' || fun.function_id EXC
                    FROM FND_MENU_ENTRIES_VL ent, FND_FORM_FUNCTIONS_VL fun
                   WHERE     1 = 1
                         AND PROMPT IS NOT NULL
                         AND NVL (ent.GRANT_FLAG, 'Y') = 'Y'
                         AND (ent.function_id IS NOT NULL OR SUB_MENU_ID IS NOT NULL)
                         AND ent.function_id = fun.function_id(+)
                  ),
           REL
              AS (SELECT 'FND_RESPONSIBILITY-' || RESPONSIBILITY_ID || '-' || APPLICATION_ID PAR, 'FND_MENUS-' || MENU_ID CH FROM FND_RESPONSIBILITY
                  UNION ALL
                  SELECT 'FND_RESPONSIBILITY-' || RESPONSIBILITY_ID || '-' || APPLICATION_ID PAR, 'FND_REQUEST_GROUPS-' || REQUEST_GROUP_ID CH
                    FROM FND_RESPONSIBILITY
                  UNION ALL
                  SELECT NULL PAR, 'FND_RESPONSIBILITY-' || RESPONSIBILITY_ID || '-' || APPLICATION_ID CH
                    FROM FND_RESPONSIBILITY
                  UNION ALL
                  SELECT 'FND_MENUS-' || MENU_ID PAR, 'FND_MENU_ENTRIES-' || MENU_ID || '-' || ENTRY_SEQUENCE CH FROM FND_MENU_ENTRIES
                  UNION ALL
                  SELECT 'FND_MENU_ENTRIES-' || MENU_ID || '-' || ENTRY_SEQUENCE par,
                         NVL2 (SUB_MENU_ID, 'FND_MENUS-' || SUB_MENU_ID, 'FND_FORM_FUNCTIONS-' || function_id)
                    FROM FND_MENU_ENTRIES
                  )
                  ,
           FN AS (
SELECT 'FND_RESPONSIBILITY-'||RESPONSIBILITY_ID|| '-' || APPLICATION_ID ID, DECODE (RULE_TYPE,  'F', 'FND_FORM_FUNCTIONS-' || ACTION_ID,  'M', 'FND_MENUS-' || ACTION_ID) RESP_ID
                    FROM FND_RESP_FUNCTIONS
                   )
      SELECT tree.FUNCTION_NAME RESP_KEY,
                  tree.USER_FUNCTION_NAME  RESP_DESCRIPTION,
                  tree.RESP_NAME function_name,
                  tree.RESP_DESCRIPTION USER_FUNCTION_NAME,
                  tree.NAVIGATION
       FROM (SELECT CONNECT_BY_ROOT function_name RESP_NAME,
             CONNECT_BY_ROOT USER_FUNCTION_NAME RESP_DESCRIPTION,
             CONNECT_BY_ROOT DAT.APPLICATION_ID RESP_APPLICATION_ID,
             CONNECT_BY_ROOT DAT.ID RESP_ID,
             CONNECT_BY_ROOT dat.DATA_TYPE RESP_DATA_TYPE,
             SYS_CONNECT_BY_PATH (function_name || ':' || USER_FUNCTION_NAME, '>') tree,
             SYS_CONNECT_BY_PATH (DECODE (data_type,'RESPONSIBILITY',CAST (NULL AS VARCHAR2 (80)),function_name || ':' || USER_FUNCTION_NAME), '>') tree_NO_RESP,
             SYS_CONNECT_BY_PATH (LPAD (FUNCTION_NAME, 20, '0'), '>') ORD_FUN,
             SYS_CONNECT_BY_PATH (CAST (DECODE (data_type, 'MENU', CAST (NULL AS VARCHAR2 (80)), USER_FUNCTION_NAME || '-') AS VARCHAR2 (80)), '>')
                NAVIGATION,
             DAT.*,
             cr.user_name CREATED_BY_NAME,
             upd.user_name LAST_UPDATED_BY_NAME,
             REL.par,
             rel.ch
        FROM DAT,
             REL,
             fnd_user cr,
             fnd_user upd
             WHERE dat.ID = rel.ch
                     AND dat.created_by          = cr.user_id(+)
                    AND dat.last_updated_by    = upd.user_id(+)
      CONNECT BY NOCYCLE PRIOR par = ch
      START WITH (
                           USER_FUNCTION_NAME = :P_NAME-->>NAME OF THE FUNCTION HERE
                           )
         )
          tree ,FN
         WHERE DATA_TYPE='RESPONSIBILITY'
          AND RESP_DATA_TYPE='FUNCTION'
           AND tree.RESP_ID=fn.RESP_ID(+)
           AND tree.ID=fn.id(+)
           and fn.id is null;
                 

viernes, 1 de abril de 2011

Project Status Inquiry (PSI) Consulta de estado de Proyecto.

Proyectos : es el modulo encargado del manejo de costos, ingresos, recursos , tareas, etc  de un proyecto.

Brinda información detallada sobre el estado del mismo por medio de una pantalla muy practica donde te permite dar información de una manera tan flexible que asusta, y digo asusta por que con los conocimientos adecuados de la estructura del modulo de Proyectos y conocimientos de el lenguaje PL/SQL le pueden ahorrar tanto trabajo al usuario de una manera casi ilimitada. La pantalla de la que hablo maravillas es una pantalla que en algún momento mi amigo Jose de Jesús Martinez Cañas, tuvo a bien explicarme el funcionamiento de la pantalla PSI.

El PSI tiene una peculiaridad que  pocas pantallas de la aplicación tienen, y esto es : Es una pantalla que pueden modificarse la forma en la que se entregan los  datos de prácticamente todas las columnas, esto quiere decir, que si uno desea puede reconstruir todos los datos que te presenta la pantalla, las etiquetas, promedios, sumatorias, minería de datos a otros módulos que tengan que ver con el proyecto o hasta lo que no tenga que ver con el proyecto se puede pintar en esta pantalla.

Las pantallas de configuración de esta pantalla nos dejan muy claro a los desarrolladores que la persona que hizo esta pantalla seguramente le cambiaron la definición de lo que querían que se viera en esta pantalla , que el decidió dejarle a los funcionales la tarea de definir que pintara la pantalla con la información disponible del modulo.

ejemplo:
Flexibilidad en cada columna.

La etiquetas del reporte también son edita bles desde esta pantalla 

Son 33 columnas para el nivel Proyecto

Y esto se puede configurar tanto para el nivel proyecto como para tarea y Recursos.
 Ahora como es tan mágico esta pantalla, como permite tal cosa, acaso las pantallas del psi se construyen en tiempo de ejecución?

No es magia ni algo remotamente parecido, lo que sucede es que genera vistas en la base de datos cuando uno le da generar visualización, vistas que como su nombre lo dicen son genéricas.

PA_STATUS_PROJ_GENERIC_V

PA_STATUS_TASK_GENERIC_V

PA_STATUS_RSRC_GENERIC_V

Estas 3 vistas contienen permiten extraer los datos como los solicito el usuario en la configuración en cada uno de los niveles del reporte, sin embargo cuando uno trata de ejecutarlas en la base de datos estas no regresan nada. como inicializar las vistas del PSI para que nos regresen valores es el  reto.

Para que no se quiebren la cabeza recordemos como funciona la aplicación.

La seguridad desde R11 y ahora en r12 se maneja por medio de los perfiles de las responsabilidades y para poder emular lo que hacen las pantallas de la aplicación para restringir el acceso a los usuarios se tienen que ejecutar siempre las funciones que inicializan los valores de la responsabilidad del usuario, y a partir de la R12 se implemento la seguridad por medio de los perfiles por lo que ahora se agregan las funciones MO.
BEGIN
 FND_GLOBAL.APPS_INITIALIZE(1117,50719,275);
/*FND_GLOBAL.APPS_INITIALIZE(user_id,resp_id,resp_appl_id);*/
MO_GLOBAL.init('PA');
 /*MO_GLOBAL.init(application short name);*/
pa_budget_utils.set_entry_level_code('A');
pa_security.SET_VALUE('ALLOW_QUERY','Y');

APPS.PA_STATUS.pa_status_driver(38,NULL
,NULL,NULL,'AC','AR'
,TRUNC(SYSDATE,'MM'),LAST_DAY(SYSDATE),1);
/*PROCEDURE pa_status_driver (
  x_project_id =>Id Proyecto  
  , x_task_id => Id tarea
  , x_resource_list_id => Id lista de recursos
  , x_resource_list_member_id =>  id miembro
  , x_cost_budget_code  =>codigo del tipo de presuspuesto de costos
  , x_rev_budget_code IN => codigo del tipo de presupuesto de Ingresos
  , x_start_date IN DATE =>Fecha inicial de periodo  a analizar
  , x_end_date IN DATE =>Fecha final de periodo  a finalizar
  , x_factor IN NUMBER=>Factor entre el que se dividirán las operaciones
);
*/ 

END;
 /

 Este procedimiento anónimo estaría inicializando las variables de ambiente suficientes para que te permita realizar consultas sobre las vistas estándar del proyecto y podemos realizar toda la minería de datos que queramos.

Espero les sea útil.