Dúvida de abstração
29/11/2005
0
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
Posts
29/11/2005
Carlosfim
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,
29/11/2005
Prgdelphi
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.
29/11/2005
Motta
Em que condições se dá a decisão de ir ou no outro ?
Vc usa mais de um bd ?
Usa ao mesmo tempo ?
29/11/2005
Emerson Nascimento
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
29/11/2005
Prgdelphi
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.
29/11/2005
Prgdelphi
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.
29/11/2005
Motta
Deve haver um procedimento de sincronia entre as bases , não ?
29/11/2005
Prgdelphi
Mas estou começando a achar que esta será a solução mesmo.... nào consigo de jeito nenhum fazer esse typecast...
30/11/2005
Motta
Clique aqui para fazer login e interagir na Comunidade :)