Erro no laço com comando sql
Bom dia.
Fiz uma consulta sql que retorna alguns valores, com isso fiz um laço while para pegar estes valores e inserir na tabela, porém está dando erro de chave primária ao tentar inserir o próximo registro e não sei o motivo, segue abaixo o código que fiz:
procedure TDM.insereoutrosvaloresitemdespesa;
var d, f:integer;
begin
with query do
begin
close;
sql.Clear;
sql.Add('use lccetil select distinct cdDespesa,cdFonteRecurso from itemdespesa');
sql.Add('where dtanoprocesso='+IntToStr(anoGlobal)+' and nrprocesso='+IntToStr(processoGlobal)+'');
SQL.Add('and cdDespesa <> '+IntToStr(dota)+' and cdFonteRecurso = '+IntToStr(fonte)+'');
open;
query.First;
while not query.Eof do
begin
d:=FieldByName('cddespesa').AsInteger;
f:=FieldByName('cdFonteRecurso').AsInteger;
with query do
begin
close;
sql.Clear();
sql.Add('INSERT INTO [LCCETIL].[dbo].[ITEMDESPESA] '+
'([idAjuste] '+
' ,[qtPedidoEmpenho] '+
',[dtAnoProcesso] '+
',[cdTipoProcesso] '+
',[nrProcesso] '+
',[Lote] '+
',[nrItem] '+
',[cdMaterial] '+
',[cdDespesa] '+
',[cdFonteRecurso] '+
',[qtdeItem] '+
',[cdAplicacao] '+
',[dtAnoExercicio]) '+
'VALUES '+
'(:idAjuste '+
',:qtPedidoEmpenho '+
',:dtAnoProcesso '+
',:cdTipoProcesso '+
',:nrProcesso'+
',:Lote '+
',:nrItem '+
',:cdMaterial '+
',:cdDespesa '+
',:cdFonteRecurso '+
',:qtdeItem '+
',:cdAplicacao '+
',:dtAnoExercicio) ');
Parameters.ParamByName('idAjuste').Value := 0;
Parameters.ParamByName('qtPedidoEmpenho').Value := 0;
Parameters.ParamByName('dtAnoProcesso').Value := anoGlobal;
Parameters.ParamByName('cdTipoProcesso').Value := 4;
Parameters.ParamByName('nrProcesso').Value := processoGlobal;
Parameters.ParamByName('Lote').Value := numLote;
Parameters.ParamByName('nrItem').Value :=StrToInt(FrmItensDescTab.txtNumeroItem.Text);
Parameters.ParamByName('cdMaterial').Value := DM.numMaterial;
Parameters.ParamByName('cdDespesa').Value := d;
Parameters.ParamByName('cdFonteRecurso').Value := f;
Parameters.ParamByName('qtdeItem').Value := 0;
Parameters.ParamByName('cdAplicacao').Value := 0;
Parameters.ParamByName('dtAnoExercicio').Value := anoGlobal;
ExecSQL;
end;
query.Next;
query.Open;
end;
end;
end;
Desde já agradeço a ajuda.
Fiz uma consulta sql que retorna alguns valores, com isso fiz um laço while para pegar estes valores e inserir na tabela, porém está dando erro de chave primária ao tentar inserir o próximo registro e não sei o motivo, segue abaixo o código que fiz:
procedure TDM.insereoutrosvaloresitemdespesa;
var d, f:integer;
begin
with query do
begin
close;
sql.Clear;
sql.Add('use lccetil select distinct cdDespesa,cdFonteRecurso from itemdespesa');
sql.Add('where dtanoprocesso='+IntToStr(anoGlobal)+' and nrprocesso='+IntToStr(processoGlobal)+'');
SQL.Add('and cdDespesa <> '+IntToStr(dota)+' and cdFonteRecurso = '+IntToStr(fonte)+'');
open;
query.First;
while not query.Eof do
begin
d:=FieldByName('cddespesa').AsInteger;
f:=FieldByName('cdFonteRecurso').AsInteger;
with query do
begin
close;
sql.Clear();
sql.Add('INSERT INTO [LCCETIL].[dbo].[ITEMDESPESA] '+
'([idAjuste] '+
' ,[qtPedidoEmpenho] '+
',[dtAnoProcesso] '+
',[cdTipoProcesso] '+
',[nrProcesso] '+
',[Lote] '+
',[nrItem] '+
',[cdMaterial] '+
',[cdDespesa] '+
',[cdFonteRecurso] '+
',[qtdeItem] '+
',[cdAplicacao] '+
',[dtAnoExercicio]) '+
'VALUES '+
'(:idAjuste '+
',:qtPedidoEmpenho '+
',:dtAnoProcesso '+
',:cdTipoProcesso '+
',:nrProcesso'+
',:Lote '+
',:nrItem '+
',:cdMaterial '+
',:cdDespesa '+
',:cdFonteRecurso '+
',:qtdeItem '+
',:cdAplicacao '+
',:dtAnoExercicio) ');
Parameters.ParamByName('idAjuste').Value := 0;
Parameters.ParamByName('qtPedidoEmpenho').Value := 0;
Parameters.ParamByName('dtAnoProcesso').Value := anoGlobal;
Parameters.ParamByName('cdTipoProcesso').Value := 4;
Parameters.ParamByName('nrProcesso').Value := processoGlobal;
Parameters.ParamByName('Lote').Value := numLote;
Parameters.ParamByName('nrItem').Value :=StrToInt(FrmItensDescTab.txtNumeroItem.Text);
Parameters.ParamByName('cdMaterial').Value := DM.numMaterial;
Parameters.ParamByName('cdDespesa').Value := d;
Parameters.ParamByName('cdFonteRecurso').Value := f;
Parameters.ParamByName('qtdeItem').Value := 0;
Parameters.ParamByName('cdAplicacao').Value := 0;
Parameters.ParamByName('dtAnoExercicio').Value := anoGlobal;
ExecSQL;
end;
query.Next;
query.Open;
end;
end;
end;
Desde já agradeço a ajuda.
Marcelo Junqueira
Curtidas 0