Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   SQL (https://www.clubdelphi.com/foros/forumdisplay.php?f=6)
-   -   Contenido de una celda de un DBGRid (https://www.clubdelphi.com/foros/showthread.php?t=78885)

patxim 23-05-2012 10:28:38

Contenido de una celda de un DBGRid
 
Hola
Tengo un DBGrid conectado a un DataSource, ADOTable y al ADOCON,
¿Cómo puedo saber el contenido de una determinada celda del DBGrid sin
tener que seleccionarla?
Gracias, Patxi.

microbiano 23-05-2012 13:16:00

Espero sea lo que necesitas
 
aAmi manera de ver no creo que tengas que tomar el valor del DBgrid ya que esté solo es un visualizador de datos, de la consulta hecha con el objeto TadoTable entonces lo que deberias hacer es referenciar a la columna que necesitas de tu tabla o consulta ¿por que TadoTable y no TadoQuery?

Código Delphi [-]
   WnocontratoSelec:=trim(Fmodulo.QryTemp.FieldByname('nocontrato').AsString);

si aun asi quieres obtener el registo del dbGrid te puede funcionar esto.
Código Delphi [-]
WnoContrato:=(Self.GridResultado.Columns[0].Field.text);

y para no tener que seleccionarlo ummmm pues puedes crear un prcedimiento

Código Delphi [-]
procedure ObtenerValorGrid:
begin
WnocontratoSelec:=trim(Fmodulo.QryTemp.FieldByname('nocontrato').AsString);
WnoContrato:=(Self.GridResultado.Columns[0].Field.text);
end;

Wnocontrato es una Variable de Tipo String aqui tu cambiarias por la que necesitas

patxim 23-05-2012 15:54:18

Tengo poca idea sobre esto.
Creo que para usar un TadoQuery hay que programarle el SQL del que no sé nada.
Lo que necesito hacer es que, por ejemplo al pinchar un botón,
conocer el valor del registro nº15 y la columna 2 sin tener hacer un select de ese registro ya que
en el DBGrid se seleccionaria esa celda.
Es algo semejente a
WnoContrato:= noséqué... [15, 2];
y gracias, Patxi.

ecfisa 23-05-2012 18:17:28

Hola patxim.

Proba de este modo:
Código Delphi [-]
type
  TDBGridEx = class(TDBGrid);

function GetFieldAtColRow(ACol, ARow: Integer; GR: TDBGrid): string;
var
  BM: TBookMark;
begin
  with TDBGridEx(GR) do
  begin
    if (ARow > 0)and( ACol > 0)and(ARow < RowCount)and(ACol < ColCount) then
    begin
      BM:= DataSource.DataSet.GetBookmark;
      DataSource.DataSet.DisableControls;
      DataSource.DataSet.MoveBy(1 - Row);
      DataSource.DataSet.MoveBy(ARow - 1);
      Result := DataSource.DataSet.Fields[ACol-1].AsString;
      DataSource.DataSet.GotoBookmark(BM);
      DataSource.DataSet.FreeBookmark(BM);
      DataSource.DataSet.EnableControls
    end
  end
end;

Llamada ejemplo:
Código Delphi [-]
procedure TForm1.Button1Click(Sender: TObject);
begin
  Caption:= GetFieldAtColRow(StrToInt(EditCol.Text), StrToInt(EditRow.Text), DBGrid1);
end;

Saludos.

patxim 23-05-2012 22:09:10

Hola ecfisa,
esto funciona perfectamente solo para lo que esta visualizado en el DBGrid, si con el scroll, por ejemplo bajas unos cuantos registros, las "ACol, ARow" de la función se refieren a lo que está visualizado, no a las de toda la DBGid.
Gracias, Patxi.

ecfisa 23-05-2012 22:27:58

Cita:

Empezado por patxim (Mensaje 433357)
Hola ecfisa,
esto funciona perfectamente solo para lo que esta visualizado en el DBGrid, si con el scroll, por ejemplo bajas unos cuantos registros, las "ACol, ARow" de la función se refieren a lo que está visualizado, no a las de toda la DBGid.
Gracias, Patxi.

Hola patxim.

Si por supuesto, eso fué lo que entendí que buscabas hacer.

En un TDBGrid no residen la totalidad de datos de un TDataSet. Si deseas movilizarte por registro/campo a través de una tabla tendrás que hacerlo accionando sobre el TDataSet (ADOTable en este caso). De otro modo estaríamos haciendo referencia a una fila del TDBGrid que podría no estar cargada todavía...

Creo que ADOTable soporta el uso de la propiedad RecNo que te daría "la fila"(registro) y "la columna" (campo) la podés obtener variando el índice de la propiedad Fields del TADOTable cuyo valor va desde cero a FieldCount-1.

Saludos.

patxim 23-05-2012 23:22:56

Hola ecfisa,

Sí, tienes razón, pero si hago un "ADOTable.RecNo := StrToInt(EditRow.Text);", automáticamente en la DBGrid se selecciona el registro RecNo y se posiciona en ella y yo lo que pretendo es que la DBGrid se quede como estaba.

Saludos, Patxi.

ecfisa 23-05-2012 23:30:38

Hola.

Proba utilizando un TBookMark y los métodos DisableControls y EnableControls.

Algo parecido a:
Código Delphi [-]
var
  BM: TBookMark;
begin
  BM:= ADOTable1.GetBookmark;  // guardar posición actual en la tabla
  ADOTable1.DisableControls;  // datos asociados al DataSet no se muestran

  //
  // Posicionarte, obtener el dato...
  // 

  ADOTable1.GotoBookmark(BM);  // volver a posición guardada
  ADOTable1.FreeBookmark(BM);
  ADOTable1.EnableControls  // restaurar mostrar datos
end;

Saludos. :)

patxim 24-05-2012 08:18:38

Hola eficsa,

Funciona perfectamente, al final yo lo he hecho así:

Código Delphi [-]
function GetFieldAtColRow(ACol, ARow: Integer; ADOT: TADOTable): string;
var
BM: TBookMark;
begin
if (ARow > 0)and( ACol > 0)and(ARow < ADOT.RecordCount)and(ACol < ADOT.FieldCount) then
begin
BM:= ADOT.GetBookmark; // guardar posición actual en la tabla
ADOT.DisableControls; // datos asociados al DataSet no se muestran
//
// Posicionarte, obtener el dato...
//
ADOT.RecNo := ARow;
Result:=ADOT.Fields[ACol].AsString;
ADOT.GotoBookmark(BM); // volver a posición guardada
ADOT.FreeBookmark(BM);
ADOT.EnableControls; // restaurar mostrar datos
end;
end;

supongo que estará bien.

Muchas gracias, Patxi.


La franja horaria es GMT +2. Ahora son las 15:01:58.

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