Fórum dados de um banco em consulta sql no outro banco #321466
16/05/2006
0
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
Curtir tópico
+ 0Posts
16/05/2006
Emerson Nascimento
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.
Gostei + 0
16/05/2006
Rvano
Se ficar lento, coloco uma animaçãozinha pra ir distraindo o usuário...hehehe
Obrigado hein
Gostei + 0
17/05/2006
Rvano
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]
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)