7 de marzo de 2013

Cuadrante Mágico de Gartner 2013 Business Intelligence

Aunque este es un blog de Oracle, tengo que admitir que soy un enamorado de la tecnología QlikView por su increible potencial y por eso comparto esta noticia.

Desde hace unos días, la más prestigiosa firma de investigación tecnológica que no es otra que Gartner ha publicado su esperado, famoso y todo lo que queramos decir Cuadrante Mágico 2013 para las tecnologías de Business Intelligence.

Una vez más ha colocado a QlikView en lo más alto del cuadrante destacando así la increible innovación que esta herramienta supone.


Por tercer año consecutivo, QlikTech ha asegurado su posición en el cuadrante de líderes debido a su amplitud de visión y habilidad de ejecución. El informe dice que “si ha existido un tema destacado en el mercado durante 2012, ha sido que el data discovery se ha convertido en una arquitectura generalizada”. QlikTech siempre ha sido una fuerza disruptiva en la industria de BI y nuestros años de innovación siendo pioneros en la categoría de Business Discovery continúan proporcionando una ventaja competitiva. Es fascinante poder mantener la condición de líder en el floreciente mercado que iniciamos.

Esta noticia confirma el gran avance que ha supuesto esta tecnología del Business Discovery

14 de diciembre de 2012

Oracle eBs: Código para esperar a que termine una solicitud (concurrent) - Oracle eBS apps


Algunas cando realizamos desarrollos Oracle en e-Business Suite veces en nuestros programas necesitamos lanzar alguna solicitud pero es necesario esperar para ver como termina.

Aquí os adjuntamos un código para solucionarlo.

BEGIN
   fnd_file.put_line (fnd_file.output,
                      '*** Call The XXXX Import Program  ***');
   fnd_global.apps_initialize (
      user_id             => fnd_profile.VALUE ('USER_ID'),
      resp_id             => fnd_profile.VALUE ('RESP_ID'),
      resp_appl_id        => fnd_profile.VALUE ('RESP_APPL_ID'),
      security_group_id   => 0);
   fnd_file.put_line (fnd_file.LOG, 'Batch ID:' || ln_group_id);
   ln_req_id :=
      fnd_request.submit_request ('--',              -- Sustituir por el codigo de la aplicacion
                                  '----',---Sustituir por SHORT CODE de nuestro programa
                                  NULL,
                                  SYSDATE,
                                  FALSE,
                                  'BATCH',
                                  ln_group_id);
   COMMIT;

   IF ln_req_id = 0
   THEN
      fnd_file.put_line (
         fnd_file.LOG,
         'Error al ejecutar "' || fnd_message.get || '".');
   ELSE
      fnd_file.put_line (
         fnd_file.LOG,
         'El programa se generó correctamente. Solicitud id :' || ln_req_id);
   END IF;

   IF ln_req_id > 0
   THEN
      LOOP
         lv_req_return_status :=
            fnd_concurrent.wait_for_request (ln_req_id,
                                             60,
                                             0,
                                             lv_req_phase,
                                             lv_req_status,
                                             lv_req_dev_phase,
                                             lv_req_dev_status,
                                             lv_req_message);
         EXIT WHEN UPPER (lv_req_phase) = 'COMPLETED'
                   OR UPPER (lv_req_status) IN
                         ('CANCELLED', 'ERROR', 'TERMINATED');
      END LOOP;

      IF UPPER (lv_req_phase) = 'COMPLETED'
         AND UPPER (lv_req_status) = 'ERROR'
      THEN
         fnd_file.put_line (
            fnd_file.LOG,
            'El programa termino con error. Ver el log para el request_id');
         fnd_file.put_line (fnd_file.LOG, SQLERRM);
      ELSIF UPPER (lv_req_phase) = 'COMPLETED'
            AND UPPER (lv_req_status) = 'NORMAL'
      THEN
         Fnd_File.PUT_LINE (
            Fnd_File.LOG,
            'El programa terminó correctamente. Id de la solicitud: '
            || ln_req_id);
      ELSE
         Fnd_File.PUT_LINE (
            Fnd_File.LOG,
            'Error en el programa ');
         Fnd_File.PUT_LINE (Fnd_File.LOG, SQLERRM);
      END IF;
   END IF;
EXCEPTION
   WHEN OTHERS
   THEN
      fnd_file.put_line (
         fnd_file.LOG,
         'WHEN OTHERS ERROR: '
         || SQLERRM);
END;


13 de diciembre de 2012

Conector QlikView - Oracle e-Business Suite apps

Como saben los desarrolladores de QlikView, el proceso de extracción de datos es uno de los que lleva más tiempo a la hora de crear nuestros cuadros de mando en QlikView.

El modelo de datos de la eBS requiere de conocimiento para la extraccion ya que es un modelo complejo.

Cualquier necesidad de ayuda en la ETL de datos para QlikView puede ser solucionado rápidamente por el equipo de insiemeIT que tienen una amplía experiencia en desarrollos tanto con QlikView como con Oracle e-Business Suite en sus versiones 11.5.9, 11,5,10, 12.x.

Para más información:  www.insiemeit.es


Tablas de personalizaciones de forms - Forms personalizations

Estas son algunas tablas que contienen los datos de nuestras personalizaciones de Oracle apps.
En esta primera es donde nos muestra la función asociada a la personalizacion
FND_FORM_CUSTOM_RULES

Esto es válido cuando nuestro proyecto tiene demasiadas pantallas personalizadas y es difícil de controlar pases a producción,....


FND_FORM_CUSTOM_SCOPES
FND_FORM_CUSTOM_ACTIONS
FND_FORM_CUSTOM_PARAMS
FND_FORM_CUSTOM_PROP_VALUES
FND_FORM_CUSTOM_PROP_LIST

Aquí disponéis de una select para poder obtener el nombre de la pantalla y el nombre de usuario.



SELECT DISTINCT FNDF.FUNCTION_NAME , FNDF.USER_FUNCTION_NAME , FNDR.CONDITION
 FROM FND_FORM_FUNCTIONS_VL FNDF ,
      FND_FORM_CUSTOM_RULES FNDR    
WHERE FNDF.FUNCTION_NAME = FNDR.FUNCTION_NAME
ORDER BY 1 ASC

www.insiemeit.es

25 de febrero de 2012

Consultores Oracle e-Business Suite


insiemeIT está buscando consultores Oracle e-Business Suite tanto freelance como para formar parte de la plantilla.

Esta consultora está muy especializada en qlikview y oracle e-business suite.

Con una mentalidad bastante moderna dentro del mundo de la consultoría, os animo a que forméis parte del proyecto insiemeIT.




QlikView y Oracle e-Business SUite

Últimamente estamos trabajando con QlikView para segmentar la información obtenida de Oracle e-Business Suite r12.
 La integración está resultando increiblemente rápida y la velocidad con la que la herramienta maneja los millones de registros es espectacular.

En cuestión de días tenemos casi un 80% de la integración. En estos momentos estamos integrando los siguientes módulos:

  • AR 
  • PO 
  • AP 
  • GL 
  • INV 
  • FA 
  • eAM 
Con el nuevo modelo de datos HZ esta integración nos servirá para las futuras versiones de Oracle Fussion Applications en la que todos los sistemas que Oracle está integrando van a llevar el mismo modelo de datos. 

Si alguien se encuentra con la misma situación, podemos ayudaros con esta integración.

Más información en www.insiemeit.es

12 de julio de 2011

Llamar directamente al gestor de solicitudes o concurrent request window

Aqui un ejemplo de como llamar desde un punto de menú al gestor de solicitudes o concurrent request program window, enviando como parámetro la solicitud que queremos ejecutar:

Desde la responsabilidad Administrador del sistema o Desarrollador de la aplicación.

1-Crearnos una función Aplicación-->Función
Valores:
Pestaña Descripción:

Funcion-->Nombre de nuestra función
Nombre de Función de Usuario-->El nombre que queremos darle para la aplicación
Descripción-->Descripción de nuestra función

Pestaña Propiedades:
Tipo:Pantalla

Pestaña Pantallas:
Pantalla-->Ejecución de Informes
Aplicación-->Nuestra aplicación donde desarrollamos
Parámetros-->CONCURRENT_PROGRAM_NAME ="nombre corto conccurren" PROGRAM_APPL_SHORT_NAME="Nuestra aplicacion"


2. Una vez creado esta función. Añadimos un nuevo punto de menú en el menú que queremos modificar, le asociamos el prompt y la función que acabmos de crear.

De esta forma aparecerá la pantalla de gestor de solicitudes con el programa directamente.


Si necesita ayuda en su proyecto para implantar Oracle e-Busines Suite contacte con nosotros.
Podemos ayudarle tanto en momentos puntuales como en proyectos de larga duración.

Contacto: info@insiemeit.es

5 de julio de 2011

Tablas autoinvoice AR-cuentas a cobrar en Oracle APPS

Las tablas que podemos consultar por base de datos para comprobar su estado son las siguientes:

RA_INTERFACE_LINES_ALL

Información de la las cabeceras y líneas. En esta tabla también encontramos datos importantes como los términos, el source u origen de la factura,... y su estado MUY IMPORTANTE

RA_INTERFACE_SALESCREDITS_ALL

El crédito asociado


RA_INTERFACE_DISTRIBUTIONS_ALL

Las distribuciones

AR_INTERFACE_CONTS_ALL

Otra tabla auxiliar con las contigencias

RA_INTERFACE_ERRORS_ALL

Tabla donde se guarda los errores.


Si necesita ayuda en su proyecto para implantar Oracle e-Busines Suite contacte con nosotros.
Podemos ayudarle tanto en momentos puntuales como en proyectos de larga duración.

Contacto: info@insiemeit.es

28 de junio de 2011

Como identificar un flexfield en una pantalla estándar

Aquí un comentario para principiantes sobre un tema básico pero que todos alguna vez hemos tenido que buscar.
La cosa es hacerlo fácil y en castellano.

Cuando vemos en una pantalla estándar de Oracle un campo Flexfield Descriptivo y queremos saber cual es para luego ir a buscarlo a la pantalla de estructura descriptivas para ver su composición, modificarlo, activarlo, etc.... es muy sencillo.

Una vez colocado sobre el flexfield en cuestión, vamos al menú superior en
Ayuda-->Examinar
Nos aparece el campo sobre el que estamos.
Seguidamente vamos otra vez a Ayuda-->Examinar
En la lista de valores de Bloque seleccionamos lo siguiente: $DESCRIPTIVE_FLEXFIELD$
En la lista de valores de Campo seleccionamos nuestro flexfield.
En ese momento en el recuadro de abajo nos aparece el nombre para luego buscarlo en la ventana de configuración de flexfields.

Esta ventana se encuentra normalmente en el mismo módulo:
Configuración-->Opciones-->Estructuras-->Descriptiva

Cambiamos la pantalla en formato consulta y aplicamos los siguientes criterios de búsqueda:
En el campo Aplicación buscamos nuestro módulo.
En el campo Título buscamos el valor que obtuvimos al consultar la estructura descriptiva en nuestra pantalla.

De esa forma encontraremos nuestro flexfield y podremos consultarlo


21 de junio de 2011

Asociar RA_CUSTOMER_TRX_ALL con HZ_PARTIES

Como muchos sabéis, en la nueva versión 12.x de Oracle e-Business Suite, las tablas del modulo de AR(Cuentas a Cobrar) ha cambiado bastante a nivel de modelo de datos.
Una consulta típica que ahora cambia es la asociación de las facturas con el concepto de PARTIES
Con esta select encontramos una de las formas para asociar HZ_PARTIES con RA_CUSTOMER_TRX_ALL.
Para llegar a los id que se guardan en las tablas de facturas es necesario pasar por la tabla hz_cust_accounts.
Con esta select podemos por ejemplo obtener quien es el cliente al que se le ha generado la factura, obtenido de la columna SOLD_TO_CUSTOMER_ID de la RA_CUSTOMER_TRX_ALL
select RA.TRX_NUMBER , A.PARTY_NAME
FROM hz_parties A, hz_cust_accounts ca , ra_customer_trx_aLL RA
WHERE A.party_id = ca.party_id
AND party_name LIKE '%nombre_cliente%'
AND RA.SOLD_TO_CUSTOMER_ID = CA.CUST_ACCOUNT_ID
¡¡¡¡ ATENCIÓN, ESTA SELECT ES BÁSICA, Y DEPENDIENDO DE CIERTAS COMPLEJIDADES COMO LAS TIPOS DE RELACIONES DE CLIENTES SE PUEDE COMPLICAR Y OPTAR POR INCLUIR LA TABLA hz_relationships ¡¡¡¡

24 de junio de 2010

Selects Utiles ADMINISTRADOR DEL SISTEMA

En esta entrada se adjuntan algunas selects utiles relacionadas con la administración de la eBS.
Algunas pueden ser útilies para tener alguna información sobre la BBDD a la hora de abrir algún SR
en Oracle o para tener control de patches,..... y NO queréis molestar al DBA.

Justo después de algunas SELECT se adjunta ejemplos de salida.


- COMPROBAR LOS PATCHES INSTALADOS Y EN QUE APLICACION

select substr(a.APPLICATION_NAME,1,60) "Application Name"
, substr(i.PRODUCT_VERSION,1,4) "Version"
, i.PATCH_LEVEL "Patch Level"
, i.APPLICATION_ID "Application ID"
, i.LAST_UPDATE_DATE "Last Update"
from APPS.FND_PRODUCT_INSTALLATIONS i
, APPS.FND_APPLICATION_ALL_VIEW a
where i.APPLICATION_ID = a.APPLICATION_ID
order by a.APPLICATION_NAME

Application Name Version Patch Level Application ID Last UPDATE
---------------- ------ ----------- ----------- ----------------
dvanced Benefits 12.0 R12.BEN.A.5 805 24/01/2008 2:16:55
Advanced Outbound Telephony 12.0 R12.IEC.A.4 545 24/01/2008 2:16:56
Advanced Pricing 12.0 R12.QP.A.4 661 24/01/2008 2:16:56

-NOMBRE DE LA BASE DE DATOS
Select name from v$database;

NAME
----
MIBBDD

-INSTANCIA
select instance_name from v$instance;

INSTANCE_name VERSIONS
------------ -------
mi instancia 10.2.0.3.0

-INFORMACION DE LA SESION ESTA PUEDE SER UTIL PARA MATAR ALGUN PROCESO O PONER EN PROCESOS QUE SE QUEDAN COLGADOS Y DESPUES
SON DIFICILES DE ENCONTRAR.

select /*s.machine */ * from v$session s where s.audsid = userenv('sessionid');

SID USER USERNAME STATUS ........
--- ------ -------- --------

110 USUARIO USERNAME ACTIVE

-DETECTAR BUGS RECONOCIDOS
select * from ad_bugs


-VERSION DE LA eBS QUE CON LA QUE TRABAJAMOS Y OTROS DATOS IMPORTANTES DE CONFIGURACOIN

SELECT * from apps.fnd_product_groups;

-PATCHES APLICADOS

select * from AD_APPLIED_PATCHES

-SABER SI TENEMOS ACTIVADO EL MULTIORG

select multi_org_flag from fnd_product_groups;

IREMOS COLOCANDO MAS SELECTS UTILES.

¡¡¡¡¡¡¡¡¡¡¡ SE AGRADECEN APORTACIONES ¡¡¡¡¡¡

22 de junio de 2010

Trazas en Oracle e-Business suite (tkprof)

En esta entrada, vamos a comentar una de las formas de hacer una traza de todas las selects y su coste a nivel de recursos y tiempos de los procesos que se ejecutan cuando entramos en cualquier pantalla de la eBS.

¡¡¡ ES IMPORTANTE DESACTIVAR LA TRAZA UNA VEZ SALGAMOS
DE LA PANTALLA O TERMINE NUESTRO PROCESO PARA NO
CARGAR EL SISTEMA !!!!!!

1- Para activar la traza por ejemplo para ver las selects que se realizan antes de lanzar un concurrent, vamos al menu Ayuda-->Diagnósticos-->Rastro y marcamos Rastreo con sustituciones y espera.













2- En este momento, ya tenemos activada la traza.
Ejecutamos nuestro concurrent.

3- Desactivamos la traza, en el mismo menú, marcamos "Sin Rastreo"

4- Nos mostrara un mensaje con la ruta donde ha dejado el archivo.

5- Vamos al sistema operativo y nos colocamos en el directorio que nos ha mostrado la aplicacion y en caso de UNIX ejecutamos el siguiente comando para convertir el fichero a txt y que sea más legible.

sintáxis: tkprof archvo.trc nuestro_nuevo_archivo.txt explain=apps/apps

14 de junio de 2010

Modificar listas de Precios con API's en Oracle e-Business Suite

En esta entrada vamos a usar una API muy típica para modificar los precios de nuestras listas de precios ya creadas. Esta es una forma muy sencilla de hacerlo y tan solo necesitamos de una tabla temporal donde hemos cargado nuestros precios nuevos. Normalmente, esto se utiliza para aprovechar una lista existente, copiarla, renombrarla y cambiarle solo los precios. Para copiar la lista de precios y renombrarla, se hace desde el módulo de AR->Lisas de Precios->Copiar A continuación se muestra un ejemplo. La tabla temporal esta los artículos ya existentes y sus precios nuevos. ------------------------------------------------------------------------------------- DECLARE --Declaramos todas las variables posibles que puedan recibir los paquetes. --Realmente solo se suelen usar 3, en los casos sencillos. gpr_return_status VARCHAR2(1) := NULL; gpr_msg_count NUMBER := 0; gpr_msg_data VARCHAR2(2000); v_id_lista_precios NUMBER; gpr_price_list_rec qp_price_list_pub.price_list_rec_type; gpr_price_list_val_rec qp_price_list_pub.price_list_val_rec_type; gpr_price_list_line_tbl qp_price_list_pub.price_list_line_tbl_type; gpr_price_list_line_val_tbl qp_price_list_pub.price_list_line_val_tbl_type; gpr_qualifiers_tbl qp_qualifier_rules_pub.qualifiers_tbl_type; gpr_qualifiers_val_tbl qp_qualifier_rules_pub.qualifiers_val_tbl_type; gpr_pricing_attr_tbl qp_price_list_pub.pricing_attr_tbl_type; gpr_pricing_attr_val_tbl qp_price_list_pub.pricing_attr_val_tbl_type; ppr_price_list_rec qp_price_list_pub.price_list_rec_type; ppr_price_list_val_rec qp_price_list_pub.price_list_val_rec_type; ppr_price_list_line_tbl qp_price_list_pub.price_list_line_tbl_type; ppr_price_list_line_val_tbl qp_price_list_pub.price_list_line_val_tbl_type; ppr_qualifiers_tbl qp_qualifier_rules_pub.qualifiers_tbl_type; ppr_qualifiers_val_tbl qp_qualifier_rules_pub.qualifiers_val_tbl_type; ppr_pricing_attr_tbl qp_price_list_pub.pricing_attr_tbl_type; ppr_pricing_attr_val_tbl qp_price_list_pub.pricing_attr_val_tbl_type; k NUMBER := 1; j NUMBER := 1; BEGIN /***********************************************************************/ /*!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! IMPORTANTE SI CREAMOS UNA NUEVA LISTA DE PRECIOS ASEGURARSE DE QUE LA FECHA DE LA CABECERA, DE LA NUEVA LISTA ES ANTERIOR A DE CUALQUIER ITEM, ES MUY IMPORTANTE, O BIEN MODIFICAR LAS FECHAS DE LOS ITEMS DE LA NUEVA LISTA A LA FECHA ACTUAL */ /***********************************************************************/ mo_global.set_policy_context('S', /*¡¡¡¡ ORG_ID de la maestra en tu proyecto¡¡¡ */); mo_global.init('ONT');--obligatorio --En la pantalla de listas de precios, copiamos el nombre y lo ponemos en esta select para obtener el id. --O bien se mira en ayuda--examinar SELECT price_list_id INTO v_id_lista_precios FROM so_price_lists WHERE NAME = 'LISTA EJEMPLO 2010' ; oe_debug_pub.initialize; oe_debug_pub.setdebuglevel(5); oe_msg_pub.initialize; FOR v_reg in ( select precio_nuevo codigo_articulo , de la talba tmp itm.INVENTORY_ITEM_ID , PRICE_LIST_LINE_ID from so_price_list_lines spll , XX_TEMPORAL_EJEMPLO_PRECIOS prec , mtl_system_items_b itm where prec.CODIGO = itm.segment1 and itm.organization_id = --TU ORG_ID and spll.inventory_item_id = itm.inventory_item_id and spll.price_list_id = v_id_lista_precios ) LOOP gpr_price_list_line_tbl(k).list_header_id := v_id_lista_precios; --Price List Header Id (List_header_id) gpr_price_list_line_tbl(k).list_line_id := V_REG.PRICE_LIST_LINE_ID; -- Price List Line Id (List_Line_id) gpr_price_list_line_tbl(k).list_line_type_code := 'PLL'; GPR_PRICE_LIST_LINE_TBL(K).OPERAND := V_REG.PRECIO; gpr_price_list_line_tbl(k).operation :=qp_globals.g_opr_update; DBMS_OUTPUT.put_line('Carga de Precios.'); DBMS_OUTPUT.put_line('=============================================='); K :=K +1; END LOOP; DBMS_OUTPUT.put_line('LINEAS CARGADA' || K); qp_price_list_pub.process_price_list(p_api_version_number => 1, p_init_msg_list => fnd_api.g_false, p_return_values => fnd_api.g_false, p_commit => fnd_api.g_false, x_return_status => gpr_return_status, x_msg_count => gpr_msg_count, x_msg_data => gpr_msg_data, p_price_list_rec => gpr_price_list_rec, p_price_list_line_tbl => gpr_price_list_line_tbl, p_pricing_attr_tbl => gpr_pricing_attr_tbl, x_price_list_rec => ppr_price_list_rec, x_price_list_val_rec => ppr_price_list_val_rec, x_price_list_line_tbl => ppr_price_list_line_tbl, x_price_list_line_val_tbl => ppr_price_list_line_val_tbl, x_qualifiers_tbl => ppr_qualifiers_tbl, x_qualifiers_val_tbl => ppr_qualifiers_val_tbl, x_pricing_attr_tbl => ppr_pricing_attr_tbl, x_pricing_attr_val_tbl => ppr_pricing_attr_val_tbl); IF ppr_price_list_line_tbl.COUNT > 0 THEN FOR k IN 1 .. ppr_price_list_line_tbl.COUNT LOOP DBMS_OUTPUT.put_line('Registros Borrados=> ' ||k); DBMS_OUTPUT.put_line('Return Status = ' ||ppr_price_list_line_tbl(k).return_status); END LOOP; END IF; IF gpr_return_status = fnd_api.g_ret_sts_success THEN -- Commit; DBMS_OUTPUT.put_line('Modificación realizada correctamente'); Else Rollback; RAISE fnd_api.g_exc_unexpected_error; END IF; FOR k IN 1 .. gpr_msg_count LOOP gpr_msg_data := oe_msg_pub.get(p_msg_index => k, p_encoded => 'F'); DBMS_OUTPUT.put_line(' Error ' ||k ||'|| : '|| gpr_msg_data); NULL; END LOOP; EXCEPTION WHEN fnd_api.g_exc_error THEN gpr_return_status := fnd_api.g_ret_sts_error; WHEN fnd_api.g_exc_unexpected_error THEN gpr_return_status := fnd_api.g_ret_sts_unexp_error; FOR k IN 1 .. gpr_msg_count LOOP gpr_msg_data := oe_msg_pub.get(p_msg_index => k, p_encoded => 'F'); DBMS_OUTPUT.put_line('Error' ||k ||'|| : ' ||gpr_msg_data); NULL; END LOOP; WHEN OTHERS THEN gpr_return_status := fnd_api.g_ret_sts_unexp_error; END; --fin programa