Fórum Bronca com Laços e Inserções. #275536
04/04/2005
0
Tenho algumas variaveis que nao vou nem mostrar como declarar por que sei do potencial de todos que visitam o nosso fórum e os mesmo saberão que tipo e por que estão declaradas as mesmas.
este é o corpo do questão:
s_mes := copy(datetostr(date),4,2);
s_ano := copy(datetostr(date),7,4);
ano_mes := s_ano + s_mes ;
//showmessage(´quantidade´ + inttostr(IB_Grid1.DataSource.Dataset.RecordCount));
v_mes := 1 ;
v_dia := 1 ;
v_turno := 1 ;
partic := 1 ; // vai fazer parte do loop, simboliza a quantidade de participantes da empresa
for partic := 1 to (ib_grid1.DataSource.Dataset.RecordCount) do
begin
if (funcoes.DiasDoMes(v_mes)) = 31 then
begin
for v_mes:= 1 to 12 do
begin
for v_dia := 1 to 31 do
begin
for v_turno := 1 to 2 do
begin
qry_folha.Close ;
qry_folha.sql.Clear ;
qry_folha.prepared:= false ;
qry_folha.SQL.Add(sql_insert2) ;
qry_folha.Prepared := true ;
qry_folha.ParamByName(´P_cod_empresa´).Value :=
datasourceaux.Dataset.fieldbyname(´cod_empresa´).Value ;
qry_folha.ParamByName(´P_folha_ano_mes´).Value := ano_mes ;
qry_folha.ParamByName(´p_mat_part´).Value :=
dados.qry_partic_empresa.fieldbyname(´mat_part´).Value ;
qry_folha.ParamByName(´P_dia_do_mes´).Value := v_dia ;
qry_folha.ParamByName(´P_numero_turno´).Value := v_turno ;
qry_folha.ExecSQL ;
end;
end;
end;
end;
end;
********************
A bronca é:
Por que o laço nao está parando ? pois testei com dados reais, e sei que uma empresa em meu banco só tem um participante da folha, e mesmo assim o danado nao para o laço.
o que me deixa mais invocado é que fiz uma rotina antes dessa, bem pareçida, e funfa numa boa.
Podem me dizer o que há de errado ?
Se quiserem mais detalhes da funcionalidade dessa rotina acima, mandem menssagens.
Atenciosamente
Technos
Technos
Curtir tópico
+ 0Posts
04/04/2005
Edilcimar
Gostei + 0
04/04/2005
Massuda
Gostei + 0
05/04/2005
Technos
Como pode ver no exemplo do código acima, existe uma linha comentada que me mostrava um showmessage com a quantidade de registros (participantes) da empresa selecionada, e assim que eu navegasse a base de dados de empresas, esse gird era atualizado, se eu clicasse no botão de geração de folha, ele me mostrava a quantidade de participantes.
Vou testar esse recordcount -1 pra ver no que dá. considerando que nao vejo sentido nisso, ams vo tentar.
Por favor, analisem a questão.
Espero Respostas
Technos
Gostei + 0
05/04/2005
Technos
Mas, vejamos:
A Lógica é o seguinte, mesmo eu tendo apenas 1 participante, o danado fica gerando mais registros, e como os campos chave são: cod_empresa, mat_part, folha_ano_mes,Dia_do_mes e numero_turno e a rotina tá repitindo o primeiro laço, que é o de quantidade de participantes, gerando o erro de violação de chave primária. Notei isso vendo o resultado do Insert no Ibexpert (Recomendo, muito Rox esse :)), vi que o valor do campo mat_part nao se altera, diferente de todos os outros registros de chave primaria.
Vamos discutir sobre isso, pois podem haver mais programadores com o mesmo problema e nem siquer sabem disso.
Valeu aee, e desde já agradeço novas opniões e as que já me foram enviadas.
Technos
Gostei + 0
07/04/2005
Technos
Era o seguinte, eu tava usand um laço pra processar todos os meses, mesmo sabendo que nao iria gravar os valores na tabela dependendo do mes, isso apenas tava servindo pra saber se o mes terminava com 28,29,30 ou 31 (pensse num processo bizarro...), mas consegui eleborar o esquema da maneira correta, tá funfando numa boa.
Só que, veio a tona outro pepino (que existia na questao anterior, só que agora se tornou crítica).
Como estou passando por um laço pra saber o dia do mes, depois to entrando num laço pra verificar o turno do dia corrente, e dentro desse ultimo laço estou gravando os dados (o insert), como posso pegar o valor do campo mat_part dentro desse ultimo laço? do jeito que tá atualmente, ele pega o mat_part do primeiro registro da query que fiz pra saber o participante que trabalha na empresa selecionada.
Olhem a rotina abaixo, tá otimizada pra nao dar erro de violação de chave, mas só que tá pegando o mat_part de acordo com o recordcount da query. Tá errado.
s_mes := copy(datetostr(date),4,2);
s_ano := copy(datetostr(date),7,4);
ano_mes := s_ano + s_mes ;
ano_param := strtoint(copy(datetostr(date),7,4));
v_dia := 1 ;
v_turno := 1 ;
contador_participante := 1 ; // vai fazer parte do loop, simboliza a quantidade de participantes da empresa
for contador_participante := 1 to (IB_Grid1.DataSource.Dataset.RecordCount) do
begin
for v_dia := 1 to (funcoes.diadomes_2(ano_param,strtoint(s_mes))) do
begin
for v_turno := 1 to 2 do
begin
qry_folha.Close ;
qry_folha.sql.Clear ;
qry_folha.prepared:= false ;
qry_folha.SQL.Add(sql_insert2) ;
qry_folha.Prepared := true ;
qry_folha.ParamByName(´P_cod_empresa´).Value :=
datasourceaux.Dataset.fieldbyname(´cod_empresa´).Value ;
qry_folha.ParamByName(´P_folha_ano_mes´).Value := ano_mes ;
qry_folha.ParamByName(´p_mat_part´).Value :=
IB_Grid1.DataRow[contador_participante];
//dados.qry_partic_empresa.fieldbyname(´mat_part´).Value ;
qry_folha.ParamByName(´P_dia_do_mes´).Value := v_dia ;
qry_folha.ParamByName(´P_numero_turno´).Value := v_turno ;
qry_folha.ExecSQL ;
end;
end;
end;
MessageDlg(´Registro Gravado com Sucesso!´, mtInformation, [mbOK], 0);
exit;
************
Mermao, pode parecer simples, até acho que seja, mas tá complicado pra min pq to tipow.. bitolado a esse procedimento e nao consigo enxergar além sacaram? acho que se alguemde fora olhar, facilita pra caramba pois vai estar com a mente limpinha
Desde já agradeço
Technos
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)