jueves, 11 de diciembre de 2014

Descubriendo el Mundo Oracle: Reportes en PDF con Oracle APEX

Buen dia a tod@s, compartato con ustedes este blog que me pareció súper útil, a mi me sirvio mucho.

Saludos :)



Reportes en Pdf desde Apex


Descubriendo el Mundo Oracle: Reportes en PDF con Oracle APEX

Descubriendo el Mundo Oracle: Reportes en PDF con Oracle APEX: Hola a todos, hace unos dias tuve una pregunta de uno de mis alumnos del curso de Introducción a Oracle APEX sobre como habilitar el PDF en...

jueves, 23 de mayo de 2013

Autorizacion Esquemas - APEX (Authorization Schemes)

Hola a tod@s... Con todo el animo agregando un nuevo post, espero les sirva.. Saludos :)

En este post quiero compartir con ustedes como se agrega seguridad en una aplicacion apex, esto sirve bastante cuando se tiene ciertos permisos segun el tipo de usuario que va a acceder a la aplicacion.

Personalmente implemente dos formas se que hay otras pero estas hasta el momento me han servido. Si tienen mas avanzadas les invito a compartirlas. Bueno empezemos:

PRIMERA FORMA - CREANDO UNA TABLA DE USUARIOS EN NUESTRA BASE DE DATOS  

Prerequisitos:
  1. Tener la aplicacion creada. 
  2. Definir los roles a utilizar y que permisos va a tener cada rol 

Proceso:

Paso 1: Crear la tabla usuarios en mi caso: tape_usu_app Los campos que he utilizado son los siguientes: rol, nick, numAplicacion, nombres, estado

Paso 2: Crear el esquema de autorizacion
  1. Ir a "Shared Components" 
  2. Dentro del panel "Security" clic sobre "Authorization Schemes" 
  3. Clic boton "Create" 
  4. Seleccionamos "From Scratch", clic "Next" 
  5. LLenamos la siguiente información en el panel que se presenta:  
    • Name: Permiso_Administrador (Puede ser cualquiera)  
    • RequiredScheme Type: Seleccionamos "PL/SQL Function Returning Boolean"  
    • Expression 1: Llenamos codigo PL/SQL, puede ser asi: 
                   declare
                   permitido NUMBER;
                  begin
                            select count(usu_id)
                            into permitido
                           from tape_usu_app
                          where UPPER(nick) = UPPER(:app_user)
                           and rol = 'admin';

                           if (permitido = 1) then
                                  return false;
                           else
                                  return true;
                           end if;
                    end;

 
    • Identify error message displayed when scheme violated: Escriben un mensaje para el error puede ser "Acceso denegado" 
    • Clic boton Crear 
 Paso 3: Nos vamos a la pagina, item, lista o lo que queremos restringir por usuarios y nos ubicamos en la pestaña "Security o Authorization" segun el tipo de objeto que vayan a retringir En mi caso le voy a dar a una pagina esta en la pestaña "Security". Seleccionamos si queremos que tenga acceso el nombre de nuestra autorizacion pero si el lo contrario seleccionamos "Not + el nombre de nuestro esquema de seguridad".

En mi caso escojo en una pagina que sea solo para mi administrador "Permiso_Administrador" y en una pagina en donde sea solo permiso de mi usuario final "Not_permiso_administrador" Asi lo pueden hacer con cualquier objeto, recuerden todo depende del "if" de su funcion PL/SQL.  

SEGUNDA FORMA - CREAR USUARIOS CON LAS ABREVIATURAS DE LOS PERMISOS Y ROLES A UTILIZAR  

Prerequisitos:
  1. Tener la aplicacion creada. 
  2. Usuarios creados bajo un estandar en sus iniciales, por ejemplo: mis usuario administrador iniciar con ff_usuario1, y mis usuarios finales iniciaran con cc_usuario2 

Proceso:

Paso 1: Crear un esquema de autorizacion como en los pasos indicados en el paso 2 de la primera forma, solo que con la diferencia en la funcion de PL/SQL simplemente puede hacer una como esta:

declare 
caracter VARCHAR2(1); 
begin 
caracter := substr(:app_user,1,1); 
if (caracter = 'G') then 
return false;
 else 
return true; 
end if; 
end; 

Los siguientes pasos son similares a la forma anterior.

Eso es todo... espero les sirva.


Saludosss... Espero sus comentarios y porque no sus aportes.
Lindo dia.. y a disfrutar de la vida.. Dios los bendiga. :)

jueves, 12 de julio de 2012

Cargar o actualizar datos desde un archivo CSV a un tabla de un Base de datos Oracle utilizando APEX

Hola a tod@s!

Espero se encuentren muy bien. Hoy quiero compartir con ustedes algo que he aprendido y es ¿Cómo cargar o subir datos desde un archivo CSV a un tabla de un Base de datos Oracle utilizando APEX ?



Paso 1: Crear una nueva página con los siguientes objetos

1.1 Un región que sea un reporte iteractivo, sobre la tabla en la que vas a cargar/actualizar los datos (Opcional). Esto se servira para ir llevando un control de lo que vas insertando o actualizando
1.2 Un botón que servirá realizar el submit para cargar los datos
1.3 Un item tipo File Browse, en mi caso tiene el nombre P1_FILE

Paso 2: Crear una validación sobre el item para que se ejecute cada vez que hagas clic sobre el botón cargar. La validación es la de que este item no sea nulo, es decir que siempre se escoja el archivo que se va a cargar antes de hacer clic en el botón.
   En apex la validación es de tipo: Item specified is NOT NULL

Paso 3: Crear un proceso, con las siguientes características:
* Type: PL/SQL anonymous block    Conditional
* Process Point: On Submit - Before Computations and Validations (Esto es para que se ejecute despues de que se realice un submit que en nuestro caso cuando hagamos clic en el botón y si cumple las validaciones que creamos)
* Source: (Esta es la query que sirve solo para insertar registros)

DECLARE
 v_blob_data       BLOB;
 v_blob_len        NUMBER;
 v_position        NUMBER;
 v_raw_chunk       RAW(10000);
 v_char      CHAR(1);
 c_chunk_len   number       := 1;
 v_line        VARCHAR2 (32767)        := NULL;
 v_data_array      wwv_flow_global.vc_arr2;
 v_rows number;
 v_sr_no number := 1;

BEGIN

--Borran datos anteriores
delete from nombre_tabla;

-- Read data from wwv_flow_files
 select blob_content into v_blob_data
 from wwv_flow_files
 where name = :P1_FILE; --AQUI DEBEN CAMBIAR EL NOMBRE POR EL ITEM QUE USTEDES CREEN

v_blob_len := dbms_lob.getlength(v_blob_data);
 v_position := 1;

-- Read and convert binary to char
 WHILE ( v_position <= v_blob_len ) LOOP
 v_raw_chunk := dbms_lob.substr(v_blob_data,c_chunk_len,v_position);
 v_char :=  chr(hex_to_decimal(rawtohex(v_raw_chunk)));
 v_line := v_line || v_char;
 v_position := v_position + c_chunk_len;
 -- When a whole line is retrieved
 IF v_char = CHR(10) THEN
 -- Convert comma to : to use wwv_flow_utilities
 v_line := REPLACE (v_line, ';', ':'); --AQUI POR FAVOR TENGA EN CUENTA CUAL ES EL SEPARADOR QUE UTILIZAN COMA, PUNTO Y COMA.
-- Convert each column separated by : into array of data
 v_data_array := wwv_flow_utilities.string_to_table (v_line);
 -- Insert data into target table
 EXECUTE IMMEDIATE 'INSERT INTO nombre_tabla (campo1
                                      ,campo2
                                      ,campo3
                                      ,campo4
                                      ,campo5
                                      ,campo6
                                      ,campo7
                                      ,campo8
                                      ,campo9
                                      ,campo10
                                      ,campo11
                                      ,campo12
                                      ,campo13)
VALUES (:1,
        :2,
        :3,
        :4,
        :5,
        :6,
        :7,
        :8,
        :9,
        :10,
        :11,
        :12,
        :13)'
 USING
 to_number(v_data_array(1)),
 v_data_array(2),
 v_data_array(3),
 v_data_array(4),
 v_data_array(5),
 v_data_array(6),
 v_data_array(7),
 v_data_array(8),
 v_data_array(9),
 v_data_array(10),
 v_data_array(11),
 to_number(v_data_array(12)),
 v_data_array(13);
 -- Clear out
 v_line := NULL;
 END IF;

END LOOP;
 END;



* Source: (Esta es la query que sirve solo para insertar y actualizar registros)

 
DECLARE
 v_blob_data       BLOB;
 v_blob_len        NUMBER;
 v_position        NUMBER;
 v_raw_chunk       RAW(10000);
 v_char      CHAR(1);
 c_chunk_len   number       := 1;
 v_line        VARCHAR2 (32767)        := NULL;
 v_data_array      wwv_flow_global.vc_arr2;
 v_rows number;
 v_sr_no number := 1;

BEGIN

-- Read data from wwv_flow_files
 select blob_content into v_blob_data
 from wwv_flow_files
 where name = :P1_FILE;

v_blob_len := dbms_lob.getlength(v_blob_data);
 v_position := 1;

-- Read and convert binary to char
 WHILE ( v_position <= v_blob_len ) LOOP
 v_raw_chunk := dbms_lob.substr(v_blob_data,c_chunk_len,v_position);
 v_char :=  chr(hex_to_decimal(rawtohex(v_raw_chunk)));
 v_line := v_line || v_char;
 v_position := v_position + c_chunk_len;
 -- When a whole line is retrieved
 IF v_char = CHR(10) THEN
 -- Convert comma to : to use wwv_flow_utilities
 v_line := REPLACE (v_line, ';', ':');
-- Convert each column separated by : into array of data
 v_data_array := wwv_flow_utilities.string_to_table (v_line);
 -- Insert data into target table
 EXECUTE IMMEDIATE 'MERGE INTO nombre_tabla A USING
 (SELECT
        :1 as "campo1",
        :2 as "campo2",
        :3 as "campo3",
        :4 as "campo4",
        :5 as "campo5",
        :6 as "campo6",
        :7 as "campo7",
        :8 as "campo8",
        :9 as "campo9",
        :10 as "campo10"
  FROM DUAL) B
ON (A.campo1 = B.campo1)
WHEN NOT MATCHED THEN
INSERT (
  campo0, campo1, campo2, campo3, campo4, campo5,
  campo6, campo7, campo8, campo9, campo10)
VALUES (
  secuencia_tabla.nextval, TRIM(B.campo1), TRIM(B.campo2), TRIM(B.campo3), TRIM(B.campo4), TRIM(B.campo5), TRIM(UPPER(B.campo6)),
TRIM(B.campo7), TRIM(B.campo8), TRIM(B.campo9), TRIM(B.campo10))
WHEN MATCHED THEN
UPDATE SET
  A.campo2 = TRIM(B.campo2),
  A.campo3 = TRIM(B.campo3),
  A.campo4 = TRIM(B.campo4),
  A.campo5 = TRIM(B.campo5),
  A.campo6 = TRIM(UPPER(B.campo6)),
  A.campo7 = TRIM(B.campo7),
  A.campo8 = TRIM(B.campo8),
  A.campo9 = TRIM(B.campo9),
  A.campo10 = TRIM(B.campo10)'
 USING
-- to_number(v_data_array(1)),
 v_data_array(1),
 v_data_array(2),
 v_data_array(3),
 v_data_array(4),
 v_data_array(5),
 v_data_array(6),
 v_data_array(7),
 v_data_array(8),
 v_data_array(9),
 v_data_array(10);
 -- Clear out
 v_line := NULL;
 END IF;

END LOOP;

EXCEPTION
 
WHEN OTHERS THEN
    
   apex_application.g_print_success_message := '  Error:  ->> ' || sqlerrm || '  Error2:   ---> ' || DBMS_UTILITY.format_error_backtrace;

 END;


Eso es todo, si quieren personalizar o separar la region de carga de datos del reporte, pueden crear una nueva región, ahi ya es cuestión de como desean personalizar su aplicación.

Les agrego una imagen de como tienen que quedar los pasos:

Cualquier inquietud me comentan, espero poder ayudarles.



El link de donde yo aprendí es: OraExplorer, APEX to upload a text file and write into a table



lunes, 28 de mayo de 2012

Link para crear y validar Expresiones Regulares

Hola a tod@s.

Espero se encuentren muy bien, queria compartir con ustedes una página muy útil, sirve para crear e ir validando expresiones regulares, las cuales nos sirven para validar que la información digitalizada cumpla ciertos parametros. Se las suele utilizar para formatos de fechas, de números, nombres, etc.

Espero les sea de utilidad. El link es: http://regexpal.com/

saludos a tod@s!! Exitos siempre!! y a luchar por alcanzar sus sueños!! :)

Sueños de Informáticos!!

A veces... bueno no... siempre me he preguntado porque elegimos algo, la carrera, tu pareja, tus amig@s, mentir o decir la verdad, bueno siempre elegiges... para que???ahora he comprendido que los sueños son los responsables... elegiges algo porque quieres algo, elegiges no engañar porque no quieres que hagan lo mismo contigo, eliges estar con alguien porque crees y sientes que vas a pasar bien junto a su lado, y bueno, eliges tu carrera para ser alguien... no verdad??? eliges porque tu sueño es el de crear, diseñar construir algo mejor, mas sofisticado... y por eso eres un informático porque analizas todo y sabes lo importante que es escalar paso a paso....

Sistemas 2009

Sistemas 2009
disfrutnado con mis amig@s en la cena de sistemas...