Dúvida de abstração

29/11/2005

Pessoal, me ajudem em uma dúvida aqui. Estou fazendo um programinha que trabalha com 2 tipo de componentes TQuery. O TADOQuery e o TQuery.

Acontece que todos os processos que o meu programa faz, é idêntico para ambos os bancos. Seja usando o TAdoQuery ou o TQuery. As tabelas são as mesmas, os selects os mesmos e todo o procedimento igual. Para uma programação mais inteligente e reutilização de código, queria criar um procedimento padrão e informar qual o componente que irá executá-lo, para não ter que mandar dois códigos idênticos; um para cada componente.

Alguem teria uma idéia de como fazer isso, passar por parâmetro ou coisa parecida? Qualquer ajuda ou dica é muito bem vinda.

Obrigado.


Prgdelphi

Respostas

29/11/2005

Carlosfim

Várias alternativas são possíveis, mas eu utilizaria uma das duas abaixo:

Se os componentes já estiverem instanciados ou forem necessários fora do escopo do procedimento, então eu passaria o componente a ser utilizado como parâmetro.

Caso o componente for criado e destruído dentro do próprio procedimento, eu passaria uma string ou qualquer outro tipo de parâmetro e, dentro do procedimento, testaria (com um if simples) o parâmetro para instanciar e utilizar o componente correto.

Só lembrando que se vc escolher passar o componente como parâmetro, o tipo desse parâmetro deverá ser um ansestral comum dos dois objetos (para que vc não precise criar dois parâmentros) e dentro do procedimento vc precisará fazer um TypeCast do componente.

Espero ter ajudado,


Responder Citar

29/11/2005

Prgdelphi

É... tentei fazer algo to tipo, mas o que eu não queria era ficar colocando um monte de if dentro do procedimento para verificar qual componente estou trabalhando.

Por Exemplo: Se este problema fosse com uma Tabela (TTable, TADOTable) eu criaria um parâmetro do tipo TDataSet na chamada do procedimento. E dentro deste procedimento, trabalharia normal seja qualquer componente.

Mas para usar este mesmo esquema com queries não estou conseguindo. Qual ancestral eu poderia usar? Tentei usar TDataset também. Mas ele não possui os mesmos métodos e propriedades da query. Pra fazer um typecast no procedimento também teria que colocar vários IFs para verificar.


Responder Citar

29/11/2005

Motta

Pq vc usa dois componentes ?
Em que condições se dá a decisão de ir ou no outro ?
Vc usa mais de um bd ?
Usa ao mesmo tempo ?


Responder Citar

29/11/2005

Emerson

use TObject como ancestral.
se as propriedades/métodos/eventos que você precisa usar são comuns aos dois objetos query, eleja um para fazer o typecasting.

procedure X(xQuery: TObject);
begin
TQuery(xQuery).SQL.Text := ´select....´;
TQuery(xQuery).Open;

TQuery(xQuery).Edit;
TQuery(xQuery).FieldByName(´xyz´).AsString := ´abc´;
TQuery(xQuery).Post;
end;

assim você pode chamar:
X( ADOQuery ); ou
X( Query )

atente-se para a passagem de parâmetros:
no ADOQuery a propriedade para isso é Parameters,
enquanto que na Query é Params


Responder Citar

29/11/2005

Prgdelphi

Respondendo ao Motta,

Este programa trabalha tanto On-line (conectado a um banco Oracle) quanto off-line (usando paradox local).

Quando ele está conectado ao oracle, faz tudo diretamente no Oracle (ADOQuery) e quando está off, faz as operações no Paradox (TQuery). Ambos os bancos possuem as mesmas tabelas e mesma estrutura que são atualizadas pelo próprio sistema.

Por isso preciso de um procedimento que funcionaria tanto para um quanto para o outro componente.


Responder Citar

29/11/2005

Prgdelphi

Emerson,

Fiz um procedimento deste jeito que me falou, mas dá erro quando uso um componente diferente do utilizado para o typecast. Por exemplo, você usou o TQuery, quando executo este procedimento enviando um TADOQuery, ele retorna uma exception de violação de acesso, mesmo o componente TADOQuery estando criado na memória.


Responder Citar

29/11/2005

Motta

Usaria TQuery para ambos (uso d5) , seria em tese só trocar o aliase se conectar de novo.
Deve haver um procedimento de sincronia entre as bases , não ?


Responder Citar

29/11/2005

Prgdelphi

É que toda a parte de conexão do programa já está estruturada deste jeito. Tive problemas na conexão com o Oracle através do BDE. Além do que para processamentos muito pesados, ele é muito mais lento que o ADO.

Mas estou começando a achar que esta será a solução mesmo.... nào consigo de jeito nenhum fazer esse typecast...


Responder Citar

30/11/2005

Motta

Nunca usei ADO para trabalho (só testes/cursos), ele não acessa Paradox.


Responder Citar

30/11/2005

Motta

digo

ele não acessa Paradox ???????? :?: :?: :?:


Responder Citar