Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Bases de datos > Firebird e Interbase
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 18-10-2013
Avatar de Angel.Matilla
Angel.Matilla Angel.Matilla is offline
Miembro
 
Registrado: Jan 2007
Posts: 771
Poder: 12
Angel.Matilla Va por buen camino
Un query que se cierra solo

Estoy usando Firebird con C++ 6. Tengo este código con dos TIBQuery:
Código:
Query->Close();
Query->SQL->Text = "INSERT INTO Cuentas (Padre, Cuenta, Defecto) 
VALUES (:Padre, :Cuenta, :Defecto)";

qTemp->Close();
qTemp->SQL->Text = "SELECT DISTINCT A.Padre, B.Cuenta, B.Defecto 
FROM ALU_TEMP A, CUE_TEMP B WHERE A.Referencia||A.Recibo = B.Referencia";
qTemp->Open();

for (; !qTemp->Eof; qTemp->Next())
{
     if (!tColegio->InTransaction)
          tColegio->StartTransaction();

     Query->Close();
     Query->ParamByName("Padre")->AsInteger   = qTemp->FieldByName("Padre")->AsInteger;
     Query->ParamByName("Cuenta")->AsString   = qTemp->FieldByName("Cuenta")->AsString;
     Query->ParamByName("Defecto")->AsInteger = qTemp->FieldByName("Defecto")->AsInteger;
     try
     {
          Query->ExecSQL();
          tColegio->Commit();
     }
     catch(...)
     {
          tColegio->Rollback();
     }
}
Hace el primer insert pero cuando debería avanzar al segundo registro de lectura me dice que que no porque el dataset está cerrado (Cannot perform this operation on a closed dataset). Si fuera cierto no debría leer ni el primer registro.

He probado, en vez de un bucle, a hacer un INSERT masivo:
Código SQL [-]
INSERT INTO Cuentas (Padre, Cuenta, Defecto) 
SELECT DISTINCT A.Padre, B.Cuenta, B.Defecto FROM ALU_TEMP A, CUE_TEMP B WHERE A.Referencia||A.Recibo = B.Referencia

y me da un error de violacion de claves (la tabla está indexada por padre y cuenta).

¿A alguien se le ocurre alguna idea?

Última edición por ecfisa fecha: 19-10-2013 a las 10:42:53. Razón: Cambiar etiqueta [code] por [sql]
Responder Con Cita
  #2  
Antiguo 18-10-2013
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: Sep 2004
Ubicación: En algún lugar.
Posts: 28.479
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Creo que el problema es que cuando guardas un registro debes hacer post, ya que el commit lo cierra.
Responder Con Cita
  #3  
Antiguo 18-10-2013
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: Dec 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.099
Poder: 30
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
Cita:
Empezado por Angel.Matilla Ver Mensaje
Hace el primer insert pero cuando debería avanzar al segundo registro de lectura me dice que que no porque el dataset está cerrado (Cannot perform this operation on a closed dataset). Si fuera cierto no debría leer ni el primer registro.
Hola Angel.

El método Commit() almacena todas las operaciónes pendientes de la transacción actual y la cierra, por lo que deberías habrirla nuevamente si deseas continuar con las operaciones.
Así mismo, el método Rollback(), cancela todas las operaciones pendientes de la transacción actual y la cierra. También deberías abrirla nuevamente si deseas continuar operando con ella.

Existe la alternativa de usar CommitRetaining() y RollbackRetaining() que respectivamente almacenan y cancelan las operaciones, pero mantienen abierta la transacción actual.

Saludos

Edito: Como dijo Casimiro arriba. (no lo había visto... )
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....

Última edición por ecfisa fecha: 18-10-2013 a las 18:30:34.
Responder Con Cita
  #4  
Antiguo 18-10-2013
Avatar de Angel.Matilla
Angel.Matilla Angel.Matilla is offline
Miembro
 
Registrado: Jan 2007
Posts: 771
Poder: 12
Angel.Matilla Va por buen camino
Gracias a los dos. Ahora mismo lo pruebo.
Responder Con Cita
  #5  
Antiguo 18-10-2013
Avatar de Angel.Matilla
Angel.Matilla Angel.Matilla is offline
Miembro
 
Registrado: Jan 2007
Posts: 771
Poder: 12
Angel.Matilla Va por buen camino
Cita:
Empezado por ecfisa Ver Mensaje
Existe la alternativa de usar CommitRetaining() y RollbackRetaining() que respectivamente almacenan y cancelan las operaciones, pero mantienen abierta la transacción actual.
Perfecto. Lo que no acabo de entender es por qué no fuciona el INSERT masivo, pero dado que ya se ha solucionado.
Responder Con Cita
  #6  
Antiguo 18-10-2013
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: Sep 2004
Ubicación: En algún lugar.
Posts: 28.479
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Cita:
Empezado por Angel.Matilla Ver Mensaje
Perfecto. Lo que no acabo de entender es por qué no fuciona el INSERT masivo, pero dado que ya se ha solucionado.

Creo recordar que la sentencia es así:

Código SQL [-]
insert into tbCuentasB (select * from tbCuentasA)
Responder Con Cita
  #7  
Antiguo 19-10-2013
Avatar de Angel.Matilla
Angel.Matilla Angel.Matilla is offline
Miembro
 
Registrado: Jan 2007
Posts: 771
Poder: 12
Angel.Matilla Va por buen camino
No. El problema tiene que ser otro porque en ese mismo proceso de carga tengo otra tabla con la sintaxis que yo ponía:
Código SQL [-]
INSERT INTO Tabla1 SELECT * FROM Tabla2
y no me da error; además, el error es un problema de índices. No obstante ya está solucionado con el bucle.
Responder Con Cita
  #8  
Antiguo 19-10-2013
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: Sep 2004
Ubicación: En algún lugar.
Posts: 28.479
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Entonces es que en la tabla origen tienes 2 registros con el mismo valor y en la de destino no están permitidos repetidos.
Problema en los datos.
Responder Con Cita
  #9  
Antiguo 19-10-2013
Avatar de Angel.Matilla
Angel.Matilla Angel.Matilla is offline
Miembro
 
Registrado: Jan 2007
Posts: 771
Poder: 12
Angel.Matilla Va por buen camino
Efectivamente.
Responder Con Cita
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

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
Delphi 2007 se Cierra Solo DANY Varios 3 21-03-2012 17:03:08
mostrar un registro solo de un query Patricio Varios 3 18-11-2008 20:31:27
query no Graba , se cierra juanmaster Tablas planas 9 12-12-2006 23:52:21
Me cierra Delphi totalmente al activar Query JamesBond_Mx SQL 2 12-01-2006 15:47:39
los query son dataset de solo lectura? kryna SQL 3 04-04-2005 01:22:27


La franja horaria es GMT +2. Ahora son las 08:58:04.


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