Jump to content
Fivewin Brasil

Ariston Santos

Membros
  • Posts

    500
  • Joined

  • Last visited

  • Days Won

    11

Posts posted by Ariston Santos

  1.  

    Muito legal esse FolderEx. 

    Troquei o oFld:SetPrompts({...}) por oFld:aPrompts[n] e funcionou.

    Só tem um probleminha: - Quando se tem "REDEFINE CHECKBOX oChk" ou "REDEFINE RADIO oRad" dentro de uma FolderEx e você em algum momento precisa dar um oChk:Enable() / oRad:Enable() ele bagunça boa parte dos outros campos da folder. Isso só acontece se você utiliza algum tema do windows. Se for Windows Clássico não apresenta esse problema.

    Alguém mais notou isso?

     

     

    Tente um Refresh() no folderex ao clicar:

       REDEFINE CHECKBOX oBox VAR lVar ID nId OF oFld:aDialogs[n] ON CHANGE oFld:aDialogs[n]:Refresh()

     

  2. E-mail via ACBrMonitor, para quem interessar.

    Testei e funcionou com Hotmail e GMail. GMail precisa autorizar, conforme já orientado.

     

          cMailIni := 'EMAIL.Novo("[EMAIL]'+CRLF
          cMailIni += 'NomeExibicao='+ALLTRIM(_cUser)+CRLF
          cMailIni += 'Endereco='+Alltrim(_cRemt)+CRLF
          cMailIni += 'Email='+Alltrim(cServ)+CRLF
          cMailIni += 'Usuario='+Alltrim(_cRemt)+CRLF
          cMailIni += 'Senha='+Alltrim(cPass)+CRLF
          cMailIni += 'Porta='+AllTrim(Str(nPort))+CRLF
          cMailIni += 'ExigeSSL='+IIF(!lSSL,'0','1')+CRLF // 0=Não, 1=Sim
          cMailIni += 'ExigeTLS='+IIF(!lTLS,'0','1')+'")' // 0=Não, 1=Sim
          cArqIni := GetCurDir()+"\tempdir\remetente.ini"
          IF FILE(cArqIni) ; FERASE(cArqIni) ; ENDIF
          IF ! FileWrite(cArqIni,cMailIni) ; RETURN .F. ; ENDIF
          IF ! ACBrMail_Novo(cArqIni) ; RETURN .F. ; ENDIF
          IF ! ACBrMail_AdicPara(cDest) ; RETURN .F. ; ENDIF
          IF ! ACBrMail_Assunto(TiraAcentos(AllTrim(cSubject))) ; RETURN .F. ; ENDIF
          IF ! ACBrMail_UsarHTML() ; RETURN .F. ; ENDIF
          IF ! ACBrMail_Mensagem(TxtToHtml(cSubject, cTxt)) ; RETURN .F. ; ENDIF // Em HTML
       /* IF ! ACBrMail_MsgTexto(cTxt) ; RETURN .F. ; ENDIF // Em texto puro */
          if len(aAttach) > 0
             For x := 1 To Len( aAttach )
       		    if aAttach[x] <> NIL
                    IF ! ACBrMail_Anexo(AllTrim(aAttach[x])) ; RETURN .F. ; ENDIF
       			 endif
             Next
          EndIf
          IF ! ACBrMail_Enviar(cTxt) ; RETURN .F. ; ENDIF
          Return .T.

    Funcões

    *-----------------------------------------------------------------------------*
    *  Programa: ACBrMail.prg                                                     *
    *  Funcao..: FUNCAO AcbrMonitor/E-mail                        Em: 30/04/2018  *
    *  Programador...: Ariston Santos                                             *
    *  Skype.........: ariston.ap                                                 *
    *  suporte@arsoft-ap.com.br                                                   *
    *  www.arsoft-ap.com.br                                                       *
    *-----------------------------------------------------------------------------*
    
    #include "fivewin.ch"
    #include "fileio.ch"
    
    ////////////////////////////////////////////////////////////////////////////////
    FUNCTION ACBrMail_Novo(_File_)
       cCmd := _File_
       IF ! MAIL_Comando("EMAIL.Novo", ["]+cCmd+["]) ; RETURN .F. ; ENDIF
    RETURN(.T.)
    ////////////////////////////////////////////////////////////////////////////////
    FUNCTION ACBrMail_UsarHTML()
       cCmd := "1"
       IF ! MAIL_Comando("EMAIL.UsarHTML", ["]+cCmd+["]) ; RETURN .F. ; ENDIF
    RETURN(.T.)
    ////////////////////////////////////////////////////////////////////////////////
    FUNCTION ACBrMail_Confirma(lCfrm) // Solicitar confirmação que leu a mensagem
       cCmd := IIF(lCfrm, "1", "0")
       IF ! MAIL_Comando("EMAIL.ConfirmarLeitura", ["]+cCmd+["]) ; RETURN .F. ; ENDIF
    RETURN(.T.)
    ////////////////////////////////////////////////////////////////////////////////
    FUNCTION ACBrMail_AdicPara(_Para_)
       cCmd := AllTrim(_Para_)
       IF ! MAIL_Comando("EMAIL.AdicionaPara", ["]+cCmd+["]) ; RETURN .F. ; ENDIF
    RETURN(.T.)
    ////////////////////////////////////////////////////////////////////////////////
    FUNCTION ACBrMail_Assunto(_Titulo_)
       cCmd := AllTrim(_Titulo_)
       IF ! MAIL_Comando("EMAIL.Assunto", ["]+cCmd+["]) ; RETURN .F. ; ENDIF
    RETURN(.T.)
    ////////////////////////////////////////////////////////////////////////////////
    FUNCTION ACBrMail_Mensagem(_Texto_) // Em formato de HTML
       cCmd := AllTrim(_Texto_)
       IF ! MAIL_Comando("EMAIL.TextoMensagem", ["]+cCmd+["]) ; RETURN .F. ; ENDIF
    RETURN(.T.)
    ////////////////////////////////////////////////////////////////////////////////
    FUNCTION ACBrMail_MsgTexto(_Texto_) // Não em formato de texto
       cCmd := AllTrim(_Texto_)
       IF ! MAIL_Comando("EMAIL.TextoAlternativo", ["]+cCmd+["]) ; RETURN .F. ; ENDIF
    RETURN(.T.)
    ////////////////////////////////////////////////////////////////////////////////
    FUNCTION ACBrMail_Anexo(_File_)
       cCmd := AllTrim(_File_)
       IF ! MAIL_Comando("EMAIL.AdicionaAnexo", ["]+cCmd+["]) ; RETURN .F. ; ENDIF
    RETURN(.T.)
    ////////////////////////////////////////////////////////////////////////////////
    FUNCTION ACBrMail_Enviar()
       IF ! MAIL_Comando("EMAIL.Enviar") ; RETURN .F. ; ENDIF
    RETURN(.T.)
    ////////////////////////////////////////////////////////////////////////////////
    function MAIL_Comando( cIndice, cDados )
       LOCAL ret_line := "chr(13)+chr(10)", cRetCmd := "", c_Ende := ""
       LOCAL lReturn := .T.
       LOCAL cTcpIp := "1"
    
       // Checar se o ACBR está instalado...
       IF ! lIsDir(cACBrFld)
          SysRefresh() ; MsgInfo("O ACBrMonitor não está instalado", "Aviso")
          RETURN(.F.)
       ENDIF
    
       cTcpIp := GetPvProfString( "ACBrMonitor", "Modo_TCP", " ", cACBrFld+"\ACBrMonitor.ini")
       cIsTxt := GetPvProfString( "ACBrMonitor", "Modo_TXT", " ", cACBrFld+"\ACBrMonitor.ini")
       c_Gate := GetPvProfString( "ACBrMonitor", "TCP_Porta", "3434", cACBrFld+"\ACBrMonitor.ini")
    
       IF cTcpIp = "1" ; c_Ende := "127.0.0.1:"+c_Gate ; ENDIF
       IF cIsTxt = "1" ; c_Ende := cACBrFld ; ENDIF
       IF EMPTY(c_Ende) ; MSGINFO("Detectado erro de configuração no ACBrMonitor", "Aviso - "+ProcName()+"("+AllTrim(Str(ProcLine()))+") Informe ao Suporte Técnico"); RETURN .F. ; ENDIF
       errfile  := "ENT.CMD"
       cDados   := iif(ValType(cDados)#"C","",cDados)
       cBuffer := cIndice + iif( len( cDados )=0,"()","(" + cDados + ")")
    
       IF cIsTxt = "1"
    
          errhandle := FCREATE(errfile)
          FWRITE(errhandle,cBuffer+&ret_line.)
          FCLOSE(errhandle)
          FERASE( cACBrFld+"\ENT.TXT" )
          FERASE( cACBrFld+"\SAI.TXT" )
          COPY FILE &(errfile) TO &(cACBrFld+"\"+errfile)
          FRENAME( cACBrFld+"\"+errfile, cACBrFld+"\ENT.TXT" )
    
       ELSEIF cTcpIp = "1"
    
       	TRY
          	IF ! ACBR_INIT(c_Ende) // De ACBRBOL.PRG
       	   	ACBR_END() // De ACBRBOL.PRG
          		SysRefresh() ; MsgAlert("Erro ao tentar abrir a porta de comunicação!","Aviso!")
    				lReturn := .F.
    	   	ENDIF
    	   CATCH
    		END
    
    		IF !lReturn ; RETURN(.F.) ; ENDIF
    
          SysRefresh()
          IF ! ACBR_ABERTA() ; RETURN .F. ; ENDIF // De ACBRBOL.PRG
    
          SysRefresh()
          cRetCmd := ACBR_COMANDO( cBuffer ) // No ACBRBOL.PRG
          ACBR_END() // De ACBRBOL.PRG
          IF "ERRO:" $ cRetCmd
             SysRefresh() ; MsgAlert(cRetCmd,"Erro!")
             RETURN(.F.)
          ENDIF
       ENDIF
    RETURN(.T.)
    FUNCTION TxtToHtml(cTit, cTxt)
       LOCAL c_Html := ""
       c_Html := AllTrim("<!DOCTYPE html>")
       c_Html += AllTrim("<html>")
       c_Html += AllTrim("   <head>")
       c_Html += AllTrim("      <title>"+TiraAcentos(AllTrim(cTit))+"</title>")
       c_Html += AllTrim("   </head>")
       c_Html += AllTrim("   <body>")
       c_Html += AllTrim("      "+StrTran(TiraAcentos(AllTrim(cTxt)),CRLF,"<br/>"))
       c_Html += AllTrim("   </body>")
       c_Html += AllTrim("</html>")
    RETURN c_Html
    FUNCTION TiraAcentos(cStr)
       LOCAL cStrNew := "", nX, aAcento, aLetras
       aAcento := {"ã","Ã","Æ","Â"," ","µ","…","·","‚","","ˆ","Ò","¡","Ö","¢","à","ä","å","“","â","£","é","","š","á","Á","à","À","é","É","ê","Ê","í","Í","ó","Ó","õ","Õ","ô","Ô","ú","Ú","ü","Ü","ù","ç","‡","Ç","€","§","¦","º","°","ª","ƒ"}
       aLetras := {"a","A","a","A","a","A","a","A","e","E","e","E","i","I","o","O","o","O","o","O","u","U","u","U","a","A","a","A","e","E","e","E","i","I","o","O","o","O","o","O","u","U","u","U"," ","c","c","C","C",".",".",".",".",".", ""}
       FOR nX := 1 TO LEN(aAcento)
           cStrNew := STRTRAN(cStr,aAcento[nX],aLetras[nX])
           cStr := cStrNew
    
       NEXT
       IF EMPTY(cStrNew) ; cStrNew := cStr ; ENDIF
    RETURN(cStrNew)

     

  3. É verdade. Hoje a pergunta "em que linguagem você programa?" está quase sem sentido. Eu, por exemplo:

    - Para desktop uso Fivewin / xHarbour / Bcc / Workshop / ACBrMonitorPLUS / Inno Setup.

    - Para web uso Html / Html5 / Php / CSS / Javascript.

    - Para Mobile uso Basic 4 Andriod.

    - Como banco de dados uso DBFCDX / MySQL / SQLLite / Firebird (e em breve MariaDB).

    - Ainda tem os que não são linguagem programação, mas estruturas para transporte de dados na web, como XML e JSON.

    Creio que a maioria dos colegas aqui também conhecem e usam essas e ainda outras linguagens.

    Enfim, programador hoje tem que saber, não uma linguagem, mas PROGRAMAR!

  4.  

    Para quem ainda esta em DBF e tem problema de lentidão, perca dois dias apenas em busca aqui no forum sobre ADS, eu nunca entendi o pq do pessoal não usar, lembro que em 2009 ia perder clientes potencias por problema de lentidão em rede com relatorios, alguns chegava a levar ate 15 minutos, com o ADS caiu para coisa de segundos, as mudança nos codigo fonte são retículas de tão simples. o desempenho é mesma coisa se tiver usando banco de dados relacional.

     

    Luiz Fernando

    Amigo, poste um prg simples, demonstrando como fazer um cadastro usando ADS.

    Ah! E o link para a gente baixar o ADS.

    Pode ser?

  5.  

    E o custo da licença?

    Não tive custo.

    Windows Server 2012 RT parece que já vem com licença para 25 usuários via TS, basta saber configurar.

    Para Windows XP e 7 (recomento do 7 profissional) tem Patch e vídeos no Youtube ensinando a fazer:

     

  6. Também sofri muito com isso. Hoje, quando o sistema começa a ficar lento em rede, mudo para TS (Terminal Service). Tem como fazer até com Windows XP e 7, mas com Windows Server 2012 fica bem melhor.

    Vantagens:

    1 - O sistema fica só no servidor, portanto a velocidade de processamento será sempre a mesma para todos os usuários;

    2 - Não tem problema de corrompimento de dados (índices) por falha da rede porque o fluxo fica só no servidor;

    3 - Não há perda de desempenho, não importa quantos usuários estejam usando o sistema ao mesmo tempo.

    Detalhe: Esta dica eu encontrei aqui, neste fórum. Apliquei e tô feliz. :D

  7. STATIC FUNCTION BolRetorno()
       ACBR_Pegar_Retorno()
    RETURN NIL
    ////////////////////////////////////////////////////////////////////////////////    
    Function ACBR_Pegar_Retorno()  
       LOCAL cRetDir := GetPvProfString("BOLETO", "DirArquivoRetorno", "", cACBrFld+"\"+cACBrIni), nSlc := SELECT()
       LOCAL lLerRet := GetPvProfString("BOLETO", "LerCedenteRetorno", "0", cACBrFld+"\"+cACBrIni)
       LOCAL aFiles    := ""
       LOCAL cLinha    := ""
       LOCAL aRetorno  := {}
       LOCAL oTxt, nRat
       LOCAL cF_ini := ALLTRIM(GetPvProfString( "ACESSOS", "ACBrIniFi", " ", ".\siscom.ini"))
       IF FILE(cF_ini) ; ACBr_Ler_Ini(cF_Ini) ; ENDIF // Forçar leitura do arquivo .ini
    
       IF ! lIsDir( cRetDir )
    		SysRefresh() ; MsgAlert("Diretório Arquivo Retorno (DirArquivoRetorno) não definido no "+cACBrFld+"\"+cACBrIni, "Atenção")
    		RETURN(.f.)
       ENDIF
       IF lLerRet <> "1"
    		SysRefresh() ; MsgAlert("Ler Dados Cedente Retorno (LerCedenteRetorno) não habilitado no "+cACBrFld+"\"+cACBrIni, "Atenção")
    		RETURN(.f.)
       ENDIF
       
       USE BANCOS SHARED NEW
       ordListClear()
       OrdListAdd("BANCOS", "BANCOD", "BANNOM")
    
    	IF ! SelectBanco() // Posiciona no registro do Banco, caso existam vários.
    	   CLOSE BANCOS
    	   SELECT(nSlc)
    	   RETURN(.f.)
    	ENDIF
       
    	ACBR_GravaCedente()
    	
       CLOSE BANCOS
       SELECT( nSlc )
    
       IF FILE(cRetDir+"\Retorno.ini")
          IF fErase(cRetDir+"\Retorno.ini") = -1
          	MsgStop("Favor excluir o arquivo "+cRetDir+"\Retorno.ini"+" manualmente.","Atenção")
             RETURN(.F.)
          ENDIF
       ENDIF
       
       aFiles := cGetFile("Retornos(*.ret)|*.RET|Retornos(*.rst)|*.RST" ,"Selecione o Arquivo!", , cRetDir)
       IF EMPTY(ALLTRIM(aFiles))
       	MsgStop("ERRO na Abertura do Arquivo!","Atenção")
          RETURN(.F.)
       ENDIF
       cMD5ret := HB_MD5File(aFiles)
       IF RetJaProc( cMD5ret )
          nOpc := MyAlert("Arquivo já processado. O que gostaria de fazer?", {"Ver", "Porcessar", "Retornar"}, "Já processado")
          IF nOpc < 1 .OR. nOpc > 2 ; RETURN(.F.) ; ENDIF
          IF nOpc = 1 ; CntChkRet(aFiles) ; RETURN(.F.) ; ENDIF
       ENDIF
       
       cCmd           := ""
       //LIMPAR LISTA
       IF ! ACBR_BOL_Comando("BOLETO.LimparLista", ["]+cCmd+["] ) ; RETURN .F. ; ENDIF
        
       //CONFIGURAR CEDENTE
       cCmd       := cACBrFld+"\cedente.ini"
       IF ! ACBR_BOL_Comando("BOLETO.ConfigurarDados", ["]+cCmd+["] ) ; RETURN .F. ; ENDIF
    
       cCmd           := ""
       IF ! ACBR_BOL_Comando( "BOLETO.LimparLista", ["]+cCmd+["] ) ; RETURN .F. ; ENDIF
       
       nRat := Rat( "\", aFiles )
       cFld := Subs( aFiles, 1, nRat )
       cCmd := cFld+[","]+cFileName(aFiles)
       IF ! ACBR_BOL_Comando( "BOLETO.LerRetorno", ["]+cCmd+["] ) ; RETURN .F. ; ENDIF
       
       ACBR_END()
    
       SysWait(0.5) ; SysRefresh() // Dar tempo para o ACBr salvar o arquivo
       nTenta := 0
       WHILE ! FILE(cRetDir+"\Retorno.ini")
          SysWait(0.5) ; SysRefresh() // Dar tempo para o ACBr salvar o arquivo
          IF FILE(cRetDir+"\Retorno.ini") ; EXIT ; ENDIF
          nTenta ++ ; IF nTenta > 10 ; EXIT ; ENDIF // Não esperar mais que 5 segundos.
       END
    
       SysWait(0.5) ; SysRefresh() // Dar tempo para o ACBr salvar o arquivo
       IF ! FILE(cRetDir+"\Retorno.ini")
       	MsgStop("ERRO na leitura do Arquivo/Retorno!","Atenção")
          RETURN(.T.)
       ENDIF
    
       STORE "" TO ret_numerodoc, ret_nossonro, ret_id_ocorren, ret_nm_ocorren, ret_mot_rejeic
       STORE 0 TO ret_vltitulo, ret_vltaxa, ret_vlabatim, ret_vldesconto, ret_vljuros, ret_vlmulta, ret_vlpago
       STORE CTOD(" ") TO ret_dtvcto, ret_data, ret_dtocorrenc, ret_dtcredito
        
       oTxt := TTxtFile():New( cRetDir+"\Retorno.ini" )
       oTxt:Gotop()
       FOR i = 1 TO oTxt:RecCount() // oTxt:nTLines
         	cLinha := oTxt:cLine
          IF 	 AT("Vencimento=", cLinha) <> 0
          		 ret_dtvcto  	 := CTOD(Subs(cLinha,12,10))
          ELSEIF AT("DataDocumento=", cLinha) <> 0	
    				 // DataDocumento=FileDate(aFiles)
    		ELSEIF AT("NumeroDocumento=", cLinha) <> 0				
    				 ret_numerodoc  := ALLTRIM(Subs(cLinha,17,15))
    		ELSEIF AT("DataProcessamento=", cLinha) <> 0							
    				 ret_data  		 := CTOD(Subs(cLinha,19,10))
    		ELSEIF AT("NossoNumero=", cLinha) <> 0								
    				 ret_nossonro   := ALLTRIM(Subs(cLinha,13,17))
    		ELSEIF AT("ValorDocumento=", cLinha) <> 0											
    				 ret_vltitulo   := ConverteCartValor(Subs(cLinha,16,15))
    		ELSEIF AT("DataOcorrencia=", cLinha) <> 0														
    			 	 ret_dtocorrenc := CTOD(Subs(cLinha,16,10))
    		ELSEIF AT("DataCredito=", cLinha) <> 0																	
    				 ret_dtcredito  := CTOD(Subs(cLinha,13,10))
    		ELSEIF AT("ValorDespesaCobranca=", cLinha) <> 0																				
    				 ret_vltaxa     := ConverteCartValor(Subs(cLinha,22,15))
    		ELSEIF AT("ValorAbatimento=", cLinha) <> 0																							
    				 ret_vlabatim   := ConverteCartValor(Subs(cLinha,17,15))
    		ELSEIF AT("ValorDesconto=", cLinha) <> 0			
    				 ret_vldesconto := ConverteCartValor(Subs(cLinha,15,15))
    		ELSEIF AT("ValorMoraJuros=", cLinha) <> 0						
    				 ret_vljuros    := ConverteCartValor(Subs(cLinha,16,15))
    		ELSEIF AT("ValorIOF=", cLinha) <> 0									
    				 // ValorIOF=0            // 13
    		ELSEIF AT("ValorOutrasDespesas=", cLinha) <> 0												
    				 // ValorOutrasDespesas=0 // 14
    		ELSEIF AT("ValorOutrosCreditos=", cLinha) <> 0															
    				 ret_vlmulta := ConverteCartValor(Subs(cLinha,21,15))
    		ELSEIF AT("ValorRecebido=", cLinha) <> 0																		
    				 // ValorRecebido=237,61  // 16
    				 ret_vlpago := ConverteCartValor(Subs(cLinha,15,15))
    		ELSEIF AT("DescricaoTipoOcorrencia=", cLinha) <> 0
    				 ret_id_ocorren := Subs(cLinha,25,2)
    				 ret_nm_ocorren := Subs(cLinha,28,80)
                /* Tabela de ocorrências
                 Os códigos de movimento '06', '09' e '17' estão relacionados com a descrição C047-C. Domínio: 
                '02' = Entrada Confirmada 
                '03' = Entrada Rejeitada 
                '04' = Transferência de Carteira/Entrada 
                '05' = Transferência de Carteira/Baixa 
                '06' = Liquidação 
                '07' = Confirmação do Recebimento da Instrução de Desconto
                '08' = Confirmação do Recebimento do Cancelamento do Desconto
                '09' = Baixa 
                '11' = Títulos em Carteira (Em Ser) 
                '12' = Confirmação Recebimento Instrução de Abatimento 
                '13' = Confirmação Recebimento Instrução de Cancelamento Abatimento 
                '14' = Confirmação Recebimento Instrução Alteração de Vencimento 
                '15' = Franco de Pagamento 
                '17' = Liquidação Após Baixa ou Liquidação Título Não Registrado 
                '19' = Confirmação Recebimento Instrução de Protesto 
                '20' = Confirmação Recebimento Instrução de Sustação/Cancelamento de Protesto 
                '23' = Remessa a Cartório (Aponte em Cartório) 
                '24' = Retirada de Cartório e Manutenção em Carteira 
                '25' = Protestado e Baixado (Baixa por Ter Sido Protestado) 
                '26' = Instrução Rejeitada 
                '27' = Confirmação do Pedido de Alteração de Outros Dados 
                '28' = Débito de Tarifas/Custas */
    		ELSEIF AT("MotivoRejeicao", cLinha) <> 0
       	       ret_mot_rejeic := ALLTRIM(Subs(cLinha,15,80))
    				 AADD(aRetorno, {ret_dtvcto, ret_numerodoc, ret_data, ret_nossonro, ret_vltitulo, ret_dtocorrenc, ret_dtcredito,;
                                 ret_vltaxa, ret_vlabatim, ret_vldesconto, ret_vljuros, ret_vlmulta, ret_vlpago, ret_id_ocorren,;
                                 ret_nm_ocorren, ret_mot_rejeic})
                 STORE "" TO ret_numerodoc, ret_nossonro, ret_id_ocorren, ret_nm_ocorren, ret_mot_rejeic
                 STORE 0 TO ret_vltitulo, ret_vltaxa, ret_vlabatim, ret_vldesconto, ret_vljuros, ret_vlmulta, ret_vlpago
                 STORE CTOD(" ") TO ret_dtvcto, ret_data, ret_dtocorrenc, ret_dtcredito
    		ENDIF
    		oTxt:skip()
       NEXT
       oTxt:Close()
       
       IF LEN(aRetorno) > 0
          // Excluir qualquer registro referente ao arquivo .ret
          REMRET->(DBSELECTAREA())
          REMRET->(DBSETORDER(3))
          IF REMRET->(DBSEEK( cMD5ret ))
             WHILE ! REMRET->(EOF())
                IF REMRET->ITEM02 <> cMD5ret ; EXIT ; ENDIF
                TRY
                   REMRET->(RLOCK())
                   REMRET->(DBDELETE())
                   REMRET->(DBUNLOCK())
                CATCH oErr
                END
                REMRET->(DBSKIP())
             END
          ENDIF
          REMRET->(dbGoBottom())
          FOR nOc := 1 TO LEN(aRetorno)
             REMRET->(DBAPPEND())
             REPLACE REMRET->IDUNIC WITH GeraIdUnico()    // ID único (Salvo em vendas e itens de vendas)                         
             REPLACE REMRET->ITEM01 WITH aRetorno[nOc,02] // Número do documento
             REPLACE REMRET->ITEM02 WITH cMD5ret          // MD5 do arquivo .ret processado                                      
             REPLACE REMRET->ITEM03 WITH aRetorno[nOc,02] // Número do documento                                                  
             REPLACE REMRET->ITEM04 WITH aRetorno[nOc,14] // ID da ocorrência - Veja Tabela de ocorrências em ACBR_Pegar_Retorno()
             REPLACE REMRET->ITEM05 WITH aRetorno[nOc,15] // Descrição da ocorrência                                              
             REPLACE REMRET->ITEM06 WITH aRetorno[nOc,01] // Vencimento                                                           
             REPLACE REMRET->ITEM07 WITH aRetorno[nOc,03] // Data do processamento                                                
             REPLACE REMRET->ITEM08 WITH aRetorno[nOc,05] // Valor do documento                                                   
             REPLACE REMRET->ITEM09 WITH aRetorno[nOc,06] // Data da ocorrência                                                   
             REPLACE REMRET->ITEM10 WITH aRetorno[nOc,07] // Data do crédito                                                      
             REPLACE REMRET->ITEM11 WITH aRetorno[nOc,08] // Valor despesa cobrança                                               
             REPLACE REMRET->ITEM12 WITH aRetorno[nOc,09] // Valor do abatimento                                                  
             REPLACE REMRET->ITEM13 WITH aRetorno[nOc,10] // Valor do desconto                                                    
             REPLACE REMRET->ITEM14 WITH aRetorno[nOc,11] // Valor Mora Juros                                                     
             REPLACE REMRET->ITEM15 WITH aRetorno[nOc,12] // Valor Multa                                                          
             REPLACE REMRET->ITEM16 WITH aRetorno[nOc,13] // Valor Recebido                                                       
          NEXT
          REMRET->(dbGoTop())
          CntChkRet(aFiles)
       ELSE
          SysRefresh() ; MsgAlert("Arquivo de retorno sem ocorrências válidas","Aviso")
       ENDIF
       SELECT(nSlc)
    RETURN(.T.)

    Adapte à sua necessidade.

  8. Teste esta função. Use do mesmo modo que usa a MsgRun(...)

    function MyMsgRun( cCaption, cTitle, bAction )
    
         LOCAL oRunDlg, nWidth, uReturn, oRunBr, nLenCp
         DEFINE BRUSH oRunBr COLOR GetSysColor(5)
         DECLARE oGif
    
         DEFAULT cCaption := "Please, wait...",;
                 bAction  := { || WaitSeconds( 1 ) }
    
         IF ! EMPTY(cCaption)
            IF cTitle == NIL
               nLenCp := (Len( cCaption )*0.8)+13
            ELSE
               nLenCp := (Max( Len( cCaption ), Len( cTitle ) )*0.8)+13
            ENDIF   
         ELSE
            nLenCp := 13
         ENDIF
         IF cTitle == NIL
              DEFINE DIALOG oRunDlg ;
                   FROM 0,0 TO 7.0, nLenCp ;
                   STYLE nOr( DS_MODALFRAME, WS_POPUP ) ;
                   TRANSPARENT BRUSH oRunBr
         ELSE
              DEFINE DIALOG oRunDlg ;
                   FROM 0,0 TO 8.4, nLenCp ;
                   TITLE cTitle ;
                   STYLE DS_MODALFRAME ;
                   TRANSPARENT BRUSH oRunBr
         ENDIF
    
         oGif := NIL
         oRunDlg:bStart := {|| (oGif := TGif():New( oRunDlg, ".\bitmaps\loading.gif", 2, 2 ),;
                                SysRefresh(), uReturn := Eval( bAction, oRunDlg ), oRunDlg:End())}
    
         nWidth := oRunDlg:nRight - oRunDlg:nLeft
         oSay := NIL
         IF ! EMPTY(cCaption)
            @20, 55 SAY oSay PROMPT cCaption SIZE nWidth - 13, 16 PIXEL OF oRunDlg
         ENDIF
         ACTIVATE DIALOG oRunDlg CENTER ON PAINT IIF(oSay<>NIL,oSay:Refresh(),) // ;
                  // VALID (!GetKeyState( VK_ESCAPE ) .AND. !GetKeyState( VK_MENU )) // Não usar isso. Dá erro ao fechar a tela de cadastro de produtos com Alt F4.
         
    return uReturn

     

  9. Amigo, Isso está certo?

    Você define mImpressora como local atribuindo o valor de PrgGetName()

    Local nLinI:=0, nColI:=0, nLinF:=0, nColF:=0,mImpressora:=PrnGetName()

    .. mas em seguida atribui "etiqueta" a mIMPRESSORA.

    mIMPRESSORA:="etiqueta"

    Isso torna a primeira atribuição desnecessária e mIMPRESSORA terá sempre o valor "etiqueta". O problema é se a impressora não estiver com este nome em "Dispositivos e Impressoras", no Windows.

    Creio que o único problema está sendo o nome da impressora.

     

×
×
  • Create New...