PDA

Ver la Versión Completa : problemas con inserciones, modificaciones y eliminaciones en Interbase con Delphi


Nereida
17-04-2008, 11:43:43
hola!:
soy un poco novata con delphi pero aún asi tengo q hacer un proyecto que consiste en dar altas, bajas y eliminaciones utilizando como servidor Interbase y uniendolo a Delphi mediante los controles convenientes. Voy a intentar explicarme lo mejor posible para asi que sea más fácil entenderlo.
En mi formulario tengo lo siguiente:
- la conexion con su ibtransaction
- un dbgrid1 ( q muestra algunos campos de una tabla)
- unos dbedit
-dos datasuouce (datasource1 y datasource2)
- un ibtable1 y un ibquery1
- botones de Nuevo, modificar, eliminar

Tengo relacionado el el datasource1, con el ibtable1 y con el dbgrid1.
Por otra parte, tmb tengo relacionado el ibquery1 con el datasource2 que lo que hace es mostrarme toda la información del control que selecciono en el dbgrid ya que en el dbgrid solo me muestra el campo dni y el nombre.

Cuando hago una inserción, llamo a un formulario externo (por manias mias), que tengo tmb dbedit relacionados al ibtable anterior.
Mi problema es que he probado varios modos de insertar pero no me actualiza el ibtable por más que le ponga refresh o lo que sea .
He probado a crear un Dataset y ponerle unit1.mdichild1.ibdataset1.insertsql.add ( sentencia sql)
pero me lo inserta pero no me actualiza nada :(

Sé que esto puede ser largo de explicar pero sé como hacer cosas con bases de datos, aunque no en delphi pero por más cosas que he probado no puedo hacer nada ya que no consigo que me actualice los datos :( .
Saludos y gracias

gluglu
17-04-2008, 12:33:45
Has creado las correspondientes sentencias de Inserción, Modificación, Borrado y Actualización para los TIBTable y TIBQuery que tienes ?

Para ello deberas hacer Click derecho encima del componente y elegir 'Dataset Editor', o también lo puedes hacer a través de las propiedades correspondientes (InsertSQL, ModifySQL, DeleteSQL, RefreshSQL).

iuqrul
17-04-2008, 12:56:11
No utilices un TIBQuery para hacer el alta y un TIBTable para ver la tabla.

Recuerda, si ejecutas un insert sobre la base de datos a través de un TIBQuery, tu TIBTable no se entera, hasta que no se cierra y se vuelve a abrir, porque es una base de datos cliente-servidor.

Si defines un TIBUpdateSQL y lo vinculas al TIBTable, y luego ejecutas el alta con el método Insert del TIBTable.

Recomendación personal: acostumbrate a usar el TIQuery, y combinado con el TIBUpdateSQL, podrás hacerlo todo, tablas simples, consultas complejas, procedimientos que devuelven resultados...

Nereida
17-04-2008, 14:44:06
No utilices un TIBQuery para hacer el alta y un TIBTable para ver la tabla.

Recuerda, si ejecutas un insert sobre la base de datos a través de un TIBQuery, tu TIBTable no se entera, hasta que no se cierra y se vuelve a abrir, porque es una base de datos cliente-servidor.

Si defines un TIBUpdateSQL y lo vinculas al TIBTable, y luego ejecutas el alta con el método Insert del TIBTable.

Recomendación personal: acostumbrate a usar el TIQuery, y combinado con el TIBUpdateSQL, podrás hacerlo todo, tablas simples, consultas complejas, procedimientos que devuelven resultados...

Te hice caso y puse el IBUpdateSQL y utilié el metodo post para guardar el valor de la tabla (primero hice un insert y una vez introducidos los datos puse un ibtable.post pero me dice "Empty SQL Statement"). Creo que deberia de haber puesto algo más en el TIBUpdate SQL. Me explico: las lineas de codigo q tengo ahora son:

ibtable1.insert
//comprobaciones de los datos q se han introducido
ibtable1.post

también prove de poner esto:
IBUpdateSQL1.InsertSQL.Add('INSERT INTO Cliente(dni_clie) VALUES ( ''' + dbedit1.Field.AsString + '' + ')');

pero me da error.

Siento si me equivoco en tonterias pero es que hasta ahora solo habia programado en Visual Basic y en C++ y este lenguaje lo estoy utilizando desde hace 2 semanas.
Saludos y gracias por la ayuda.

BlueSteel
17-04-2008, 15:57:12
Hola Nereida

Creo que te seria util leer la cara oculta de delphi 4 (http://www.terawiki.clubdelphi.com/Delphi-Win32/Libros/)... te puede aclarar varias cosas...Tambien te recomendaria que te dieras una buelta por la Wiki (http://wiki.clubdelphi.com/).. tambien existen varios ejemplos

Bueno... pasando a tu tema...

Yo trabajo con Interbase 6, Delphi 7 y componente IBX

Cuando desarrollo un proyecto, creo un Formulario de Tipo DataModule... lo nombro como Datos y en él dejo todos los componentes IBX para conexión al Interbase... estos son:

-( 1 ) TIBDatabase -> conexión a la base... direcion..ruta..archivo

-( n ) TIBQuery -> conexión a tablas y/o procesos de actualización de registros
-( n ) TIBTransaction (hacer doble click y dejar en Read Committed para reflejar actualizaciones)

Para insertar un registro, utilizo un codigo similar al que sigue



// Datos es un Formulario de tipo DataModule donde estan todo lo que mencione antes

Datos.IBQ_Edit.SQL.Clear;
// Aqui comienzo a realizar instrucción para insertar registros
Datos.IBQ_Edit.SQL.Add('Insert Into "Cliente" ("Cli_Rut","Cli_Razon","Cli_Giro","Cli_Email","Cli_Direccion","Cli_Poblacion","Cli_Comuna","Cli_Fono","Cli_Fax")');
Datos.IBQ_Edit.SQL.Add('Values (:P1, :P2, :P3, :P4, :P5, :P6, :P7, :P8, :P9)');
Datos.IBQ_Edit.Params[0].AsString := vRut.Text;
Datos.IBQ_Edit.Params[1].AsString := vRaz.Text;
Datos.IBQ_Edit.Params[2].AsString := vGir.Text;
Datos.IBQ_Edit.Params[3].AsString := vMai.Text;
Datos.IBQ_Edit.Params[4].AsString := vDir.Text;
Datos.IBQ_Edit.Params[5].AsString := vPob.Text;
Datos.IBQ_Edit.Params[6].AsString := vCom.Text;
Datos.IBQ_Edit.Params[7].AsString := vTel.Text;
Datos.IBQ_Edit.Params[8].AsString := vFax.Text;
Datos.IBQ_Edit.ExecSQL; // Ejecuto sentencia SQL
Datos.IBT_Edit.Commit; // Aplico cambios en la transacción asociada

Selecciona_Cliente; // procedimiento que me realiza un select de todos los registro para que se muestre el insertado



// Este es el proceso que se llama en el codigo de arriba
procedure Selecciona_Cliente;
begin
Datos.IBQ_Select.Close;
Datos.IBQ_Select.SQL.Clear;
Datos.IBQ_Select.SQL.Add('Select * From "Cliente" Order By "Cli_Rut"');
Datos.IBQ_Select.Open;
end;


Bueno... espero que este código te sea de ayuda.. cualquier cosa..sigue preguntando..

Salu2:p:D

iuqrul
18-04-2008, 10:12:50
... "Empty SQL Statement"). Creo que deberia de haber puesto algo más en el TIBUpdate SQL...

Debes cumplimentar el TIBQuery.SQL.Text con la consulta sobre la que vas a modificar, y en el TIBUpdateSQL.RefreshSQL pones lo mismo pero añadiendo "where ID=:ID" sustituyendo ID por el campo de la clave primaria.

Nereida
18-04-2008, 11:43:49
Debes cumplimentar el TIBQuery.SQL.Text con la consulta sobre la que vas a modificar, y en el TIBUpdateSQL.RefreshSQL pones lo mismo pero añadiendo "where ID=:ID" sustituyendo ID por el campo de la clave primaria.

He puesto esto:

IBUpdateSQL1.SQL.Text:='UPDATE Cliente SET nom_clie = ''' + dbedit2.field.AsString + '';

pero me decia q esperaba un [ en vez de un punto pq me parece q tenia q ponerle algo en la propiedad de SQL pq cuando la ponia me decia q pusiera el tipo, por lo q prové a poner modifySQL pero no lo reconocia :(

después puse:

unit1.MDIChild1.IBUpdateSQL1.modifySQL.Add('UPDATE Cliente SET nom_clie = ''' + dbedit2.field.AsString + '');
unit1.MDIChild1.IBUpdateSQL1.RefreshSQL.Add ('UPDATE Cliente SET nom_clie = ''' + dbedit2.field.AsString + ''' + WHERE dni_clie= ' + dbedit1.Field.AsString);

pero me da error con las claves primarias.
Siento ser tan pesada pero es que me cuesta mucho.

Saludos y gracias a todos

Nereida
25-04-2008, 11:15:28
Debes cumplimentar el TIBQuery.SQL.Text con la consulta sobre la que vas a modificar, y en el TIBUpdateSQL.RefreshSQL pones lo mismo pero añadiendo "where ID=:ID" sustituyendo ID por el campo de la clave primaria.

Con un poco de suerte y con ayuda de un compañero, pude hacer lo que me dijiste y funciona genial.
Muchas gracias :D

Saludos