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)
-   -   Numero de fila en DBGrid (https://www.clubdelphi.com/foros/showthread.php?t=31694)

Colgueit 15-05-2006 16:01:44

Numero de fila en DBGrid
 
Hola,

Antes de nada decir que he estado mirando en el foro hacerca de este tema, y si hay muchas cosas pero no es exactamente lo que busco.

Para ver el numero de fila en un grid he visto en el foro 2 opciones:

1º opcion:
"IntToStr(TStringGrid(DBGridPedidos).Row"
Pero esto no me sirve ya que lo que hace es contar en el grid las filas visibles, es decir si en la tabla tengo 20 filas y veo en el grid 10 solo me va a contar hasta la 10.

2º opcion:
"IntToStr(Tabla.RecNo)"
Así si me cuenta todas las filas de la tabla, pero claro hay un problema, si hago un filter de esa tabla, me sigue contando tambien los datos filtrados, y claro va la cuenta a saltos.

Entonces, ninguna de estas opciones me sirve.
Conclusión de lo que necesito hacer: ¿Como se cual es el numero de fila de todo el recorrido de filas en un DBgrid?

Espero haberme explicado bien, pero si no explico lo que quiero hacer exactamente:
Tengo un grid y abajo quiero poner un campo de texto que muestre "Cliente 5 de 20" , es decir que si me posiciono en la fila 5 del grid , muestre el 5. Esto a priori es facil pero como ya he dicho no me sirve cuando la tabla está filtrada y por eso no me sirve la 2ª opcion.
Tiene que haber alguna forma facil de hacerlo, pero la desconozco,

Espero que alguien me pueda ayudar, antetodo muchas gracias!!! :)

trashky 15-05-2006 16:38:11

Prueba con
Código Delphi [-]
dbgrid.GetRowCount
haber si te funciona con esto

Colgueit 15-05-2006 16:44:28

No funciona..
 
He intendado probar eso, pero esa función no me aparece . Pongo DbGridArticulos.GetRowCount y da error ([Error] Articulos.pas(122): Undeclared identifier: 'GetRowCount').

A ti si te aparece?.

Gracias por responder Trashky!

Palmiro 15-05-2006 16:49:44

Hola.

creo que entendi lo que estas queriendo hacer y la solucion puede ser la siguente....

el numero de filas la puede obtener de la siguiente manera, hasta inclusive despues de haber filtrado la consulta

DataSource.DataSet.RecordCount. // Nro total de registro que tengas en la consulta

y el numero del registro en donde esta ubicado de la siguiente manera

DataSource.DataSet.RecNro // Registro en que estas Ubicado

y por ultimo puede hacer lo siguiente.....

label1.Caption:= 'Registro' + IntToStr(DataSource.DataSet.RecNro) + 'de' IntToStr(DataSource.DataSet.RecordCount)

de esta manera obtendrias saber en que registro de cuantos estas ubicado

esa linea de codigo la puede ubicar en el evento Onclick de un TDBNavegator o algun otro boton que tenga para desplazarte por las diferentes fila de la grilla

Palmiro 15-05-2006 16:50:28

Hola.

creo que entendi lo que estas queriendo hacer y la solucion puede ser la siguente....

el numero de filas la puede obtener de la siguiente manera, hasta inclusive despues de haber filtrado la consulta

DataSource.DataSet.RecordCount. // Nro total de registro que tengas en la consulta

y el numero del registro en donde esta ubicado de la siguiente manera

DataSource.DataSet.RecNro // Registro en que estas Ubicado

y por ultimo puede hacer lo siguiente.....

label1.Caption:= 'Registro' + IntToStr(DataSource.DataSet.RecNro) + 'de' IntToStr(DataSource.DataSet.RecordCount)

de esta manera obtendrias saber en que registro de cuantos estas ubicado

esa linea de codigo la puede ubicar en el evento Onclick de un TDBNavegator o algun otro boton que tenga para desplazarte por las diferentes fila de la grilla

Espero haberte entendido y ayudado.

Colgueit 15-05-2006 17:00:24

Sigue sin funcionar
 
Antetodo muchas gracias Palmiro.

Pero me pasa igual que con la segunda opcion que comente:
Acabo de probarlo y "IntToStr(DataSource.DataSet.RecNro)" hace lo mismo que "IntToStr(Tabla.RecNo)", es decir, que cuando tengo la tabla filtrada no me muestra la fila correcta en el grid , me muestra la fila correspondiente en la tabla no filtrada :( .

Bueno habrá que seguir investigando...jeje

Graciasss

waltergomez 15-05-2006 18:48:36

Si esto te funciona tomate un vinito y brinda por mi. Jaja.

Código Delphi [-]
....
uses BDE;
....

procedure ..............
var i : integer;
begin
  Table1.Filtered := true;
  Check(DbiGetExactRecordCount(Table1.Handle, i));
  ShowMessage(inttostr(i));
end;

Saludos,

Colgueit 15-05-2006 19:10:03

nada...
 
Muchas Gracias waltergomez,
Pero no me voy a poder tomar el vinito todavia ,jeje.

He probado lo que dices y nada, me devuelve el numero total de filas, y lo quiero saber es el numero de la fila seleccionada (que me funcione si la tabla esta filtrada).

He buscado en la ayuda esa funcion y dice esto:
"DbiGetExactRecordCount retrieves the current exact number of records associated with the cursor."
Es decir que devuelve el numero total de filas, hace lo mismo que "tabla.RecordCount".

Pues a seguir investigando...
Continuará ... jeje

waltergomez 15-05-2006 20:06:57

Y si usas el evento OnFilterRecord del TTable, para llevar un contador ?
Bueno ahora el vinito me lo tomo yo porque me voy a comer.

Salu2,

lpmlpm 15-05-2006 20:12:29

Y porque no en vez de un TTable usas un TQuery y el filtro que usas lo pones en la sección Where del SQL de esa Query, ahi si te funcionará sin problemas el RecNo.

Para estos casos es que es incómodo el uso de Filtros, pero el SQL siempre lo saca a uno de problemas de una manera elegante

Saludos

Colgueit 15-05-2006 20:26:00

Tampoco
 
Para waltergomez: Acabo de probar Poniendolo ahi pero tampoco funciona. Gracias otra vez de todas formas.

Para lpmlpm: No me interesa usar Sql ya que uso el grid para modificar datos, tengo campos calculados, los cuales sería engorroso de hacer sin hacer por campos calculados , ademas de tener ya como 20 DBGrids hechos con filtros y cambiarlos ahora imaginate...
Pero Gracias por la idea ;)

¿Tiene que haber alguna forma de hacerlo no?, Joe, llevo horas y horas intentandolo y no doy con ella.

Bueno pues a seguir intentandolo.

Thanks!

luisgutierrezb 15-05-2006 21:51:22

tal vez acabo de dar con la respuesta, a ver si funciona, de la ayuda de delphi:

TDataset

property BufferCount: Integer;

Description

TDataSet maintains an internal cache of records from the underlying database table. For example, if the dataset is used to populate a data-aware grid, the cache includes a record for each row in the grid. BufferCount indicates the size of this cache. An associated TDataLink object determines the value of BufferCount.

Colgueit 15-05-2006 22:21:16

uff
 
Muchas Gracias luisgutierrezb pero he estado probando a ver como puedo usar la propiedad BufferCount y no se como usarla, y he estado buscando por todas partes acerca de la propiedad BufferCount y no he encontrado nada util.

Por lo que dice la ayuda de delphi tiene pinta que puede servir, pero no explica como se usa.

¿Alguien sabe usarla?
¿o sabe de alguna otra forma de hacer lo que planteo?

Joe, ya estoy desesperado, no descubro como se hace :eek:

waltergomez 15-05-2006 23:19:18

Estas usando base de datos, DBASE, Paradox, Access ?

Colgueit 15-05-2006 23:25:19

Paradox.

A ver si al final se consigue resolver... :)

waltergomez 16-05-2006 01:19:04

Tengo una solucion pero no funciona si usas la barra de scroll. Tampoco me puse a ver muy profundo. Peor es nada :) :)

Código Delphi [-]
  TMalditaGrilla = class(TDBGrid)
  public
    FPos : integer;
    procedure Scroll(Distance: Integer); override; // Este metodo es  Progido !!!:mad: 
 end;

  TForm1 = class(TForm)
    Database1: TDatabase;
    Table1: TTable;
    DBGrid1: TDBGrid;
    DataSource1: TDataSource;
    Button1: TButton;
    Button2: TButton;
    procedure Button2Click(Sender: TObject);
    procedure DBGrid1DblClick(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
    FMalditaGrilla : TMalditaGrilla;
    FCTR : integer;
  end;



var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button2Click(Sender: TObject);
begin
  Table1.Filtered := false;
  Table1.Filter := 'empno > 20';
  Table1.Filtered := true;
  Table1.First;
end;

procedure TForm1.DBGrid1DblClick(Sender: TObject);
begin
  Check(DbiGetExactRecordCount(Table1.Handle, FCTR));
  showmessage(inttostr(FMalditaGrilla.FPos + 1)+' / '+inttostr(FCTR));
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  FMalditaGrilla := TMalditaGrilla.Create(self);
  FMalditaGrilla.DataSource := DataSource1;
  FMalditaGrilla.FPos := 0;
end;

procedure TMalditaGrilla.Scroll(Distance: Integer);
begin
  inherited Scroll(Distance);
  FPos := FPos + Distance;
end;

Lo que hace uno por un brindis. jajajaj:eek:

Colgueit 16-05-2006 02:07:13

Y tampoco
 
Lo he probado minuciosamente, y pasa igual que con todos, en el caso de estar la tabla filtrada no funciona, me da el numero de la fila en la tabla no filtrada. Ya me estoy desesperando bastante jeje.

De todas formas, waltergomez, muchisimas gracias por tu interes y tu ayuda!!!!!!!!!!!!!!!! no se como agredacertelo que creo q con solo darte las gracias me quedo muy corto :) .

Bueno pues seguire intentandolo, el que la sigue la consigue :cool:

Un Saludo!!

roman 16-05-2006 02:35:25

Una pregunta: ¿para qué quieres este número de registro? Como ya habrás notado, aun con un mismo filtrado, tal número cambiará conforme se agreguen, modifiquen o eliminen registros.

// Saludos

Colgueit 16-05-2006 02:52:21

Lo conseguire?
 
1 Archivos Adjunto(s)
Pues simplemente lo quiero porque quiero mostrar debajo de los DBgrids un campo de texto que ponga "Registro 20 de 100" y cada vez que mueva (calculandolo de nuevo en la propiedad OnDrawColumnCell del grid) que calcule de nuevo el valor, es decir si muevo a la siguiente fila que aparezca "Registro 21 de 100", solo es cuestión de estética, pero me gustaria hacerlo.

En el ejemplo que he puesto el 20 será el registro numero 20 dentro del Grid (pero no solo de los visibles, por eso "TStringGrid(DBGridPedidos).Row no me sirve")

El Numero maximo lo hayo bien, y el numero de registro funciona bien aunque borre, modifique o agregue registros, solo falla en el caso de filtrar la tabla. Ya que lo que quiero en realidad es la posicion del registro en el grid entero (incluidas las filas no visibles).

Pero bueno, ya para dejarlo mas claro, adjunto imagen de lo que estoy haciendo. En la imagen debajo del grid entre las flechas del navegador aparece el contador del que hablo.

Gracias otra vez por vuestro interes.

Colgueit 16-05-2006 19:01:49

¿Nadie sabe hacerlo?

Un saludo!


La franja horaria es GMT +2. Ahora son las 12:48:31.

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