Bronca com Laços e Inserções.
Alow pessoal
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
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
Curtidas 0
Respostas
Edilcimar
04/04/2005
que tal recordcount-1
GOSTEI 0
Massuda
04/04/2005
Eu não entendo muito de BD, mas ib_grid1.DataSource.Dataset.RecordCount só terá um valor válido se ib_grid1.DataSource.Dataset for um TTable (ou derivado); para datasets baseados em query, é recomendável fazer um COUNT antes no BD.
GOSTEI 0
Technos
04/04/2005
Ae Massuda.
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
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
Technos
04/04/2005
Como já era de esperar, o RecordCount -1 do nosso amigo acima nao funcionou, pois eu inicializo a variavel com o valor 1 (a variavel que fará a contagem de participantes), e como logo após estou setando recordcount -1, estou anulando, ou seja, nem no primeiro laço ela entrará.
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
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
Technos
04/04/2005
Resolvi a questão da Violação de Chave primária
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
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