Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Conexión con bases de datos
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Conexión con bases de datos

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 06-04-2006
NPIdea NPIdea is offline
Miembro
 
Registrado: feb 2005
Posts: 121
Poder: 20
NPIdea Va por buen camino
Problema refresco IBX con Firebird 2 y Delphi 2006

Como no podía ser de otra forma, soy un grandísimo novato en esto de SGDB's y me he decantado a probar Firebird y como soy un "campeón" pues me he conseguido la versión 2.0.

Pues el problema es que cuando inserto un registro en una tabla, si en el AfterPost del IBDataSet hago un commit y vuelvo a abrir la tabla, todo va de maravilla, a excepción de que pierdo el puntero al registro insertado, pero si hago un commitretaining me inserta en la dbgrid los valores del primer registro de esa tabla, hasta que cierro y abro otra vez la tabla, que está todo correcto.

La transacción la tengo en read commited.

Y ya estoy por coger la opcion de abrir la tabla y buscar el registro cada vez, pero no me parece lógico.

Lo que he encontrado extraño es que no me deja coger en DefaulAction la de TARollBackRetaining dandome el error Format %s invalid o incompatible with argument cada vez que solicito esta opción de la propiedad de IBTransaction.

Gracias

PD:

RefreshSQL:
select ORDEN,TIPO,NUMERO,SITUACION,POSX,POSY from INSTALACIONES order by ORDEN

SelectSQL:
select * from INSTALACIONES ORDER BY ORDEN

InsertSQL:
insert into instalaciones (TIPO,NUMERO,SITUACION,POSX,POSY) values (:TIPO,:NUMERO,:SITUACION,:POSX,:POSY)


Siendo ORDEN un autoinc:

Generador:
CREATE GENERATOR GEN_INSTALACIONES_ID;

Trigger:
CREATE TRIGGER INSTALACIONES_BI FOR INSTALACIONES
ACTIVE BEFORE INSERT POSITION 0
AS
BEGIN
IF (NEW.ORDEN IS NULL) THEN
NEW.ORDEN = GEN_ID(GEN_INSTALACIONES_ID,1);
END

Se me olvidaba que la forma de introducir los datos es por código. Estoy traspasando datos de una tabla Paradox 7.0 a Firebird.

Código:
    with Dato.Instalaciones do begin
        Insert;
        Fields[1].AsInteger:=Table1.FieldByName('TIPO').AsInteger;
        Fields[2].AsInteger:=Table1.FieldByName('NUM').AsInteger;
        Fields[3].AsString:=Table1.FieldByName('SITUACION').AsString;
        Fields[4].AsInteger:=Table1.FieldByName('POSX').Asinteger;
        Fields[5].AsInteger:=Table1.FieldByName('POSY').Asinteger;
        Post;
    end;

Última edición por NPIdea fecha: 06-04-2006 a las 13:44:36.
Responder Con Cita
  #2  
Antiguo 07-04-2006
NPIdea NPIdea is offline
Miembro
 
Registrado: feb 2005
Posts: 121
Poder: 20
NPIdea Va por buen camino
Una parte ya está resuelta.

Bueno, pues en el evento AfterPost hago un CommitRetaining y luego un Refresh al IBDataSet.

Me actualiza o me refresca los datos correctamente menos el campo Autoinc, que no me muestra nada, está vacio, pero si abro y cierro la tabla está bien.
HAgo un:
Código:
Showmessage(IntToStr(IBDataSet1.FieldByName('ORDEN').AsInteger));
y me devuelve siempre 0, pero cuando cierro y abro me da su valor correcto.

La solucion para que me refresque la tabla bien sin necesidad de hacer un Commit es la sentencia del RefreshSQL:

RefreshSQL:
select ORDEN,TIPO,NUMERO,SITUACION,POSX,POSY from INSTALACIONES where ORDEN=:ORDEN

¡¡¡Funciona correctamente!!! (Menos lo del refresco de la Columna ORDEN)

Última edición por NPIdea fecha: 07-04-2006 a las 09:40:17.
Responder Con Cita
  #3  
Antiguo 07-04-2006
[pepon386] pepon386 is offline
Miembro Premium
 
Registrado: ene 2005
Ubicación: Valencia
Posts: 68
Poder: 20
pepon386 Va por buen camino
El problema de que te devuelva 0 es porque el valor ha sido generado en la base de datos, y si no cierras y abres de nuevo la consulta no lo verás reflejado. La alternativa que tienes es obtener el valor del generador desde tu programa y asignarlo tú manualmente.
Responder Con Cita
  #4  
Antiguo 07-04-2006
NPIdea NPIdea is offline
Miembro
 
Registrado: feb 2005
Posts: 121
Poder: 20
NPIdea Va por buen camino
Gracias por la respuesta.

Entonces, lo que me aconsejais es que lo haga desde mi programa (asignar el valor) o la otra opción sería un ¿Procedimiento Almacenado?

Gracias.

Edito: Aunque en el proceso que digo tampoco es tan traumatico el volver a abrir la tabla. Lo único será crear un evento para que los clientes se enteren y actualicen sus tablas.

Cada vez estoy más contento de cambiar a bases de datos "de verdad". Vaya montón de posiblidades.

Última edición por NPIdea fecha: 07-04-2006 a las 10:48:26.
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Consulta Delphi 6, Delphi 2005 y Delphi 2006 Leviatan Varios 6 18-08-2007 17:02:08
Que es .net y delphi 2006 artemisa Varios 2 07-04-2006 01:59:51
Problema con firebird 1.5 y delphi neosyoshiran Conexión con bases de datos 5 27-09-2005 16:40:54
Refresco datos FireBird Io Conexión con bases de datos 2 06-08-2005 19:44:59
Problema con refresco mar646 Gráficos 0 28-03-2005 13:03:11


La franja horaria es GMT +2. Ahora son las 01:04:34.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi