Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Bases de datos > Firebird e Interbase
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 13-10-2008
[FGarcia] FGarcia is offline
Miembro Premium
 
Registrado: sep 2005
Ubicación: Cordoba, Veracruz, México
Posts: 1.123
Poder: 20
FGarcia Va por buen camino
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?
__________________
ESTO ES UN FORO ... NO UN MÓVIL
¿Por qué no escribir de una manera comprensible para que los humanos lo podamos entender?
Responder Con Cita
  #2  
Antiguo 14-10-2008
lbuelvas lbuelvas is offline
Miembro
 
Registrado: may 2003
Ubicación: Colombia
Posts: 377
Poder: 22
lbuelvas Va por buen camino
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;
__________________
Luis Fernando Buelvas T.
Responder Con Cita
  #3  
Antiguo 14-10-2008
[FGarcia] FGarcia is offline
Miembro Premium
 
Registrado: sep 2005
Ubicación: Cordoba, Veracruz, México
Posts: 1.123
Poder: 20
FGarcia Va por buen camino
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!!
__________________
ESTO ES UN FORO ... NO UN MÓVIL
¿Por qué no escribir de una manera comprensible para que los humanos lo podamos entender?
Responder Con Cita
  #4  
Antiguo 14-10-2008
[FGarcia] FGarcia is offline
Miembro Premium
 
Registrado: sep 2005
Ubicación: Cordoba, Veracruz, México
Posts: 1.123
Poder: 20
FGarcia Va por buen camino
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
__________________
ESTO ES UN FORO ... NO UN MÓVIL
¿Por qué no escribir de una manera comprensible para que los humanos lo podamos entender?
Responder Con Cita
  #5  
Antiguo 15-10-2008
lbuelvas lbuelvas is offline
Miembro
 
Registrado: may 2003
Ubicación: Colombia
Posts: 377
Poder: 22
lbuelvas Va por buen camino
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.
__________________
Luis Fernando Buelvas T.
Responder Con Cita
  #6  
Antiguo 15-10-2008
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 29
Lepe Va por buen camino
¡¡ 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
__________________
Si usted entendió mi comentario, contácteme y gustosamente,
se lo volveré a explicar hasta que no lo entienda, Gracias.

Última edición por Lepe fecha: 15-10-2008 a las 10:33:23.
Responder Con Cita
  #7  
Antiguo 15-10-2008
[FGarcia] FGarcia is offline
Miembro Premium
 
Registrado: sep 2005
Ubicación: Cordoba, Veracruz, México
Posts: 1.123
Poder: 20
FGarcia Va por buen camino
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.
__________________
ESTO ES UN FORO ... NO UN MÓVIL
¿Por qué no escribir de una manera comprensible para que los humanos lo podamos entender?
Responder Con Cita
  #8  
Antiguo 15-10-2008
[FGarcia] FGarcia is offline
Miembro Premium
 
Registrado: sep 2005
Ubicación: Cordoba, Veracruz, México
Posts: 1.123
Poder: 20
FGarcia Va por buen camino
Pues ya cambie a un query y ahora me resulta algo mas interesante..

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 *!!

¿que tiene ese DELETE que lo hace tan complicado?
__________________
ESTO ES UN FORO ... NO UN MÓVIL
¿Por qué no escribir de una manera comprensible para que los humanos lo podamos entender?
Responder Con Cita
  #9  
Antiguo 15-10-2008
Avatar de Delphius
[Delphius] Delphius is offline
Miembro Premium
 
Registrado: jul 2004
Ubicación: Salta, Argentina
Posts: 5.582
Poder: 25
Delphius Va camino a la fama
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,
__________________
Delphius
[Guia de estilo][Buscar]

Última edición por Delphius fecha: 15-10-2008 a las 18:40:57. Razón: me equivoqué de etiquetas
Responder Con Cita
  #10  
Antiguo 15-10-2008
[FGarcia] FGarcia is offline
Miembro Premium
 
Registrado: sep 2005
Ubicación: Cordoba, Veracruz, México
Posts: 1.123
Poder: 20
FGarcia Va por buen camino
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.
__________________
ESTO ES UN FORO ... NO UN MÓVIL
¿Por qué no escribir de una manera comprensible para que los humanos lo podamos entender?
Responder Con Cita
  #11  
Antiguo 15-10-2008
Avatar de Delphius
[Delphius] Delphius is offline
Miembro Premium
 
Registrado: jul 2004
Ubicación: Salta, Argentina
Posts: 5.582
Poder: 25
Delphius Va camino a la fama
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,
__________________
Delphius
[Guia de estilo][Buscar]
Responder Con Cita
  #12  
Antiguo 15-10-2008
[FGarcia] FGarcia is offline
Miembro Premium
 
Registrado: sep 2005
Ubicación: Cordoba, Veracruz, México
Posts: 1.123
Poder: 20
FGarcia Va por buen camino
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!
__________________
ESTO ES UN FORO ... NO UN MÓVIL
¿Por qué no escribir de una manera comprensible para que los humanos lo podamos entender?
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
como borrar datos de una tabla majuub Varios 6 23-05-2007 19:07:30
Borrar todos los datos de una tabla dariana20 SQL 8 07-06-2006 17:09:04
Borrar datos duplicados Sr.Scorpion Conexión con bases de datos 4 20-06-2005 19:52:57
borrar datos de varias tablas davidfp SQL 1 02-06-2005 18:23:47
Borrar datos de tablas JuanSB MS SQL Server 2 11-10-2004 17:03:14


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


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