[Lazarus-es] Comportamiento Lazarus y firebird

Manuel Galeote manuel en clublazarus.com
Vie Jul 22 20:30:05 CEST 2011


Gracias Ismael, me han sido de gran ayuda tus comentarios para iniciarme en
el uso de las transacciones y procedimientos. 

Un saludo.

 

De: Ismael L. Donis Garcia [mailto:ismael en citricos.co.cu] 
Enviado el: viernes, 22 de julio de 2011 17:45
Para: Spanish version of Lazarus List
Asunto: Re: [Lazarus-es] Comportamiento Lazarus y firebird

 

Yo te haría 2 correcciones: 1 en Firebird y otra en Lazarus. Aunque no se
cual es la llave primaria de la tabla USUARIOS, pero al menos creo que
tengas definido al campo usuarios.usuario con un índice único, para que no
puedas tener 2 usuarios con el mismo nombre.

 

El procedimiento almacenado lo haría como sigue:

 

CREATE OR ALTER PROCEDURE USUARIOS_NUEVO (

    usuario varchar(80),

    clave varchar(80),

    nivel integer)

as

DECLARE VARIABLE VCH_USER VARCHAR(80);

begin

  /* Nuevo usuario */

select first 1 u.usuario from usuarios u where (u.usuario=:usuario) into
:vch_user;

if (row_count = 0) then

    INSERT INTO USUARIOS (USUARIO,CLAVE,NIVEL) values (:USUARIO, :CLAVE,
:NIVEL);

end

 

En lazarus lo  haría como sigue (pero recuerda que mi experiencia aquí es
mucho menor, mi experiencia en Lazarus o en Delphi que es nula, pero no así
en los lenguajes de Microsoft que es bastante amplia, llevo más de 10 años
desarrollando soft en varios lenguajes de Visual Estudio)

 

  if SQLTransactionVAV.Active then begin
    try try
      SQLTransactionVAV.Commit;
    except on e:exception do
      SQLTransactionVAV.Rollback;
    end;
    finally
      SQLTransactionVAV.EndTransaction;
    end;
  end;

  SQLQryOrdenes.Close;

  SQLQryOrdenes.SQL.Clear;

  SQLQryOrdenes.SQL.Text := 'EXECUTE PROCEDURE USUARIOS_NUEVO(:USUARIO,
:CLAVE, :NIVEL)';

  SQLQryOrdenes.ParamByName('USUARIO').Value:=edtUsuario.Text;

  SQLQryOrdenes.ParamByName('CLAVE').Value:=cifra(edtPassword.Text);

  //Genera el nivel con relación al ItemIndex

  SQLQryOrdenes.ParamByName('NIVEL').Value:=cbNivel.ItemIndex;

  

  try try

  SQLTransactionVAV.StartTransaction;

    SQLQryOrdenes.ExecSQL;

    SQLTransactionVAV.Commit;

  except

     begin

        ShowMessage('Error: al guardar los datos en la tabla');

        SQLTransactionVAV.Rollback;

     end

  end;

  finally

    SQLTransactionVAV.EndTransaction;

  end

 

  SQLQryUsuarios.Active:=false;

  SQLQryUsuarios.Active:=true;

 

 

Saludos Reiterados

=========
|| ISMAEL ||
=========

----- Original Message ----- 

From: Manuel Galeote <mailto:manuel en clublazarus.com>  

To: 'Spanish version of Lazarus List'
<mailto:lazarus-es en lists.lazarus.freepascal.org>  

Sent: Friday, July 22, 2011 6:42 AM

Subject: Re: [Lazarus-es] Comportamiento Lazarus y firebird

 

Gracias, en zeos tenía el autocommit a true pero no funcionaba, finalmente
he cambiado zeos por sqldb y aparentemente ahora, tecleando todo a mano y
abriendo y cerrando las conexiones a la base de datos dentro de cada
formulario (antes intenté usar un form común), creo que voy por buen camino.

He probado los procedimientos almacenados creándolos con ibexpert personal,
me ha costado un poco encontrar la lógica y la forma de usarlos pero
finalmente lo he conseguido y parece que funciona bien. De todas formas os
agradecería que me confirmarais si voy por buen camino o hay otra forma de
hacer u optimizar lo siguiente.

 

El procedimiento sería este:

CREATE OR ALTER PROCEDURE USUARIOS_NUEVO (

    usuario varchar(80),

    clave varchar(80),

    nivel integer)

as

begin

  /* Nuevo usuario */

INSERT INTO USUARIOS (USUARIO,CLAVE,NIVEL) values (:USUARIO, :CLAVE,
:NIVEL);

  suspend;

end

 

Y el código el siguiente:

 

  try

    SQLQryOrdenes.SQL.Clear;

    SQLQryOrdenes.SQL.Text := 'EXECUTE PROCEDURE USUARIOS_NUEVO :USUARIO,
:CLAVE, :NIVEL;';

    SQLQryOrdenes.ParamByName('USUARIO').Value:=edtUsuario.Text;

    SQLQryOrdenes.ParamByName('CLAVE').Value:=cifra(edtPassword.Text);

    //Genera el nivel con relación al ItemIndex

    // 0=Control total

    // 1=Usuario

   // 2=


    SQLQryOrdenes.ParamByName('NIVEL').Value:=cbNivel.ItemIndex;

   SQLQryOrdenes.ExecSQL;

   SQLTransactionVAV.CommitRetaining;

   SQLQryUsuarios.Refresh;

   except

    ShowMessage('Error: al guardar los datos en la tabla');

end;

 

Un saludo.

 

De: Ismael L. Donis Garcia [mailto:ismael en citricos.co.cu] 
Enviado el: jueves, 21 de julio de 2011 15:35
Para: Spanish version of Lazarus List
Asunto: Re: [Lazarus-es] Comportamiento Lazarus y firebird

 

El problema lo tienes porque no estas haciendo el Commit de la transacción,
eso no tiene nada que ver con firebird.

 

Otra cosa me parece que lo que debías de optar es por no usar zeos ya que el
soporte no va al mismo ritmo de lazarus, en vez de haber decidirte por usar
o una distribución de firebird u otra, aunque yo en lo personal no
recomiendo tampoco a nadie que para un desarrollo serio use la versión 2.5
de firebird porque tiene muchos insectos, eso si pueden usar perfectamente
la última foto de la versión 2.5.1 la cual ya se le han corregido muchos
insectos, la cual considero que no faltará mucho en salir como candidate 1
del próximo reléase.

 

Otra cosa te recomiendo que trabajes todas las actualizaciones con
procedimientos almacenados, factor este que te va a evitar muchos dolores de
cabeza con las aplicaciones cliente-servidor.

 

Saludos Cordiales

=========
|| ISMAEL ||
=========

PD: Mi caso es todo lo contrario al tuyo, muchos conocimientos en el manejo
de RDBMS y muy pocos de Lazarus.

 

----- Original Message ----- 

From: Manuel Galeote <mailto:manuel en clublazarus.com>  

To: Lazarus-es en lists.lazarus.freepascal.org 

Sent: Thursday, July 21, 2011 8:07 AM

Subject: [Lazarus-es] Comportamiento Lazarus y firebird

 

Hola a todos.

Estoy comenzando a desarrollar una aplicación para windows y he decidido
usar Lazarus y Firebird por la capacidad, de con relativamente poco cambio,
poder usarlo en otro sistema operativo (Linux o mac). Con Lazarus alguna
cosa he hecho pero en firebird no tengo ninguna experiencia.

He comenzado con mal pie al usar zeos 6.6.6 y firebird 2.5 ya que me da en
la nariz que no son muy compatibles. A partir de aquí he bajado a firebird
2.1 y todo ha funcionado  mejor pero me estoy encontrando con algún que otro
problemilla y agradecería a quien tenga experiencia en el tema que me dijera
si esto es normal.

Tengo un formulario principal donde hago la conexión con un zconnection y un
formulario donde permito modifca datos con un ztable,dataset, grid y edt


Si ejecuto la aplicación, se conecta correctamente a la base de datos y
puedo hacer los cambios que quiera.

Ejecuto la aplicación 2 veces (simulo el uso en 2 ordenadores), cuando
realizo cambios en la tabla en el primer programa el segundo no refresca los
cambios. Entiendo que es normal ya que supongo que tendré que hacer un
refresco de datos en la tabla.

Pues no funciona nada, hasta que no fuerce una desconexión de la base de
datos y vuelva a conectar. He probado con un componente de tabla y con otro
de query y a hacer refresh de la tabla,  close y open o poner el active a
false y luego a true y no refrescan los datos. Tengo necesariamente que
desactivar la conexión y volver a conectarla para que lo haga.

Alguien sabe por qué pasa.

Un saludo.

 


  _____  


_______________________________________________
Lazarus-es mailing list
Lazarus-es en lists.lazarus.freepascal.org
http://lists.lazarus.freepascal.org/mailman/listinfo/lazarus-es


  _____  


_______________________________________________
Lazarus-es mailing list
Lazarus-es en lists.lazarus.freepascal.org
http://lists.lazarus.freepascal.org/mailman/listinfo/lazarus-es

------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://lists.lazarus-ide.org/pipermail/lazarus-es/attachments/20110722/a64ff701/attachment-0002.html>


More information about the Lazarus-es mailing list