Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Conexión con bases de datos (https://www.clubdelphi.com/foros/forumdisplay.php?f=2)
-   -   eliminar datos con dbgrid (https://www.clubdelphi.com/foros/showthread.php?t=41695)

UREÑA 22-03-2007 20:34:29

eliminar datos con dbgrid
 
hola buen dia a todos tengo una base de datos en firebird y quiero eliminar datos y no se como, ya inserto y consulto pero no puedo eliminar, les agradecere su ayuda

tambien estoy utilizando un query, un datasource, ibtransaction y database todos estos estan un datamodule

gracias!!!

Caral 22-03-2007 20:40:02

Hola UREÑA
Me extraña que si inserta no puedas eliminar.
La razon normal por la que suele pasar esto es porque debe haber un campo clave que este afectado en la tabla.
De otra forma de deberia ser problema.
Saludos

Lepe 22-03-2007 20:50:16

Si usas un query, bastaría algo así:
Código SQL [-]
delete from nombreTabla where claveprimaria = 33

y después llamar a Query1.ExecSql

Saludos

vtdeleon 22-03-2007 22:59:55

Seria bueno que nos mostraras la forma en que consultas e insertas datos.

Saludos

UREÑA 26-03-2007 19:08:44

Esta es la forma en la que estoy insertando registros

//INSERTA REGISTROS
try
frm_DataModule.trans_commit.StartTransaction;
frm_DataModule.qry_usuarios.Close;
frm_DataModule.qry_usuarios.SQL.Clear;
frm_DataModule.qry_usuarios.SQL.Add('INSERT INTO USUARIOS (NOMBRE, APELLIDOP_US) ');
frm_DataModule.qry_usuarios.SQL.Add('VALUES('+QuotedStr(Edit1.Text)+','+QuotedStr(Edit2.Text)+')');
frm_DataModule.qry_usuarios.SQL.Text;
frm_DataModule.qry_usuarios.ExecSQL;
frm_DataModule.trans_commit.Commit;
Except
frm_DataModule.trans_commit.Rollback;
end;
Close ();

lo mejor es utilizar un query para cada operacion??? para insertar, eliminar y editar??

gracias!!!

Caral 26-03-2007 19:17:46

Hola UREÑA
Asi se ve mejor:
Código Delphi [-]
try
frm_DataModule.trans_commit.StartTransaction;
frm_DataModule.qry_usuarios.Close;
frm_DataModule.qry_usuarios.SQL.Clear;
frm_DataModule.qry_usuarios.SQL.Text 'INSERT INTO USUARIOS (NOMBRE, APELLIDOP_US) ' +
                                    'VALUES ('+QuotedStr(Edit1.Text)+','+QuotedStr(Edit2.Text)+')';
frm_DataModule.qry_usuarios.ExecSQL;
frm_DataModule.trans_commit.Commit;
Except
frm_DataModule.trans_commit.Rollback;
end;
Close ();
Saludos

Lepe 26-03-2007 19:39:59

Si estas usando Firebird, es mejor que instales los MDOLIB, ya que son y serán totalmente compatible con Firebird.

Después usas un TMDODataset, que es un componente con 4 sqls:
- select
- insert
- update
- delete

En diseño estableces esas cuatro propiedades (especificando la tabla de firebirde que se va a modificar y los campos actualizables) con unas sqls que el propio MDODataset te propone, y así podrás hacer cada una de las operaciones como si de un TTable se tratara (más o menos).

Saludos

RONPABLO 26-03-2007 20:14:04

Cita:

lo mejor es utilizar un query para cada operacion??? para insertar, eliminar y editar??
como recomendación no uses el query.sql.add()... mejor crea para cada tabla un xxDataSet (como te recomendó Lepe), donde desde el diseño ya tenga los querys de Insert, Delte, Update y select.

Tambien usa parámetros, algo asi como esto:


Código SQL [-]
select * from tabla where id = :vparametroId 
inserte into tabla (id, nombre) values(:vparametroId, :vparametroNombre)
update tabla set nombre = :vparametroNombre where id = :vparametroId
//los dos puntos indican que ese valor va a ser enviado por medio de un
// parametro, la forma de enviar parametros desde Delphi es asi:


Código Delphi [-]

modulo.query.close;
modulo.query.ParamByName('parametroId').asInteger = 1;
modulo.query.ParamByName('parametroNombre').asString = 'juan';
modulo.query.open;

UREÑA 27-03-2007 19:38:56

hola amigos buen dia

con la novedad!!!

por fin ya pude eliminar

Código SQL [-]
   //ELIMINA REGISTROS
  if frm_DataModule.qry_usuarios.RecordCount > 0 then
begin
    try
     frm_DataModule.trans_commit.StartTransaction;
     frm_DataModule.qry_usuarios_upd.Close;
     frm_DataModule.qry_usuarios_upd.SQL.Clear;
     //ShowMessage(frm_DataModule.qry_usuarios.fieldbyname('NOMBRE').AsString);
     frm_DataModule.qry_usuarios_upd.SQL.Add('DELETE FROM USUARIOS where NOMBRE ='+QuotedStr(frm_DataModule.qry_usuarios.fieldbyname('NOMBRE').AsString));
     frm_DataModule.qry_usuarios_upd.SQL.Text;
     frm_DataModule.qry_usuarios_upd.ExecSQL;
     frm_DataModule.trans_commit.Commit;
   Except
     frm_DataModule.trans_commit.Rollback;
     end;
     frm_DataModule.qry_usuarios.Close;
     frm_DataModule.qry_usuarios.Open;
end
else
ShowMessage('No hay nada para eliminar');

gracias a todos!! solo me falta validar:confused:

me esta gustando mucho esto de delphi:D

Lepe 28-03-2007 17:10:09

Un detalle, cambia la línea:
Código Delphi [-]
 if frm_DataModule.qry_usuarios.RecordCount > 0 then
por esta otra:
Código Delphi [-]
 if not frm_DataModule.qry_usuarios.isEmpty then

el RecordCount solo funciona en tablas de escritorio (paradox), es demasiado costoso para implementarlo en Firebird u otro sistema c/s.

Saludos

ArdiIIa 28-03-2007 17:20:33

Cita:

Empezado por UREÑA
frm_DataModule.qry_usuarios_upd.Close;
frm_DataModule.qry_usuarios.Close;

Creo que esas dos líneas, son superfluas....

Lepe 29-03-2007 12:41:52

Ardilla no entiendo qué líneas dices:
Código Delphi [-]
frm_DataModule.qry_usuarios_upd.Close;
frm_DataModule.qry_usuarios.Close;
La primera es necesaria porque estamos cambiando el SQL de esa consulta.
La segunda línea... bueno... se trata de otra Consulta distinta... de la que no tenemos constancia sobre su SQL, por ello, no me atrevería a asegurar que sobran.

La que si es cierto que sobra es esta:
Código Delphi [-]
     frm_DataModule.qry_usuarios_upd.SQL.Text;

Saludos

ArdiIIa 29-03-2007 18:20:59

Hola Lepe:

Hasta donde yo sé, cuando se modifica la propiedad SLQ de un Query, éste se cierra automáticamente, luego sería innecesario cerrarlo, dado que ya con el hecho de hacer un SQL.Clear, este se cierra.
En el segundo caso, si el Query depende de la transacción con la que se efectúa un Commit o un Rolback, nada mas hacer cualquiera de los dos pasos, el Query se cerrará de forma automática, por lo tanto, tampoco será preciso cerrarlo, de ahí es por lo que hago esa observación.

Claro está que estoy hablando de TQuery y sus derivados. En un post anterior citabas los componentes MDOLIB, los cuales desconozco, y en el caso de que en en este ejemplo sean los componentes utilizados, y estos tengan un comportamiento distinto al citado, mi observación no tendría cabida.
Así que si esto ultimo es cierto retiro mi observación. Ahora bien, si los componentes utilizados son TQuery o TIbQuery, creo que mi observación optimiza el código.

Saludos

Kenobi 29-03-2007 22:55:30

No entiendo bien lo que dice....
 
Hola amigos ....
entiendo que un query tiene a nivel de propiedades para colocarle la rutina insert, delete etc ...ahora bien cual es el problema (ademas del codigo en la aplicacion) de usar sql.add como dijo RonPablo(mis respetos amigo) digo yo... acaso no funciona siempre bien..? pregunto porque yo lo uso bastante y si estoy cometiendo un error ......a corregirlo sea dicho......

Lepe 30-03-2007 12:12:40

Tu código está bien, solo que aqui estamos "divagando" :D :D ... bueno mejor dicho... intentando optimizar el código que usas.

Lo lógico, cuando vas a modificar el SQL de una consulta, es hacer lo que haces, es decir, primero cierras la consulta y después utilizas Clear para borrar el contenido, por último añades la SQL nueva.

Cuando estudias más a fondo un tema, aprendes cosas nuevas, y ves que el TQuery ya hace algunas cosas internamente, es entonces cuando empiezas a mirar detenidamente tu código y dices: "¿Para qué voy a poner tal o cual línea de código si ya lo hace el TQuery internamente?, pues eso, elimino la línea y me ahorro una línea de código"

En ocasiones, es mejor dejar esa línea de código, para clarificar el código y hacerlo más legible. Si estas empezando, quizás te sea más claro para tí dejar esas líneas "que están demás".

Saludos

RONPABLO 30-03-2007 19:31:29

Cita:

Empezado por Kenobi
ahora bien cual es el problema (ademas del codigo en la aplicacion) de usar sql.add como dijo RonPablo(mis respetos amigo) digo yo... acaso no funciona siempre bien..? pregunto porque yo lo uso bastante y si estoy cometiendo un error

Como tal así funciona, la cuestión es cuando buscamos escalabilidad, solo por ejemplo que en algún momento tienes que cambiar de componente de conexión a la bd, con el sql.add, tendrás que ir unidad por unidad buscando donde esta el código sql, mientras que si tienes dentro de un modulo (o dos o tres, pero no muchos) todos los xxQuerys (con su correspondiente xxUpdateSQL) o xxDataSets, te quedara mas fácil modificar estos.

un ejemplo:


Tabla Permisos (id, nombre); tabla Perfiles (id, nombre)

para estas dos tablas yo creo en Delphi dos xxQuery asi que normalmente los llamaría xxQPermisos y xxQPerfiles y los asociaria con de a xxUpdateSQL (xxUSPermisos, xxUSPerfiles), ya en el inspector de objetos en la propiedad
unidirectional la igualaría a false y la propiedad sql pondría algo como esto

Código SQL [-]
//en el xxqPermisos
select * from TPERMISOS where id = :id

//en el xxqPerfiles
select * from TPERFILES where id = :id

con esto solo tendría que ir al xxUpdateSQL darle doble clic, pedirle los nombres de la tabla, donde me mostraría dos cuadros con los mismos campos, uno se llama Key FIelds y el otro se llama UpdateFiels, en Key Fields seleccionaría el campo id y en update Fields todos los campos, luego le diria que me genere el sql y el me daría estos resultados:

Código SQL [-]
//Modify
update TPERMISOS
set
  CODIGO = :CODIGO,
  NOMBRE = :NOMBRE
where
  CODIGO = :OLD_CODIGO


//Insert
insert into TPERMISOS
  (CODIGO, NOMBRE)
values
  (:CODIGO, :NOMBRE)

//Delete
delete from TPERMISOS
where
  CODIGO = :OLD_CODIGO


//refresh
Select 
  CODIGO,
  NOMBRE
from TPERMISOS 
where
  CODIGO = :CODIGO

con esto que me ahorro??, simple en cada unidad tener que estar poniendo

Código Delphi [-]
query.sql.clear;
query.sql.add('el select');
query.open;

query.sql.clear;
query.sql.add('el delete y su parametro');
query.paramByname('id').asInteger= varId;

query.sql.clear;
query.sql.add('el update y su parametro');
query.sql.ParamByName('id').asInteger;


y solo usaría comandos como:

Código Delphi [-]
xxQPermisos.opent;
xxQPermisos.Edit;
xxQPermisos.Insert;
xxQPermisos.Delete;
xxQPermisos.Refresh;
xxQPermisos.post;
xxQPermisos.applyUpdates;

RONPABLO 30-03-2007 19:34:44

se me olvidaba, en el msn anterior las xx pueden ser remplazadas por IB o MDO o el componente que se use.

UREÑA 30-03-2007 20:22:12

amigos les agradesco todos sus comentarios ya que como apenas estoy enpezando este tipo de criticas me sirven mucho para mejorar

y si me pueden dar consejos manuales o alguna url de una buena pagina, lo que sea se los agradeceria mucho

saludos:D

RONPABLO 30-03-2007 21:56:13

busca un pdf llamdo "la cara oculta de Delphi 4", es muy bueno para empesar (o contiunar) con Delphi

Lepe 30-03-2007 23:06:10

RonPablo, quizás no he entendido bien, pero eso mismo lo encapsula el XXDataset (sustituya XX por IB, MDO, etc).

Es un solo componente que tiene las 4 sqls, al que puedes llamar con los métodos Edit, Delete, Insert, Update, etc. Quizás tu mensaje va orientado a cuando tenemos una consulta con inner join, y por tanto no se pueden actualizar.

Tal y como has puesto el ejemplo, el Query y el UpdateSql se sustituye con el XXDataset.

Saludos


La franja horaria es GMT +2. Ahora son las 16:26:08.

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