PERGUNTAS E RESPOSTAS
 
Bem Vindo, Visitante  Todos os Fórums
  ADVPL
Enviar para a impressoraImprimir  Enviar e-mail para um amigoEnviar Para um Amigo
Precisa estar Logado

Subject Assunto:
Erro em função de impressão de boleto
Versão:
12.1.17
Plataforma:
Microsoft
Complemento:
DB:
.
Complemento:
LinkedIn
Foto
Mensagem do Enviar e-mail Abrir o Perfil do usuário NETOTOTVS NETOTOTVS em 10/07/2019, 16:35 h
Local: PE  Registro: 29/01/2019  Postagens: 16
Estou tentando descobrir o motivo do erro em fonte de geração de boleto especificamente no envio de boleto por email, quando clico para enviar por email da o seguinte erro :" variable is not an object on IMPBOL(BOLETO.PRW) 22/02/2018 14:44:03 line : 745 ", quando vou olhar no fonte a parte que está acusando este erro é " oPrint:StartPage() ", você sabem dizer a causa deste erro e teriam como me ajudar ?

Abaixo segue o fonte: (VOU DESTACAR A LINHA DO ERRO COM O SIMBOLO "--->")

/*-------------------------------------
-- Função: Impressão de boleto.     --
--                                   --
---------------------------------------*/
Static Function ImpBol(aTitulos)
Local aEmpresa := {AllTrim(SM0->M0_NOMECOM),;                                   //[01] Nome da Empresa
                     AllTrim(SM0->M0_ENDENT),;                                    //[02] Endereço
                     AllTrim(SM0->M0_BAIRENT),;                                   //[03] Bairro
                     AllTrim(SM0->M0_CIDENT),;                                    //[04] Cidade
                     SM0->M0_ESTENT,;                                             //[05] Estado
                     "CEP: " + Transform(SM0->M0_CEPENT, "@R 99999-999"),;        //[06] CEP
                     "PABX/FAX: " + SM0->M0_TEL,;                                 //[07] Telefones
                     "CNPJ: " + Transform(SM0->M0_CGC, "@R 99.999.999/9999-99"),; //[08] CGC
                     "I.E.: " + Transform(SM0->M0_INSC, SuperGetMv("MV_IEMASC",.F.,"@R 999.999.999.999"))}     //[09] I.E

Local aCB_RN_NN     := {}
Local aDadTit     := {}
Local aBanco     := {}
Local aSacado     := {}
Local aVlBol    := {}

// No máximo 8 elementos com 80 caracteres para cada linha de mensagem
Local aBolTxt := {"","","","","","","",""}
Local nSaldo   := 0
Local nLoop    := 0
Local cNumCta := ""
Local cChvSA6 := ""
Local cChvSEE := ""
Local cNmPDF   := ""
Local lGerBor := .F.

Local oPrint
Private nNumPag   := 1
Private lBx       := .F.
Private cDirGer   := AllTrim(mv_par24) + IIf(Substr(AllTrim(mv_par24),Len(AllTrim(mv_par24)),1) == "\","","\")
Private cNumBor   := IIf(mv_par25 == 1,Soma1(GetMV("MV_NUMBORR"),6),0)
Private cBanco    := ""
Private cCmpLv    := ""
Private cNN       := ""
Private cCart     := ""
Private cNNum     := ""
Private cConvenio := ""
Private cLogo     := ""
Private nDesc     := 0
Private nJurMul   := 0
Private nRow      := 0
Private nCols     := 0
Private nWith     := 0

// --- nTpImp = Tipo da impressão: 2 - Spool ou 6 - PDF (envio de e-mail)
If ! nTpImp == 6 .and. ! cTpImpre == "2"
     nPosPDF := 0
     oPrint:= TMSPrinter():New("Boleto Laser")
     oPrint:SetPortrait()                                        // ou SetLandscape()
     oPrint:StartPage()                                             // Inicia uma nova página
     oPrint:Setup()
   elseIf cTpImpre == "2"                               // Saida em PDF
        If cGerArq == "1"
           nPosPDF := 25

          // Nome do PDF: "Bol_" + Codigo Cliente + Loja Cliente + Banco + Prefixo + Titulo
           cNmPDF := "Bol_" + Substr(aSacado[2],1,TamSX3("A1_COD")[1]) + "_" +;
                      Substr(aSacado[2],(TamSX3("A1_COD")[1] + 2),TamSX3("A1_LOJA")[1]) +;
                      "_" + mv_par19 + "_" + AllTrim(aTitulos[01][03]) +;
                      "_" + AllTrim(aTitulos[01][04]) + "_TODAS"
          // --------------------------------------------------

           oPrint := FwMSPrinter():New(cNmPDF,6,.T.,cDirGer,.T.,.F.,,,,.T.,,.F.)
           oPrint:SetResolution(72)
           oPrint:SetMargin(5,5,5,5)
           oPrint:SetPortrait()                                        // ou SetLandscape()
        EndIf
EndIf

// Fazer pergunta de Centimetro ou Polegada

nTipo := 1 /* Aviso(     "Impressão",;
          "Escolha o método de impressão.",;
          {"&Centimetro","&Polegada"},,;
          "A T E N Ç Ã O" ) */

SetRegua(Len(aTitulos))

cNumBor := Replicate("0",6-Len(Alltrim(cNumBor))) + Alltrim(cNumBor)

While ! MayIUseCode("SE1"+xFilial("SE1")+cNumBor)      // verifica se esta na memoria, sendo usado
     // busca o proximo numero disponivel
     cNumBor := Soma1(cNumBor)
EndDo

// Faz loop no array com os títulos a serem impressos
For nLoop := 1 To Len(aTitulos)
      IncRegua("Titulo: "+aTitulos[nLoop,02]+"/"+aTitulos[nLoop,03]+"/"+aTitulos[nLoop,04])

      // Se estiver marcado, imprime
      If aTitulos[nLoop,01]
        dbSelectArea("SE1")
        SE1->(dbGoTo(aTitulos[nLoop,18]))

        dbSelectArea("SA1")
        SA1->(dbSetOrder(1))
        SA1->(dbSeek(xFilial("SA1") + SE1->E1_CLIENTE + SE1->E1_LOJA))

        dbSelectArea("SA6")
        SA6->(dbSetOrder(1))

        If ! Empty(aTitulos[nLoop,02]) .and. mv_par23 == 2
            cChvSA6 := aTitulos[nLoop,02] + aTitulos[nLoop,19] + aTitulos[nLoop][20]
          else
            cChvSA6 := mv_par19 + mv_par20 + mv_par21
        EndIf

        If ! SA6->(dbSeek(xFilial("SA6") + cChvSA6))
            Aviso("Emissão do Boleto","Banco não localizado no cadastro!",{"&Ok"},,;
                  "Banco: " + SubStr(cChvSA6,1,3) + "/" + SubStr(cChvSA6,4,5) + "/" + SubStr(cChvSA6,9,10))
            Loop
        EndIf

          //Posiciona na Configuração do Banco
        dbSelectArea("SEE")
        SEE->(dbGoTop())
        SEE->(dbSetOrder(1))

        If ! Empty(aTitulos[nLoop,02])
            cChvSEE := aTitulos[nLoop,02] + aTitulos[nLoop,19] + aTitulos[nLoop][20] + aTitulos[nLoop][21]
          else
            cChvSEE := mv_par19 + mv_par20 + mv_par21 + mv_par22
        EndIf

        If ! SEE->(dbSeek(xFilial("SEE") + cChvSEE))
            Aviso("Emissão do Boleto",     "Configuração dos parâmetros do banco não localizado no cadastro!",;
                         {"&Ok"},,"Banco: " + Substr(cChvSEE,1,3) + "/" + SubStr(cChvSEE,4,5) + "/" +;
                         SubStr(cChvSEE,9,10) + "/" + SubStr(cChvSEE,19,3))
            Loop
          else
            cLogo   := AllTrim(SEE->EE_XLOGO)
            aLinDig := {}

            aAdd(aLinDig, AllTrim(SEE->EE_XNNUM))     // Formatação do Nosso Numero
            aAdd(aLinDig, AllTrim(SEE->EE_XDGNN))     // Formatação para calculo no digito do nosso numero
            aAdd(aLinDig, AllTrim(SEE->EE_XMTNN))     // Montagem do Nosso Numero para o boleto
            aAdd(aLinDig, AllTrim(SEE->EE_XCRN1))     // Formatação da primeiro parte
            aAdd(aLinDig, AllTrim(SEE->EE_XCRN2))     // Formatação da segunda parte
            aAdd(aLinDig, AllTrim(SEE->EE_XCRN3))     // Formatação da terceira parte
            aAdd(aLinDig, AllTrim(SEE->EE_XCRN4))     // Formatação da quarta parte
            aAdd(aLinDig, AllTrim(SEE->EE_XCPLV))     // Formatação para Campo livre com digito
        EndIf

        dbSelectArea("SE1")
        cNumCta := IIf(AllTrim(SA6->A6_COD) == "237",StrZero(Val(AllTrim(SA6->A6_NUMCON)),7),AllTrim(SA6->A6_NUMCON))

        aBanco := {AllTrim(SA6->A6_COD),;                                                             // [01] Numero do Banco
                    SA6->A6_NREDUZ,;                                                                   // [02] Nome do Banco
                    IIf(Len(AllTrim(SA6->A6_AGENCIA)) < 4,StrZero(Val(AllTrim(SA6->A6_AGENCIA)),4),;
                                                         AllTrim(SA6->A6_AGENCIA)),;                  // [03] Agência
                    cNumCta,;                                                                          // [04] Conta Corrente
                    SubStr(SA6->A6_DVCTA,At("-",SA6->A6_DVCTA)+1,1),;                                  // [05] Dígito da conta corrente
                    AllTrim(SEE->EE_CODCART),;                                                         // [06] Codigo da Carteira
                    SEE->EE_XDVBCO,;                                                                   // [07] Dígito do Banco
                    SA6->A6_DVAGE,;                                                                    // [08] Digito da Agência
                    IIf(AllTrim(SA6->A6_COD) $ ("341/104"),AllTrim(SEE->EE_CODEMP),StrZero(Val(SEE->EE_CODEMP),7)),;// [09] Convêncio com o Banco
                    IIf(SEE->EE_TPCOBRA == "1",;
                      IIf(AllTrim(SA6->A6_COD) $ "104/033",AllTrim(SEE->EE_TIPCART),AllTrim(SEE->EE_CODCART)),"SR")}// [10] Tipo da Carteira

               If Empty(SA1->A1_ENDCOB)
                    aSacado := {AllTrim(SA1->A1_NOME),;                                               // [1] Razão Social
                                AllTrim(SA1->A1_COD ) + "-" + SA1->A1_LOJA,;                 // [2] Código
                                AllTrim(SA1->A1_END ) + " - " + AllTrim(SA1->A1_BAIRRO),;    // [3] Endereço
                                AllTrim(SA1->A1_MUN ),;                                      // [4] Cidade
                                SA1->A1_EST,;                                                // [5] Estado
                                SA1->A1_CEP,;                                                // [6] CEP
                                SA1->A1_CGC,;                                                // [7] CGC
                                SA1->A1_PESSOA}                                              // [8] PESSOA

                else
                    aSacado := {AllTrim(SA1->A1_NOME),;                                        // [1] Razão Social
                                AllTrim(SA1->A1_COD ) + "-" + SA1->A1_LOJA,;                   // [2] Código
                          AllTrim(SA1->A1_ENDCOB) + " - " + AllTrim(SA1->A1_BAIRROC),;   // [3] Endereço
                          AllTrim(SA1->A1_MUNC),;                                        // [4] Cidade
                          SA1->A1_ESTC,;                                                 // [5] Estado
                          SA1->A1_CEPC,;                                                 // [6] CEP
                          SA1->A1_CGC,;                                                  // [7] CGC
                          SA1->A1_PESSOA}                                                // [8] PESSOA
               Endif

          // Define o valor do título considerando Acréscimos e Decréscimos
             aVlBol := U_fnSldBo(SE1->E1_PREFIXO,SE1->E1_NUM,SE1->E1_PARCELA,SE1->E1_CLIENTE,SE1->E1_LOJA)
           nSaldo := aVlBol[01]               // Valor do documento
           nJurMul := aVlBol[03]               // Valor de Mora/Multa (Acréscimos)
           nDesc   := aVlBol[04]               // Valor do desconto (Decréscimos)

          // Define o Nosso Número
               If ! Empty(SE1->E1_NUMBCO) .and. mv_par23 == 2
                    cNNum     := Substr(AllTrim(SE1->E1_NUMBCO),1,(len(Alltrim(SE1->E1_NUMBCO)) - 1))
                    bRetImp := .T.
                else
              bRetImp := .F.
              cNNum   := AllTrim(SEE->EE_FAXATU)

                    dbSelectArea("SEE")
                    RecLock("SEE",.F.)
                     Replace SEE->EE_FAXATU with Soma1(Alltrim(SEE->EE_FAXATU),11)
                    SEE->(MsUnLock())
               EndIf

               dbSelectArea("SE1")

           // ---- Monta codigo de barras
          aCB_RN_NN := Ret_cBarra(Subs(aBanco[1],1,3),;               // [01]-Banco+Fixo 9
                                  aBanco[3],;                              // [02]-Agencia
                                  aBanco[4],;                             // [03]-Conta
                                  aBanco[5],;                              // [04]-Digito Conta
                                  aBanco[6],;                              // [05]-Carteira
                                  cNNum,;                                   // [06]-Nosso Número
                                  nSaldo,;                              // [07]-Valor do Título
                                  SE1->E1_VENCTO,;             // [08]-Vencimento
                                  aBanco[9],;                  // [09]-Convêncio
                                  SEE->EE_XMODELO,;            // [10]-Modulo para calculo do digito verificador do Nosso Número
                                  SEE->EE_XPESO)               // [11]-Peso para calcular o digito do nosso número modulo 11

          dbSelectArea("SE1")

          aDadTit := {AllTrim(E1_NUM) + IIf(Empty(E1_PARCELA),"","/" + E1_PARCELA),; // [01] Número do título
                      E1_EMISSAO,;                                                    // [02] Data da emissão do título
                      dDataBase,;                                                     // [03] Data da emissão do boleto
                      E1_VENCTO,;                                                     // [04] Data do vencimento
                      nSaldo,;                                                        // [05] Valor do título
                      aCB_RN_NN[3],;                                                  // [06] Nosso número (Ver fórmula para calculo)
                      E1_PREFIXO,;                                                    // [07] Prefixo da NF
                      SEE->EE_X_ESPDC,;                                               // [08] Tipo do Titulo
                      E1_HIST,;                                                       // [09] HISTORICO DO TITULO
                      aCB_RN_NN[4],;                                                  // [10] Nosso numero para gravação na "SE1"
                      SEE->EE_XLOCPG}                                                 // [11] Mensagem de Local de Pagamento

               aBolTxt := {"","","","","","","",""}

          If SEE->EE_X_MULTA > 0
             aBolTxt[1] := "Multa de R$ " + Alltrim(Transform(((aDadTit[5] * SEE->EE_X_MULTA) / 100),"@E 999.99")) + " após o vencimento."
          EndIf

          If SEE->EE_X_JURME > 0
             aBolTxt[2] := "Juros de R$ " + AllTrim(Transform(((aDadTit[5] * SEE->EE_X_JURME) / 100),"@E 999.99")) + " ao dia."
          EndIf

          If Val(SEE->EE_DIASPRT) > 0
             aBolTxt[3] := "Título sujeito a protesto após " + SEE->EE_DIASPRT + " dias de vencimento."
          EndIf

          //Adicionado por Raphael Neves
          If aVlBol[05] > 0
             aBolTxt[4] := "Valor do Desconto até o vencimento R$ " + AllTrim(Transform(aVlBol[05],"@E 999,999,999.99"))
          EndIf

          If ! Empty(Alltrim(SEE->EE_FORMEN1))
             aBolTxt[5] := Substr(AllTrim(&(SEE->EE_FORMEN1)),2,(Len(AllTrim(&(SEE->EE_FORMEN1))) - 2))
          EndIf

          If ! Empty(Alltrim(SEE->EE_FORMEN2))
             aBolTxt[6] := Substr(AllTrim(SEE->EE_FORMEN2),2,(Len(AllTrim(SEE->EE_FORMEN2)) - 2))
          EndIf

          If ! Empty(Alltrim(SEE->EE_FOREXT1))
             aBolTxt[7] := SubStr(AllTrim(SEE->EE_FOREXT1),2,(Len(AllTrim(SEE->EE_FOREXT1)) - 2))
          EndIf

          If ! Empty(Alltrim(SEE->EE_FOREXT2))
                aBolTxt[8] := SubStr(AllTrim(SEE->EE_FOREXT2),2,(Len(AllTrim(SEE->EE_FOREXT2)) - 2))
          EndIf

           // Sempre Incremento a mensagem de não receber após vencimento
        // aBolTxt[8]     := "SR. CAIXA, NÃO RECEBER APÓS O VENCIMENTO"

        // Valida se é impressão em PDF para envio de E-mail ou impressão somente PDF
          If nTpImp == 6 .or. cTpImpre == "2"
             If cGerArq == "2"
               nPosPDF := 25

               // Nome do PDF: "Bol_" + Codigo Cliente + Loja Cliente + Banco + Prefixo + Titulo + Parcela
               cNmPDF := "Bol_" + Substr(aSacado[2],1,TamSX3("A1_COD")[1]) + "_" +;
                          Substr(aSacado[2],(TamSX3("A1_COD")[1] + 2),TamSX3("A1_LOJA")[1]) +;
                          "_" + mv_par19 + "_" + AllTrim(aTitulos[nLoop,3]) +;
                          "_" + AllTrim(aTitulos[nLoop,4]) + "_" + AllTrim(aTitulos[nLoop,5])
               // --------------------------------------------------

               oPrint := FwMSPrinter():New(cNmPDF       ,6      ,.T.,cDirGer    ,.T.,.F.,,,,.T.,,.F.)
               oPrint:SetResolution(72)
               oPrint:SetMargin(5,5,5,5)

               oPrint:SetPortrait()                                        // ou SetLandscape()
                                        
             
             EndIf
               
           ---> oPrint:StartPage()
            
             If mv_par26 == 1
               fnImprRd(oPrint,aEmpresa,aDadTit,aBanco,aSacado,aBolTxt,aCB_RN_NN,cNNum)     // Impressão boleto reduzido
             else
               fnImpres(oPrint,aEmpresa,aDadTit,aBanco,aSacado,aBolTxt,aCB_RN_NN,cNNum)     // Impressão boleto completo
             EndIf

             If cTpImpre == "1"      // Se não for direito PDF
               oPrint:EndPage()     // Finaliza a página
               oPrint:Preview()     // Visualiza antes de imprimir
               FreeObj(oPrint)      // Destruir objeto
             EndIf
           else
             oPrint:StartPage()

             If mv_par26 == 1
               fnImprRd(oPrint,aEmpresa,aDadTit,aBanco,aSacado,aBolTxt,aCB_RN_NN,cNNum)     // Impressão boleto reduzido
              else
               fnImpres(oPrint,aEmpresa,aDadTit,aBanco,aSacado,aBolTxt,aCB_RN_NN,cNNum)     // Impressão boleto completo
             EndIf
          EndIf
           // -----------------------------------------------

          dbSelectArea("SE1")
          SE1->(dbGoTo(aTitulos[nLoop,18]))

          Reclock("SE1",.F.)
                Replace SE1->E1_PORTADOR with mv_par19
                Replace SE1->E1_AGEDEP   with mv_par20
                Replace SE1->E1_CONTA    with mv_par21
                Replace SE1->E1_XSUBCTA with mv_par22
          SE1->(MsUnlock())

        // ---- Geração de Bordero
          If mv_par23 <> 2 .and. mv_par25 == 1
             cNumBor := Replicate("0",6-Len(Alltrim(cNumBor))) + Alltrim(cNumBor)

             While ! MayIUseCode("SE1" + xFilial("SE1") + cNumBor)      // verifica se esta na memoria, sendo usado
                // busca o proximo numero disponivel
                 cNumBor := Soma1(cNumBor)
             EndDo

             fnGrvBrd()

             PutMv("MV_NUMBORR", cNumBor)

             lGerBor := .T.
          EndIf
        // ------------------------
          EndIf
Next

If lGerBor
     Aviso("ATENÇÃO","Bordero - " + cNumBor + " gerado com sucesso...",{"OK"})
EndIf

If ! nTpImp == 6 .and. ! cTpImpre == "2"
     oPrint:EndPage()     // Finaliza a página
     oPrint:Preview()     // Visualiza antes de imprimir
   elseIf ! cTpImpre == "2"
          MsAguarde({|| U_fnEnvBo(aTitulos)},"Enviando boleto(s) por e-mail...",SM0->M0_FILIAL)
        elseIf cTpImpre == "2"   // --- Gravar boleto em PDF
               cFilePrint := cDirGer + "BOL_" + Substr(aSacado[2],1,TamSX3("A1_COD")[1]) +;
                             SubStr(aSacado[2],(TamSX3("A1_COD")[1] + 1),TamSX3("A1_LOJA")[1]) + "_" + DToS(aDadTit[4]) + ".PD_"
               File2Printer(cFilePrint,"PDF")
               oPrint:cPathPDF := cDirGer
               oPrint:EndPage()     // Finaliza a página
               oPrint:Preview()     // Visualiza antes de imprimir
               FreeObj(oPrint)      // Destruir objeto
EndIf
Return(Nil)

/*------------------------------------
-- Função: Impressão dos dados.    --
--                                  --
--------------------------------------*/

Mensagem do Enviar e-mail Abrir o Perfil do usuário DON.JUNIOR DON.JUNIOR em 10/07/2019, 21:34 h
Local: RJ  Registro: 24/01/2016  Postagens: 124
Você esta declarando oPrint, mas ele só é instanciado dentro do If ElseIf; provavelmente seu If/ElseIf está falhando, e não esta criando o objeto, mais na frente (linha do erro) esta tentando acesso ao objeto que ainda não foi criado, gerando o erro... No "olhometro" foi isso que identifiquei!


Att.
Don Junior

Foto
Mensagem do Enviar e-mail Abrir o Perfil do usuário NETOTOTVS NETOTOTVS em 10/07/2019, 22:40 h
Local: PE  Registro: 29/01/2019  Postagens: 16
Mestre Don Junior, mais uma vez muito obrigado, hoje no final do dia cheguei a essa conclusão, consegui resolver, agora surgiu outro problema mas estou aguardando o envio de um fonte que fizeram e não me passaram.

Em todo caso muito obrigado.

Foto
Mensagem do Enviar e-mail Abrir o Perfil do usuário NILSILVA NILSILVA em 19/07/2019, 17:36 h
Local: SP  Registro: 15/07/2019  Postagens: 2
Boa tarde @NETOTOTVS,

Estou precisando deste fonte, teria como voce me enviar.

Ficaria agradecido

niltonpsilva1994@gmail.com

Para postar no Fórum você precisa efetuar o seu login ou se registrar

 Mudar para Fórum

 

 

 
 
   
Pagina Principal Shopping PROTHEUS Tire suas duvidas Vagas Microsiga em todo Brasil Aprofunde seus conhecimentos Noticias Online Fale Conosco Pagina Principal