Array
(
)

Dúvida de abstração

Prgdelphi
   - 29 nov 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.


Carlosfim
   - 29 nov 2005

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,


Prgdelphi
   - 29 nov 2005

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


Motta
   - 29 nov 2005

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 ?


Emerson
   - 29 nov 2005

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


Prgdelphi
   - 29 nov 2005

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.


Prgdelphi
   - 29 nov 2005

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.


Motta
   - 29 nov 2005

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 ?


Prgdelphi
   - 29 nov 2005

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


Motta
   - 30 nov 2005

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


Motta
   - 30 nov 2005

digo

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