Problema com loop para gerar PDFs.

09/07/2018

0

Ola!
Eu tenho uma tabela em um banco FB com 500 receitas cadastradas.Cada receita tem um arquivo PDF gerado e salvo em uma pasta no HD e com o path salvo em um campo FILENAME do tipo varchar na tabela. Esse PDF é copiado para uma outra pasta.Estou fazendo um loop em toda tabela e se o arquivo PDF nao existe estou criando ele e copiando para a tal pasta.SE o arquivo ja existe eu so copio e se o campo FILENAME esta em branco eu crio e copio o PDF.So que dos 500 arquivos so estao sendo feitos 169 as vezes 166 as vezes 167. O que esto fazndo errado? Segue o codigo:

Var
Copied : Boolean;
NomeArq,DataArq,PDFFileName : String;
RX : TRichEdit;
label
goHere;
begin
if MessageDlg('Gerar PDFs?',mtWarning,[mbYes,mbNo],0) = mrYes then
Begin
btAbreReceitaLista.Enabled := False;
btGeraPDF.Enabled := False;
btFechaListaReceitas.Enabled := False;
btFiltro.Enabled := False;

DM.cdsListaReceitas.DisableControls;
DM.cdsListaReceitas.First;
while not DM.cdsListaReceitas.Eof do
Begin
if DM.cdsListaReceitas.FieldByName('FILENAME').AsString <> '' then
Begin
if FileExists(DM.cdsListaReceitas.FieldByName('FILENAME').AsString) then
Begin
DataArq := GetFileDate(DM.cdsListaReceitas.FieldByName('FILENAME').AsString);
NomeArq := StringReplace(FormatDateTime('dd/mm/yyyy',StrToDateTime(DataArq)),'/',EmptyStr,[rfReplaceAll]);
NomeArq := NomeArq + '-' + StringReplace(FormatDateTime('hh:mm:ss',now),':',EmptyStr,[rfReplaceAll]);

Copied := False;
while not Copied do
Copied := CopyFile(PChar(DM.cdsListaReceitas.FieldByName('FILENAME').AsString),PChar(Form1.RaizPath + 'ARQUIVOS\\' + Form1.ReceitaDiaPath + '\\' + 'RECEITA-' + DM.cdsListaReceitas.FieldByName('NOME_CLIENTE').AsString + '-' + NomeArq + '.pdf'),False);

if Copied then
Begin
goto goHere;
End;
End // end do if fileexists
Else
Begin
//FileExists returns false need to create a PDF
DM.cdsClientes.Open;
if DM.cdsClientes.Locate('NOME',DM.cdsListaReceitas.FieldByName('NOME_CLIENTE').AsString,[loCaseInSensitive]) Then
Begin
RX := TRichEdit.Create(Self);
RX.Parent := FORM1;
RX.Visible := False;
RX.Lines.Assign(DM.cdsListaReceitas.FieldByName('RECEITA_HEADER'));
RX.Width := 550;

if not DirectoryExists(UsersPath + 'USERs\\' + DM.cdsClientes.FieldByName('NOME').AsString) then
Begin
ForceDirectories(UsersPath + 'USERs\\' + DM.cdsClientes.FieldByName('NOME').AsString);
End;

NomeArq := StringReplace(FormatDateTime('dd/mm/yyyy',Date),'/',EmptyStr,[rfReplaceAll]);
NomeArq := NomeArq + '-' + StringReplace(FormatDateTime('hh:mm:ss',now),':',EmptyStr,[rfReplaceAll]);
PDFFileName := UsersPath + 'USERS\\' + DM.cdsClientes.FieldByName('NOME').AsString + '\\RECEITA-' + DM.cdsClientes.FieldByName('NOME').AsString + '-' + NomeArq + '.pdf';

if convertPDF(DM.cdsClientes.FieldByName('NOME').AsString,DM.cdsClientes.FieldByName('TELEFONE').AsString,DM.cdsClientes.FieldByName('CELULAR').AsString,PDFFileName,RX) Then
Begin
Try
DM.cdsListaReceitas.Edit;
DM.cdsListaReceitas.FieldByName('FILENAME').AsString := PDFFileName;
DM.cdsListaReceitas.Post;
DM.cdsListaReceitas.ApplyUpdates(0);
except
on E : Exception do
MessageDlg(E.ClassName + ' error : ' + E.Message,mtError,[mbOk],0);
End;

Copied := False;
while not Copied do
Copied := CopyFile(PChar(PDFFileName),PChar(Form1.RaizPath + 'ARQUIVOS\\' + Form1.ReceitaDiaPath + '\\' + 'RECEITA-' + DM.cdsListaReceitas.FieldByName('NOME_CLIENTE').AsString + '-' + NomeArq + '.pdf'),False);

if Copied then
Begin
goto goHere;
End;

End;
End;
DM.cdsClientes.Close;
End;
End //end do if filenamee <> vazio
Else
Begin
//if filename is empty
DM.cdsClientes.Open;
if DM.cdsClientes.Locate('NOME',DM.cdsListaReceitas.FieldByName('NOME_CLIENTE').AsString,[loCaseInSensitive]) Then
Begin
RX := TRichEdit.Create(Self);
RX.Parent := FORM1;
RX.Visible := False;
RX.Lines.Assign(DM.cdsListaReceitas.FieldByName('RECEITA_HEADER'));
RX.Width := 550;

if not DirectoryExists(UsersPath + 'USERs\\' + DM.cdsClientes.FieldByName('NOME').AsString) then
Begin
ForceDirectories(UsersPath + 'USERs\\' + DM.cdsClientes.FieldByName('NOME').AsString);
End;

NomeArq := StringReplace(FormatDateTime('dd/mm/yyyy',Date),'/',EmptyStr,[rfReplaceAll]);
NomeArq := NomeArq + '-' + StringReplace(FormatDateTime('hh:mm:ss',now),':',EmptyStr,[rfReplaceAll]);
PDFFileName := ExtractFilePath(Application.ExeName) + 'USERS\\' + DM.cdsClientes.FieldByName('NOME').AsString + '\\RECEITA-' + DM.cdsClientes.FieldByName('NOME').AsString + '-' + NomeArq + '.pdf';

if convertPDF(DM.cdsClientes.FieldByName('NOME').AsString,DM.cdsClientes.FieldByName('TELEFONE').AsString,DM.cdsClientes.FieldByName('CELULAR').AsString,PDFFileName,RX) Then
Begin
Try
DM.cdsListaReceitas.Edit;
DM.cdsListaReceitas.FieldByName('FILENAME').AsString := PDFFileName;
DM.cdsListaReceitas.Post;
DM.cdsListaReceitas.ApplyUpdates(0);
except
on E : Exception do
MessageDlg(E.ClassName + ' error : ' + E.Message,mtError,[mbOk],0);
End;

Copied := False;
while not Copied do
Copied := CopyFile(PChar(PDFFileName),PChar(Form1.RaizPath + 'ARQUIVOS\\' + Form1.ReceitaDiaPath + '\\' + 'RECEITA-' + DM.cdsListaReceitas.FieldByName('NOME_CLIENTE').AsString + '-' + NomeArq + '.pdf'),False);

if Copied then
Begin
goto goHere;
End;

End;
End;

DM.cdsClientes.Close;
End;

goHere:
DM.cdsListaReceitas.Next;
End;// end do while

DM.cdsListaReceitas.EnableControls;
btAbreReceitaLista.Enabled := True;
btGeraPDF.Enabled := True;
btFechaListaReceitas.Enabled := True;
btFiltro.Enabled := True;

MessageDlg('PDFs gerado com sucesso!',mtInformation,[mbOk],0);

End; // end do if messagaedlg


obrigado
Eduardo Jr

Eduardo Jr

Responder

Post mais votado

14/07/2018

Olá Eduardo, veja se o problema não está ao gerar o nome do arquivo. Pelo que observei você pega informações de data/hora/minuto/segundo para gerar o arquivo, certo? Pode ser que, durante o processamento como o tempo de geração entre os arquivos é rápido ele sobrescreve vários com o mesmo nome, diferente da execução quando "debugando" onde você precisa executar 1 a 1 diferenciando o tempo entre eles.. Se for isso, tente juntar ao nome do arquivo alguma outra chave que não se repita entre as receitas.

Jerson Boer

Jerson Boer
Responder

Mais Posts

09/07/2018

Eduardo Jr

Só mais uma coisa.Fiz o teste com a tabela contendo somente 10 receitas e ele so gera 3 arquivos PDFs tinha q gerar os 10.
Responder

09/07/2018

Eduardo Jr

Se eu executar com um breakpoint ele cria todos os registros desejados.
Responder

Assista grátis a nossa aula inaugural

Assitir aula

Saiba por que programar é uma questão de
sobrevivência e como aprender sem riscos

Assistir agora

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar