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)
-   -   Borrar datos con IBX y FB2.0 (https://www.clubdelphi.com/foros/showthread.php?t=60768)

FGarcia 13-10-2008 21:55:05

Borrar datos con IBX y FB2.0
 
Hola!!

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

Código Delphi [-]
delete from DATOS
where
  CONSECUTIVO = :OLD_CONSECUTIVO

Pero en lo real quiero hacer esto:

Código Delphi [-]
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:

Cita:

---------------------------
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.

Código Delphi [-]
    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

Código SQL [-]
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:

Código Delphi [-]
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:

Código SQL [-]
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:

Código SQL [-]
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:

Código SQL [-]
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:

Código Delphi [-]
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!


La franja horaria es GMT +2. Ahora son las 06:01:49.

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