Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   GotoBookMark (https://www.clubdelphi.com/foros/showthread.php?t=69768)

BPL 07-09-2010 22:54:46

GotoBookMark
 
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:
Código Delphi [-]
...
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...

Código Delphi [-]
{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:

Código Delphi [-]
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. :)


La franja horaria es GMT +2. Ahora son las 03:52:42.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi