Ir para conteúdo
  • Cadastre-se

dev botao

ACBrNFeMonitor com VB6


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

Recommended Posts

Pessoal,

Estou usando ACBrNFeMonitor no meu sistema em Clipper, sem problema, na época peguei um exemplo no forum do PC Toledo para fazer a leitura do retorno (SAINFE.TXT).

Agora estou fazendo no sitema que estou desenvolvendo em VB6, consigo fazer todas as comunicações com o Monitor, no envio do (ENTNFE.TXT), o problema está no retorno do (SAINFE.TXT).

Logo que mando o arquivo (ENTNFE.TXT) chamo a função que vai ler o arquivo (SAINFE.TXT), como há um pequeno delay, acaba dando um erro "PERMISSION DENIED".

Enquanto fica no laço While lFlag = False esperando o montior criar o arquivo de retorno acontece o erro.

Tem algum colega aqui no forum que desenvolve em VB6 que tenha passado por isso, ou saiba como eu faço para dar uma parada no processo entre o envio e a chamada da função que le o arquivo (SAINFE.TXT)?


Private Sub ButtonPlus1_Click()

Dim I As Long

On Error GoTo error


   If Dir(vPathMonitor & "\SAINFE.TXT") <> "" Then

      Kill vPathMonitor & "\SAINFE.TXT"


   End If

   Open vPathMonitor & "\ENTNFE.TXT" For Output As #1

   cConteudo = "NFe.EnviarEmail("

   cConteudo = cConteudo & Chr(34)

   cConteudo = cConteudo & "[email protected]"

   cConteudo = cConteudo & Chr(34) & ","

   cConteudo = cConteudo & Chr(34)

   cConteudo = cConteudo & "C:\ACBrNFeMonitor\Logs\41120613374035000132550010000001071167858305-nfe.xml"

   cConteudo = cConteudo & Chr(34) & ",1,,)"


   Print #1, cConteudo

   Close #1


   lFlag = False


   While lFlag = False

      If Dir(vPathMonitor & "\SAINFE.TXT") <> "" Then

         Call LeArquivo("SAINFE.TXT")


      End If


   Wend


   Exit Sub


error:

   MsgBox Err.Description


End Sub

Private Function LeArquivo(arquivo As String)

Dim vLinha As String, cMensagem As String, Ok As Boolean


   If Dir(vPathMonitor & "\" & arquivo) <> "" Then

      lFlag = True

      Open vPathMonitor & "\" & arquivo For Input As #1

      DoEvents


      Do While Not EOF(1)

         Line Input #1, vLinha

         If cMensagem <> "" Then

            cMensagem = cMensagem & vbCr & vLinha

            Exit Do


         End If


         If InStr(vLinha, "OK: Serviço em Operação") > 0 Then

            Exit Do


         End If


         If InStr(vLinha, "ERRO:") > 0 Then

            cMensagem = vLinha


         End If


         If InStr(vLinha, "OK: Email enviado com sucesso") > 0 Then

            cMensagem = vLinha


         End If


      Loop


      If cMensagem <> "" Then

         MsgBox cMensagem, , "Atenção!"


      End If

      Close #1


   End If


End Function

"Muitos são os planos no coração do homem, mas o que prevalece é o propósito do SENHOR." Pv 19.21

Link para o comentário
Compartilhar em outros sites

Aconteceu o mesmo comigo, mas uso C#.NET

procure no VB, ou na help do MSDN alguma função que tenha o mesmo papel de abrir o arquivo tipo um CanOpen, ou entao um CanDelete, CanWrite, sei la...

de qquer forma segue meu codigo abaixo:


        public static Boolean podeAbrirArquivo(String sPath)

        {

            Boolean bAbriu = false;

            Int32 i = 0;


            while (!bAbriu && i < 100000)

            {

                try

                {

                    i++;

                    FileStream fs = System.IO.File.Open(sPath, FileMode.Open, FileAccess.Read, FileShare.None);

                    fs.Flush();

                    fs.Dispose();

                    fs.Close();

                    bAbriu = true;

                }

                catch

                {

                }

            }


            return bAbriu;

        }

perceba que depois que o meu programa consegue abrir o arquivo ele fecha ele dando um flush, e ai eu tenho CERTEZA que posso usar o arquivo

Link para o comentário
Compartilhar em outros sites

Obrigado Igor,

Mas não achei nada parecido no VB6.

Fiz uma alteração na função, que funcionou, o problema é que se por algum motivo o arquivo sainfe.txt não for criado na pasta, o programa vai fica num loop infinito.

Tem outra sugestão?

"Muitos são os planos no coração do homem, mas o que prevalece é o propósito do SENHOR." Pv 19.21

Link para o comentário
Compartilhar em outros sites

  • Moderadores

Obrigado Igor,

Mas não achei nada parecido no VB6.

Fiz uma alteração na função, que funcionou, o problema é que se por algum motivo o arquivo sainfe.txt não for criado na pasta, o programa vai fica num loop infinito.

Tem outra sugestão?

Coloque um timeout, e verifique ele na sua função, assim se o arquivo não for criado depois de um tempo X do timeout a função sai do loop.

Equipe ACBr

Régys Borges da Silveira

http://www.regys.com.br

certificacao delphicertificacao delphi
Link para o comentário
Compartilhar em outros sites

  • Moderadores

... ou saiba como eu faço para dar uma parada no processo entre o envio e a chamada da função que le o arquivo (SAINFE.TXT)?

Oi Fauze, eu não entendo de Vb, mas quanto a fato de dar uma parana no processo acredito que seja o sleep

Nestes dois links tem um exemplo, veja se te ajuda:

Option Explicit

Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)

Private Sub Form_Click()

MsgBox "Primeira mensagem"

Sleep 1000

MsgBox "Segunda Mensagem"

End Sub

http://www.macoratti.net/vbtelnet.htm

http://www.babooforum.com.br/forum/index.php?/topic/402507-visual-basic-tempo-de-espera-antes-de-executar-um-comando/

Se funcionar vc pode por acrescentar na tua função este tempo de espera, para ele não ficar num loop desesperado

algo por aqui:

(...)


   contador:=0


   While lFlag = False



     ++contador


     se contador > 10  //isto teria já dado uns 20 segundos

          sair

     end se


     sleep 2000 //aguarda dois segundos


     //seria bom incrementar um contador também e ai vc limitaria um número de tentativas, exemplo 20


     If Dir(vPathMonitor & "\SAINFE.TXT") <> "" Then

         Call LeArquivo("SAINFE.TXT")


      End If


   Wend

(...)

Só transforme em Vb :) passei desta forma para comentar a sugestão, mas não entendo de Vb.

Caso vc não consiga, usar a opção acima, poderia tentar fazer a abertura do arquivo em modo exclusivo, enquanto não fosse possível é porque o arquivo estaria ainda em uso pelo Monitor, evitando assim o "acesso negado", porém não evitaria o loop contínuo caso o arquivo não esteja na pasta, então de qualquer forma tem que tentar um timeout um contador, alguma coisa ali que limite o número de tentativas.

Um abraço! Té+


logoacbr.pngConheça o Portal do Projeto ACBr

Ajude o Projeto ACBr crescer - Assine o SAC ACBr
Assine um dos planos de longa duração do SAC ACBr, obtenha Descontos Especiais, Parcele no Cartão e ainda ganhe Brindes Exclusivos. Saiba mais aqui

Conheça o ACBrLib, o ACBr de forma nativa para qualquer linguagem de programação. Saiba mais aqui

 

 

 

 

Link para o comentário
Compartilhar em outros sites

Igor, Régys e Kiko,

Obrigado pelas orientações.

Já havia tentado o Sleep como sugeriu o Kiko, em seguida encontrei um função e resolvi usá-la, assim não corro o risco de elevar o processamento do servidor.

Vou postar o código, está com os comentários como estava no forum.

Obs.: Qual a sugestão dos amigos para eu usar o ACBrNFeMonitor com VB6?


'//--------------------------------------------------------------------

'// PROPOSITO:

'// Dar Pause or delay em um PROCEDIMENTO especificando os segundos

'//

'// ARGUMENTS:

'// Number of seconds. May use fractions in a decimal format (#.##)

'//

'// COMMENTS:

'// Timer() returns a Single value rounded to the nearest 1/100 of a

'// second like a stopwatch. Also, Timer() has a "bug" - it resets

'// itself at midnight. Therefore we need to adjust for this, using

'// some sort of counter. The simplest way is to concatenate the day

'// in front of it with Day(Date) but then the days get reset when the

'// month changes, and of course we need to adjust when the months are

'// reset by the changing year. Fortunately that's as far as we have

'// to go. To avoid an extremely large number by concatenating one in

'// front of the other, we add the different parts of the Date together

'// and then concatenate with the sum.

'//--------------------------------------------------------------------

Public Sub EventPause(sngSeconds As Single)

Dim dblTotal As Double, dblDateCounter As Double, sngStart As Single

Dim dblReset As Double, sngTotalSecs As Single, intTemp As Integer

   '// For our purposes, it's better to concatenate five zeros onto the

   '//  end of our date counter, then ADD any Timer values to it.

   dblDateCounter = ((Year(Date) + Month(Date) + Day(Date)) _

     & 0 & 0 & 0 & 0 & 0)

   '// Initialize start time.

   sngStart = Timer

   '// We also need to adjust for the possible resetting of Timer()

   '//  (such as if the Time happens to be just before midnight) when

   '//  adding the Pause time onto the Start time. The folowing formula

   '//  takes ANY value of the total seconds, whether it's above or below

   '//  the 86400 limit, and converts it to a format compatible to the

   '//  date counter.

   sngTotalSecs = (sngStart + sngSeconds)

   intTemp = (sngTotalSecs \ 86400)   '// Return the integer portion only

   dblReset = (intTemp * 100000) + (sngTotalSecs - (intTemp * 86400))

   '// Now we can initialize our total time.

   dblTotal = dblDateCounter + dblReset


   '// Timer loop

   Do

      DoEvents        '// Make sure any other tasks get some attention

      '// For this to work properly, we cannot create a variable with the

      '//  concatenated expression and plug it in unless we reset the variable

      '//  during the loop. Much better to do it like this:

   Loop While (dblDateCounter + Timer) < dblTotal


End Sub

"Muitos são os planos no coração do homem, mas o que prevalece é o propósito do SENHOR." Pv 19.21

Link para o comentário
Compartilhar em outros sites

Qual a sugestão dos amigos para eu usar o ACBrNFeMonitor com VB6?

Depende muito do que você JÁ tem em VB6...

Se você fosse começar um projeto novo do zero, eu aconselharia fortemente a migrar ou pra Delphi (mais parecido com VB 6, porem tem a vantagem de poder usar o componente diretamente) ou entao mudar pra pelo menos um VB.NET

Com o tempo as linguagens vao ficando defasadas...

Mas isso é só minha opinião, ponha todos os pesos na balança

Link para o comentário
Compartilhar em outros sites

  • Moderadores

Kiko, não sei em VB mas em delphi o sleep leva o processamento do servidor lá nas alturas.

Vixi Régys, em Vb também não sei, mas pelo comentário do Fauze, o procedimento é o mesmo.

Obs.: Qual a sugestão dos amigos para eu usar o ACBrNFeMonitor com VB6?

Fauze não entendi direito a pergunta, mas o ACBrNFeMonitor funciona sem problemas com qualquer linguagem, pois o que ocorre entre os programas e o Monitor é apenas a troca de arquivos em um padrão já definido.

Eu creio que a particularidade vai depender do domínio que cada um tem na linguagem que está desenvolvendo para ter o controle sobre os arquivos que estão em uso.


logoacbr.pngConheça o Portal do Projeto ACBr

Ajude o Projeto ACBr crescer - Assine o SAC ACBr
Assine um dos planos de longa duração do SAC ACBr, obtenha Descontos Especiais, Parcele no Cartão e ainda ganhe Brindes Exclusivos. Saiba mais aqui

Conheça o ACBrLib, o ACBr de forma nativa para qualquer linguagem de programação. Saiba mais aqui

 

 

 

 

Link para o comentário
Compartilhar em outros sites

  • Moderadores

Quanto a nova rotina, ficou legal porque usa DoEvents que é o equivalente a application.processmessages, isso faz com que o computador espere mas libera o processador

ao contrário do Sleep.

Quanto a sua pergunta, se você diz respeito a comunicação com o ACBrMonitor, eu penso que o melhor seria utilizar sockets ao invés do arquivo texto, agora se está falando da linguagem, concordo plenamente com o kiko, você deve utilizar a que você domine mais, a que seja mais produtivo.

Lembrando que se utilizar delphi não precisa utilizar o ACBrMonitor, pode fazer diretamente com os componente ACBr, o que diminui uma camada no teu aplicativo.

Equipe ACBr

Régys Borges da Silveira

http://www.regys.com.br

certificacao delphicertificacao delphi
Link para o comentário
Compartilhar em outros sites

Fauze não entendi direito a pergunta

Kiko, gostaria de sabe se tem outra opção para usar o monitor, que não seja troca de arquivos .txt?

"Muitos são os planos no coração do homem, mas o que prevalece é o propósito do SENHOR." Pv 19.21

Link para o comentário
Compartilhar em outros sites

Quanto a sua pergunta, se você diz respeito a comunicação com o ACBrMonitor, eu penso que o melhor seria utilizar sockets ao invés do arquivo texto, agora se está falando da linguagem, concordo plenamente com o kiko, você deve utilizar a que você domine mais, a que seja mais produtivo.

Lembrando que se utilizar delphi não precisa utilizar o ACBrMonitor, pode fazer diretamente com os componente ACBr, o que diminui uma camada no teu aplicativo.

Régys, como poderia usar o sockets, qual a diferença entres eles e qual seria melhor?

"Muitos são os planos no coração do homem, mas o que prevalece é o propósito do SENHOR." Pv 19.21

Link para o comentário
Compartilhar em outros sites

  • Moderadores

Arquivo texto e troca de arquivo, normal como você está fazendo ai.

Socket, você conecta diretamente ao ACBrMonitor, não tem envio de arquivo texto, mas comando e respostas somente. Você estabelece uma comunicação via TCP/IP na porta e envia os comando, dai o ACBrMonitor devolve a resposta.

Eu particularmente acho melhor dessa forma porque assim você não terá os problemas de troca de arquivo que está tendo e simplifica a comunicação.

Equipe ACBr

Régys Borges da Silveira

http://www.regys.com.br

certificacao delphicertificacao delphi
Link para o comentário
Compartilhar em outros sites

  • Moderadores

Fauze eu ainda não usei via Socket, mas tente dar o pontapé inicial por aqui:

http://acbr.sourceforge.net/drupal/?q=node/40

Desça até encontrar:

Modo Modo TCP/IP:

Ai tem uns exemplos, veja se te ajuda.


logoacbr.pngConheça o Portal do Projeto ACBr

Ajude o Projeto ACBr crescer - Assine o SAC ACBr
Assine um dos planos de longa duração do SAC ACBr, obtenha Descontos Especiais, Parcele no Cartão e ainda ganhe Brindes Exclusivos. Saiba mais aqui

Conheça o ACBrLib, o ACBr de forma nativa para qualquer linguagem de programação. Saiba mais aqui

 

 

 

 

Link para o comentário
Compartilhar em outros sites

Fauze eu ainda não usei via Socket, mas tente dar o pontapé inicial por aqui:

http://acbr.sourceforge.net/drupal/?q=node/40

Desça até encontrar:

Modo Modo TCP/IP:

Ai tem uns exemplos, veja se te ajuda.

Obrigado Kiko, vou dar uma olha.

"Muitos são os planos no coração do homem, mas o que prevalece é o propósito do SENHOR." Pv 19.21

Link para o comentário
Compartilhar em outros sites

Arquivo texto e troca de arquivo, normal como você está fazendo ai.

Socket, você conecta diretamente ao ACBrMonitor, não tem envio de arquivo texto, mas comando e respostas somente. Você estabelece uma comunicação via TCP/IP na porta e envia os comando, dai o ACBrMonitor devolve a resposta.

Eu particularmente acho melhor dessa forma porque assim você não terá os problemas de troca de arquivo que está tendo e simplifica a comunicação.

Obrigado Régys, como disse ao amigo Kiko, vou dar uma olhada e ver se consigo desenvolver (preciso de exemplos).

"Muitos são os planos no coração do homem, mas o que prevalece é o propósito do SENHOR." Pv 19.21

Link para o comentário
Compartilhar em outros sites

  • Este tópico foi criado há 4491 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.