conexao TADOQuery em uma dbgrid

SQL Server

SQL

ADO

03/10/2024

boa tarde, estou carregando uma dbgrid com os dados de uma consulta sql de lançamento de movimentação de caixa
faço a consulta no botão pesquisar mas, quando dois cliques na dbrigd pra capturar os campos e lançar nos edits não reconhece mais a conexão.
tenho que toda vez criar uma variável no botão em questão, dar um create pra que seja reconhecida. Ao dar o create a pesquisa anterior realizada já não existe mais, tendo que fazer uma nova consulta.

gostaria de saber se tem alguma forma de não precisar criar variável de conexão toda hora e aproveitar a consulta anteriormente realizada.
Cristiane

Cristiane

Curtidas 0

Respostas

Raimundo Pereira

Raimundo Pereira

03/10/2024

boa tarde, estou carregando uma dbgrid com os dados de uma consulta sql de lançamento de movimentação de caixa
faço a consulta no botão pesquisar mas, quando dois cliques na dbrigd pra capturar os campos e lançar nos edits não reconhece mais a conexão.
tenho que toda vez criar uma variável no botão em questão, dar um create pra que seja reconhecida. Ao dar o create a pesquisa anterior realizada já não existe mais, tendo que fazer uma nova consulta.

gostaria de saber se tem alguma forma de não precisar criar variável de conexão toda hora e aproveitar a consulta anteriormente realizada.


Boa tarde Cristiane,
Post a rotina para analisarmos
GOSTEI 0
Cristiane

Cristiane

03/10/2024

procedure TFrmLancamento.Button5Click(Sender: TObject);
var conexao:TFrmConexao;
begin
conexao := TFrmConexao.Create(self);
conexao.PesquisaLancamento.Close;
conexao.PesquisaLancamento.SQL.Clear;
conexao.PesquisaLancamento.SQL.Add('select l.*, t.descricao as tipo, fp.descricao as forma, d.descricao as despesa from lancamento l ' +
'inner join tipomovimento t on t.tipoId = l.tipoId ' +
'inner join formapagamento fp on fp.formaId = l.formaId ' +
'left join despesa d on d.despesaId = l.despesaId');

conexao.PesquisaLancamento.SQL.Add(' where data between ' + QuotedStr(MaskEdit2.Text) + ' and ' + QuotedStr(MaskEdit3.Text) + ' order by data desc' );
conexao.PesquisaLancamento.Open;
end;

procedure TFrmLancamento.carregarCampos;
var conexao:TFrmConexao;
begin
conexao := TFrmConexao.Create(self);
MaskEdit1.Text := DateToStr(conexao.PesquisaLancamentodata.Value);
Edit2.Text := CurrToStr(conexao.PesquisaLancamentovalor.Value);
Memo1.Text := conexao.PesquisaLancamentomotivo.AsString;
ComboBox2.ItemIndex := ComboBox2.Items.IndexOfName(conexao.PesquisaLancamentotipo.AsString);
ComboBox1.ItemIndex := ComboBox2.Items.IndexOfName(conexao.PesquisaLancamentoforma.AsString);
ComboBox3.ItemIndex := ComboBox2.Items.IndexOfName(conexao.PesquisaLancamentodespesa.AsString);

Button2.Visible:= False;

MaskEdit1.SetFocus;

end;

se eu não faço conexao := TFrmConexao.Create(self); no carregar campos, dá erro de acesso violado.
GOSTEI 0
Cristiane

Cristiane

03/10/2024

tenho uma unit chamada conexao, uso o ADOQuery pras consultas e ADOConnection pra conexão com o banco de dados.

esse trecho que postei anteriormente é referente à unit Lancamento onde faço uses da unit conexao como implementation:
unit lancamento;

interface

uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.ExtCtrls, Vcl.StdCtrls, Vcl.DBCtrls,
Data.DB, Data.FMTBcd, Data.SqlExpr, Data.DBXInterBase, FireDAC.Stan.Intf,
FireDAC.Stan.Option, FireDAC.Stan.Param, FireDAC.Stan.Error, FireDAC.DatS,
FireDAC.Phys.Intf, FireDAC.DApt.Intf, FireDAC.Stan.Async, FireDAC.DApt,
FireDAC.Comp.DataSet, FireDAC.Comp.Client, Vcl.Grids, Vcl.DBGrids, Vcl.Mask,
Vcl.ComCtrls;

type
TFrmLancamento = class(TForm)
Panel1: TPanel;
Label1: TLabel;
Edit2: TEdit;
Label2: TLabel;
Label3: TLabel;
Label5: TLabel;
Button2: TButton;
Button5: TButton;
DBGrid1: TDBGrid;
Button6: TButton;
Button7: TButton;
Button8: TButton;
RadioGroup1: TRadioGroup;
ComboBox1: TComboBox;
ComboBox2: TComboBox;
Memo1: TMemo;
Label4: TLabel;
Label6: TLabel;
ComboBox3: TComboBox;
ComboBox4: TComboBox;
Label7: TLabel;
Label8: TLabel;
MaskEdit1: TMaskEdit;
MaskEdit2: TMaskEdit;
MaskEdit3: TMaskEdit;
DataSource1: TDataSource;
procedure Button5Click(Sender: TObject);
procedure ComboBox2Change(Sender: TObject);
procedure Edit2KeyPress(Sender: TObject; var Key: Char);
procedure Edit1KeyPress(Sender: TObject; var Key: Char);
procedure Button2Click(Sender: TObject);
procedure RadioGroup1Click(Sender: TObject);
procedure Button7Click(Sender: TObject);
procedure Button8Click(Sender: TObject);
procedure DBGrid1DblClick(Sender: TObject);
private
{ Private declarations }
procedure carregarCampos;

public
{ Public declarations }
procedure limparPesquisa;


end;

var
FrmLancamento: TFrmLancamento;

implementation

{$R *.dfm}

uses conexao;

//uses conexao;

gostaria de ver como deixar essa unit usada: Conexao, como glogal, sem precisar estar criando variável e reiniciando ela toda vez a cada botão ou procedure criada que for necessário fazer consulta, dar um insert, delete ou update.
GOSTEI 0
Raimundo Pereira

Raimundo Pereira

03/10/2024

tenho uma unit chamada conexao, uso o ADOQuery pras consultas e ADOConnection pra conexão com o banco de dados.

esse trecho que postei anteriormente é referente à unit Lancamento onde faço uses da unit conexao como implementation:
unit lancamento;

interface

uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.ExtCtrls, Vcl.StdCtrls, Vcl.DBCtrls,
Data.DB, Data.FMTBcd, Data.SqlExpr, Data.DBXInterBase, FireDAC.Stan.Intf,
FireDAC.Stan.Option, FireDAC.Stan.Param, FireDAC.Stan.Error, FireDAC.DatS,
FireDAC.Phys.Intf, FireDAC.DApt.Intf, FireDAC.Stan.Async, FireDAC.DApt,
FireDAC.Comp.DataSet, FireDAC.Comp.Client, Vcl.Grids, Vcl.DBGrids, Vcl.Mask,
Vcl.ComCtrls;

type
TFrmLancamento = class(TForm)
Panel1: TPanel;
Label1: TLabel;
Edit2: TEdit;
Label2: TLabel;
Label3: TLabel;
Label5: TLabel;
Button2: TButton;
Button5: TButton;
DBGrid1: TDBGrid;
Button6: TButton;
Button7: TButton;
Button8: TButton;
RadioGroup1: TRadioGroup;
ComboBox1: TComboBox;
ComboBox2: TComboBox;
Memo1: TMemo;
Label4: TLabel;
Label6: TLabel;
ComboBox3: TComboBox;
ComboBox4: TComboBox;
Label7: TLabel;
Label8: TLabel;
MaskEdit1: TMaskEdit;
MaskEdit2: TMaskEdit;
MaskEdit3: TMaskEdit;
DataSource1: TDataSource;
procedure Button5Click(Sender: TObject);
procedure ComboBox2Change(Sender: TObject);
procedure Edit2KeyPress(Sender: TObject; var Key: Char);
procedure Edit1KeyPress(Sender: TObject; var Key: Char);
procedure Button2Click(Sender: TObject);
procedure RadioGroup1Click(Sender: TObject);
procedure Button7Click(Sender: TObject);
procedure Button8Click(Sender: TObject);
procedure DBGrid1DblClick(Sender: TObject);
private
{ Private declarations }
procedure carregarCampos;

public
{ Public declarations }
procedure limparPesquisa;


end;

var
FrmLancamento: TFrmLancamento;

implementation

{$R *.dfm}

uses conexao;

//uses conexao;

gostaria de ver como deixar essa unit usada: Conexao, como glogal, sem precisar estar criando variável e reiniciando ela toda vez a cada botão ou procedure criada que for necessário fazer consulta, dar um insert, delete ou update.


Olá Cris, bom dia!
Eu geralmente, realizo a conexão com a base de dados no inicio da aplicação.

Cada tela, trabalhando individualmente com sua respectiva query.

Acredito que o erro que está enfrentando pode está relacionado ao evento:
procedure DBGrid1DblClick(Sender: TObject);

Caso queira, podemos fazer uma call, e tento analisar e auxiliar melhor.
Discord @oficialrcp

GOSTEI 0
Raimundo Pereira

Raimundo Pereira

03/10/2024

tenho uma unit chamada conexao, uso o ADOQuery pras consultas e ADOConnection pra conexão com o banco de dados.

esse trecho que postei anteriormente é referente à unit Lancamento onde faço uses da unit conexao como implementation:
unit lancamento;

interface

uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.ExtCtrls, Vcl.StdCtrls, Vcl.DBCtrls,
Data.DB, Data.FMTBcd, Data.SqlExpr, Data.DBXInterBase, FireDAC.Stan.Intf,
FireDAC.Stan.Option, FireDAC.Stan.Param, FireDAC.Stan.Error, FireDAC.DatS,
FireDAC.Phys.Intf, FireDAC.DApt.Intf, FireDAC.Stan.Async, FireDAC.DApt,
FireDAC.Comp.DataSet, FireDAC.Comp.Client, Vcl.Grids, Vcl.DBGrids, Vcl.Mask,
Vcl.ComCtrls;

type
TFrmLancamento = class(TForm)
Panel1: TPanel;
Label1: TLabel;
Edit2: TEdit;
Label2: TLabel;
Label3: TLabel;
Label5: TLabel;
Button2: TButton;
Button5: TButton;
DBGrid1: TDBGrid;
Button6: TButton;
Button7: TButton;
Button8: TButton;
RadioGroup1: TRadioGroup;
ComboBox1: TComboBox;
ComboBox2: TComboBox;
Memo1: TMemo;
Label4: TLabel;
Label6: TLabel;
ComboBox3: TComboBox;
ComboBox4: TComboBox;
Label7: TLabel;
Label8: TLabel;
MaskEdit1: TMaskEdit;
MaskEdit2: TMaskEdit;
MaskEdit3: TMaskEdit;
DataSource1: TDataSource;
procedure Button5Click(Sender: TObject);
procedure ComboBox2Change(Sender: TObject);
procedure Edit2KeyPress(Sender: TObject; var Key: Char);
procedure Edit1KeyPress(Sender: TObject; var Key: Char);
procedure Button2Click(Sender: TObject);
procedure RadioGroup1Click(Sender: TObject);
procedure Button7Click(Sender: TObject);
procedure Button8Click(Sender: TObject);
procedure DBGrid1DblClick(Sender: TObject);
private
{ Private declarations }
procedure carregarCampos;

public
{ Public declarations }
procedure limparPesquisa;


end;

var
FrmLancamento: TFrmLancamento;

implementation

{$R *.dfm}

uses conexao;

//uses conexao;

gostaria de ver como deixar essa unit usada: Conexao, como glogal, sem precisar estar criando variável e reiniciando ela toda vez a cada botão ou procedure criada que for necessário fazer consulta, dar um insert, delete ou update.


Olá Cris, bom dia!
Eu geralmente, realizo a conexão com a base de dados no inicio da aplicação.

Cada tela, trabalhando individualmente com sua respectiva query.

Acredito que o erro que está enfrentando pode está relacionado ao evento:
procedure DBGrid1DblClick(Sender: TObject);

Caso queira, podemos fazer uma call, e tento analisar e auxiliar melhor.
Discord @oficialrcp




Em relação a unit global, geralmente uso DataModule mantendo todas as conexões e query nele.
em cada form que usará a conexão declaro em uses udm
GOSTEI 0
Cristiane

Cristiane

03/10/2024

obrigada. deu certo. é que estava usando um formulário pras conexões. com o DataModule deu certo. muito obrigada
GOSTEI 0
Arthur Heinrich

Arthur Heinrich

03/10/2024

Ao invés de definir a variável (var conexao:TFrmConexao;) dentro do seu forma ou localmente em uma rotina, você pode definir esta variável na seção "interface" da unit "conexao".

Eventualmente terá que mudar o nome da sua variável para não conflitar com o nome da unit, mas é apenas um detalhe técnico.

Você pode, inclusive, criar a rotina que efetua a conexão com o banco dentro da unit "conexao", chamando-a na seção "initialization" da unit. Desta forma, sempre que você criar uma aplicação e adicionar a unit "conexão", a conexão será aberta automaticamente.

Depois disso, é só não declarar a variável em outros lugares, em que o escopo seja mais relevante. Do contrário, acessará a variável errada.

Ao final da aplicação, caso você abra a conexão na sessão initialization, poderá encerrar a conexão na seção finalization, também.
GOSTEI 0
POSTAR