Fórum dados de um banco em consulta sql no outro banco #321466

16/05/2006

0

Olá pessoal,

Estou quebrando a cabeça com a seguinte dúvida:

Aqui na empresa, infelizmente possuímos dois bancos de dados. Um em Oracle com o cadastro de alunos e outro em SQL Server com o cadastro de solicitantes de bolsa de estudos.

O campo em comum é o número de matrícula.

Ocorre que preciso montar um relatório onde será informado os dados do aluno (Oracle) e também os dados da bolsa para esse aluno (SQL Server).

Por motivo de permissão de acesso, não posso criar uma tabela temporária no Oracle com os dados da Bolsa.

Tentei então criar um SQL no oracle que traria todos os alunos com a seguinte condição:

 aluno.cd_matricula in (´+Matriculas+´)


´Matrículas´ é uma string que recebe as matrículas daqui:
  qryBolsaAluno.First;
  while not qryBolsaAluno.Eof do
  begin
    if Matriculas <> ´´ then
      Matriculas := Matriculas + ´, ´ +   qryBolsaAluno.FieldByName(´cd_matricula´).AsString
    else
      Matriculas := qryBolsaAluno.FieldByName(´cd_matricula´).AsString;
    qryBolsaAluno.Next;
  end;


Até aqui estaria tudo bem, não fosse o fato de que como são muitos alunos, a variável fica grande e a query não consegue armazenar todo o código SQL.

Estou utilizando o TZQuery do ZeosLib.

Alguém sabe que alternativas eu tenho?
Obrigado hein galera...

:D [/code]


Rvano

Rvano

Responder

Posts

16/05/2006

Emerson Nascimento

crie um clientdataset para uso temporário* e o preencha a cada determinado número de registros.
por exemplo:
i := 1; // inteiro
qryBolsaAluno.First; 
while not qryBolsaAluno.Eof do 
begin 
  if Matriculas <> ´´ then Matriculas + ´, ´;
  // atente-se ao fato de não incluir matrículas repetidas!
  Matriculas := Matriculas +
    qryBolsaAluno.FieldByName(´cd_matricula´).AsString 

  Inc(i);

  // a cada 100 registros, faz a leitura no oracle
  if i > 100 then
  begin
    InsereTemporario**;
    Matriculas := ´´;
    i := 1;
  end;

  qryBolsaAluno.Next; 
end;

// se ainda restava alguma matrícula, insere-as no cds
if Matriculas <> ´´ then
  InsereTemporario**;

agora você passa a trabalhar com o clientdataset temporário.





*para usar um clientdataset como tabela temporária, faça assim:
- instancie um componente clientdataset no form
- dê um duplo-clique no componente e adicione os campos manualmente
com New Field (Ctrl+N) e adicione-os como Field Type=Data
- ao criar o form, execute clientdataset.createdataset

**procedure para inserção dos registros no cds temporário
procedure TForm1.InsereTemporario;
begin
  abre_a_query_oracle_com_as_matriculas_selecionadas;

  with query_oracle do
  while not eof do
  begin
    cds_temp.append;
    cds_temp.fieldbyname(´tal´).value := fieldbyname(´tal_oracle´).value;
    cds_temp.fieldbyname(´taln´).value := fieldbyname(´taln_oracle´).value;
    cds_temp.post;
    next;
  end;

  fecha_a_query_oracle;
end;

[size=18:9926829aef]talvez isso torne o sistema um pouco lento por conta do número de acessos ao oracle[/size:9926829aef]
mas não custa tentar pra ver se a performance é aceitável.


Responder

Gostei + 0

16/05/2006

Rvano

Legal...vou fazer o teste e já posto o resultado aqui!

Se ficar lento, coloco uma animaçãozinha pra ir distraindo o usuário...hehehe


Obrigado hein


Responder

Gostei + 0

17/05/2006

Rvano

Funcionou!

O único problema é que quando restava algumas matrículas, a variável recebia duas vírgulas. Resolvi assim:

   //Se ainda restar alguma matrícula, inserir no cds                              
   if Matriculas <> ´´ then
   begin
     //Substitui duas vírgulas por uma
     Matriculas := StrReplace(Matriculas, ´, ,´ , ´,´);
     InsereTemporario;
   end;


E não ficou muito lento conforme imaginávamos. Valeu pela ajuda hein! Obrigado.[/code]


Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar