Navegação de registros perfeita usando ADODataSet

05/11/2005

Olá galerinha,

Estou tentando fazer uma navegação de registros perfeita no delphi com sql server mas não estou conseguindo, alguem pode me ajudar?

Eu coloquei os paramentros de conexão certinho

ConnectionString := ConnStr;
CommandText := STR_SQL;

CursorLocation := clUseClient;
CursorType := ctKeyset;

Quanbdo eu faço as condições para saber se está em fim ou inicio de registro para mostrar os dados, mas ele sempre no final ou no inicio eu tenho que clicar duas vezes para navegar.

Alguem pode me ajudar??????????????

Grato


Levisants

Respostas

05/11/2005

Bon Jovi

Usando Prior/Next nem precisa tratar BOF/EOF. Mostre o código que vc está fazendo...


Responder Citar

05/11/2005

Levisants

if lbl_edtCodigo.Text = ´´ Then begin {Caso não tenha nenhum registro selecionado, irá mostrar o primeiro}

ADODataSetCadTransp.Recordset.MoveFirst;

end else begin


if Not ADODataSetCadTransp.Recordset.BOF Then ADODataSetCadTransp.Recordset.MovePrevious;

end;

if Not ADODataSetCadTransp.Recordset.BOF Then exibedados; //mostra os dados no campo


Responder Citar

06/11/2005

Bon Jovi

Nao acesse direto os métodos do Recordset, e sim os métodos da VCL, como DataSet.First/.Prior/.Next/.Last.

Nao entendi seu objetivo em relacao a esse código. Mas pegue exemplo aqui: http://rapidshare.de/files/7248897/Project1.zip.html (No final da pagina clica no botao [Free] e na prox pagina no final clica em Download: Project1.zip)


Responder Citar

06/11/2005

Levisants

Ae funciona sem usar o recordset.

Mas num tem como vc me ajudar a fazer usando o recordset?

E porque existe duas opções de uso, a sem o recordset e com o recordset...


Responder Citar

06/11/2005

Bon Jovi

Ok, veja abaixo:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, ADODB,
  StdCtrls;

type
  TForm1 = class(TForm)
    btnPrimeiro: TButton;
    btnAnterior: TButton;
    btnProximo: TButton;
    btnUltimo: TButton;
    Edit1: TEdit;
    procedure FormDestroy(Sender: TObject);
    procedure FormShow(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure btnPrimeiroClick(Sender: TObject);
    procedure btnAnteriorClick(Sender: TObject);
    procedure btnProximoClick(Sender: TObject);
    procedure btnUltimoClick(Sender: TObject);
  private
    { Private declarations }
    ADOConexao: _connection;
    ADORecordSet: _Recordset;
    procedure Mostra;
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

uses
 ADOInt;

procedure TForm1.FormCreate(Sender: TObject);
begin
  ADOConexao := CoConnection.Create;
  ADORecordSet := CoRecordSet.Create;

  ADOConexao.CursorLocation := adUseClient;
  ADORecordSet.CursorLocation := adUseClient;
  ADORecordSet.CursorType := adOpenStatic;
  ADORecordSet.LockType := adLockOptimistic;
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
  ADORecordSet.Close;
  ADORecordSet := nil;
  ADOConexao.Close;
  ADOConexao := nil;
end;

procedure TForm1.FormShow(Sender: TObject);
begin
  ADOConexao.Open(´Provider=Microsoft.Jet.OLEDB.4.0;Data Source=bd1.mdb;Persist Security Info=False´, ´´, ´´, 0);
  ADORecordSet.Open(´select nome from tabela´, ADOConexao, adOpenStatic, adLockOptimistic, -1);
  if ADORecordSet.RecordCount > 0 then
    Mostra;
end;

procedure TForm1.Mostra;
begin
  Edit1.Text := VarToStr(ADORecordSet.Fields[´nome´&93;.Value);
end;

procedure TForm1.btnPrimeiroClick(Sender: TObject);
begin
  if ADORecordSet.AbsolutePosition <= 1 then
    Exit;
    
  ADORecordSet.MoveFirst;
  Mostra;
end;

procedure TForm1.btnAnteriorClick(Sender: TObject);
begin
  if ADORecordSet.AbsolutePosition <= 1 then
    Exit;

  ADORecordSet.MovePrevious;
  Mostra;
end;

procedure TForm1.btnProximoClick(Sender: TObject);
begin                           
  if (ADORecordSet.AbsolutePosition = ADORecordSet.RecordCount) or (ADORecordSet.AbsolutePosition = -1) then
    Exit;
    
  ADORecordSet.MoveNext;
  Mostra;    
end;

procedure TForm1.btnUltimoClick(Sender: TObject);
begin
  if (ADORecordSet.AbsolutePosition = ADORecordSet.RecordCount) or (ADORecordSet.AbsolutePosition = -1) then
    Exit;

  ADORecordSet.MoveLast;
  Mostra;  
end;

end.



Responder Citar

07/11/2005

Levisants

Cara eu sei que já estou enchendo né, mas tem uma coisa que ainda não consegui fazer funcionar...

Eu tentei de diversas maneiras de fazer associar o recordset com o dbgrid e até agora não consegui.


Responder Citar

08/11/2005

Bon Jovi

Acho q ou vc usa plenamente a VCL ou faz tudo na mão, ou ainda.. eca.. usar alguma grid ActiveX. Pra usar TDBGrid de forma automatica esqueça recordset..., qual o pq de usa-lo?? Se ainda assim quer mesmo usar recordset, então varra o recordset e vá jogando num ClientDataSet.


Responder Citar