dados de um banco em consulta sql no outro banco
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:
´Matrículas´ é uma string que recebe as matrículas daqui:
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]
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
Curtidas 0
Respostas
Emerson Nascimento
16/05/2006
crie um clientdataset para uso temporário* e o preencha a cada determinado número de registros.
por exemplo:
*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
[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.
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
Rvano
16/05/2006
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
Se ficar lento, coloco uma animaçãozinha pra ir distraindo o usuário...hehehe
Obrigado hein
GOSTEI 0
Rvano
16/05/2006
Funcionou!
O único problema é que quando restava algumas matrículas, a variável recebia duas vírgulas. Resolvi assim:
E não ficou muito lento conforme imaginávamos. Valeu pela ajuda hein! Obrigado.[/code]
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