Ir para conteúdo
  • Cadastre-se

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

Recommended Posts

Postado

Estou tentando gerar os arquivos do  CAT-52 em pastas separadas por mês e ano, ex:  "C:\CAT52 01-2014", "C:\CAT52 02-2014",

utilizando o método ACBrECF1.PafMF_GerarCAT52(DataInicial, DataFinal, DirArquivos );

Porém após gerar em um diretório, se eu tento gerar novamente em outro diretório ele gera sempre no primeiro informado, sendo necessário fechar a aplicação

para gerar em um novo dir.  Eu verifiquei que no arquivo "Bemafi32.ini" o parâmetro "Path" é atualizado corretamente, tanto que o 

arquivo "download.mfd" é gerado normalmente nos diretórios informados e apenas os arquivos do CAT-52 que não vão para o novo diretório.

  • Moderadores
Postado (editado)

Bom então temos um problemas pois não deveria!

se observar nos fontes existe um LoadDLLFunctions e UnLoadDLLFunctions 

que são invocados no AbrePortaSerialDLL e  FechaPortaSerialDLL

e podem ser observados no código em que gera o arquivo!

AbrePortaSerialDLL( FilePath ) ;

    // fazer primeiro o download da MFD para o período
    Resp := xBematech_FI_DownloadMFD( FileMFD, '1', DiaIni, DiaFim, Prop );
    if (Resp <> 1) then
    begin
      raise EACBrECFErro.Create(ACBrStr(
        'Erro ao executar xBematech_FI_DownloadMFD.' + sLineBreak +
        AnalisarRetornoDll(Resp)
      ));
    end;

    // gerar o arquivo para cada dia dentro do período a partir da
    // MFD baixada da impressora fiscal
    DataArquivo := DataInicial;
    repeat
      DiaIni := FormatDateTime('dd/mm/yyyy', DataArquivo);

      Resp := xBematech_FI_GeraRegistrosCAT52MFD( FileMFD, DiaIni ) ;
      if (Resp <> 1) then
      begin
        raise EACBrECFErro.Create(ACBrStr(
          'Erro ao executar xBematech_FI_GeraRegistrosCAT52MFD.' + sLineBreak +
          AnalisarRetornoDll(Resp) + sLineBreak +
          'Para a data de: "' + DiaIni + '"'
        ));
      end;

      // próximo dia
      DataArquivo := IncDay( DataArquivo, 1 );

    until DataArquivo > DataFinal;

  finally
    FechaPortaSerialDLL( OldAtivo );
  end;

Deveria ser possível mover pois após feito o arquivo é liberado o uso da dll por ser feito carga dinâmica!

tente debugar sua aplicação e veja o que ele faz nesses códigos se ele vai mesmo para o unload ou não!

 

Onde quero chegar é que a dll não libera o arquivo ini ou melhor não recarrega ele por consequência!

Editado por Juliomar Marchetti
Consultor SAC ACBr Juliomar Marchetti
 

Projeto ACBr

skype: juliomar
telegram: juliomar
e-mail: [email protected]
http://www.juliomarmarchetti.com.br
MVP_NewLogo_100x100_Transparent-02.png
 

 

Postado

Boa tarde

Criei um aplicativo só para testes, e a liberação da Bemafi32.dll ocorre normalmente, mas a gravação persiste sempre repetindo no diretório que foi informado inicialmente.

No Bemafi32.ini e no  log os diretórios aparecem corretamente informados. Veja o log em anexo.

 

BemaFI32-20140529.txt

Postado

Boa tarde pessoal

Quanto a modificar o path do Bemafi32.ini em tempo de execução, O André Munhoz da Bematech me respondeu o seguinte:

 

 

Olá,

Se vc estiver modificando a chave Path no arquivo BemaFI32.ini em tempo de execução, é necessário recarregar a dll para que ela leia esta nova modificação. Sendo assim, vc pode incluir na sua aplicação uma chamada à função Bematech_FI_ReloadINIFile para que a dll seja recarregada em tempo de execução.

É possivel implementar a chamada deste método no ACBR ?

 

Obrigado.

  • Fundadores
Postado

Nos fontes atuais, do ACBrECFBematech.pas, já existe o procedimento de carregar e descarregar a DLL.... Isso ocorre sempre que o ACBr precisa chamá-la...

 

Veja um trecho

procedure TACBrECFBematech.FechaPortaSerialDLL(const OldAtivo: Boolean);
begin
  GravaLog( '   xBematech_FI_FechaPortaSerial' ) ;
  xBematech_FI_FechaPortaSerial ;

  UnloadDLLFunctions;

  GravaLog( '   Ativar ACBr: '+ifthen(OldAtivo,'SIM','NAO') ) ;
  if OldAtivo then
     Ativo := OldAtivo;
end;
Consultor SAC ACBr

Daniel Simões de Almeida
O melhor TEF, é com o Projeto ACBr - Clique e Conheça
Ajude o Projeto ACBr crescer - Assine o SAC

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

  • Moderadores
Postado

 

Nos fontes atuais, do ACBrECFBematech.pas, já existe o procedimento de carregar e descarregar a DLL.... Isso ocorre sempre que o ACBr precisa chamá-la...

 

Veja um trecho

procedure TACBrECFBematech.FechaPortaSerialDLL(const OldAtivo: Boolean);
begin
  GravaLog( '   xBematech_FI_FechaPortaSerial' ) ;
  xBematech_FI_FechaPortaSerial ;

  UnloadDLLFunctions;

  GravaLog( '   Ativar ACBr: '+ifthen(OldAtivo,'SIM','NAO') ) ;
  if OldAtivo then
     Ativo := OldAtivo;
end;

Daniel estive olhando a mesma

e ele é chamado ao final do procedimento mas o mesmo não está mesmo carregando ou a dll ou o ini ao chamar novamente o comando!

como se ele não liberasse a dll 

 

se notar no comando que ele utiliza está dentro de um try finally e mesmo assim não libera

pelo menos nos testes que eu fiz não ocorreu isso

Consultor SAC ACBr Juliomar Marchetti
 

Projeto ACBr

skype: juliomar
telegram: juliomar
e-mail: [email protected]
http://www.juliomarmarchetti.com.br
MVP_NewLogo_100x100_Transparent-02.png
 

 

Postado

Nos testes que fiz, mesmo que a dll seja liberada pelo sistema, o path não atualiza se a dll for recarregada novamente pelos métodos atuais.

É aí que entra Bematech_FI_ReloadINIFile, Justamente para atualizar as informações novas (path) do Bemafi32.ini.

Postado

Pessoal, boa tarde

Inseri a chamada do método no ACbrECFBematech.pas (Em anexo) , e funcionou normalmente.

O método Bematech_FI_ReloadINIFile foi colocado procedure AbrePortaSerialDLL logo após LoadDLLFunctions.

As alterações foram nas linhas Linhas: 339, 3330, 3353 e 3402. Espero que analisem a possibilidade de implementar na versão oficial.  

Obrigado.

ACBrECFBematech.pas

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