Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   C++ Builder (https://www.clubdelphi.com/foros/forumdisplay.php?f=13)
-   -   Eliminar Registros de u n DBGrid C++ Builder (https://www.clubdelphi.com/foros/showthread.php?t=77823)

zuzito76 28-02-2012 18:50:55

Eliminar Registros de u n DBGrid C++ Builder
 
ola amigos. Tengo un problema: Estoy tratando de borrar registros de un DBgrid de los que se denominan "no actualizables", es decir, los que muestran el resultado de una consulta que utiliza dos o más tablas relacionadas. Por ejemplo, supongamos que tenemos una tabla llamada EMPLEADOS con el código de empleado y su nombre, y otra llamada ARTICULOS (de venta) con el código del artículo, el nombre de dicho artículo y el código del empleado que ha vendido dicho artículo.En el DBGrid muestro el resultado de una consulta que indica el código del artículo y el nombre del empleado (no el código) que ha vendido ese artículo. Lo que trato de hacer es eliminar registros del DBGrid, pero no sé como hacerlo. Evidentemente, al hacer DBGrid->SelectedRows->Delete() me da un error, puesto que es un Grid no actualizable.Al hacerlo a través de un elemento UpdateSql y Query->Delete() (con la opcoión CachedUpdate=true) consigo eliminar el registro, pero al volver otra vez al DBGrid sigue estando ahí el registro. ¿Alguien me puede decir como puedo hacerlo? Muchas gracias de antemano. Saludos.

ecfisa 28-02-2012 20:10:27

Hola zuzito76.

Agregá otro componente query. El ejemplo lo hice con componentes IBX y uso como nombres IBQuery1 para el query asociado al TDBGrid y IBQueryTmp para el que ejecutará el borrado:
Código:

void __fastcall TForm1::btnBorrarClick(TObject *Sender)
{
 IBQueryTmp->Close();
 IBQueryTmp->SQL->Clear();
 IBQueryTmp->SQL->Add("DELETE FROM TU_TABLA WHERE TU_CAMPO = :VALUE");
 IBQueryTmp->ParamByName("VALUE")->Value = DBGrid1->Fields[0]->Value;
 IBQueryTmp->ExecSQL();
 /*
 si deseas ver reflejado el cambio en el DBGrid tendrías que agregar:
 IBQuery1->Close();
 IBQuery1->Open();
 */
}

Deberás adaptar los nombres de tabla, campo y el índice en el DBGrid que referencia al campo que utilizarás como condición del borrado.

Saludos.

zuzito76 29-02-2012 00:04:16

Hola Ecfisa. Acabo de probarlo y me ha funcionado correctamente. Es como tú dices salvo algunos detallitos. Efectivamente tenía que usar un query auxiliar (o temporal), pero en mi versión de builder no tengo elementos IBX, así que lo hice directamente con un query auxiliar y un elemento UpdateSql asociado a dicho query auxiliar para realizar la consulta con DELETE, ya que no lo puedo hacer con el query. Me explico: Haciendo QueryTemp->SQL->Add("DELETE FROM Mi Tabla WHERE...") obtengo un error que dice "Invalid Token Delete...". Así que lo que hice fue lo siguiente:
1)Asociar un elemento UpdateSQL a mi Query auxiliar (o temporal)
2)UpdateSql->DeleteSQL->Text="DELETE FROM Mi Tabla WHERE...";
3)QueryTemp->Delete();
4)QueryTemp->Open(); (o QueryTemp->ExecSQL();)
5)Como tu bien dices, para ver reflejado el cambio en el DBGrid: Query1->Close();
Query1->Open();
Y ha funcionado perfectamente...Problema solucionado. Así que muchísimas gracias por tu ayuda, llevaba comiéndome la cabeza bastante tiempo... y enhorabuena por este gran foro.
Un saludo.


La franja horaria es GMT +2. Ahora son las 12:03:35.

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