Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Firebird e Interbase (https://www.clubdelphi.com/foros/forumdisplay.php?f=19)
-   -   Duda al hacer insert con delphi/firebird/IBObjects (https://www.clubdelphi.com/foros/showthread.php?t=73620)

victor2211 05-05-2011 10:32:50

Duda al hacer insert con delphi/firebird/IBObjects
 
Hola a todos, soy nuevo por aqui. El caso esque me han mandado un proyecto en el que debo usar delphi, firebird e Ibojets. Hasta ahora consegi hacer un select y que me recorra los campos usando el IBOquery y el IBOdatabase. Ahora me toca hacer un insert no tengo ni idea de como hacerlo. Nunca e usado delphi y nunca e usado pascal asique estoy un poco pegado. Busque por internet pero no encontre ningun ejemplo, asique cualquier ayuda sera bien recibida. Un saludo a todos y gracias de antemano.

Casimiro Notevi 05-05-2011 11:27:24

Hola, bienvenido a clubdelphi :)
Exactamente, ¿qué quieres hacer?

victor2211 05-05-2011 12:59:00

pues quiero hacer un insert a una tabla, pero ya lo consegi. El problema era que yo estaba usando el IBOquery, y este solo te permite obtener datos pero no midificarlos, asique al final use el IBOTable y ya me hace tanto la consulta, como el insert,delete y modificacion.

ecfisa 05-05-2011 21:46:11

Hola Victor2211.

A modo de aclaración, se pueden modificar datos con un TIBQuery, con la salvedad que en lugar de Open debes usar ExcecSQL.

Como ejemplo:
Código Delphi [-]
var
  SQLStr: string;
begin
  SQLStr:= IBQuery1.SQL.Text;
  IBQuery1.Close;
  IBQuery1.SQL.Clear;
  IBQuery1.SQL.Add('UPDATE CLIENTES SET RAZON = ''PEREZ JUAN''');
  IBQuery1.ExecSQL;
  IBQuery1.Close;
  IBQuery1.SQL.Text:= SQLStr;
  IBQuery1.Open;
end;

Y si hacés uso de CachedUpdates podés de asociarle un TIBUpdateSQL al efecto.


Un saludo.

victor2211 06-05-2011 09:36:11

Cita:

Empezado por ecfisa (Mensaje 399081)
Hola Victor2211.

A modo de aclaración, se pueden modificar datos con un TIBQuery, con la salvedad que en lugar de Open debes usar ExcecSQL.

Como ejemplo:
Código Delphi [-]
var
  SQLStr: string;
begin
  SQLStr:= IBQuery1.SQL.Text;
  IBQuery1.Close;
  IBQuery1.SQL.Clear;
  IBQuery1.SQL.Add('UPDATE CLIENTES SET RAZON = ''PEREZ JUAN''');
  IBQuery1.ExecSQL;
  IBQuery1.Close;
  IBQuery1.SQL.Text:= SQLStr;
  IBQuery1.Open;
end;

Y si hacés uso de CachedUpdates podés de asociarle un TIBUpdateSQL al efecto.


Un saludo.

ok, muchas gracias por la ayuda, lo tendre en cuenta tambien.

rastafarey 19-05-2011 04:50:05

Resp
 
Pon un bdgrid un dbnavigator. Estable ce las relaciones dataset datasuorce etc. Has doble click sobre el tibquiery. click la parte de select sql click en la tabal y click en los campos que quieres insertar o actualizar. luego uodatesql y le das generar las instrcciones el lo hace solito. lo activas y listo. mas facil que pelar mandarina.

coej 19-05-2011 17:17:12

rastafarey , me he quedado en el segundo gajo, en el select, eliges los campos, pero a partir de ahi para que te haga los borrados o updates en las modificaciones... ahi me he perdido, si es que la mandarina...

coej 19-05-2011 17:50:43

es decir, todo esto lo puedes hacer con los botones del dbnavigator, para que el tibquery???, o no he entendido bien como lo quiere hacer victor...

guillotmarc 19-05-2011 18:07:34

Cita:

Empezado por coej (Mensaje 400658)
es decir, todo esto lo puedes hacer con los botones del dbnavigator, para que el tibquery???, o no he entendido bien como lo quiere hacer victor...

Victor ya ha comentado que ha cambiado el IBQuery por un IBTable, puesto que el IBQuery no sirve para hacer inserciones/modificaciones (a menos, claro, que utilices el IBQuery para lanzar manualmente una sentencia INSERT o UPDATE, como bien ha dicho ecfisa). En cualquiera de los casos dbNavigator no nos sirve para hacer inserciones/modificaciones desde un IBQuery (en todo caso habría que cambiarlo por un IBTable o IBDataset, como ha hecho Victor).

Saludos.

coej 19-05-2011 18:15:18

ok, eso si lo he pillado, lo que no entiendo es lo que comenta rastfary, con los borrados y updates desde la propiedad sql del ibquery, eso es lo que no me ha quedado claro...
Yo creo que con el dbnavigator y dbgrid es suficiente, aunque supongo que habrá gente que no le guste así y se haga de otras formas , quizás asociando a botones código asociado el ibquery(que no se si se podra hacer que soy muy novato en esto)...

rastafarey 07-06-2011 05:50:53

Resp
 
A los ibquery debes establecerles las instrccuines sqls. select, insert, update y delete.

HAs doble clic sobre el componente
PAra establecer los sqls.

Para select pestaña SQL. Click sobre la tabal y o sobre los campos y veras como funciona.

Luego pesdtaña UPDATE SQL y le das A generate for table y listo.

ecfisa 07-06-2011 15:01:23

Hola rastafarey.

Puedo estar confundido, pero hasta donde sé, la única forma de usar las propiedades ModifySQL, InsertSQL y DeleteSQL con un TIBQuery es asignándole a la propiedad UpdateObject un TIBUpdateSQL. O de otra forma lanzar una sentencia de ese tipo manualmente.

Saludos.

JPCastro 22-05-2012 16:16:30

Modificar datos a través de un TIBOQuery
 
Hola a todos
Seguramente a estas alturas has podido resolver tu problema Victor, pero escribiré esto por si alguien más consulta esta liga, a manera de aclaración.
Para poder modificar datos con un objeto tIBOQuery, es necesario poner código en tres propiedades: DeleteSQL, EditSQL e InsertSQL, con las respectivas sentencias en sql para hacer la operación respectiva. Esto puede hacerse escribiendo el código directamente en estas propiedades en el inspector de objetos de delphi (una vez que está seleccionado el objeto tIBOQuery, por supuesto) o bien haciendo uso del asistente: se selecciona el objeto, luego botón secundario (generalmente botón derecho del ratón), en el menú contextual seleccionar la opción "Edit query" y aparece el asistente de configuración del objeto, por default en la pestaña SQL, donde se pone la sentencia Select con la cual extraeremos los datos de una tabla; la última pestaña de ese pagecontrol, se llama UpdateSQL, ahí están en tres secciones las propiedades referidas, y dos botones "Generate for table" y "Generate for procedure", al dar click llenará los espacios respectivos con el código SQL para hacer el UPDATE, INSERT y DELETE.

Una vez hecho esto, se pueden hacer las operaciones de modificación a la tabla referida.

Saludos.

cdamer 12-03-2025 15:55:15

Como es el uso practico de un DeleteSql por ej.
 
Hola,
se que ha pasado un tiempo, pero sigo sin poder usar esta caracteristica de los TIBOQuery, que podria ser muy util aparentemente.
entiendo como generar los SQL en el TIBOQuery.
pero no comprendo como seria el codigo para pasar parametros si deseo eliminar un registro por ej.
como es el uso practico de esos sql's generados ?
se asigna un SQL generado, a otro componente ?
se usa el mismo componente ?
como se asignan los parametros en cada caso y como se ejecuta cada SQL ?

navbuoy 12-03-2025 16:04:11

En Delphi usando TIBOQuery (de IBObjects), puedes ejecutar una sentencia SQL de varias maneras dependiendo del tipo de consulta que deseas hacer.

�� Para consultas de selección (SELECT)
Si necesitas recuperar datos de la base de datos:

Código Delphi [-]
IBOQuery1.SQL.Text := 'SELECT * FROM clientes WHERE ciudad = :ciudad';
IBOQuery1.ParamByName('ciudad').AsString := 'Madrid';
IBOQuery1.Open;  // O usar IBOQuery1.Active := True;

Aquí se usa ParamByName para evitar SQL Injection y mejorar rendimiento.

�� Para consultas de acción (INSERT, UPDATE, DELETE)
Si necesitas ejecutar una consulta que modifique datos:

Código Delphi [-]
IBOQuery1.SQL.Text := 'UPDATE clientes SET telefono = :telefono WHERE id = :id';
IBOQuery1.ParamByName('telefono').AsString := '123456789';
IBOQuery1.ParamByName('id').AsInteger := 10;
IBOQuery1.ExecSQL;

�� ExecSQL se usa en sentencias que no devuelven datos.

�� Para ejecutar una consulta sin parámetros
Si la consulta es fija y sin parámetros, puedes ejecutarla directamente:

Código Delphi [-]
IBOQuery1.SQL.Text := 'DELETE FROM pedidos WHERE estado = ''cancelado''';
IBOQuery1.ExecSQL;

�� Para recorrer los datos después de ejecutar un SELECT
Si necesitas procesar los resultados de una consulta:

Código Delphi [-]
IBOQuery1.SQL.Text := 'SELECT id, nombre FROM clientes';
IBOQuery1.Open;

while not IBOQuery1.Eof do
begin
  ShowMessage('Cliente: ' + IBOQuery1.FieldByName('nombre').AsString);
  IBOQuery1.Next;
end;

IBOQuery1.Close; // Cerrar consulta al finalizar



en concreto Cdamer, lo que ParamByName te permite es con ayuda de la "cadena de texto" construir sentencias SQL para el TQuery asi digamos "personalizadas" como con variables y tal que podrian tomar ciertos valores en el transcurso del programa o bien por ejemplo si tenemos alguna especie de "Constructor" (en nuestra app) para que el usuario digamos "pregunte (via SQL)" cosas que le vengan en gana (al usuario) a la BD variando esos valores de la consulta SQL me refiero mediante algun sistema que tu mismo elabores para el usuario por ejemplo un desplegable con opciones relativas a cierto campo o bien un Editbox donde el usuario meteria numeros para por ejemplo listar registros cuyo "salario" sea de tanto ..... entiendes no?? eso le da mucha mas flexibilidad y customizacion potente que si por ejemplo solo estableces en el codigo la sentencia SQL pre-fijada.

Espero que asi te quede mas claro todo, un saludo amigo

navbuoy 12-03-2025 16:22:12

y si, se usa el mismo componente IBOQuery para todo lo unico en tu parte del codigo que proceda, asignar la propiedad de SQL con la consulta EXCEPTO que por alguna razon necesites por ejemplo usar un TQuery para un SELECT y conservar el resultado porque dependiendo de lo que leas de los datos del SELECT tengas por ejemplo que hacer modificaciones a la propia TABLA u otra TABLA en cuyo caso necesitarias 2 objetos TIBOQUERY (ya que como digo, necesitas disponer de los datos del primero para recorrerlos y actuar segun sea la interpretacion o valores o lectura de esos campos/datos del SELECT con un INSERT o UPDATE en el otro TQUERY o tal)

porque como ya estaras suponiendo, si haces el SELECT y vuelves a utilizar el TIBOQUERY de nuevo pues los resultados del SELECT adios adios..... ajjajaja

y otra cosa que no se si han dicho por aqui Cdamer, es que por ejemplo si utilizas la TTABLE en memoria, dependiendo de si tienes muchisimos registros puede petar la propia memoria o el Stack o algo de la app, pero con una consulta SQL en un TIBOQuery creo que no pasa eso ya que no carga el contenido de toda la tabla en la memoria, eso es bueno saberlo si, porque si eres capaz de "gestionar" todo el tema de la BD solo con el TQuery pues mejor

cdamer 12-03-2025 16:23:18

ModifySQL, InsertSQL y DeleteSQL con un TIBQuery
 
Muchas gracias por la pronta respuesta, navbuoy !!
pero me referia a como usar las propiedades ModifySQL, InsertSQL y DeleteSQL con un TIBQuery

navbuoy 12-03-2025 16:34:57

realmente creo que no hace falta si usas la propiedad SQL del componente, porque la propia "sentencia SQL" que implementes ya resuelve eso

pero aqui te doy la informacion relativa a eso:

Las propiedades ModifySQL, InsertSQL y DeleteSQL en TIBQuery (de IBObjects) permiten definir manualmente las sentencias SQL para las operaciones de actualización, inserción y eliminación, en lugar de depender de la generación automática de IBObjects.

�� Uso de ModifySQL, InsertSQL y DeleteSQL en TIBQuery
1️⃣ Configuración en tiempo de diseño
Abre el diseñador de Delphi.
Agrega un componente TIBQuery al formulario.
Configura la propiedad SQL con la consulta SELECT.
Expande la propiedad UpdateSQL en el Inspector de Objetos.
Define las sentencias en ModifySQL, InsertSQL y DeleteSQL.
2️⃣ Configuración en código
Puedes definir las sentencias manualmente en tiempo de ejecución:

Código Delphi [-]
IBQuery1.SQL.Text := 'SELECT id, nombre, telefono FROM clientes WHERE id = :id';

// Configuración de Update (ModifySQL)
IBQuery1.ModifySQL.Text :=
  'UPDATE clientes SET nombre = :nombre, telefono = :telefono WHERE id = :old_id';

// Configuración de Insert (InsertSQL)
IBQuery1.InsertSQL.Text :=
  'INSERT INTO clientes (id, nombre, telefono) VALUES (:id, :nombre, :telefono)';

// Configuración de Delete (DeleteSQL)
IBQuery1.DeleteSQL.Text :=
  'DELETE FROM clientes WHERE id = :old_id';

�� Ejemplo de Uso
Después de configurar las sentencias, puedes utilizar ApplyUpdates para aplicar los cambios:

Código Delphi [-]
IBQuery1.Open;  // Abrimos la consulta

// Modificar un registro
IBQuery1.Edit;
IBQuery1.FieldByName('nombre').AsString := 'Juan Pérez';
IBQuery1.FieldByName('telefono').AsString := '987654321';
IBQuery1.Post;

IBQuery1.ApplyUpdates; // Aplica los cambios en la base de datos

// Insertar un registro
IBQuery1.Append;
IBQuery1.FieldByName('id').AsInteger := 100;
IBQuery1.FieldByName('nombre').AsString := 'Nuevo Cliente';
IBQuery1.FieldByName('telefono').AsString := '123456789';
IBQuery1.Post;

IBQuery1.ApplyUpdates;

// Eliminar un registro
IBQuery1.Delete;
IBQuery1.ApplyUpdates;

�� ¿Cuándo usar ModifySQL, InsertSQL y DeleteSQL?

Si la tabla no tiene una clave primaria bien definida.
Si necesitas consultas personalizadas (ejemplo: manejar registros de auditoría).
Si hay restricciones específicas en la base de datos que requieren manejar los cambios manualmente.



Creo que asi lo vas a tener ya claro del todo..... te pasare mi bizum, 100 euros bastaran (jajajaj es broma)

Casimiro Notevi 12-03-2025 16:45:05

Cita:

Empezado por cdamer (Mensaje 562646)
Muchas gracias por la pronta respuesta, navbuoy !!
pero me referia a como usar las propiedades ModifySQL, InsertSQL y DeleteSQL con un TIBQuery

Es igual al otro componente.
De todas formas, al seleccionar la tabla, pulsas en generar sql y se rellenan todos automáticamente.

Y si no es eso lo que preguntas entonces es mejor que crees un nuevo hilo con tu duda, aclarando exactamente lo que necesitas.

navbuoy 12-03-2025 16:49:18

Esta bien asi Casimiro, guarda relacion con el tema del hilo y creo que ya no queda mucho mas que explicar


La franja horaria es GMT +2. Ahora son las 11:19:09.

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