Ir para conteúdo
  • Cadastre-se

dev botao

Gerar Boleto em Lote e Enviar Boletos Individuais por E-Mail


Ver Solução Respondido por visibly,
  • Este tópico foi criado há 3413 dias atrás.
  • Talvez seja melhor você criar um NOVO TÓPICO do que postar uma resposta aqui.

Recommended Posts

  • Membros Pro
Postado

Pesquisando aqui no fórum, não achei nada que resolvesse meu problema. :cry:

Depois de quebrar um pouco a cabeça segue abaixo o código e espero que possa ajudar a quem enfrente o mesmo problema. :P

A questão era:

Monto um lote de boletos de variados clientes com diversos títulos.

Através dele consigo imprimir em um único PDF todos os boletos, só que após isso eu gostaria de enviar por e-mail os boletos individuais para o respectivos clientes.

O problema é que a ListadeBoletos contém todos os títulos e a procedure EnviarEmail só me permite enviar um único e-mail, ela não é capaz de "quebrar" os e-mail por clientes.

A solução foi:

No formulário inseri dois componentes do tipo TACBrBoleto e dois do tipo TACBRBoletoFCFortes.

Sendo que um conjunto fica para o "Lote" e o outro fica para "Auxiliar" no envio dos e-mails.

ACBrBoletoLote - ACBRBoletoFCLote

ACBrBoletoEMail - ACBRBoletoFCEMail

Após inserir os títulos normalmente na lista de boletos do ACBrBoletoLote segue o código do procedimento.


  (*Imprime os boletos em PDF*)

  ACBrBoletoLote.Imprimir;


  (*Prepara o ACBrBoletoEmail com os mesmos parâmetros do ACBrBoletoLote*) 

  ACBrBoletoEmail.Cedente    := ACBrBoletoLote.Cedente;

  ACBrBoletoEmail.Banco      := ACBrBoletoLote.Banco;


  (*Laço que percorrerá a lista de Boletos e através do ACBrBoletoEMail enviará boletos individuais para cada cliente*)

  for i := 0 to Pred(ACBrBoletoLote.ListadeBoletos.Count) do

  begin

    (*Limpa a lista de boletos auxiliar*)

    ACBrBoletoEmail.ListadeBoletos.Clear;


    (*Adiciona o título exclusivo na Lista de Boletos auxiliar*)

    ACBrBoletoEmail.ListadeBoletos.Add(ACBrBoletoLote.ListadeBoletos.Objects[i]);


    (*Enviar o e-mail através do componente auxiliar que contém o boleto exclusivo de determinado cliente*)

    ACBrBoletoEmail.EnviarEmail('smtp.aaa.com.br',

                                '587',

                                '[email protected]',

                                'SuaSenha',

                                '[email protected]',

                                ACBrBoletoLote.ListadeBoletos.Objects[i].Sacado.Email,//EMail do Cliente

                                'Boleto de Cobrança',

                                vMsg,//StringList

                                False,

                                True,

                                nil,

                                nil,

                                False,

                                False,

                                'Leonardo',

                                True);

  end; //for

  • Curtir 1
  • 5 meses depois ...
  • 1 mês depois ...
Postado

Amigo 

leoprates , tentei fazer a sua solução descrita acima ocorreu tudo bem mas quando tento fazer qualquer outra coisa

 ou fechar o form da um erro de ' Invalid pointer operation ' e trava o sistema ai só no  gerenciador de tarefa para fechar

aconteceu isso com você se sim qual a solução

 

OBS: isso só acontece se eu mandar os email com a sua solução.

Postado (editado)

Amigo 

leoprates , tentei fazer a sua solução descrita acima ocorreu tudo bem mas quando tento fazer qualquer outra coisa

 ou fechar o form da um erro de ' Invalid pointer operation ' e trava o sistema ai só no  gerenciador de tarefa para fechar

aconteceu isso com você se sim qual a solução

 

OBS: isso só acontece se eu mandar os email com a sua solução.

Pessoal já resolvi meu problema posta ai em cima , não consegui resolver o erro que tava dando, mas acho que era pelo fato de ter dois componente mas como não entendo de oop não aventurei descobrir no fonte.

minha solução foi mais simples eu acho:

 

 

segue trecho do codigo ; uso o mesmo acbrBoleto,  como os dados ja estao selecionado so limpo os titulos ai faço um por um

 

 

 

 

ACBrBoletoLote.ACBrBoletoFC.NomeArquivo :=
cdsConfigBOL_PATH_GERARPDF.AsString+'\'+'Boletos '+FormatDateTime('DDMMYYYYHHMMSS',Now)+'.pdf';
   if Application.MessageBox('Enviar Boleto Individual a cada Formando?',
        'Atenção!', MB_YESNO + MB_ICONINFORMATION) = IDYES then
      begin
       ACBrBoletoLote.ListadeBoletos.Clear;
      if DBGrid1.SelectedRows.Count > 0 then
      begin
      with DBGrid1 do
      begin
    for X := 0 to Pred(SelectedRows.Count) do
    begin
 
    Datasource.Dataset.Bookmark := SelectedRows[X];
    xNossoNumero := IntToStr(cdsContasCTR_ID.AsInteger);
 

// aqui pego os boletos que ja tem nosso numero ja gerado

// sao 2 rotinas semelhantes na primeira nosso numero tem estar null

pra gerar os pdf,html, remessa.

 

    if not cdsContasCTR_NOSSONUMERO.IsNull then
 
    begin
 
    Titulo:= ACBrBoletoLote.CriarTituloNaLista;
 
    with Titulo do
    begin
 
      Vencimento        := cdsContasCTR_DTVENC.AsDateTime;
      DataDocumento     := cdsContasCTR_DTEMIS.AsDateTime;
      NumeroDocumento   :=  IntToStr(cdsContasCTR_ID.AsInteger);
      EspecieDoc        := cdsConfigBOL_ESPECIE.AsString;
      if cdsConfigBOL_ACEITE.AsString = 'SIM' then
         Aceite := atSim
      else
         Aceite := atNao;
      DataProcessamento := Now;
      Carteira          := cdsCedenteCED_CARTEIRA.AsString;
      NossoNumero       := xNossoNumero;
      ValorDocumento    := cdsContasCTR_VLFIM.AsFloat;
      Sacado.NomeSacado := cdsContasCLI_NOME.AsString;
      Sacado.CNPJCPF    := cdsContasCLI_CPF.AsString;
      Sacado.Logradouro := cdsContasCLI_ENDR.AsString;
      Sacado.Numero     := cdsContasCLI_NUMR.AsString;
      Sacado.Bairro     := cdsContasCLI_BAIRRR.AsString;
      Sacado.Cidade     := cdsContasCID_NOME.AsString;
      Sacado.UF         := cdsContasCID_CODTUF.AsString;
      Sacado.CEP        := cdsContasCLI_CEPR.AsString;
      Sacado.Email      :='[email protected]'; //cdsContasCLI_EMAIL.AsString;
      ValorAbatimento   := 0;
      LocalPagamento    := CdsConfigBOL_LOCAL_PAGTO.AsString;
      ValorMoraJuros    := 0;
      ValorDesconto     := 0;
      ValorAbatimento   := 0;
      DataMoraJuros     := 0;
      DataDesconto      := 0;
      DataAbatimento    := 0;
      DataProtesto      := cdsContasCTR_DTVENC.AsDateTime + cdsConfigBOL_DIAS_PROTESTO.AsInteger;
      PercentualMulta   := 0;
      Mensagem.Text     := CdsConfigBOL_MENSAGEM.AsString;
      OcorrenciaOriginal.Tipo := toRemessaBaixar;
      Instrucao1        := padL(trim(CdsConfigBOL_INSTRUCAO_1.AsString),2,'0');
      Instrucao2        := padL(trim(CdsConfigBOL_INSTRUCAO_2.AsString),2,'0');
      Parcela           := 1;
 
 
    end;  // with titulo
 
     EnviaBoletoEmail;
Editado por visibly
  • Administradores
Postado

Bom dia.

 

Se  não restar mais nenhuma dúvida, por favor marque o tópico como Resolvido.

 

Att.

  • Curtir 1
Consultora SAC ACBr

Juliana Tamizou

Gerente de Projetos ACBr / Diretora de Marketing AFRAC
Ajude o Projeto ACBr crescer - Seja Pro

Projeto ACBr     Telefone:(15) 2105-0750 WhatsApp(15)99790-2976.  Discord

Projeto ACBr - A maior comunidade Open Source de Automação Comercial do Brasil


Participe de nosso canal no Discord e fique ainda mais próximo da Comunidade !!

  • 1 ano depois...
Postado

Amigo 

leoprates , tentei fazer a sua solução descrita acima ocorreu tudo bem mas quando tento fazer qualquer outra coisa

 ou fechar o form da um erro de ' Invalid pointer operation ' e trava o sistema ai só no  gerenciador de tarefa para fechar

aconteceu isso com você se sim qual a solução

 

OBS: isso só acontece se eu mandar os email com a sua solução.

 

 

eu fiz a mesma coisa citada no primeiro post do tópico mas ai passei a ter o mesmo erro que é citado acima. Invalid pointer operation ' , mas o erro acontece quando vou fechar a tela, ou quando vou gerar uma nova remessa

 

e comigo também só acontece se eu enviar o email, ou seja, se criar a segunda lista.

na verdade se na hora de criar a lista auxiliar eu usar o Clear ele se perde na  hora.

entao eu fiz como abaixo:

      // Tive que usar um componente ACBR apenas para o Email,
      // nele incluo apenas um título de cada vez, e já envio o email.
      // DM_ACBr.ACBrBoletoEmail.ListadeBoletos.Clear; //se usar clear o componente se perde, acredito que apaga as duas listas, por isso uso delete
      if DM_ACBr.ACBrBoletoEmail.ListadeBoletos.Count > 0 then
        DM_ACBr.ACBrBoletoEmail.ListadeBoletos.Delete(0);
 

alguém tem alguma sugestão?

 

valeu galera

  • 4 meses depois ...
Postado

Amigo 

leoprates , tentei fazer a sua solução descrita acima ocorreu tudo bem mas quando tento fazer qualquer outra coisa

 ou fechar o form da um erro de ' Invalid pointer operation ' e trava o sistema ai só no  gerenciador de tarefa para fechar

aconteceu isso com você se sim qual a solução

 

OBS: isso só acontece se eu mandar os email com a sua solução.

Acabei usando a solucao Citada no Post e também tive o erro de Invalid pointer operation '.

depois de muito quebrar a cabeça eu reparei que simplesmente indo no datamodule e apagando "um par" o outro que sobrava perdia a referencia, e era necessário liga-los novamente. Então deduzi que o erro acontece justamente por ter dois componentes do mesmo tipo, 2 ACBRBoleto e 2 ACBRBoletoFCFR, 

fiz o seguinte.

apaguei o segundo "par" de ACBRBoleto e ACBRBoletoFCFR e usei uma Lógica "não muito convencional" mas funcionou bem e a atribuicao dos valores ao componente ficou centralizada.

entao na primeira vez q ele passa pelo Loop 1 to 2, o compoente recebe todos os boletos de uma vez com porque é necessário fazer isso para imprimir e para gerar a Remessa. na segunda vez ele sempre limpa o conteudo do componente para enviar os emails 1 a 1.

  for vLoopOpcao := 1 to 2 do
  begin
    vContEmail:=0;
    ProgressBarStatus.Step := 0;
    i := 0;
    if (vLoopOpcao = 2) then
    begin
      DM_ACBr.ACBRBoleto.ListadeBoletos.Clear;
    end;
    ....
    //preenche os dados do Titulo

        Titulo := DM_ACBr.ACBRBoleto.CriarTituloNaLista;

        with Titulo do

        begin
          Vencimento := ;
          DataDocumento := ;
          NumeroDocumento := ;

        end;

   .....
    if (vLoopOpcao = 2) and (CheckBoxEnviarEmail.Checked) then
    begin
      //envia email
    end;
    if not CheckBoxEnviarEmail.Checked then
      Break;
    if vLoopOpcao = 1 then
    begin
        DM_ACBr.ACBRBoleto.Imprimir;
        DM_ACBr.ACBRBoleto.GerarRemessa();
        ImprimeBordero(StrToInt(TypeEditCdConta.Text), StrToInt(TypeEditNRREMESSA.Text));
    end;
  end; // if vLoopOpcao = 1 then
  

 

  • Este tópico foi criado há 3413 dias atrás.
  • Talvez seja melhor você criar um NOVO TÓPICO do que postar uma resposta aqui.

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar Agora
×
×
  • Criar Novo...

Informação Importante

Colocamos cookies em seu dispositivo para ajudar a tornar este site melhor. Você pode ajustar suas configurações de cookies, caso contrário, assumiremos que você está bem para continuar.