PDA

Ver la Versión Completa : Borrar datos con IBX y FB2.0


FGarcia
13-10-2008, 21:55:05
Hola!!

En el dataset editor (IBDataSet) tengo esta sentencia para DeleteSQL:


delete from DATOS
where
CONSECUTIVO = :OLD_CONSECUTIVO


Pero en lo real quiero hacer esto:


procedure TdmDatos.BorrarDatos(indice: integer);
begin
with dstDatos do
begin
DeleteSQL.Clear;
if (indice < 4) then
begin
DeleteSQL.Text := 'DELETE FROM Datos WHERE Bascula = :Borrar';
ParamByName('Borrar').Value := indice;
end
else
DeleteSQL.text := 'DELETE FROM Datos' ;
ExecSQL;
end;
end;


Me da un mensaje de Horror que dice:


---------------------------
Debugger Exception Notification
---------------------------
Project Captura.exe raised exception class EIBClientError with message 'Field "Borrar" not found'. Process stopped. Use Step or Run to continue.
---------------------------
OK Help
---------------------------



Es decir que no encuentra el campo "Borrar" y se supone que estoy pasando un parametro llamado "Borrar".

¿Que estoy haciendo mal?

lbuelvas
14-10-2008, 00:07:48
Hola, hice la siguiente prueba con una tabla de mi base de datos y me funcionó bien. Mi base de datos es Firebird 1.5.5. Lo diferente es que utilicé un objeto TIBQuery en vez de un TIBDataset, este ultimo objeto lo utilizo para navegación y manipulacion de registros.

Me parece que es mas apropiado un TIBQuery o incluso es mejor un TIBSQL pues estas lanzando eliminaciones de registros.


for i := 10000 to 10005 do
begin
IBQuery1.SQL.Clear;
if (i < 10005) then
begin
IBQuery1.SQL.Text := 'DELETE FROM RESOLUCION WHERE ID = :Borrar';
IBQuery1.ParamByName('Borrar').Value := I;
end
else
IBQuery1.SQL.Text := 'DELETE FROM RESOLUCION WHERE ID = 1000000' ;
IBQuery1.ExecSQL;
end;

FGarcia
14-10-2008, 22:02:42
Gracias por tu respuesta Luis Fernando, lo voy a probar aunque aun me queda la duda, pues se supone que El IBDataset es un producto de dos componentes IBX como son el el IBQuery y el IBUpdateSql y deberia tener la capacidad de hacer lo que intento, en fin se me hace que ¡¡he vivido engañado!!

FGarcia
14-10-2008, 23:38:53
pues no!
Algo anda mal, no me funciona. Tal vez estoy mal en el concepto de lo que quiero hacer.

Tengo una tabla:

ID - Bascula - campoX - CampoY
=========================
1 1 xx yy
2 2 xx yy
3 3 xx yy
4 4 xx yy
||
||
||
1150 1 xx yy
1151 2 xx yy
1152 3 xx yy
1153 4 xx yy

Lo que necesito es borrar todos los registros que cumplan la condicion del indice (1 o 2 o 3 o 4) de la consulta por eso

WHERE BASCULA = :BORRAR
ParambyName('BORRAR') = indice


¿?¿? NPI

lbuelvas
15-10-2008, 09:17:51
Lo que pasa es que los TIBDataset exigen que exista una clausula select, las demas propiedades SQL son opcionales y creo que tu no utilizas el select.

Me da la impresion que por esos lados puede ser el problema, porque en tu tabla no existe un campo 'Borrar'.

Bueno estas con Firebird 2 y yo no he trabajado con esa version. Porque no pruebas con el nombre del parametro en mayusculas 'BORRAR'.

La otra posibilidad aunque queda algo feo es cambiar tu segmento de codigo de manera que no utilices parametros, asi:


procedure TdmDatos.BorrarDatos(indice: integer);
begin
with dstDatos do
begin
DeleteSQL.Clear;
if (indice < 4) then
begin
DeleteSQL.Text := 'DELETE FROM Datos WHERE Bascula = ' + IntToStr(indice);
end
else
DeleteSQL.text := 'DELETE FROM Datos' ;
ExecSQL;
end;
end;


Si no te funciona porque no utilizas un procedimiento almacenado.

Lepe
15-10-2008, 10:19:31
¡¡ quieto parao !!

Me parece que estás complicando la cosa mucho, lo simple es esto:
- En el ibdataset, escribe el selectSQL, típico: select * from tabla
- ahora clic derecho en el tibdataset y elige la opción "dataset editor"
- Obtienes una ventana donde puedes elegir la tabla y los campos, por defecto te aparece la sql de select que escribiste antes y en esta ventana:

- pulsa en el botón "select primary keys" y los 3 botones que tienes abajo.
- cambia de pestaña y verás que las sqls de borrado, inserción y modificación se han escrito correctamente.
- Acepta la pantalla.

- configura un dbnavigator que apunte a ese datasource
- Listo, ya puedes borrar registros, añadir, modificar y seleccionar.

Las SQLs ya no tienes que tocarlas para nada, ni tampoco pasarle parámetros, se usará el registro que esté en pantalla (obviamente moviéndote con el dbnavigator).

Edito:
Aunque puedes configurar la propiedad DeleteSQL para borrar un grupo de registros, no lo considero oportuno, el DELETESQL es para el registro que se encuentre activo. Si necesitas borrar un grupo de registros, usa un Query o un procedimiento almacenado.

Saludos

FGarcia
15-10-2008, 17:05:02
Hola!

Lepe, Luis Fernando, todo el procedimiento que me describen sobre la generacion de la sentencia SELECT y la configuracion a traves del Dataset Editor ya esta realizado, eso ya lo tenia desde el inicio, el detalle esta en esto ultimo que me explicas Lepe, yo quiero cambiar la sentencia DELETE que genero el Dataset editor, pero si no sirve para lo que quiero (borrar un grupo de registros) entonces si debo de cambiar de estrategia -en este caso componente- Ya les comentare que paso.

FGarcia
15-10-2008, 17:37:55
Pues ya cambie a un query y ahora me resulta algo mas interesante..:confused:

SQL.Text := 'DELETE * FROM DATOS WHERE BASCULA = :BORRAR';
Params.ParamByName('BORRAR').value := indice;

al ejecutar me aparece esto

---------------------------
Debugger Exception Notification
---------------------------
Project Captura.exe raised exception class EIBInterBaseError with message 'Dynamic SQL Error
SQL error code = -104
Token unknown - line 1, column 8
*'. Process stopped. Use Step or Run to continue.
---------------------------
OK Help
---------------------------

es decir que ¡¡no reconoce a *!! :confused::confused::confused:

:D:D¿que tiene ese DELETE que lo hace tan complicado?:(

Delphius
15-10-2008, 18:40:13
Hola FGarcia,
No dejes que el SQL te quite el sueño.
El tema del DELETE y el asterisco es que se debe a dos cosas;):
1. O Borras todo el registro o no borras nada. No puedes pedirle al motor que borre algunos campos. El DELETE afecta a todo el registro, por tanto no le interesa cuantos campos tenga.
2. Como corolario de 1, el estándar SQL definió que la sentencia DELETE se establezca del siguiente modo:

DELETE FROM tabla WHERE ....

Saludos,

FGarcia
15-10-2008, 19:04:27
Delphius NO quiero borrar campos de un registro. Quiero borrar todos los registros que cumplan con la condicion de campo "bascula = indice"; es decir que si tengo el indice con valor 3 entonces todos los registros cuyo valor de campo (bascula) sea igual a 3 sean borrados de la tabla. El * definitivamente no lo reconoce el DELETE. La sentencia "DELETE FROM TABLA" borra perfectamente toda la tabla.

Hay algo que no comprendo en esto de firebird e IBX, con Access esto funciona bastante facil.

Delphius
15-10-2008, 19:13:38
A ver amigo, tal vez no me expliqué bien, el tema del asterisco en un DELETE es que no responde al estandar SQL. Una sentencia SQL del tipo DELETE no espera ningún asterisco, espera la orden que le informe cuantos o cuales registros debe borrar.

El asterisco sólo tiene sentido en un SELECT, puesto que se espere que regrese todos los campos que forman al registro.

Me extraña que tengas problemas, esta consulta SQL debería funcionarte:

DELETE FROM TuTabla
WHERE TuCampo = :Parametro

Saludos,

FGarcia
15-10-2008, 22:17:38
Bueno, despues de andar reinventando el hilo negro y no se que carajos traia en la cabez esto quedo asi:


procedure TdmDatos.BorrarDatosBascula(indice: integer);
begin
//Cambie el dataset por un query
with qyApoyo do
begin
Close;
SQL.Text := 'DELETE FROM DATOS WHERE BASCULA = :indice';
Params.ParamByName ('indice').Value := indice;
ExecSQL; //Aqui usaba open
end;

//Aqui actualizo la parte visual de los datos
qyResumen.Close ;
qyResumen.Open ;
qyPlot.Close ;
qyPlot.Open ;
end;


¡Gracias por la ayuda!