StoredProcedure / ClientDataSet
Olá pessoal.
Estou com um problema de performance no meu sistema.
Fiz uma precedure de gera dados de um funcionário. Ela retorna as horas trabalhas dia a dia. (passo o idFuncionario, dataInicio e dataFim) e ela retorna todos os dias do periodo.
Mas preciso gerar um relatório com varios funcionarios(todos ativos).
Como a procedure so retorna 1 funcionario por vez, tive que clonar o ClientDataSet, fazer selects e transportar cada select para o ClientDataSet clonado.
Funcionou blz. mas ficou mto lento. Alguem tem alguma sugestao para melhorar a performance desta rotina.
Obrigado.
Estou com um problema de performance no meu sistema.
Fiz uma precedure de gera dados de um funcionário. Ela retorna as horas trabalhas dia a dia. (passo o idFuncionario, dataInicio e dataFim) e ela retorna todos os dias do periodo.
Mas preciso gerar um relatório com varios funcionarios(todos ativos).
Como a procedure so retorna 1 funcionario por vez, tive que clonar o ClientDataSet, fazer selects e transportar cada select para o ClientDataSet clonado.
Funcionou blz. mas ficou mto lento. Alguem tem alguma sugestao para melhorar a performance desta rotina.
Obrigado.
Daniel Oliveira
Curtidas 0
Respostas
Marco Salles
19/06/2010
idéia rapida (Sql não é meu forte) é que vc retire o idFuncionario da Istruçao Where e coloque-o na
Instrução Group By .. Ou seje Agrupar pelo Id .. Assim vc terá vsrios Registros Agrupados pelo idFuncionario dos
Funcionarios
GOSTEI 0
Daniel Oliveira
19/06/2010
Obrigado Marco.
Tem uma situação em que eu preciso selecionar quais serão os funcionários inclusos no relatório. Assim se não tiver o id na cláusula where, não funcionará. Ate pensei em passar uma lista de ids como parametro, mas tem casos de precisar selecionar 200 funcionarios ou mais... Assim nao consegui resolver.
Tem uma situação em que eu preciso selecionar quais serão os funcionários inclusos no relatório. Assim se não tiver o id na cláusula where, não funcionará. Ate pensei em passar uma lista de ids como parametro, mas tem casos de precisar selecionar 200 funcionarios ou mais... Assim nao consegui resolver.
GOSTEI 0
Marco Salles
19/06/2010
Obrigado Marco.
Tem uma situação em que eu preciso selecionar quais serão os funcionários inclusos no relatório. Assim se não tiver o id na cláusula where, não funcionará. Ate pensei em passar uma lista de ids como parametro, mas tem casos de precisar selecionar 200 funcionarios ou mais... Assim nao consegui resolver.
Uma coisa é uma Coisa outra Coisa é Outra Coisa ("Vanderlei Luxemburgo")
.
Vc Tira o Id da Clausula Where mas qnd Precisar de Algum Id especifico , Vc Filtra os Resultados que estão em
Memória ...O Importante é Vc ter esta Range de Dados para Vc Usa-los
Tem uma situação em que eu preciso selecionar quais serão os funcionários inclusos no relatório. Assim se não tiver o id na cláusula where, não funcionará. Ate pensei em passar uma lista de ids como parametro, mas tem casos de precisar selecionar 200 funcionarios ou mais... Assim nao consegui resolver.
GOSTEI 0
Daniel Mourao
19/06/2010
Olá!
Só trocando uma idéia...quando você diz que uma procedure só retorna um funcionário isso é porque você deseja que seja assim?
Porque você poderia alterar essa procedure ou fazer uma outra que retornasse todos os funcionários daquele período solicitado. Não precisaria passar o idFuncionario, somente o período e a procedure retornaria todos os funcionários do período.
Outra sugestão é que você faça uma marcação para os registros que quer imprimir. Tipo, colocar um campo na tabela que marque o registro ou então encontrar um outro campo que diferencie os registros que você quer imprimir dos demais.
Espero ter ajudado.
Só trocando uma idéia...quando você diz que uma procedure só retorna um funcionário isso é porque você deseja que seja assim?
Porque você poderia alterar essa procedure ou fazer uma outra que retornasse todos os funcionários daquele período solicitado. Não precisaria passar o idFuncionario, somente o período e a procedure retornaria todos os funcionários do período.
Outra sugestão é que você faça uma marcação para os registros que quer imprimir. Tipo, colocar um campo na tabela que marque o registro ou então encontrar um outro campo que diferencie os registros que você quer imprimir dos demais.
Espero ter ajudado.
GOSTEI 0
Emerson Nascimento
19/06/2010
se você estiver trabalhando com uma stored procedure do firebird, altere-a de modo a receber somente a data inicial e a data final e filtre o funcionário com where. assim:
select * from sp_ponto(dataini, datafim) -> retorna a marcação de todos os funcionários no período indicado
select * from sp_ponto(dataini, datafim) where id_funcionario = funcionario -> retorna a marcação de daquele funcionário no período indicado
select * from sp_ponto(dataini, datafim) -> retorna a marcação de todos os funcionários no período indicado
select * from sp_ponto(dataini, datafim) where id_funcionario = funcionario -> retorna a marcação de daquele funcionário no período indicado
GOSTEI 0
Daniel Oliveira
19/06/2010
Acho q vou ter q fazer isso mesmo (alterar a procedure). Mas isso vai dar uma grande mao de obra aki. Pq existem outras procedures legadas a esta q retornam totalizadores baseados no mes. Por isso nao queria mexer nela.
Se alguem souber alguma forma de popular o ClientDataSet mais rapido, poste aki por favor.
Obrigado pela ajuda Marco, Daniel e Emerson.
Se alguem souber alguma forma de popular o ClientDataSet mais rapido, poste aki por favor.
Obrigado pela ajuda Marco, Daniel e Emerson.
GOSTEI 0