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)
-   -   problemas con ibdataset1.parambyname en ibx (https://www.clubdelphi.com/foros/showthread.php?t=89864)

anubis 20-02-2016 05:07:57

problemas con ibdataset1.parambyname en ibx
 
Hola,
por mas que hago pruebas y reviso no soy capaz de saber el por qué no funciona esto:

Código Delphi [-]
function tfagregausuario.verificarnick:byte;
begin
ibdataset1.SelectSQL.clear;
ibdataset1.selectSQL.Text:='select * from usuarios';
ibdataset1.open;
ibdataset1.Close;
ibdataset1.SelectSQL.clear;
ibdataset1.selectSQL.add('select * from usuarios where nick = :nick4');
ibdataset1.ParamByName('nick4').value:=lowercase(enick.Text);
ibdataset1.open;

cuando lo ejecuto, me dice que nick4 no existe.
Leyendo y buscando sobre los componentes ibx, recomiendan no usar los ibtable ni los ibquery porque son para migracion, lo mas recomendable es usar los ibdataset. Pues bien, teniendo en cuenta, como sabeis, que estaba acostumbrado a los zeos y no he tenido problemas con ellos, ni con lo que escribi antes, no entiendo porque aqui no me deja pasar el parametro si es lo mismo que estuve haciendo con zeos y lo mismo que poneis en otros post.
Cerrar, limpiar, asignar el sql, el parametro y finalmente abrir.

nose la verdad :(

gracias

ecfisa 20-02-2016 05:43:29

Hola anubis.

Código Delphi [-]
function tfagregausuario.verificarnick:byte;
begin
  
{ **  las líneas siguientes son innecesarias **
  ibdataset1.SelectSQL.clear;
  ibdataset1.selectSQL.Text:='select * from usuarios';
  ibdataset1.open;
}
 
  // quedaría:
  ibdataset1.Close;
  ibdataset1.selectSQL.Text := 'select * from usuarios where nick = :nick4';
  ibdataset1.ParamByName('nick4').value := lowercase(Trim(enick.Text)); //(*)
  ibdataset1.open;
end;
(*) La función Trim quitará espacios indeseados. Asegurate que los valores de la columna nick estén almacenados en minúsculas o no hallará coincidencias.

Saludos :)

anubis 20-02-2016 06:00:16

Gracias por contestar de nuevo ;).

si eso me queda claro, lo que no me cuentra es nick4 que esta en parambyname, dice que no existe el campo, puedo poner lo que sea que dice que no existe.

Los valores que comentas que son innecesarios los pongo para poder volver a asignar seleccionar todos los registros y poder realizar otro filtro.

ecfisa 20-02-2016 06:22:26

Hola anubis.
Cita:

Empezado por anubis (Mensaje 502364)
Gracias por contestar de nuevo ;).

si eso me queda claro, lo que no me cuentra es nick4 que esta en parambyname, dice que no existe el campo.

Según tu código inicial, el nombre del campo es nick y el nombre del parámetro es nick4 por lo que el código del mensaje #2,
Código Delphi [-]
  ibdataset1.Close;
  ibdataset1.selectSQL.Text := 'select * from usuarios where nick = :nick4';
  ibdataset1.ParamByName('nick4').value := lowercase(Trim(enick.Text)); //(*)
  ibdataset1.open;
no tendría que dar ese tipo de error...

¿ Cuál es "literalmente" el error que te muestra ? (copia/pega)

Saludos :)

anubis 20-02-2016 06:25:44

Cita:

Field "nick4" not found
A la hora ejecutar el programa, cuando vuelvo a poner otro usuario, ya me sale ese error.

Al quitar inicialmente las lineas que dices que no son necesarias, el programa me lo ejecuta normal de primera vez, me busca el usuario, al poner otro usuario y pasar por el mismo sitio, ya me salta el error.

ecfisa 20-02-2016 06:31:47

Hola.

Suena como que hay residuos en la cadena, pero eso no debería pasar usando la propiedad Text ya que sobreescribe lo anterior.

¿ Estas usando el método Add de este modo ?
Código Delphi [-]
  ibdataset1.Close;
  ibdataset1.selectSQL.Add('select * from usuarios where nick = :nick4');

Saludos :)

anubis 20-02-2016 06:33:21

No la verdad no, es como te lo he mostrado, con selectsql.text no con add.

ecfisa 20-02-2016 06:37:54

Que extraño...

¿ Podrías copiar/pegar las líneas que ejecutas cada vez que ingresas un usuario ?

Saludos :)

anubis 20-02-2016 06:46:25

Código Delphi [-]
function tfagregausuario.verificarnick:byte;
begin
ibdataset1.Close;
ibdataset1.selectSQL.text:='select * from usuarios where nick = :nick4';
ibdataset1.ParamByName('nick4').value:=lowercase(trim(enick.Text));
ibdataset1.Open;

if (ibdataset1.IsEmpty) then
begin
end
else
showmessage('el usuario existe');
end;

Esa es la funcion y este es el procedimiento

Código Delphi [-]
procedure TFagregausuario.enickKeyPress(Sender: TObject; var Key: char);
begin

if not (key in ['A'..'Z','a'..'z',#7,#8, #13]) then
key:=#0
else
  if (key=#13) and (enick.text<>'') then
  begin
   verificarnick;
   end;

No hay mas, cada vez que escribo en text1.text y pulso enter, se va a verificar si el usuario existe.
De primera vez si lo hace bien, de segunda vez, sin cerrar el programa, ya me aparece que nick4 not found.

Efectivamente, faltaba poner en la funcion algo como esto:

Código Delphi [-]
ibdataset1.Close;
ibdataset1.SelectSQL.text:='select * from usuarios';
ibdataset1.open;
Para que de la segunda vuelta empiece de nuevo con el select de todos los usuarios, pero poniendolo al principio o al final de la funcion, me da el error antes o despues.

ecfisa 20-02-2016 07:41:56

Hola de nuevo.

Me quedé pensando de donde podría venir ese error y me acordé de algo... ¿ Por casualidad cuando creaste la tabla hiciste parecido a esto ?
Código SQL [-]
CREATE TABLE USUARIOS (
    ID          INTEGER,
    "Nick"      VARCHAR(20), /* <- el nombre en esta línea */
    ...
);
¿ Haciendo que el nombre de la columna contenga mayúsculas y minúsculas ? De ser así, podría aparecerte ese mensaje.

Ejecuta esta línea desde tu gestor (IBExpert, Flamerobin, etc),
Código SQL [-]
ALTER TABLE USUARIOS ALTER COLUMN "Nick" TO NICK;  /* (1) */
aplica commit y luego intenta nuevamente desde Delphi.

(1) Donde Nick deberá ser exáctamente el nombre dado al campo (respetando mayúsculas y minúsculas en su órden).

Saludos :)

anubis 20-02-2016 07:55:05

Gracias en verdad.

La verdad es que genere otra aplicacion de prueba con los componentes basicos y funciono tal y como lo puse sin problema, asi que volvi a mi aplicacion anterior y estaba viendo que coloque un componente ibdynamicgrid que me estaba haciendo la puñeta :(.

Lo quite y ya no hubo ningun problema ;).

gracias de nuevo, voy a seguir completando la informacion con todo lo que me pusiste en el otro post.

Gracias de nuevo, esto de cambiar de componentes (de zeos a ibx) es un dolor de cabeza :(.

ecfisa 20-02-2016 07:56:54

Me alegra que lo hayas podido solucionar ^\||/

Saludos :)


La franja horaria es GMT +2. Ahora son las 05:15:59.

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