Cursor unknown

Firebird

16/01/2006

[b:3864dae543]Caros amigos, eu montei um sisteminha com os códigos de uma apostila
para DBExpress como o seguinte código;[/b:3864dae543]
[b:3864dae543]Ele tem um campo(EDIT1) para inserir o que se procura e três radiobuttons para se definir a pesquisa:
()comece com
()contenha
()termine com
e mais três para se escolher o campo a procurar
()nome
()empresa
()produto[/b:3864dae543]

unit UPesquisa;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, Grids, DBXpress, DBGrids, StdCtrls, ExtCtrls, ComCtrls, Buttons;

type
TForm3 = class(TForm)
ListView1: TListView;
Panel1: TPanel;
Label1: TLabel;
Edit1: TEdit;
GroupBox1: TGroupBox;
RadioButton1: TRadioButton;
RadioButton2: TRadioButton;
RadioButton3: TRadioButton;
GroupBox2: TGroupBox;
RadioButton4: TRadioButton;
RadioButton5: TRadioButton;
RadioButton6: TRadioButton;
Button1: TButton;
BitBtn1: TBitBtn;
procedure Button1Click(Sender: TObject);
procedure BitBtn1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form3: TForm3;

implementation

uses Udtm1;

{$R *.dfm}

procedure TForm3.Button1Click(Sender: TObject);
var
Consulta:string;
ListItem:TListItem;
begin
if Trim(edit1.Text)<>´´ then
begin
Consulta:=´select * from EMPRESAS where ´;

//no campo;

if Radiobutton1.Checked=true then
Consulta:=Consulta + ´NOME ´
else if
Radiobutton2.Checked=true then
Consulta:=Consulta + ´EMPRESA ´
else
Consulta:=Consulta + ´PRODUTO ´;

//que;

if Radiobutton4.Checked=true then
Begin
Consulta:=Consulta + ´starting with ´´´ +Edit1.Text+ ´´´´;
end
else if
Radiobutton5.Checked=true then
begin
Consulta:=Consulta + ´like ´´¬´+Edit1.Text+´¬´´´
end
else
Consulta:=Consulta + ´like ´´¬´+Edit1.Text+´´´´;

try
Transacao.TransactionID:=1;
Transacao.IsolationLevel:=xilREPEATABLEREAD;
dtm1.SQLConnection1.StartTransaction(Transacao);
dtm1.SQLQuery1.Close;
dtm1.SQLQuery1.SQL.Clear;
dtm1.SQLQuery1.SQL.Append(Consulta);
dtm1.SQLQuery1.Open;
dtm1.SQLConnection1.Commit(Transacao);

except
on Exc:Exception do
Begin
ShowMessage(´Ocorreu um erro na Consulta:´+exc.Message);
dtm1.SQLConnection1.Rollback(Transacao);
end;
end;
end;
dtm1.SQLQuery1.First;
ListView1.Items.Clear;
while true do
Begin
ListItem:=ListView1.Items.Add;
ListItem.Caption:=dtm1.SQLQuery1.Fields[0].AsString;
ListItem.SubItems.Add(dtm1.SQLQuery1.Fields[1].AsString);
ListItem.SubItems.Add(dtm1.SQLQuery1.Fields[2].AsString);
ListItem.SubItems.Add(dtm1.SQLQuery1.Fields[3].AsString);
ListItem.SubItems.Add(dtm1.SQLQuery1.Fields[4].AsString);
ListItem.SubItems.Add(dtm1.SQLQuery1.Fields[5].AsString);
Try
dtm1.SQLQuery1.Next;
except
break;
end;
end;
end;


[b:3864dae543][color=red:3864dae543]O erro:[/color:3864dae543][/b:3864dae543]
[color=black:3864dae543][b:3864dae543]Project ProjFornec.exe raised exception class EDatabaseError with message ´Cursor unknown´.
Process stopped...[/b:3864dae543][/color:3864dae543]
[b:3864dae543][color=red:3864dae543]se dá quando tento incluir todos os resultados da Query no ListView através do while pois se eu deixar apenas as linhas[/color:3864dae543][/b:3864dae543]
[b:3864dae543]ListItem:=ListView1.Items.Add;
ListItem.Caption:=dtm1.SQLQuery1.Fields[0].AsString;
ListItem.SubItems.Add(dtm1.SQLQuery1.Fields[1].AsString);
ListItem.SubItems.Add(dtm1.SQLQuery1.Fields[2].AsString);
ListItem.SubItems.Add(dtm1.SQLQuery1.Fields[3].AsString);
ListItem.SubItems.Add(dtm1.SQLQuery1.Fields[4].AsString);
ListItem.SubItems.Add(dtm1.SQLQuery1.Fields[5].AsString);[/b:3864dae543]
[color=red:3864dae543][b:3864dae543]ele nã dá erro mas dá apenas um resultado.[/b:3864dae543][/color:3864dae543]


Muito Obrigado.
[b:3864dae543][color=blue:3864dae543]Título do tópico editado por Vinicius2K:[/color:3864dae543][/b:3864dae543] [b:3864dae543][color=red:3864dae543][list:3864dae543][*:3864dae543]Titulo inteiramente em maiúsculas: ´CURSOR UNKNOWN.´ [/list:u:3864dae543][/color:3864dae543][/b:3864dae543] Peço que leia atentamente as [url=http://forum.clubedelphi.net/viewtopic.php?t=6689]Regras de Conduta[/url] e se algum esclarecimento sobre o funcionamento do fórum ou sobre as Regras de Conduta for necessário, envie-me uma [url=http://forum.clubedelphi.net/privmsg.php?mode=post&u=2796]Mensagem Particular[/url].



Fonsenix

Fonsenix

Curtidas 0

Respostas

Edilcimar

Edilcimar

16/01/2006

dá o erro depois do while porque vc está tentando fazer um loop infinito, aí ele faz a primeira vez e perde o cursor, que aqui é o ponteiro do registro


GOSTEI 0
Fonsenix

Fonsenix

16/01/2006

dá o erro depois do while porque vc está tentando fazer um loop infinito, aí ele faz a primeira vez e perde o cursor, que aqui é o ponteiro do registro


Amigo Edicilmar , como posso proceder então?
Grato.


GOSTEI 0
Edilcimar

Edilcimar

16/01/2006

retire o while, afinal de contas vc só vai fazer isto uma vez a cada procedimento


GOSTEI 0
Fonsenix

Fonsenix

16/01/2006

retire o while, afinal de contas vc só vai fazer isto uma vez a cada procedimento


Caro Edilcimar,
eu deixei o código assim:

[b:f4aec0fae6]unit UPesquisa;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, Grids, DBXpress, DBGrids, StdCtrls, ExtCtrls, ComCtrls, Buttons;

type
TForm3 = class(TForm)
ListView1: TListView;
Panel1: TPanel;
Label1: TLabel;
Edit1: TEdit;
GroupBox1: TGroupBox;
RadioButton1: TRadioButton;
RadioButton2: TRadioButton;
RadioButton3: TRadioButton;
GroupBox2: TGroupBox;
RadioButton4: TRadioButton;
RadioButton5: TRadioButton;
RadioButton6: TRadioButton;
Button1: TButton;
BitBtn1: TBitBtn;
procedure Button1Click(Sender: TObject);
procedure BitBtn1Click(Sender: TObject);

private
{ Private declarations }
public
{ Public declarations }
procedure CarregaLista;
end;

var
Form3: TForm3;

implementation

uses Udtm1;

{$R *.dfm}

procedure TForm3.Button1Click(Sender: TObject);
var
Consulta:string;
begin
if Trim(edit1.Text)<>´´ then
begin
Consulta:=´select * from EMPRESAS where ´;

//no campo;

if Radiobutton1.Checked=true then
Consulta:=Consulta + ´NOME ´
else if
Radiobutton2.Checked=true then
Consulta:=Consulta + ´EMPRESA ´
else
Consulta:=Consulta + ´PRODUTO ´;

//que;

if Radiobutton4.Checked=true then
Begin
Consulta:=Consulta + ´starting with ´´´ +Edit1.Text+ ´´´´;
end
else if
Radiobutton5.Checked=true then
begin
Consulta:=Consulta + ´like ´´¬´+Edit1.Text+´¬´´´
end
else
Consulta:=Consulta + ´like ´´¬´+Edit1.Text+´´´´;

try
Transacao.TransactionID:=1;
Transacao.IsolationLevel:=xilREPEATABLEREAD;
dtm1.SQLConnection1.StartTransaction(Transacao);
dtm1.SQLQuery1.Close;
dtm1.SQLQuery1.SQL.Clear;
dtm1.SQLQuery1.SQL.Append(Consulta);
dtm1.SQLQuery1.Open;
dtm1.SQLConnection1.Commit(Transacao);

except
on Exc:Exception do
Begin
ShowMessage(´Ocorreu um erro na Consulta:´+exc.Message);
dtm1.SQLConnection1.Rollback(Transacao);
end;
end;
CarregaLista;
end;
end;
procedure Tform3.CarregaLista;
Begin
dtm1.SQLQuery1.First;
ListView1.Items.Clear;
ListView1.Items.Add;
ListView1.Items.Item[ ListView1.Items.Count -1 ].Caption := dtm1.SQLQuery1.Fields.Fields[0].AsString;
ListView1.Items.Item[ ListView1.Items.Count -1 ].SubItems.Add(dtm1.SQLQuery1.Fields.Fields[1].AsString);
dtm1.SQLQuery1.Next;
End;

procedure TForm3.BitBtn1Click(Sender: TObject);
begin
Close;
end;
end.[/b:f4aec0fae6]

E mesmo se a minha pesquisa resultar em vários registros eu não preciso usar o while?

Muito Obrigado por sua ajuda.


GOSTEI 0
Fonsenix

Fonsenix

16/01/2006

retire o while, afinal de contas vc só vai fazer isto uma vez a cada procedimento


Caro Edilcimar,
eu deixei o código assim:

[b:82923bf4e5]unit UPesquisa;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, Grids, DBXpress, DBGrids, StdCtrls, ExtCtrls, ComCtrls, Buttons;

type
TForm3 = class(TForm)
ListView1: TListView;
Panel1: TPanel;
Label1: TLabel;
Edit1: TEdit;
GroupBox1: TGroupBox;
RadioButton1: TRadioButton;
RadioButton2: TRadioButton;
RadioButton3: TRadioButton;
GroupBox2: TGroupBox;
RadioButton4: TRadioButton;
RadioButton5: TRadioButton;
RadioButton6: TRadioButton;
Button1: TButton;
BitBtn1: TBitBtn;
procedure Button1Click(Sender: TObject);
procedure BitBtn1Click(Sender: TObject);

private
{ Private declarations }
public
{ Public declarations }
procedure CarregaLista;
end;

var
Form3: TForm3;

implementation

uses Udtm1;

{$R *.dfm}

procedure TForm3.Button1Click(Sender: TObject);
var
Consulta:string;
begin
if Trim(edit1.Text)<>´´ then
begin
Consulta:=´select * from EMPRESAS where ´;

//no campo;

if Radiobutton1.Checked=true then
Consulta:=Consulta + ´NOME ´
else if
Radiobutton2.Checked=true then
Consulta:=Consulta + ´EMPRESA ´
else
Consulta:=Consulta + ´PRODUTO ´;

//que;

if Radiobutton4.Checked=true then
Begin
Consulta:=Consulta + ´starting with ´´´ +Edit1.Text+ ´´´´;
end
else if
Radiobutton5.Checked=true then
begin
Consulta:=Consulta + ´like ´´¬´+Edit1.Text+´¬´´´
end
else
Consulta:=Consulta + ´like ´´¬´+Edit1.Text+´´´´;

try
Transacao.TransactionID:=1;
Transacao.IsolationLevel:=xilREPEATABLEREAD;
dtm1.SQLConnection1.StartTransaction(Transacao);
dtm1.SQLQuery1.Close;
dtm1.SQLQuery1.SQL.Clear;
dtm1.SQLQuery1.SQL.Append(Consulta);
dtm1.SQLQuery1.Open;
dtm1.SQLConnection1.Commit(Transacao);

except
on Exc:Exception do
Begin
ShowMessage(´Ocorreu um erro na Consulta:´+exc.Message);
dtm1.SQLConnection1.Rollback(Transacao);
end;
end;
CarregaLista;
end;
end;
procedure Tform3.CarregaLista;
Begin
dtm1.SQLQuery1.First;
ListView1.Items.Clear;
ListView1.Items.Add;
ListView1.Items.Item[ ListView1.Items.Count -1 ].Caption := dtm1.SQLQuery1.Fields.Fields[0].AsString;
ListView1.Items.Item[ ListView1.Items.Count -1 ].SubItems.Add(dtm1.SQLQuery1.Fields.Fields[1].AsString);
dtm1.SQLQuery1.Next;
End;

procedure TForm3.BitBtn1Click(Sender: TObject);
begin
Close;
end;
end.[/b:82923bf4e5]

Mas continua dando erro de Cursor Unknown.

E mesmo se a minha pesquisa resultar em vários registros eu não preciso usar o while?

Muito Obrigado por sua ajuda.


GOSTEI 0
POSTAR