Array
(
)

Navegação de registros perfeita usando ADODataSet

Levisants
   - 05 nov 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


Bon Jovi
   - 05 nov 2005

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


Levisants
   - 05 nov 2005

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}

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


Bon Jovi
   - 06 nov 2005

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)


Levisants
   - 06 nov 2005

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...


Bon Jovi
   - 06 nov 2005

Ok, veja abaixo:
#Código

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´].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.



Levisants
   - 07 nov 2005

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.


Bon Jovi
   - 08 nov 2005

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.