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)
-   -   Elegir registro con un AdoQuery (https://www.clubdelphi.com/foros/showthread.php?t=93201)

Copernico 14-06-2018 11:33:30

Elegir registro con un AdoQuery
 
Buenos días.

Ante todo disculpad si no me explico bien o si lo que pregunto es algo muy básico pero no se como poder hacerlo.

El caso es que tengo una tabla, "Categorías", con dos campos, "Código" y "Nombre", en la que contengo 4 registros.
Pongamos que cada uno de ellos tiene la siguiente estructura: Código = 1, Nombre = 'A'; Código = 2, Nombre = 'B'... así hasta cuatro.

Tengo mi AdoQuery en la que agrego una consulta sencilla para ver los datos: qyCategorias.SQL.Add('Select * from Categorias');

Mi pregunta es: ¿Cómo puedo ver los datos de un registro en concreto? sin saber ni el código, ni el nombre, ni nada.

Por ej: Quiero almacenar en un TEdit el nombre de la segunda categoría ('B'), sin poder acceder por parámetros a ese valor ya que desconozco su código y su nombre.

Desconozco si hay algo como "Edit1.Text := qyCategoriasNombre[1].Value" (Ya se que esto es erróneo, es para que captéis la idea).

Gracias de antemano.
Saludos.

ElDioni 14-06-2018 14:56:18

Hola, si te he entendido bien lo que buscas es lo siguiente:


Código Delphi [-]
Edit1.Text := qyCategoriasNombre.Fields[1].AsString;


Saludos.

Neftali [Germán.Estévez] 14-06-2018 16:15:14

Si sabes los nombres de los campos también puedes acceder de esta manera a los valores del registro actual, sea cual sea:


Código Delphi [-]
 sCod := qyCategorias.FieldByName('Codigo').AsString;
 sNombre := qyCategorias.FieldByName('Nombre').AsString;

Copernico 14-06-2018 17:20:36

Cita:

Empezado por ElDioni (Mensaje 527101)
Hola, si te he entendido bien lo que buscas es lo siguiente:


Código Delphi [-]
Edit1.Text := qyCategoriasNombre.Fields[1].AsString;


Saludos.

Hola y gracias por contestar.

Claro, de esta manera accedería a la información del segundo campo, ¿pero para acceder al segundo campo de la segunda línea?

La idea es que tengo cuatro TEdits, y en cada uno de ellos quiero poner el nombre de cada categoría ejecutando únicamente la query que antes he mencionado. Si pongo algo como me has aconsejado:

Código Delphi [-]
Edit1.Text := qyCategoriasNombre.Fields[0].AsString;
Edit2.Text := qyCategoriasNombre.Fields[1].AsString;
Edit3.Text := qyCategoriasNombre.Fields[2].AsString;
Edit4.Text := qyCategoriasNombre.Fields[3].AsString;

No podría ser, acabaría dando error, ya que intento acceder a registros que no existen. Lo que quiero es meter el nombre de cada categoría.

Copernico 14-06-2018 17:21:40

Cita:

Empezado por Neftali [Germán.Estévez] (Mensaje 527102)
Si sabes los nombres de los campos también puedes acceder de esta manera a los valores del registro actual, sea cual sea:


Código Delphi [-]
 sCod := qyCategorias.FieldByName('Codigo').AsString;
 sNombre := qyCategorias.FieldByName('Nombre').AsString;

Hola, gracias por contestar.

Si, pero quiero acceder a uno en concreto para dejarlo en un sitio en concreto. Sin saber ni el código ni el nombre.

Casimiro Notevi 14-06-2018 17:47:43

Cita:

Empezado por Copernico (Mensaje 527105)
Si, pero quiero acceder a uno en concreto para dejarlo en un sitio en concreto. Sin saber ni el código ni el nombre.

A uno en concreto, ok, ¿de forma aleatoria? ¿el que ocupa una posición en la lista? ¿el que tenga nombre más largo? ¿alfabéticamente? ... Algo tendrás que saber para decidir qué buscar.
O eso, o no te hemos entendido.

Copernico 14-06-2018 18:02:17

Cita:

Empezado por Casimiro Notevi (Mensaje 527106)
A uno en concreto, ok, ¿de forma aleatoria? ¿el que ocupa una posición en la lista? ¿el que tenga nombre más largo? ¿alfabéticamente? ... Algo tendrás que saber para decidir qué buscar.
O eso, o no te hemos entendido.

Hola gracias por contestar.

Perdona si no he sido claro. Quiero acceder siempre a la información del segundo campo "Nombre".

Tengo cuatro Filas:

Código Nombre

| 1 | | A |
| 2 | | B |
| 3 | | C |
| 4 | | D |

Por ejemplo, quiero sacar la información del campo "Nombre" del Código cuyo valor es 2. Luego quiero obtener 'B'.
El problema es que desconozco el Código (no siempre es númerico incremental, esto lo he puesto para el ejemplo) y desconozco el valor del Nombre. Solo se que es el segundo campo de la segunda fila.

Pero no tiene porque ser de la segunda en concreto, puede ser de la cuarta, o de la tercera, o de la decimoquinta si hubiera, es decir que quiero hallar esa información según el numero de una fila aleatoria.

Gracias y lamento no explicarme mejor.

Casimiro Notevi 14-06-2018 18:25:46

O sea, que te devuelva el valor del campo "nombre" de un registro... cualquiera :D
Piensa un poco en lo que estás diciendo ;)

Neftali [Germán.Estévez] 14-06-2018 19:03:36

Cita:

Empezado por Copernico (Mensaje 527104)
Claro, de esta manera accedería a la información del segundo campo, ¿pero para acceder al segundo campo de la segunda línea?

De esta forma accedes al segundo campo del regitro activo.
Si piensas en los registros de un ADOQuery (los que has obtenido utilizando una SELECT), NO puedes acceder a todos a la vez,
sino que puedes acceder al que está activo.
Si quieres moverte por los registros debes mover ese puntero que apunta à la línea activa.
Cita:

Empezado por Copernico (Mensaje 527104)

La idea es que tengo cuatro TEdits, y en cada uno de ellos quiero poner el nombre de cada categoría ejecutando únicamente la query
que antes he mencionado. Si pongo algo como me has aconsejado

Código Delphi [-]
Edit1.Text := qyCategoriasNombre.Fields[0].AsString; 
Edit2.Text := qyCategoriasNombre.Fields[1].AsString; 
Edit3.Text := qyCategoriasNombre.Fields[2].AsString; 
Edit4.Text := qyCategoriasNombre.Fields[3].AsString;

Con esto accedería a los diferentes cam,pos de la línea o el registro activo.
Si quieres el campo nombre de todos los registros de la query, debes hacer el recorrido que te he comentado. Algo así (de memoria):


Código Delphi [-]
  // Colocarte en el primer registro
  qyCategorias.First;   
  // Mientra hay regisrros en la query...
  while (not qyCategorias.eof) do begin
    // para el activo me quedo con el nombre y lo muestro
    ShowMessage('Nombre: ' + qyCategorias.FieldByName('Nombre').AsString);
    // siguiente registro
    qyCategorias.Next;
  end;

orodriguezca 15-06-2018 08:16:39

Hola Copernico, Estoy de acuerdo con los compañeros que ya han hecho sus aportes que el planteamiento de tu problema es algo desquiciado; pero bueno, para seguirte la corriente, y suponiendo que entendí el problema, propongo el siguiente fragmento de código como ejemplo de una posible solución;

Código Delphi [-]
begin
  ADOQuery1.Close;
  AdoQuery1.CursorLocation := clUseClient; // para que el cursor, de los datos,
                                           // esté lado del cliente

  AdoQuery1.CursorType := ctKeyset; // hace un snapshot de los datos, de esta
                                    // manera los datos se puede recorrer en
                                    // cualquier dirección, es decir, podemos
                                    // avanzar o retroceder.

  ADOQuery1.SQL.Text := 'Select * from Categorias';
  ADOQuery1.Open;
  ADOQuery1.Last; // Forzamos a cargar todos los registros en memoria porque el
                  // cursor está del lado del cliente.  Casi siempre funciona!.
                  // Es la forma confiable de saber cuantos registros
                  // devolvió la consulta SQL usando el método AdoQuery1.RecordCount.


  AdoQuery1.RecNo := 2; // Nos posicionamos en la segunda fila recuperada,
                        // la segunda categoria, suponiendo que exista!.

  // Obtenemos el nombre de la categoría
  Edit1.Text := ADOQuery1.FieldByName('Nombre').AsString;
end;

Nota: Una sentencia SQL select sin un order by, en la mayoría de los motores de bases de datos, puede regresar información en un orden totalmente aleatorio y no coincidir con el orden en que suponemos esta grabada la información en la tabla, sobre todo cuando el motor de bases de datos está haciendo uso de multithreading y/o paralelismo y sobre todo si se está haciendo reuso de registros borrados.

ElDioni 19-06-2018 15:29:35

A ver así.

Código Delphi [-]
procedure ColocarNombres();
var
x:integer;
begin
QueryCategorias.First;
x:=1;
While QueryCategorias.Eof=false do
  begin
    TEdit(FindComponent('Edit'+inttostr(x))).Text:=QueryCategorias.Fields[1].AsString;
    inc(x);
    QueryCategorias.Next;
  end;


Saludos.


La franja horaria es GMT +2. Ahora son las 13:11:34.

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