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)
-   -   Pasar el resultado de un Zquery a una variable (https://www.clubdelphi.com/foros/showthread.php?t=44288)

NeWsP 02-06-2007 12:29:25

Pasar el resultado de un Zquery a una variable
 
Buenos dias,

Estoy intentando hacer un programa que me crea un registro en una tabla ya creada, entonces automaticamente al insertar el registro, la BD le da un valor para el campo ID .
El problema que tengo es como recuperar ese campo ID y meter el valor en una variable.

Asi inserto el campo en la BD:

Código Delphi [-]
Zquery1.SQL.Clear;
ZQuery1.SQL.Add('insert into '+Edit5.Text +'.'+Edit6.text+ '_sections');
Zquery1.SQL.add('(title,name,scope,image_position,published)');
Zquery1.SQL.Add('VALUES ('+quotedstr(edit1.text)+','+quotedstr(edit1.Text)+',''content'',''left'',''1'')');

Asi "intento" recuperar el resultado del Query

Código Delphi [-]
  Zquery1.SQL.Clear; // limpiamos query
  Zquery1.sql.add('select id from '+Edit5.Text +'.'+Edit6.text+ '_sections');  //memorizamos la nueva ID de la categoria
  Zquery1.SQL.add('WHERE name='+quotedstr(edit1.Text));

Supuestamente tendria que hacer algo como variable:=resultado del query pero no se me ocurre como.

He leido algo asi, pero luego me he dado cuenta ( o creo ) que es para pasar datos en vez de guardarlos

Código Delphi [-]
idcategoria:=Zquery1.FieldByName('id').AsInteger;

Muchas gracias por adelantado, espero que me podais hechar un cable ( pero q no sea al cuello :P )

marcoszorrilla 02-06-2007 15:14:47

Aunque con el Zquery no he trabajado, supongo que el problema venga dado por no tener declarados los campos como persistentes.

Te pongo un ejemplo con un Tquery por si fuese de aplicación al Zquery.
Código Delphi [-]
idCategoria:=Tquery.Fields[0].AsInteger;

Un Saludo.

NeWsP 02-06-2007 15:42:45

Gracias por contestar marcos,

he probado como comentas y me da error de Out of Bounds (0)

Lo he probado asi

Código Delphi [-]
Zquery1.SQL.Clear; // liampiamos query
  Zquery1.sql.add('select `id` from '+Edit5.Text +'.'+Edit6.text+ '_sections');  //memorizamos la nueva ID de la categoria
  Zquery1.SQL.add('WHERE name='+quotedstr(edit1.Text));
  Zquery1.execsql;
  idcategoria:=Zquery1.Fields[0].AsInteger;


  label9.Caption:=inttostr(idcategoria);

Tambien he probado de hacer el execsql despues de la linea

Código Delphi [-]
  idcategoria:=Zquery1.Fields[0].AsInteger;

pero siempre con el mismo Out Of Bounds

pensaba que habria alguna forma de meter el resultado del sql en una variable, ya que hay casos como este, que unicamente puede dar un resultado.

Bueno, seguire mirando a ver si encuentro algo, muchas gracias

marcoszorrilla 02-06-2007 19:19:33

He estado buscando y he encontrado el siguiente código:
Código Delphi [-]
function getsqlsubquerydatax(sql:string):string;
begin
  result:='';
  zquery.close;
  zquery.sql.text:=sql;
  zquery.open;
  zquery.first;
    while not zquery.eof do
    begin
       if result='' then result:=''''+zquery.fields[0].asstring+'''' else
       result:=result+','''+zquery.fields[0].asstring+'''';

       zquery.next;
    end;
  zquery.close;
    if result='' then result:='''''';

end;

Lo cual me confirma que el código que puse de ejemplo tiene que funcionar, claro que si la consulta no devuelve registros entonces te dara error porque no hay nada que cargar en la variable y por lo tanto la matriz de campos no existe.

Puedes utilizar si Zquer1.RecordCount o IsEmpty para comprobar primero que realmente ha devuelto registros y no acceder de esta manera a una matriz vacía.

Un Saludo.

roman 02-06-2007 20:24:42

Lo que pasa es que en el código, NeWsP está usando

Código Delphi [-]
Zquery1.execsql;

cuando debería ser

Código Delphi [-]
Zquery1.Open;

como hace Marcos. ExecSQL, al no estar pensada para consultas que devuelven registros, pues se ve que no prepara el dataset para ello.

// Saludos

marcoszorrilla 02-06-2007 20:36:10

Pues no me había dado cuenta de ese detalle Román, daba por hecho que hacia un Open.

Sin duda por ahí viene el problema.

Un Saludo.

NeWsP 02-06-2007 20:43:37

Buenas tardes

pues si era eso U_U

Lo tenia que hacer con open, en vez de execsql ... ains

Muchisimas gracias por toda la ayuda que me estais dando, espero algun dia aprender lo suficiente, para poder ayudar a alguien U_U

Saludos


La franja horaria es GMT +2. Ahora son las 01:47:40.

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