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)
-   -   Solución para el error "Field ID not found" (https://www.clubdelphi.com/foros/showthread.php?t=16320)

Calderin 23-11-2004 22:14:38

Solución para el error "Field ID not found"
 
Hola a todos, necesito ayuda con un problemilla que tengo en una aplicación cliente / servidor que estoy desarrollando. Estoy utilizando Interbase 6.5 y Delphi 7. Las conexiones las realizo con IBDataSet.

A continuación pongo un ejemplo del código con el que tengo el problema. En el código del ejemplo lo que hago es eliminar un registro seleccionado, pero el error me ocurre tanto cuando inserto, elimino, modifico y refresco.

Código:

  if dmPrincipal.dsetFamilia.Fields[0].Value <> null then
        begin
          if  MessageDlg('¿Seguro que desea borrar el registro seleccionado?', mtInformation, [mbYes, mbNo],0) = mrYes then
                begin
                  dmPrincipal.dsetFamilia.Delete;
                  dmPrincipal.dsetFamilia.ParamByName('ID').AsInteger := dmPrincipal.dsetFamilia.Fields[0].Value;
                  dmPrincipal.dsetFamilia.Open;
                end
          else
                  dmPrincipal.dsetFamilia.Open;
        end
  else
        MessageDlg('Debe seleccionar un registro para eliminarlo', mtInformation, [mbYes], 0)

Haciendo la traza del programa el error se produce en la linea en la que le indico el parámetro ("ID"). El mensaje de error es el siguiente: "Field "ID" not found." El error me lo devuelve como he comentado antes tanto haciendo insert, delete ... Lo extraño es que a pesar de mostrar el error, elimina el registro.

Buenos gracias de antemano, y si alguien tiene algunas respuesta para mi enigma de deberé unas cuantas noches en vela. :o

Un saludo.

eduarcol 23-11-2004 22:24:03

El problema esta en que cuando pasas al parametro el valor "id" estas pasando un literal cuando en realidad lo que se espera es un valor numerico entre 0 y n donde n es la cantidad total de parametros menos uno

Calderin 23-11-2004 23:46:58

Antes que nada darte las gracias eduarcol por la rápida respuesta, pero hay algo que no entiendo. No se a que te refieres cuando dices:
Cita:

"...estas pasando un literal cuando en realidad lo que se espera es un valor numerico..."
El valor que recojo en la línea siguiente es un entero.

Código:

...
 dmPrincipal.dsetFamilia.ParamByName('ID').AsInteger := dmPrincipal.dsetFamilia.Fields[0].Value; ...

Si pudieses especificar más o poner un ejemplo te lo agradecería.

eduarcol 24-11-2004 00:05:51

Perdon no vi bien la sintaxis, tienes razon, pero el asunto esta que el parametro ID no existe ese es todo el problema

Calderin 24-11-2004 00:52:12

El la declaración de DeleteSQL tengo lo siguiente:
Código:

DELETE FROM Familia WHERE ID = :ID
Tengo definido un parámetro :ID, además en el caso de no existir el parámetro ¿Cómo se explica que elimine el registro seleccionado?

defcon1_es 24-11-2004 11:18:26

Hola,
Cita:

Empezado por Calderin
Tengo definido un parámetro :ID, además en el caso de no existir el parámetro
¿Cómo se explica que elimine el registro seleccionado?

Realmente NO tienes ese parámetro, a menos que esté definido en la sentencia SQL de la propiedad SELECTSQL.
En un IBDataSet, sólo tienes acceso a los parámetros que pongas en la sentencia SELECTSQL.

Los "parámetros" de las sentencias INSERTSQL, UPDATESQL y DELETESQL los "sustituye" (internamente)
por el valor de los campos que tienen el mismo nombre, por eso te borra el registro. ;)

Pregunta: Cuando haces un INSERT/APPEND o EDIT del IBDataSet,
¿a que NO le pasas todos los "parámetros" de las sentencias INSERTSQL o UPDATESQL como parámetros (con ParamByName),
sino que asignas los valores correspondientes a los campos (FieldByName o Field[x])?

Yo haría lo siguiente:
Código Delphi [-]
  if not(dmPrincipal.dsetFamilia.FieldByName('ID').IsNull)
  then begin
    if MessageDlg('¿Seguro que desea borrar el registro seleccionado?', 
                       mtInformation, [mbYes, mbNo],0) = mrYes 
    then dmPrincipal.dsetFamilia.Delete; // Borra el reg. seleccionado
  end
  else MessageDlg('Debe seleccionar un registro para eliminarlo', 
                         mtInformation, [mbYes], 0);

Salu2.


La franja horaria es GMT +2. Ahora son las 13:58:10.

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