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)
-   -   Error : field not found (https://www.clubdelphi.com/foros/showthread.php?t=92102)

identsoft 26-07-2017 13:21:40

Error : field not found
 
Hola a todos.
Estoy intentando obtener el valor de dos campos de una tabla y de un campo si obtengo pero del otro campo no. El error que da es "Error SqlVarios:Field AGENTE not found" . Los dos campos existen el la tabla ASEGURADOS y tiene valor.
Pongo código:
Código Delphi [-]
        SQLVarios.Close;
         SQLVarios.SQL.Clear;
         SQLVarios.SQL.Text := 'select AGENTE, FORMA_COBRO from ASEGURADOS where CODIGO = :ICODIGO';
         SQLVarios.ParamByName('ICODIGO').AsInteger := StrToInt(DBEAsegurado.Text);
         SQLVarios.Open;
         if SQLVarios.IsEmpty = False then
            begin
               fpago := SQLVarios.FieldByName('FORMA_COBRO').AsInteger;
               ag_aux := SQLVarios.FieldByName('AGENTE').AsInteger;  <-- El error lo da aquí
            end

Las dos variable están definidas de igual forma.Son Integer.
Siguiendo el debug, si antes de la asignación le pregunto por el valor del campo (SQLVarios.FieldByName('AGENTE').AsInteger) me lo da correctamente, no tira ningún error.

Utilizo del DBExpress y la bd es firebird. La tabla existe y los dos campos existen y definidos como integer.
Alguien tiene alguna idea de porque da este error?

Muchas gracias.

Casimiro Notevi 26-07-2017 13:39:03

¿Qué componente es SQLVarios?
¿Qué base de datos estás usando?

El error está claro, pero mejor antes nos aclaras esas dudas.

EDITO: Estoy ciego, lo pones claramente :(

Casimiro Notevi 26-07-2017 13:46:52

Seguramente ese componente va así:
Código Delphi [-]
fpago := SQLVarios.Fields[0].AsInteger;
ag_aux := SQLVarios.Fields[1].AsInteger;

O también así:
Código Delphi [-]
ag_aux := SQLVarios.Fields.FieldByName('agente').AsInteger;

identsoft 26-07-2017 13:58:30

Casimiro:
poniendolo como tu dices, me tira otro tipo de error 'xxx' is not a valid integer value

duilioisola 26-07-2017 15:44:28

Cita:

Empezado por identsoft (Mensaje 519733)
Casimiro:
poniendolo como tu dices, me tira otro tipo de error 'xxx' is not a valid integer value

¿El error lo da en el mismo lugar o en otra línea?
Aparentemente etá recibiendo 'xxx' y tratan de convertirlo a entero y no puede.
Supongo que se trata de la línea donde carga el parámetro, en donde tienes StrToInt().

identsoft 26-07-2017 17:40:08

El error lo da en la misma linea.
Si pongo sqlVarios.fieldbyname('AGENTE').asinteger el error queda da "FIELD NOT FOUND"
Si pongo SqlVarios,Fields[0].asinteger el error que da es "'xxx' is not a valid integer value". Le Intenta asignar el valor de otro campo(direccion) de tipo string.
Es como si no reconociera el campo AGENTE. Pero lo he comprobado varias veces y existe, es integer y en otro form lo utilizo en un dbedit.
Expediente X.

identsoft 26-07-2017 18:03:57

Si en vez de utilizar el sqlquery(sqlVarios) utilizo un SIMPLIDATASET la cosa funciona perfectamente.
La solución la tengo, pero esto me genera muchas dudas con el sqlquery.
Gracias a todos por vuestro tiempo y si alguien quiere o puede aportar algo más, estaremos atentos.
Un saludo

movorack 26-07-2017 18:43:06

Hola!,

Solo para ver que pudo ser el fallo con el Query. ¿Puedes copiar el componente acá? (Copiar sobre el componente y pegar en el editor de texto del foro)

identsoft 26-07-2017 18:52:03

Cita:

Empezado por movorack (Mensaje 519755)
Hola!,

Solo para ver que pudo ser el fallo con el Query. ¿Puedes copiar el componente acá? (Copiar sobre el componente y pegar en el editor de texto del foro)

Explicame como lo hago. No lo he hecho nunca

duilioisola 26-07-2017 18:54:43

Por el nombre del componente, diría que lo utilizas varias veces con SQLs distintos.
Prueba a crear otro componente para ese SQL. Puede que quede la estructura del SQL anterior en memoria y debas borrar los campos antes de seguir.
Prueba con algo como esto:

Código Delphi [-]
   // Creo componente
   with TSQLQuery.Create(nil) do
   begin
       // Me aseguro de liberarlo aunque falle
     try
         // Trabajo con el compoente
       Close;
       SQL.Clear;
       SQL.Text := 'select AGENTE, FORMA_COBRO from ASEGURADOS where CODIGO = :ICODIGO';
       ParamByName('ICODIGO').AsInteger := StrToInt(DBEAsegurado.Text);
       Open;
       if IsEmpty = False then
       begin
        fpago := FieldByName('FORMA_COBRO').AsInteger;
        ag_aux := FieldByName('AGENTE').AsInteger;  <-- El error lo da aquí
       end;
     finally
         // Libero componente
       Free;
     end;
   end;

ecfisa 26-07-2017 19:28:41

Hola identsoft.

Una consulta, ¿ Has creado campos persistentes en SQLVarios ?

Saludos :)

identsoft 26-07-2017 19:33:17

No. Nada extraño, solo lo que puse

identsoft 27-07-2017 10:42:58

Cita:

Empezado por duilioisola (Mensaje 519757)
Por el nombre del componente, diría que lo utilizas varias veces con SQLs distintos.
Prueba a crear otro componente para ese SQL. Puede que quede la estructura del SQL anterior en memoria y debas borrar los campos antes de seguir.
Prueba con algo como esto:
Código Delphi [-]
// Creo componente    
with TSQLQuery.Create(nil) do    
begin        
  // Me aseguro de liberarlo aunque falle        
  try            
  // Trabajo con el compoente            
    Close;            
    SQL.Clear;            
    SQL.Text := 'select AGENTE, FORMA_COBRO from ASEGURADOS where CODIGO = :ICODIGO';            
    ParamByName('ICODIGO').AsInteger := StrToInt(DBEAsegurado.Text);            
    Open;            
    if IsEmpty = False then            
    begin               
      fpago := FieldByName('FORMA_COBRO').AsInteger;               
      ag_aux := FieldByName('AGENTE').AsInteger;  <-- El error lo da aquí            
    end;        
  finally            
    // Libero componente            
    Free;        
  end;    
end;

Da error : "Parameter ICODIGO not found"

Casimiro Notevi 27-07-2017 11:27:13

Cita:

Empezado por identsoft (Mensaje 519788)
Da error : "Parameter ICODIGO not found"

Eso no puede ser.
¿Qué código estás usando?

identsoft 27-07-2017 12:02:09

Cita:

Empezado por Casimiro Notevi (Mensaje 519790)
Eso no puede ser.
¿Qué código estás usando?

el que puso duilioisola en el foro:
Código Delphi [-]
with TSQLQuery.Create(nil) do 
begin 
  try 
    Close; 
    SQL.Clear; 
    SQL.Text := 'select AGENTE, FORMA_COBRO from ASEGURADOS where CODIGO = :ICODIGO'; 
    ParamByName('ICODIGO').AsInteger := StrToInt(DBEAsegurado.Text); 
    Open; 
    if IsEmpty = False then 
    begin 
      fpago := FieldByName('FORMA_COBRO').AsInteger; 
      ag_aux := FieldByName('AGENTE').AsInteger; 
    end; 
  finally 
    Free; 
  end; 
end;
Y el error lo da en la linea del ParamByName('ICODIGO').....

identsoft 27-07-2017 12:03:17

lo siento, no ha respetado los marcadores codigo delphi

Casimiro Notevi 27-07-2017 12:10:57

Dime exactamente qué componentes estás usando y a qué paleta pertenecen, para hacer una prueba igual.

identsoft 27-07-2017 12:22:49

Cita:

Empezado por Casimiro Notevi (Mensaje 519795)
Dime exactamente qué componentes estás usando y a qué paleta pertenecen, para hacer una prueba igual.

El componente es un SQLQUERY de la paleta dbexpress.
Lo he utilizado muchas veces de la misma forma: buscar el contenido de un campo de una tabla. previamente un Close y un Clear. A continuacion en sql.Text pongo la select que busco ( a veces con parametros, otras sin parametros) y siempre a funcionado bien, excepto en este caso.
Tal como decia anteriormente, el problema lo tengo solucionado con otro componente(simplidataset, en la misma paleta), pero la cuestion es (si se puede) saber porque hace estas cosas, porque me genera dudas.

Casimiro Notevi 27-07-2017 13:02:14

He hecho una prueba similar y no ha ocurrido ningún error.
Yo probaría a eliminar esos componentes, guardar, volver a crearlos y probar de nuevo. Vaya a haber algo raro que haya quedado.

movorack 27-07-2017 14:19:02

Podría ser que el componente que usa tiene campos persistentes y al modificar la consulta por código agrega un campo que no está persistente y por eso genera el error.

Por eso te dije que copies el componente acá en el foro.

Como copiar un componente for dummies:
- Clic derecho del mouse sobre el componente. Edit > Copy
- Abres la página del navegador donde enviarás la respuesta
- En el cuadro de texto de la respuesta haces Clic derecho del mouse y seleccionas Pegar

Vas a obtener algo parecido a esto:

Código Delphi [-]
object SQLQuery1: TSQLQuery
  Params = <>
  Left = 240
  Top = 184
end


La franja horaria es GMT +2. Ahora son las 01:44:08.

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