Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Lazarus, FreePascal, Kylix, etc. (https://www.clubdelphi.com/foros/forumdisplay.php?f=14)
-   -   Insertar registros en Firebird (https://www.clubdelphi.com/foros/showthread.php?t=66312)

GustavoCruz 12-02-2010 20:39:55

Insertar registros en Firebird
 
Hola amigos del foro, mi pregunta viene porque he estado intentando insertar unos registros pero no he podido lograr hacerlo.


de antemano mil gracias

Casimiro Notevi 12-02-2010 20:48:46

¿Y por qué no has podido?

GustavoCruz 12-02-2010 20:58:52

veras, yo conecto la base de datos y pongo el SQLtransaction. luego pongo el SQLQuery y en la propiedad de InsertSQL pongo la sentencia adecuada.

el problema es que cuando cierro la conección, se pierden los registro.

Al finalizar la inserción yo pongo
Código SQL [-]
SQLTransaction.CommintRetaing
y eso debería ser suficiente pero no...:mad:

De antemano mil gracias por vuestro tiempo y aportes

Casimiro Notevi 12-02-2010 21:21:23

¿No habrás olvidado hacer 'post' después del insert?

marcoszorrilla 12-02-2010 22:12:32

Haz caso a Casimiro:

Código Delphi [-]
procedure TfrProveedores.BitBtn1Click(Sender: TObject);
begin
 if DmProv.IBDTsProv.State in [dsInsert, dsEdit] then
 DmProv.IBDTsProv.Post;

Código Delphi [-]
procedure TDmProv.IBDTsProvAfterPost(DataSet: TDataSet);
begin
DmConex.IBTransaction.CommitRetaining;
end;

Un Saludo.

GustavoCruz 13-02-2010 16:54:23

hola amigos, yo en lazarus escribo asì:
Código Delphi [-]
with SQLQuery1 do
begin
  insertSQL.Clear;
  insertSQL.Add('insert into tabla(campos) values(valores)');
  ...
end;

y eso debería ser suficiente para insertar los registros...

pero no funciona:mad:

Casimiro Notevi 13-02-2010 17:42:42

¿No has leído el código que te ha puesto marcoszorrilla? :confused:, no es suficiente con que hagas el 'insert', debes hacer 'post' y luego 'commit', te falta el 'post' que viene a ser el comando que realmente graba los datos, luego el 'commit' confirma que se graben, pero te falta el post.

En tu código debes escribir algo así como:
Código:

with SQLQuery1 do
begin
  insertSQL.Clear;
  insertSQL.Add('insert into tabla(campos) values(valores)');

  SQLQuery1.Post;  <<-------------<

end;


GustavoCruz 13-02-2010 18:36:49

Definitivamente no...:(

Código Delphi [-]
with SQLQuery1 do
        begin
          InsertSQL.Clear;
          InsertSQL.Add('insert into detable values('+Dbf1.Fields[0].AsString
          +','''+Dbf1.Fields[1].AsString+''')');
          ExecSQL;
          Post;
        end;

Gracias por vuestro tiempo


Gustavo Cruz

GustavoCruz 13-02-2010 18:50:10

Tal vez el problema se encuentre en SQLTransaction

el tiene una Params, ¿Qué de se debe colocar?.

yo ahí no tengo nada.


Gracias de Antemano por vuestro tiempo


GustavoCruz

Casimiro Notevi 13-02-2010 18:53:47

Amigo GustavoCruz, el problema es que no somos adivinos, debes contarnos lo más detallado posible la situación de lo que estás haciendo, porque así, con lo parco en palabras que estás siendo... es bastante difícil poder ayudarte, cuéntanos en detalle los componentes que usas, cómo están enlazados, qué procesos haces, pasos que das hasta llegar a esa función, mensajes de error o aviso que te salgan, resultados obtenidos, etc.

Casimiro Notevi 13-02-2010 18:58:51

Cita:

Empezado por GustavoCruz (Mensaje 353884)
Tal vez el problema se encuentre en SQLTransaction
el tiene una Params, ¿Qué de se debe colocar?.
yo ahí no tengo nada.
Gracias de Antemano por vuestro tiempo
GustavoCruz

Lo debes tener enlazado con la base de datos.

GustavoCruz 13-02-2010 19:53:24

Bueno amigos, ustedes disculpen mi torpeza...

tengo los siguientes componentes:
IBConnection1
SQLTransaction1
SQLQuery1

conecto la base de datos al IBConnection1, luego hago el enlace
IBConnection1 - SQLTransaction1; y los activo...
luego al SQLQuery1 le asigno el IBConnection1 y el SQLTransaction1

lanzo una consulta para probar que todo está bien y me funciona...

esto es lo que probé la primera vez:

Código Delphi [-]
  SQLTransaction1.StartTransaction;
  while not Dbf1.EOF do
    begin
      with SQLQuery1 do
        begin
          InsertSQL.Clear;
          InsertSQL.Add('insert into detable values('+Dbf1.Fields[0].AsString
          +','''+Dbf1.Fields[1].AsString+''')');
          ExecSQL;
        end;
      Dbf1.Next;
    end;
  SQLTransaction1.CommitRetaining;

eso me dio el siguiente error: 'EDatabaseError' Transaction already active

luego probé con esto:
Código Delphi [-]
  SQLTransaction1.EndTransaction;
  SQLTransaction1.StartTransaction;
  while not Dbf1.EOF do
    begin
      with SQLQuery1 do
        begin
          InsertSQL.Clear;
          InsertSQL.Add('insert into detable values('+Dbf1.Fields[0].AsString
          +','''+Dbf1.Fields[1].AsString+''')');
          ExecSQL;
        end;
      Dbf1.Next;
    end;
  SQLTransaction1.CommitRetaining;

ya aquí no hay errores pero sigue sin insertar...

luego probé hacer como ustedes me sugirieron y tampoco...
PD. Dbf1 es el lugar donde estoy sacando los datos que necesito migrar...

Muchas Gracias

Casimiro Notevi 13-02-2010 20:16:54

ok, amigo, ahora está más claro, vamos a ver si conseguimos solucionar ese problemita :)
La "cadena de conexión" de componentes debe ser: DataBase->Transaction->DataSet, supongo que el IBConnection es el que conecta a la base de datos, según has explicado:
Cita:

conecto la base de datos al IBConnection1, luego hago el enlace
IBConnection1 - SQLTransaction1; y los activo...
luego al SQLQuery1 le asigno el IBConnection1 y el SQLTransaction1
Creo que el asunto va a estar ahí, el SQLQuery es un DataSet que haces bien en conectarlo a la base de datos (IBConnection), pero creo que está sobrando ahí el enlace con SQLTransaction. Tengo que confirmarlo porque no sé exactamente qué componentes son esos, pero prueba a quitar eso y además añade el .post que te aconsejamos antes.
Código:

SQLTransaction1.StartTransaction;
  while not Dbf1.EOF do
  begin
    with SQLQuery1 do
    begin
      InsertSQL.Clear;
      InsertSQL.Add('insert into detable values('+Dbf1.Fields[0].AsString +','''+Dbf1.Fields[1].AsString+''')');
      ExecSQL;
      Post;  <---------------
    end;
    Dbf1.Next;
 end;
 SQLTransaction1.CommitRetaining;

Si no te funciona, entonces infórmame qué componentes son esos para yo hacer una prueba.

Chris 13-02-2010 20:33:46

Hola, veo con gran asombro los consejos dados al compañero, me van a disculpar si sueno odioso, pero quiero corregir algo: Cuando estas trabajando directamente con un componente que ejecuta consultas directamente como lo es un TSQLQuery, no necesitas de la llamada al procedimiento Post. Las razones técnicas ya son conocidas pos los que conozcan el funcionamiento interno del TDataset (que es donde se implementa este procedimiento).

Por otro lado, veo que segue habiendo un vacío de información aquí. No se sabe cuál es la configuración que estás utilizando para la transacción. La configuración la puedes encontrar en la propiedad Params del componente de transacción.

Con respecto al error que tenías ("Transaction Already Active") el código que has utilizado no es lo recomentado. Prueba el siquiente:

Código Delphi [-]

  if not SQLTransaction1.InTransaction then // iniciar la transacción si aún no se ha iniciado
     SQLTransaction1.StartTransaction;

  while not Dbf1.EOF do
  begin
      with SQLQuery1 do
        begin
          InsertSQL.Clear;
          InsertSQL.Add('insert into detable values('+Dbf1.Fields[0].AsString
          +','''+Dbf1.Fields[1].AsString+''')');
          ExecSQL;
        end;
      Dbf1.Next;
  end;

  SQLTransaction1.CommitRetaining;

Debes asegurarte que el componente SQLQuery1 esté enlazado a SQLTransaction1 y estos últimos tambien conectados al componente de conección a la base de datos.

Saludos y quedo a la espera de que nos digas que estás colocando en la propiedad Params del SQLTransaction1 :)

Chris 13-02-2010 20:42:20

Analizando mejor el código, ahora creo que el problema no está en los parámetros de la transacción, sino en el propio código y componentes que estás utilizando.

Fijate en lo siguiente:

Código Delphi [-]
  if not SQLTransaction1.InTransaction then // iniciar la transacción si aún no se ha iniciado
     SQLTransaction1.StartTransaction;

  while not Dbf1.EOF do
  begin
      with SQLQuery1 do
        begin
          InsertSQL.Clear;
          InsertSQL.Add('insert into detable values('+Dbf1.Fields[0].AsString
          +','''+Dbf1.Fields[1].AsString+''')');
          ExecSQL;
        end;
      Dbf1.Next;
  end;

  SQLTransaction1.CommitRetaining;

Veo confuso ese código. El nombre de componente SQLQuery1 por su nombre parece ser un decendiente de TSQLQuery, no se porque estás usando una propiedad "InsertSQL" (o estás confundiendo en el código un componente distinto que se llama "InsertSQL" o es una propiedad del componente "SQLQuery1") Si fuera la primero, asegurate que el componente InsertSQL esté conectado a cómo te dije con respecto a SQLQuery1 en el post anterior. Si es lo segundo, estas resolviendo un problema con otro problema. Deberías utilizar un componente más sencillo, un desenciente de TSQLQuery, el que solo tiene una propiedad llamada SQL que es donde insertas la instrucción SQL que deseas ejecutar.

Espero hallas entendido lo que quise decir. Sino, no me molesta y con gran gusto te aclaro la idea. Saludos. //

Casimiro Notevi 13-02-2010 21:13:49

Es que ese es el problema, Chris, que no tenemos datos concretos de qué tipo de componentes son esos, y así es difícil aconsejar.

GustavoCruz 13-02-2010 21:17:34

Hola amigo Chris, efectivamente se trata de TSQLQuery (de esos que vienen con lazarus).
Y estos componentes tienen la propiedades
InsertSQL,
DeleteSQL,
UpdateSQL y
SQL.

yo, pues, utilizo InsertSQL. Pienso igualmente que el problema radica en los parámetros de la Transacción. Pues en fibplus el componente de transacción tiene unos parámetros e igual que los interbase, pero dichos parámetros cuando los copio al componente respectivo de Lazarus me muestra un error de esos... que son graves. haz la prueba y verás

Gracias por vuestro tiempo


Gustavo Cruz

GustavoCruz 13-02-2010 21:23:23

Problema solucionado.
Dejé de utilizar la propiedad InsertSQL, del componente SQLQuery, por SQL
y me funcionó:D. no sé, pero si ponen esa propiedad es para que funcione....:D


Gracias a todos por vuestro tiempo

Gustavo Cruz


La franja horaria es GMT +2. Ahora son las 20:44:50.

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