Editar Base De Datos Gambas 2.19 [Solucionado]


Ir a la página Anterior  1, 2

Objetivo: Re: Editar Base De Datos Gambas 2.19 [Solucionado]
haces mal al abrir y cerrar conexión dentro del bucle. Abrir y cerrar una conexión es algo "pesado". Deberías hacerlo fuera del bucle y dentro solo los updates o insert o lo que sea.

conectabase()
for n=1 to principal.articulos-1
...
next
cerrarconexion()

Y de hecho lo mejor sería si se puede (que a veces se puede y a veces no) ir acumulando los cambios que quieres hacer y luego hacer un único update o insert o lo que sea.

Un saludo

Perfil MP  
Objetivo: Re: Editar Base De Datos Gambas 2.19 [Solucionado]
soplo escribió:  
haces mal al abrir y cerrar conexión dentro del bucle. Abrir y cerrar una conexión es algo "pesado". Deberías hacerlo fuera del bucle y dentro solo los updates o insert o lo que sea.

conectabase()
for n=1 to principal.articulos-1
...
next
cerrarconexion()

Y de hecho lo mejor sería si se puede (que a veces se puede y a veces no) ir acumulando los cambios que quieres hacer y luego hacer un único update o insert o lo que sea.

Un saludo


Gracias, lo voy a cambiar ahora mismo, y una vez terminado todo voy a reorganizar mi codigo por que si voy a necesitar usarlo en varios proyectos, saludos

Perfil MP  
Objetivo: Re: Editar Base De Datos Gambas 2.19 [Solucionado]
Hola,

Aunque no se si me meto donde no me llaman, creo que es más limpio para este tipo de opeaciones crear y emplear funciones, triggers en la propia base de datos de forma que desde el aplicativo nos olvidamos de la "lógica de negocio". Como ejemplo parecido al tuyo:

Un sencillo ejemplo sería crear un Trigger para insertar un pedido de algún producto cuando la cantidad de éste, en nuestro almacén, sea inferior a un valor dado. Fuente Wikipedia

BEFORE UPDATE ON tabla_almacen
FOR ALL records
IF :NEW.producto < 100 THEN
INSERT INTO tabla_pedidos(producto) VALUES ('1000');
END IF;
SELECT DBO.POLVE.TEST
END


Otro ejemplo, esta vez de mi cosecha, para logearse: Esta operación muy común requiere un formulario muy sencillo que en principio bastaría con dos TextBox (usuario y password) y un Button para enviar. La programación del formulario debería ceñirse a comprobar el formato de los dos texbox, a encriptar la contraseña, a enviar los datos al SGBD y a actuar en función de la respuesta del SGBD. Todo lo demás, lo puedes hacer desde la base de datos: Saber si existe el usuario, en caso afirmativo comprobar contraseña, grabar los datos de la conexión si es correcta, grabar si hay error, gestionar intentos de conexión, bloquear el usuario en caso de tres intentos erroneos, y por supuesto comunicar al aplicativo el resultado. ¿Ventajas? Repartes el trabajo entre el aplicativo y el SGBD, en caso de fallo de programación en la lógica no tienes que hacer un nuevo ejecutable y distribuirlo, si te apetece programar un aplicativo en otro lenguaje solo tienes que reprogramar el formulario.

CREATE OR REPLACE FUNCTION valida_usuario(text[], text[])
RETURNS character varying AS
$BODY$ DECLARE
/********************************************************************************************************
* The contents OF this file are subject TO the GPL V.3
* The Original Code IS TPV -ERP.
* All portions are Copyright(C)2008 - 2010 JORGE MARTIN AZNAR
* All Rights Reserved.
Parámetos de entrada:
1. -array con los datos ordenados username y password
2. -Texto con host
Retorna PASA si hay exito
Retorna ERROR_0019 si el usuario está bloqueado
Retorna ERROR_0018 si el usuario no está activo
Retorna ERROR_0017 si La persona está bloqueada
Retorna ERROR_0016 Este usuario a quedado bloqueado
Retorna ERROR_0015 Error de usuario o contraseña
********************************************************************************************************/
result RECORD;
contador Int;
valores ALIAS FOR $1 ;
valores2 ALIAS FOR $2 ;
resul1 varchar(10);
id Int;
BEGIN
contador = 0;
SELECT INTO result * FROM erp_usuarios WHERE username = valores[1] AND password = valores[2] AND delete_u = 'N';
IF result.username = valores[1] THEN
id = result.id_usuario;
IF (result.isactive_u = 'Y') then
IF (result.isblocked = 'Y') then
resul1 = fregistro_entradas(valores2,'EN', id);
RETURN 'ERROR_0019';
ELSE
IF (result.isactive_u = 'Y') then
resul1 = fregistro_entradas(valores2,'EY', id);
IF (resul1 = 'OK') then
update erp_usuarios set cont_int = 0 WHERE username = valores[1];
RETURN 'PASA';
ELSE
RETURN resul1;
END IF ;
ELSE
resul1 = fregistro_entradas(valores2,'EN', id);
RETURN 'ERROR_0018';
END IF ;
END IF ;
ELSE
resul1 = fregistro_entradas(valores2,'EN', id);
RETURN 'ERROR_0017';
END IF ;
ELSE
SELECT INTO result * FROM erp_usuarios WHERE username = valores[1] AND delete_u = 'N';
id = result.id_usuario;
IF (result.cont_int < 3) THEN
contador = result.cont_int + 1;
update erp_usuarios set cont_int = contador WHERE username = valores[1];
ELSE
IF (result.cont_int = 3) THEN
update erp_usuarios set isblocked = 'Y' WHERE username=valores[1];
RETURN 'ERROR_0016';
END IF ;
END IF ;
SELECT INTO result * FROM erp_usuarios WHERE username = valores[1];
IF result.username = valores[1] THEN
id = result.id_usuario;
resul1 = fregistro_entradas(valores2,'EN', id);
END IF ;
RETURN 'ERROR_0015';
END IF ;
EXCEPTION WHEN OTHERS THEN
RETURN SQLERRM;
END ; $BODY$
LANGUAGE 'plpgsql' VOLATILE
COST 100;
ALTER FUNCTION valida_usuario(text[], text[]) OWNER TO postgres;



Otra pega que veo en tu código es que no controlas las transacciones y eso producirá errores a largo plazo casi seguro.

Espero que os sirva

Saludos

Objetivo: Re: Editar Base De Datos Gambas 2.19 [Solucionado]
Los triggers son mucho mas seguros cuando se pueden usar lo que pasa es que ante un usuario que está aprendiendo si le sueltas un ladrillo con todas las posibilidades se muere. No pasa nada por escribir código y recibir críticas constructivas para saber que has hecho bien y que has hecho mal. Así lo siguiente lo haces mejor.

Erik los triggers son ordenes que se le dan a una base de datos para que cuando tu insertes, actualices o borres un determinado campo haga algo. Ese algo puede ser un cálculo o actualizar o borrar otro campo de otra tabla. Así no tienes que hacer todo. Tu haces el trigger y de ahí en adelante cada vez que cambies el valor de el campo ese se ejecutará el trigger. Como está en la base de datos ni siquiera ocurre con tu programa. Ocurre con cualquier cosa que haga que ese cambio ocurra venga de donde venga. De esa forma te evitas errores porque no hay posibilidad física de que eso no ocurra. Así por ejemplo si restar en un campo supone sumar en otro cada vez que de una forma u otra restes se hará la otra suma automáticamente. Nunca hay inconsistencia de datos.

También se pueden usar procedimientos almacenados que son mas complejos porque son programitas (a veces programones).

Sin embargo el uso de estas técnicas no se debe usar al tutiplen. Saber programar es conocer todas las posibilidades y elegir en cada momento el método mas conveniente.


Perfil MP  
Objetivo: Re: Editar Base De Datos Gambas 2.19 [Solucionado]
Hola,

Tienes razón soplo. Espero no haber liado la madeja y que al menos sirva para despertar la curiosidad sobre estos temas.

Saludos

Objetivo: Re: Editar Base De Datos Gambas 2.19 [Solucionado]
no no, liarla no. Al menos no lo creo. Ahora Erik sabe que hay otras opciones y quizá con el tiempo las investigue también. Por ahí hemos pasado todos. Con esas experiencias y con elt iempo y con errores se aprende. Luego uno un día mira algo que hizo tiempo atras con tanto esfuerzo y se da cuenta de como lo podría haber hecho mejor y con menos esfuerzo. Yo me arreglé así varios programas en el pasado y lo disfrutaba porque cada línea de código me daba cuenta lo que había mejorado y veia mi programa funcionar mejor, con mas opciones, mas estable, y con menos trabajo.

Hay a quien no le gustan las críticas. Yo tengo por costumbre hacerlas cuando creo que debo hacerlo pero siempre es para que quien pone ese código vea que cosas ha resuelto bien y que cosas son mejorables. El ánimo es solo constructivo, lo que pasa es que si no te lo dice nadie pues no lo sabes. Erik ahora sabe que tiene que tener cuidado donde pone el abrir y cerrar conexiones. La próxima vez partirá de eso y lo hará mejor. Nada mas que eso.

Por cierto que tanto hablar del fallo parece que todo estuviera mal cosa que no es cierto je je je.

Perfil MP  
Objetivo: Re: Editar Base De Datos Gambas 2.19 [Solucionado]
Gracias nuevamente a todos, pues este es mi segundo programa en gambas, el primero solo era una agenda a medio terminar por que cambie de ubuntu a fedora y no resplde todo :P, aunque a veces me arrepiento del cambio jejejeje, todo lo que me comentan lo guardo para ocuparlo despues, ahora estoy un poco contra el tiempo, pero ya que trabajare con proyectos similares me encargare de poco a poco ir mejorando mi codigo y empaparme mas de gambas que me ha gustado bastante, bueno nos estamos leyendo y espero pronto yo poder dar consejos jejeje.

Perfil MP  
Ir a la página Anterior  1, 2

Página 2 de 2


  
No puede crear mensajes
No puede responder temas
No puede editar sus mensajes
No puede borrar sus mensajes
No puede votar en encuestas
No puede adjuntar archivos
Puede descargar archivos
No puede publicar eventos en el calendario

   

Está utilizando la versión (Lo-Fi). Para ver la versión completa del foro, haga clic aquí.

Powered by Icy Phoenix based on phpBB
Design by DiDiDaDo

Página generada en:: 0.1481s (PHP: -8% SQL: 108%)
Consultas SQL: 22 - Debug off - GZIP Activado