PDA

Ver la Versión Completa : GotoBookMark


BPL
07-09-2010, 22:54:46
Hola

saben tengo el siguiente problema...
tengo dos dbgrid,
la 1º esta enlazada a la tabla directamente y desde aqui selecciona varios registro, cada vez que selecciono uno se traspasa a la 2º dbgrid que esta enlazada a una rx, incluyo el recno de cada registro seleccionado, ya que despues lo necesitare....

pues bien ahora que tengo la 2º dbgrid llena con el juego de registro que necesito intervenir, aparece mi problema...
he trabajado con el GetBookmark, GotoBookmark pero no logor llegar a los registro en mi tabla que seran los que se deben intervenir....

por favorcito..

Trabajao con Deplhi 7, Motor Advantage, ahhh y tablas DBF...(eso si...a punto de de morir)

ecfisa
08-09-2010, 00:50:07
Hola BPL.

Según entiendo tenés una tabla física asociada a un DBGrid, y una en memoria asociada al segundo DBGrid. Y , una vez pasados los registros de interés al segundo DBGrid, querés desde los mismos acceder a los correspondientes de la tabla física. (al menos eso entendí...) :)

No trabajo con rxLib, pero te hago un ejemplo usando ClientDataSet para trabajar los datos en memoria, en reemplazo de lo que supongo debe hacer el rx. Para el mismo usé la Tabla Country de DBDEMOS.

Teníamos: un TTable, dos TDataSource, dos TDBGrid y en mi caso un TClientDataSet, usé los eventos OnCellClick en ambos DBGrids.

El ejemplo queda:

...
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, DB, DBClient, Grids, DBGrids, DBTables;

type
TForm1 = class(TForm)
Table: TTable;
dsTable: TDataSource;
DBGrid1: TDBGrid;
DBGrid2: TDBGrid;
dsClientDataSet: TDataSource;
ClientDataSet: TClientDataSet;
ClientDataSetPosic: TIntegerField;
ClientDataSetName: TStringField;
ClientDataSetCapital: TStringField;
procedure FormCreate(Sender: TObject);
procedure DBGrid1CellClick(Column: TColumn);
procedure DBGrid2CellClick(Column: TColumn);
private
public
end;

var
Form1: TForm1;

implementation {$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
ClientDataSet.CreateDataSet;
ClientDataSet.Open
end;

{ Pasar registros a ClientDataSet (memoria) }
procedure TForm1.DBGrid1CellClick(Column: TColumn);
begin
ClientDataSet.Append;
ClientDataSetPosic.Value:= Table.RecNo; // agregado por que decís necesitarlo despues
ClientDataSetName.Value:= Table.FieldByName('Name').AsString;
ClientDataSetCapital.Value:= Table.FieldByName('Capital').AsString;
end;

{ Posicionarse en la tabla física }
procedure TForm1.DBGrid2CellClick(Column: TColumn);
begin
Table.Locate('Name',VarArrayOf([ClientDataSetName.Value]),[])
// Ya estamos posicionado en la tabla y en el registro
// correspondiente
end;
...


Creo que lo que buscas está en el procedimiento DBGrid2CellClick. Espero aportarte alguna ayuda.

Saludos. :)

BPL
08-09-2010, 16:48:00
ecfisa... hola....

NO:( , el locate ni el Findkey, ni nada por el estilo me sirve los datos no son unicos, ningun campo.
Por eso solo tengo que hacerlo con ir al recno....
de lo contario tendria que crear un nuevo campo y darle un numero unico , y eso no quiero....

Por si hay dudas, esto es lo que necesito
desde la primera grilla (conectada al datasouce) lanzo 5 registros, y aparecen en la segunda grilla y estando aqui necesito intervenirlo la tabla cada uno de esos 5...

creo que la solucion va por gotoBookMark...¿?


ojala tengas algo sobre esto.... que me pueda ayudar...

cloayza
08-09-2010, 19:33:00
En vez de utilizar una segunda Grilla podrias utilizar un TListBox...

Este ejemplo esta usando la tabla country del DBDemos...


{Cada vez que se hace un doble click sobre la grilla se agrega al ListBox, el Pais y el Puntero al registro...}
procedure TForm1.DBGrid1DblClick(Sender: TObject);
begin
ListBox1.Items.AddObject(Table1.fieldbyname('NAME').AsString,Pointer(Table1.GetBookmark));
end;

{Cada vez que hago click sobre un item del TListBox lo dirigo al registro correspondiente...}
procedure TForm1.ListBox1Click(Sender: TObject);
begin
Table1.GotoBookmark(ListBox1.Items.Objects[ListBox1.ItemIndex]);
end;


Ten en cuenta que debes implementar las validaciones correspondientes.

Saludos

ecfisa
08-09-2010, 20:06:14
Ahora me queda un poco más claro... hacés selección múltiple.

Busca en la ayuda de delphi 'SelectedRows', viene un ejemplo que quizá te pueda orientar.

Aunque sinceramente, creo que agregar un campo autoincremental, no ocupa tanto y te ahorraría dolores de cabeza...

Saludos. :)

ecfisa
08-09-2010, 20:52:47
Hola BPL.

Como no me gusta dejar las cosas a medias, te implemento un ejemplo.

Los componentes: 2 TDBGrid, 2 TButton, 1 TTable (Country/DBDEMOS), 1 ClientDataSet.

Para el ejemplo en ambos DBGrids esta dgMultiSelect = True.
Un botón copia al ClientDataSet y el otro obtiene todas las posiciones en la tabla de los datos copiados:


type
TForm1 = class(TForm)
tb: TTable;
dsCtry: TDataSource;
ClientDataSet: TClientDataSet;
dsCDS: TDataSource;
DBGrid1: TDBGrid;
DBGrid2: TDBGrid;
CDSName: TStringField;
CDSCapital: TStringField;
CDSContinent: TStringField;
CDSArea: TFloatField;
CDSPopulation: TFloatField;
btnPasar: TButton;
btnObtener: TButton;
procedure FormCreate(Sender: TObject);
procedure btnPasarClick(Sender: TObject);
procedure btnObtenerClick(Sender: TObject);
private
FLstBM: TStrings;
public
end;

var
Form1: TForm1;

implementation {$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
ClientDataSet.CreateDataSet;
ClientDataSet.Open;
end;

procedure TForm1.btnPasarClick(Sender: TObject);
var
i: Integer;
begin
if DBGrid1.SelectedRows.Count > 0 then
begin
FLstBM:= TStringList.Create; // Crear lista
with DBGrid1.DataSource.DataSet do
for i:= 0 to DBGrid1.SelectedRows.Count -1 do
begin
GotoBookmark(pointer(DBGrid1.SelectedRows.Items[i]));
FLstBM.Add(tb.Bookmark); // Guardar Bookmarks
with ClientDataSet do
begin
Append;
CDSName.Value:= tb.FieldByName('Name').AsString;
CDSCapital.Value:= tb.FieldByName('Capital').AsString;
CDSContinent.Value:= tb.FieldByName('Continent').AsString;
CDSArea.Value:= tb.FieldByName('Area').AsFloat;
CDSPopulation.Value:= tb.FieldByname('Population').AsFloat;
end;
end;
end;
end;

procedure TForm1.btnObtenerClick(Sender: TObject);
var
i: Integer;
begin
if DBGrid2.SelectedRows.Count > 0 then
begin
with DBGrid2.DataSource.DataSet do
for i:= 0 to DBGrid2.SelectedRows.Count -1 do
begin
GotoBookmark(pointer(DBGrid2.SelectedRows.Items[i]));
// Aca obtenes los 'n' BookMarks de la Tabla
tb.BookMark:= FLstBM[i];
// A partir de aca haces lo que gustes...
ShowMessage(tb.FieldByName('Name').AsString);
end;
FLstBM.Free; // Liberar lista
end;
end;


Saludos. :)