[Lazarus-es] Comportamiento Lazarus y firebird

Ismael L. Donis Garcia ismael en citricos.co.cu
Vie Jul 22 17:44:56 CEST 2011


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 
  To: 'Spanish version of Lazarus List' 
  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 

    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/cf216145/attachment-0002.html>


More information about the Lazarus-es mailing list