viernes, 11 de noviembre de 2011

Copiar elementos de una Lista a Otra, subir y bajar en oracle forms (PL/SQL)

Hola:

Para poder hacer este ejemplo es necesario saber PL/SQL y un poco de Oracle Forms, este ejemplo espero y le pueda servir a alguien, bueno a mi me sirvio para la parte del proyecto en el que trabaje.

Paso 1.

Tenemos que construir un bloque de datos de manera manual lo llamaremos LISTA:



Mostrara un asistente como el siguiente:


Paso 2. Creado el bloque de datos LISTA, ir al apartado de Lienzos, abrir el CANVAS2 o como se llame en su proyecto, mostrara una ventana con el canvas, en la opción Canvas: seleccionar CANVAS2 y en Block: LISTA .



Paso 3: Arrastar todos los elementos: La lista es el Elemento de Lista de la barra de herramientas vertical.


Ir a la las propiedades del Elemento y en el apartado Funcional en la opción Estilo de Lista seleccionar Lista de Texto, esto se tendra que hacer para cada lista.


El diseño debe quedar parecido al de la imagen de arriba.

Paso 4. Debemos cargar Datos e nuestra Lista, se puede hacer desde la base Datos, pero por ahora no pondre esa parte, los pondremos en codigo duro.

Ir a las propiedades de la Lista principal, en el apartado Funcional seleccionar la opción Elementos de Lista , preisionar el boton More..., mostrara una ventana de List Elements, en esta podemos dar de alta los elementos y sus valores.







Paso 5. Para agregar el Trigger( Disparador, para los programan en Java un Evento) o nuestro boton debemos contar con los siguientes elementos:







Nuestro formulario debe tener los siguientes elementos:
LIST_ELEMENT
LIST_ELEMENT_END
BTN_ADD_ELEMET
BTN_ADD_ALL_ELEMET
BTN_DEL_ELEMENT
BTN_DEL_ALL_ELEMENT
BTN_UP_ELEMENT
BTN_DOWN_ELEMENT












Como se muestra en la siguiente imagen:














Ahora tenemos que agregar el disparador WHEN-BUTTON-PRESSED al boton BTN_ADD_ELEMET:












En el editor de codigo poner el siguiente codigo:






DECLARE
l_count INTEGER;
l_text VARCHAR2(100);
l_value VARCHAR2(100);
n_index_borrar INTEGER:=-1;
BEGIN
--Cuenta el numero de elementos de la lista
l_count := GET_LIST_ELEMENT_COUNT('LIST_ELEMENT');
--Itera por cada elemento de lista
FOR i in 1..l_count LOOP
--Valida si el elemento de la lista es el seleccionado
IF GET_LIST_ELEMENT_VALUE('LIST_ELEMENT',i) = :LIST_ELEMENT THEN
l_text := GET_LIST_ELEMENT_LABEL('LIST_ELEMENT',i);
l_value:= GET_LIST_ELEMENT_VALUE ('LIST_ELEMENT',i);
Add_List_Element('LIST_ELEMENT_END',1,l_text,l_value);
n_index_borrar:=i;
END IF;
END LOOP;
--elimina el elemento de la lista
IF n_index_borrar <> -1 THEN
DELETE_LIST_ELEMENT ('LIST_ELEMENT',n_index_borrar);
END IF;
END;



BTN_ADD_ALL_ELEMET agregamos el disparador WHEN-BUTTON-PRESSED y en editor el siguiente codigo

DECLARE
l_count INTEGER;
l_text VARCHAR2(100);
l_value VARCHAR2(100);
n_index_borrar INTEGER:=-1;
BEGIN

l_count := GET_LIST_ELEMENT_COUNT('LIST_ELEMENT');
FOR i in 1..l_count LOOP

l_text := GET_LIST_ELEMENT_LABEL('LIST_ELEMENT',i);
l_value:= GET_LIST_ELEMENT_VALUE ('LIST_ELEMENT',i);

IF TRIM(l_text) is not null THEN
Add_List_Element('LIST_ELEMENT_END',i,l_text,l_value);
n_index_borrar:=i;
END IF;

END LOOP;

IF n_index_borrar <> -1 THEN
CLEAR_LIST('LIST_ELEMENT');
END IF;

END;


BTN_ADD_ALL_ELEMET agregamos el disparador WHEN-BUTTON-PRESSED y en editor el siguiente codigo

DECLARE
l_count INTEGER;
l_text VARCHAR2(100);
l_value VARCHAR2(100);
n_index_borrar INTEGER:=-1;
BEGIN

l_count := GET_LIST_ELEMENT_COUNT('LIST_ELEMENT_END');
FOR i in 1..l_count LOOP

l_text := GET_LIST_ELEMENT_LABEL('LIST_ELEMENT_END',i);
l_value:= GET_LIST_ELEMENT_VALUE ('LIST_ELEMENT_END',i);

IF TRIM(l_text) is not null THEN
Add_List_Element('LIST_ELEMENT',i,l_text,l_value);
n_index_borrar:=i;
END IF;

END LOOP;

IF n_index_borrar <> -1 THEN
CLEAR_LIST('LIST_ELEMENT_END');
END IF;

END;

BTN_ADD_ELEMET agregamos el disparador WHEN-BUTTON-PRESSED y en editor el siguiente codigo

DECLARE
l_count INTEGER;
l_text VARCHAR2(100);
l_value VARCHAR2(100);
n_index_borrar INTEGER:=-1;
BEGIN

l_count := GET_LIST_ELEMENT_COUNT('LIST_ELEMENT_END');
FOR i in 1..l_count LOOP
IF GET_LIST_ELEMENT_VALUE('LIST_ELEMENT_END',i) = :LIST_ELEMENT_END THEN
l_text := GET_LIST_ELEMENT_LABEL('LIST_ELEMENT_END',i);
l_value:= GET_LIST_ELEMENT_VALUE ('LIST_ELEMENT_END',i);
Add_List_Element('LIST_ELEMENT',1,l_text,l_value);
n_index_borrar:=i;
END IF;
END LOOP;

IF n_index_borrar <> -1 THEN
DELETE_LIST_ELEMENT ('LIST_ELEMENT_END',n_index_borrar);
END IF;

END;



Para subir un elemento de la lista LIST_ELEMENT_END se configura el siguiente disparador WHEN-BUTTON-PRESSED en el boton BTN_UP_ELEMENT con este código

DECLARE
l_count INTEGER;
l_text VARCHAR2(100);
l_value VARCHAR2(100);
l_text2 VARCHAR2(100);
l_value2 VARCHAR2(100);
bandera INTEGER:=0;
BEGIN

l_count := GET_LIST_ELEMENT_COUNT('LIST_ELEMENT_END');
FOR i in 1..l_count LOOP
IF GET_LIST_ELEMENT_VALUE('LIST_ELEMENT_END',i) = :LIST_ELEMENT_END AND bandera=0 AND i <> 1 THEN
l_text := GET_LIST_ELEMENT_LABEL('LIST_ELEMENT_END',i);
l_value:= GET_LIST_ELEMENT_VALUE ('LIST_ELEMENT_END',i);
l_text2 := GET_LIST_ELEMENT_LABEL('LIST_ELEMENT_END',i-1);
l_value2:= GET_LIST_ELEMENT_VALUE ('LIST_ELEMENT_END',i-1);
Add_List_Element('LIST_ELEMENT_END',i-1,l_text,l_value);
Add_List_Element('LIST_ELEMENT_END',i,l_text2,l_value2);
DELETE_LIST_ELEMENT ('LIST_ELEMENT_END',i);
DELETE_LIST_ELEMENT ('LIST_ELEMENT_END',i+1);
bandera:=1;
END IF;
END LOOP;

END;

Para bajar un elemento de la lista LIST_ELEMENT_END se configura el siguiente disparador WHEN-BUTTON-PRESSED en
el boton BTN_DOWN_ELE con este código

DECLARE
l_count INTEGER;
l_text VARCHAR2(100);
l_value VARCHAR2(100);
l_text2 VARCHAR2(100);
l_value2 VARCHAR2(100);
bandera INTEGER:=0;
BEGIN

l_count := GET_LIST_ELEMENT_COUNT('LIST_ELEMENT_END');
FOR i in 1..l_count LOOP
IF GET_LIST_ELEMENT_VALUE('LIST_ELEMENT_END',i) = :LIST_ELEMENT_END AND bandera=0 AND (l_count) <> i THEN
l_text := GET_LIST_ELEMENT_LABEL('LIST_ELEMENT_END',i);
l_value:= GET_LIST_ELEMENT_VALUE ('LIST_ELEMENT_END',i);
l_text2 := GET_LIST_ELEMENT_LABEL('LIST_ELEMENT_END',i+1);
l_value2:= GET_LIST_ELEMENT_VALUE ('LIST_ELEMENT_END',i+1);
Add_List_Element('LIST_ELEMENT_END',i+1,l_text,l_value);
Add_List_Element('LIST_ELEMENT_END',i,l_text2,l_value2);
DELETE_LIST_ELEMENT ('LIST_ELEMENT_END',i+1);
DELETE_LIST_ELEMENT ('LIST_ELEMENT_END',i+2);
bandera:=1;
END IF;
END LOOP;

END;

Para que la lista fin este limpia (LIST_ELEMENT_END), cuando crea un nueva instancia se configura un disparador WHEN-NEW-FORM-INSTANCE con el siguiente código

CLEAR_LIST ('LIST_ELEMENT_END');

Cuando se recuperan datos desde la base de datos de tiene hacer una función para llenar la lista principal y la lista fin,en otra entrada mostrare como hacerlo.



Si ejecutamos hasta aqui nuestro pequeño proyecto ya podremos copiar un elemento de una lista a la otra:





continuara...

Se feliz, libre, sueño por un mundo mejor.......

martes, 27 de septiembre de 2011

Obtener dia primerio y ultimo del mes actual (oracle)

Hola:

Pongo una pequeña consulta espero les sirva, es para obtener el dia primero y ultimo del mes anterior al actual en oracle.

select to_date(trunc(trunc(sysdate, 'MM')-1,'MM'),'dd/mm/rrrr') dia_primero_mes_ant
,to_date(last_day(trunc(sysdate, 'MM')-1),'dd/mm/rrrr') dia_fin_mes_ant
from dual

Saludos.

lunes, 5 de septiembre de 2011

Extraer tokens con REGEXP_SUBSTR (Oracle)

Hola:

Muchos lenguejes de programación tienen funciones, clases, etc para extraer los tokens de una cadena ya sea por medio de una expresion regular o por un delimitador, hace ya varios meses me tope con este problemita pero con PL SQL, y un compañero del trabajo se le ocurrio este idea que comparto:

Para nuestro ejemplo sera por el delimitador "-", pero usando una expresion regular por medio de REGEXP_SUBSTR

set serveroutput on;
declare
V_DESC VARCHAR2(200):='1234-Isaac Le-Mew';
N_TOKENS PLS_INTEGER:=0;
V_VAL_RETORNO VARCHAR2(50);
begin
-- Se obtiene el numero de tokens de la cadena
N_TOKENS :=LENGTH(V_DESC) - LENGTH(REPLACE(V_DESC, '-', '')) + 1;
-- Se itera sobre cada uno de los tokens de la cadena
FOR I IN 1 .. N_TOKENS
LOOP
-- Se extrae cada ocurrencia del token empezando siempre desde la posicion 1
V_VAL_RETORNO := REGEXP_SUBSTR(V_DESC,'[^-]+',1,I);
dbms_output.put_line(I||' - '||V_VAL_RETORNO);
END LOOP;
end;
/

el resultado sera algo como lo sisuiente:

anonymous block completed
1 - 1234
2 - Isaac Le
3 - Mew


Saludos, el mundo siempre puede ser mejor....

viernes, 2 de septiembre de 2011

Como extraer los datos de LOV (Lista de valores) por medio de Grupo de Registros (Oracle Forms)

Hola:

Cuando desarrollamos aplicaciones en Oracle Forms siempre nos topamos con hacer cosas que ya estan hechas y no es tan dificil como aparenta.

Un dia muy feliz en mi trabajo me pidieron la opción que dentro de una LOV list, le pusiera la opción de todos, y lo que no queria hacer un bloque de datos con un check box con las opción de todos, puesto que me tardaria muchos dias porque eran muchas listas de valores, asi que encontre como sulucionar esto, quizas alguien encontro una maneras mas simple, pero me gustaria compartir como lo hize.

La funcion PL SQL que ocupe es la siguiente:

FUNCTION L_OBT_ELEMENTS_RGP_SP(v_IdItem VARCHAR2,v_campo VARCHAR2) RETURN VARCHAR2 IS
v_LovName VARCHAR2(150);
v_GroupName VARCHAR2(150);
the_rowcount PLS_INTEGER;
rg_Id RecordGroup;
status PLS_INTEGER;
rec_Count PLS_INTEGER;
v_valIn VARCHAR2(500);
v_valor VARCHAR2(100);
col1 GroupColumn;
v_lon PLS_INTEGER;

BEGIN
NULL;

v_LovName := Get_Item_Property(v_IdItem, LOV_NAME );
v_GroupName := Get_LOV_Property(v_LovName,GROUP_NAME);
rg_Id:= Find_Group(v_GroupName);
status:=Populate_Group(rg_Id);
rec_Count := Get_Group_Row_Count( rg_id );
col1 := Find_Column(v_GroupName||'.'||v_campo);

FOR j IN 1..rec_Count LOOP
v_valor:= GET_GROUP_CHAR_CELL(col1, j );
v_valIn:=v_valIn||v_valor||',';
END LOOP;

v_lon:=LENGTH(v_valIn);
v_valIn:=SUBSTR(v_valIn,1,v_lon-1) ;


return v_valIn;
END;

martes, 23 de agosto de 2011

REGEXP_SUBSTR en oracle

Hola: (Hay problemas con las pipes)

Tengo tiempo trabajando con esta función de oracle REGEXP_SUBSTR y me gustaría compartir el uso que se le puede dar.

Supongamos que tenemos una cadena, el ejemplo mas claro es para los impuestos del SAT le llaman cadena original y se guarda con delimitadores su estándar es el pipe pero usaremos ";" para este ejemplo:

Cadena Original:

;; A;1;2005-09-02T16:30:00;1;ISP900909Q88;Industrias del Sur Poniente, S.A. de C.V.;Alvaro Obregón;37;3;Col. Roma Norte;México;Cuauhtémoc;Distrito Federal;México;06700;Pino Suarez;23;Centro;Monterrey;Monterrey;Nuevo Léon;México;95460;CAUR390312S87;Rosa María Calderón Uriegas;Topochico;52;Jardines del Valle;Monterrey;Monterrey;Nuevo León;México;95465;10;Caja;Vasos decorados;20;200;1;pieza;Charola metálica;150;150;IVA;52.5 ;;

Supongamos que este dato lo guardamos en un campo de la base de datos y queremos extraer la razón social.

Usamos la siguiente expresión dentro de la consulta:

REGEXP_SUBSTR(campo de tipo varchar2 o tipos parecidos, expresión regular,
posición del campo en que va iniciar,numero de ocurrencia)

SELECT REGEXP_SUBSTR(';; A;1;2005-09-02T16:30:00;1;ISP900909Q88;Industrias del Sur Poniente, S.A. de C.V.;
Alvaro Obregón;37;3;Col. Roma Norte;México;Cuauhtémoc;Distrito Federal;México;06700;Pino Suarez;23;Centro;Monterrey;
Monterrey;Nuevo Léon;México;95460;CAUR390312S87;Rosa María Calderón Uriegas;Topochico;52;Jardines del Valle;Monterrey;Monterrey;
Nuevo León;México;95465;10;Caja;Vasos decorados;20;200;1;pieza;Charola metálica;150;150;IVA;52.5 ;;','[^;]+',3,6) FROM DUAL

Ahora lo que quiere decir los parámetros es lo siguiente:


[^;]+ va a separar los tokens que contengan este expresión regular
3 va a empezar en la posición 3 de la cadena, va eliminar los dos primeros

la cadena quedaría de la siguiente manera:

A;1;2005-09-02T16:30:00;1;ISP900909Q88;Industrias del Sur Poniente, S.A. de C.V.;Alvaro Obregón;37;3;Col. Roma Norte;México;
Cuauhtémoc;Distrito Federal;México;06700;Pino Suarez;23;Centro;Monterrey;Monterrey;Nuevo Léon;
México;95460;CAUR390312S87;Rosa María Calderón Uriegas;Topochico;52;Jardines del Valle;Monterrey;
Monterrey;Nuevo León;México;95465;10;Caja;Vasos decorados;20;200;1;pieza;Charola metálica;150;150;IVA;52.5 ;;

El parámetro 6 que es la ocurrencia,para nuestra expresión separa la cadena de esta manera:

A ocurrencia 1
1 ocurrencia 2
2005-09-02T16:30:00 ocurrencia 3
1 ocurrencia 4
ISP900909Q88 ocurrencia 5
Industrias del Sur Poniente, S.A. de C.V. ocurrencia 6
Alvaro Obregón ocurrencia 7
.
.
n ocurrencia 7

sábado, 4 de junio de 2011

Como hacer una cursor de una tabla de tipo record? (PL/SQL)

Hola:

Todos alguna vez cuando programamos en PL/SQL nos topamos con el problema de retornar un cursor pero los campos se encuentran en distinas tablas y ademas debemos tener validaciones de x tipo, sumado a esto no podemos crear una GLOBAL TEMPORARY TABLE.

Paso 1. Creamos un record con los tipo de datos que deseamos utilizar, para una mejor practica recomiendo el uso de         esquema.nombretabla.campo%TYPE

 TYPE persona IS RECORD
(
nombre VARCHAR2(100),
edad NUMERIC(2)
);

Paso 2. Creamos una colección de datos con el tipo de dato persona
TYPE listaPersonas  IS  TABLE OF persona;
listPers listaPersonas := listaPersonas();

Es necesario aclarar que esta tabla solo estará disponible cuando se llame al paquete, función o procedimiento, para agregar elementos a la colección (TABLA) se llama a metodo extend (añade una instancia)

Ejemplo:
listPers.extend;
listPers(indice).nombre := 'Josue ';
listPers(indice).edad :=25;

indice es el subíndice de la tabla, este indica la posición en que hace referencia la instancia que estamos asignando

Paso 3. Necesitamos crear una función PIPELINED, esta función sirve para manejar volúmenes de información cuando no se desea guardar los datos físicamente en alguna tabla de la base de datos, en resumen la función de PIPELINED son útiles si hay una necesidad de una fuente de datos que no sea una tabla en una instrucción select.


 
FUNCTION getRows RETURN listaPersonas PIPELINED IS
BEGIN
FOR i IN listPers.first..listPers.last LOOP 
PIPE ROW ( listPers(i) );
END LOOP;  RETURN;
END getRows;

El codigo completo es el siguiente:
create or replace PACKAGE         PR_EJEMPLO_Pipelined  IS
TYPE persona IS RECORD        
(            
nombre VARCHAR2(100),      
edad NUMERIC(2)
);
TYPE listaPersonas  IS  TABLE OF persona;
listPers listaPersonas := listaPersonas();
PROCEDURE OBTPERSONAS;
FUNCTION getRows RETURN listaPersonas PIPELINED;
END;
/

create or replace PACKAGE BODY PR_EJEMPLO_Pipelined  IS

PROCEDURE OBTPERSONAS IS
IND NUMBER := 0; 
type personas_cursor is REF CURSOR;
BEGIN
listPers.delete;
WHILE(IND<20)       
LOOP               
IND := IND + 1;
listPers.extend;
listPers(IND).nombre := 'Josue '||IND;
listPers(IND).edad := IND;
END LOOP;
for x in listPers.first..listPers.last  loop
dbms_output.put_line(listPers(x).nombre||' - '||listPers(x).edad);
end loop;


for p in ( SELECT * from  TABLE(getRows) ) loop
dbms_output.put_line('tabla temporal '||p.nombre||' - '||p.edad);
end loop;

end;

FUNCTION getRows RETURN listaPersonas PIPELINED IS
BEGIN
FOR i IN listPers.first..listPers.last LOOP 
PIPE ROW ( listPers(i) );
END LOOP;  RETURN;
END getRows;

END PR_EJEMPLO_Pipelined ;
 /

martes, 22 de marzo de 2011

Grid en swingx (Parte 2)

Hola:


Para la parte crearemos un la parte del modelo el cual servira para mostrar datos en nuestro tabla de swing, es muy simple solo debemos hacer lo siguiente:


1.- Vamos a crear una JFrame en donde colocaremos nuestro JPanelGrid, netbeans tiene una manera fácil y rápida de hacerlo File/New File/Swing GUI Forms/ en la opción de Files types seleccionar JFrameForm y next




Aparecerá un panel en donde tienen que poner el nombre la clase para este ejemplo se llamara JFramePrincipal.



Ahora ya tendremos una ventana en donde podremos colocar nuestro JPanelGrid, pero antes de agregarlo vamos a las propiedades de la tabla su nombre es jXTable1, en las propiedades hay una que se llama model
entramos ha esta y eliminamos todas las columnas y renglones, después damos clic en botón OK, en la imagen de abajo muestro como hacerlo.

Después compilamos con F9 nuestra clase llamada JPanelGrid y para adherirlo a nuestro JFramePrincipal solo es necesario arrastrar nuestra Clase JPanelGrid en JFramePricipal que esta en modo diseño.

Para probar que todo hasta aquí va funcionando de maravilla solo necesitamos ejecutar (Run File) la clase JFramePrincipal y nos tiene que abrir una ventana con un grid vacio.