Ir para conteúdo
Fórum Script Brasil
  • 0

(Resolvido) DBGrid em tempo de execução


SIGNORI

Pergunta

Olá amigos, estou fazendo um trabalho orientado a objeto para a faculdade, sempre programei um Delphi usando DbExpress, só que neste projeto estou Usando ADO. Tenho o seguinte problema, não estou conseguindo preencher o DBGRid com dados vindos de uma consulta do BD, segue o código da consulta:

function TuClassClientes.Consultar(Condicao: string): TDataSource;

var

Qry: TADOQuery;

ds: TDataSource;

begin

try

Qry := TADOQuery.Create(nil);

ds := TDataSource.Create(nil);

try

if Condicao <> '' then

Condicao := 'where('+Condicao+')';

with Qry do

begin

Connection := TuClassConexao.ObtemConexao;

Close;

SQL.Text := 'select CLIENTES.ID_CLIENTE, CLIENTES.NOME, CLIENTES.DATA_NASC '+

'from CLIENTES';

Open;

end;

ds.DataSet := Qry;

Result := ds;

finally

ds.Free;

Qry.Free;

end;

except on E: Exception do

raise Exception.Create('Ops! Ocorreu um erro na consulta: '+e.Message);

end;

end;

Se executar a SQL direto no BD retorna os registros.. no forma chamo da seguinte maneira;

procedure TForm1.Button5Click(Sender: TObject);

var

CLIENTE: TuClassClientes;

begin

CLIENTE := TuClassClientes.Create;

try

DBGrid1.DataSource := CLIENTE.Consultar('');

finally

CLIENTE.Free;

end;

end;

Oque está errado? Obrigado!

Link para o comentário
Compartilhar em outros sites

4 respostass a esta questão

Posts Recomendados

  • 0

Ao que observei sua dbgrid já esta no formulario. Tche eu faria um pouco diferente, como você disse que esta fazendo uma programação Orientada a Objeto eu criaria uma classe base e nela colocaria a conexão com o banco de dados, as outras classes seriam filhas da classe base, assim você esquece deter problemas com conexão.

Outra coisa, o dbgrid ta ligado a um DataSouce que esta ligado a um ClientDataSet ai eu criaria dentro do obejeto cliente uma consulta generica sem filtros no banco de dados (podendo é claro a aplicação do filtro quando quiser , assim poderei usar minha consulta qtas vezes quiser e em diversos casos, com filtros diferentes)

vamos imaginar

1º crio minha classe base - com uma propriedade do tipo da minha conexão com o banco

TBaseClass = Class

private

fConn: TIBDataBase;

function get_conn: TIBDatabase;

protected

public

constructor create(loconn:TIBDataBase); virtual;

property conn:TIBDatabase read get_conn;

end;

2º crio minha classe de controle filha da classe base

// classe de controle

TBaseControl = class(TBaseClass)

protected

function Incluir:integer; virtual; abstract;

function Alterar:integer; virtual; abstract;

function Excluir:integer; virtual; abstract;

end;

3º Crio minha classe Cliente filha de TBaseControl que é filha de Tbaseclass

o proposito de você usar objetos é justamente você poder utilizar informações comuns a todos

logo minha classe TCliente já terá os metodos Incluir, alterar e excluir NÃO implementados mas a disposição e tb a coneção com o meu Banco

TCLiente = Class(TBaseControl)

private

Fiid : integer ;

Fcnome : string ;

protected

function get_id: integer;

function get_nome: string;

procedure set_id(const Value: integer);

procedure set_nome(const Value: string);

public

constructor create(loconn:TIBDataBase); override; (veja que para chamar essa classe o construtor pede uma conexão sempre)

destructor destroy; override;

property id : integer read get_id write set_id ;

property nome : string read get_nome write set_nome ;

// metodos

function Incluir:integer; override;

function Alterar:integer; override;

function Excluir:integer; override;

function getContatos: OleVariant;

procedure doValida; virtual;

(Aqui q queria chegar. observe este metodo, ele vai para a classe de persistencia e executa a consulta no banco retornando um olevariant)

function sql(filtro:string):OleVariant;

published

end;

implementation

// olha como fica a chamada da consulta no banco

// não estou falando da camada de persistencia onde esta a consulta genérica

// o resultado disso é um dado olevariant;

function TCLiente.sql(filtro: string): OleVariant;

var

loCliente: TCLientePst; //pst vem de pesistencia

begin

loCliente:= TCLientePst.create(self.conn);

try

result := loCliente.SQL(filtro);

finally

loCliente.free;

end;

end;

4º Ta, agora você volte para a tela de onde você quer chamar a consulta e fassa assim;:

Function TfrmCompraVenda.doClientDataSet (filtro,filtro2:string):OleVariant;

var

loCliente : TCliente;

begin

locliente := TCliente.Create(conexao);

try

ClientDataSet .Close;

ClientDataSet.data := doClientDataSet (' cliente = 10'); (Veja que é só mudar o filtro e teremos novos dados)

ClientDataSet .Open;

finally

loCliente.free;

end;

end;

// se teu DBGrid já esta ligado a um DS e o DS ligado ao CDS, pronto os dados já estarão sendo exibidos.

// sobre a conexão, você deve ter instanciado um objeto para fazer a conexão e atrazves de um arquivo ini ou direto você configurou. pronto

// agora quando você abre o sistema você deve setar a conexão dizendo para a tua classe base quem é tua conexão

Cara espero ter ajudado indiretamente, como derrepente você esta no começo do sistema , então quem sabe vale a pena pensar um pouco sobre o que falei.

Link para o comentário
Compartilhar em outros sites

  • 0

Me perdoe esqueci de te mandar isso aqui ainda para completar.

5º quando você chama o metodo na persistencia é esse que é executado ( um exemplo)

function TClientesPst.SQL(filtro: string): OleVariant;

var

query : TIBDataSet;

begin

query := TIBDataSet.Create(nil);

try

try

Query.database := self.conn; //

Query.Close;

Query.SelectSQL.Clear;

// aqui você coloca o seu Select generico

Query.SelectSQL.Add('SELECT pessoas.*, clientes.* ');

Query.SelectSQL.Add(' FROM ');

Query.SelectSQL.Add(' PESSOAS ');

Query.SelectSQL.Add(' INNER JOIN CLIENTES ON (PESSOAS.ID=CLIENTES.ID)');

Query.SelectSQL.Add('WHERE ');

Query.SelectSQL.Add(' (1 = 1) ');

// aqui ele verifica se o filtro é vazio ou não para então executa-lo

if filtro<>'' then

query.SelectSQL.Add('and '+ filtro);

query.Open;

result := Tutil.DataSetToOleVariant(query);

except

on e: exception do

begin

Assert(false,'');

Tutil.doTrataException('',E);

raise;

end;

end;

finally;

Query.Close;

Query.Free;

end;

end;

{ eu tenho uma classe de utilidades gerais quando preciso dessas utilidades posso estar chamando diretamente }

class function Tutil.DataSetToOleVariant(DS: TIBDataSet): OleVariant;

var

loProvider : TProvider;

begin

loProvider := TProvider.Create(nil);

try

loProvider.DataSet := DS;

Result := loProvider.Data

finally

loProvider.Free;

end;

end;

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,3k
    • Posts
      652,3k
×
×
  • Criar Novo...