Bronca com Laços e Inserções.

Delphi

04/04/2005

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


Technos

Technos

Curtidas 0

Respostas

Edilcimar

Edilcimar

04/04/2005

que tal recordcount-1


GOSTEI 0
Massuda

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

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


GOSTEI 0
Technos

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


GOSTEI 0
Technos

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


GOSTEI 0
POSTAR