none
MF ADC em impressoras Bematech (Bematech_FI_DataHoraGravacaoUsuarioSWBasicoMFAdicional) RRS feed

  • Pergunta

  • Como o help orienta, lá diz pra usar o comando Bematech_FI_DataHoraGravacaoUsuarioSWBasicoMFAdicional
    com os parâmetros DataUsuario, DataSWBasico e LetraAdicional, TODOS como String.

    Os dois primeiros parâmetros são retornados normalmente pela dll, porém o terceiro (LetraAdicional) é "eliminado" pela dll, nao possibilitando o acesso para verificação, exemplo em DELPHI:

    function ECF_InfoSB(var MFADC: String; var VersaoSB: String; var DataSB: TDate; var HoraSB: TTime; var NSeq: Integer; ECF: TModelosECF): Integer;
    var
       vDHUsuario: String;
       vDHSoftB: String;
    begin
       case ECF of
          MP2100TH : begin
             SetLength(MFADC, 2);
             MFADC := '  ';
             SetLength(VersaoSB, 6);
             SetLength(vDHUsuario, 20);
             SetLength(vDHSoftB, 20);
              
                  //retorna as 2 primeiras OK e a variavel "MFADC" aparentemente é eliminada pela dll, impossibilitando o acesso para comparação
             if (Bematech_FI_DataHoraGravacaoUsuarioSWBasicoMFAdicional(vDHUsuario, vDHSoftB, MFADC) = 1) then
             begin
                if Trim(MFADC) = EmptyStr then //Aqui dá access violation
                begin
                   {GRAVO ALGUMA COISA NO BANCO DE DADOS}
                end;
             end;
          end;
       end;
    end;  

    Qualquer outra tentativa de atribuição do tipo var1 := MFADC; também da acesss violation.
    Qualquer tentativa de ler a variavel da access violation: var2 := Length(MFADC);
    Em resumo qualquer tipo de USO, dá access violation!!

    A declaração da função vinda da dll é feita de acordo com o help da bematech:
    function Bematech_FI_DataHoraGravacaoUsuarioSWBasicoMFAdicional( dataUsuario: string; dataSoftwareBasico: string; var letraAdicional: string ): integer; stdcall; external 'BEMAFI32.DLL';

    No ExemploFiscalDelphi.exe da bematech e seus fontes NÃO tem implementado o comando Bematech_FI_DataHoraGravacaoUsuarioSWBasicoMFAdicional, não dispondo de um exemplo para utilização, o que piorou as coisas.

    Segundo o suporte da Bematech, somente caso a impressora TENHA MF-ADC, será retornado alguma coisa na váriavel de retorno, mas
    e quando a impressora não tem? Segundo o suporte um parceiro deles (bematech) conseguiu retorno declarando como GLOBAL, mas também fiz o teste e houve os mesmos problemas...

    Alguem implementou essa função e pode ajudar no assunto??

    Obrigado.
    quarta-feira, 24 de fevereiro de 2010 20:55

Respostas

  • Olá Ricardo,

    Vc está usando a BemaFI32.dll versão 5.10.6.5 ?

    Se sim, experimente declarar a função desta forma:

    function Bematech_FI_DataHoraGravacaoUsuarioSWBasicoMFAdicional( dataUsuario, dataSoftwareBasico: string; var letraAdicional: char ): integer; stdcall; external 'BEMAFI32.DLL';

    E usa-la assim, exemplo:

    procedure TfrmPrincipal.Button5Click(Sender: TObject);
    var
       iRetorno, iConta: integer;
       dataUsuario, dataSWBasico, texto: string;
       MFAdicional : char;
    begin

       for iConta := 1 to 20 do
          begin
             dataUsuario  := dataUsuario  + ' ';
             dataSWBasico := dataSWBasico + ' ';
          end;

       MFAdicional := ' ';

       iRetorno := Bematech_FI_DataHoraGravacaoUsuarioSWBasicoMFAdicional( dataUsuario, dataSWBasico, MFAdicional );

       texto := 'Data de gravação do Usuário: ' + copy( dataUsuario, 1, length( dataUsuario ) - 1 ) + #13 + #10 +
                'Data de gravação do SW Básico: ' + copy( dataSWBasico, 1, length( dataSWBasico ) -1 ) + #13 + #10 +
                'MF Adicional: ' + MFAdicional;

       Application.MessageBox( pchar( texto ), 'Informação', MB_ICONINFORMATION + MB_OK );

    end;

    Procure não usar o SetLength para inicializar as variáveis string, pois ele coloca sujeira de memória nelas.

    Qualquer coisa, me avise.

    Ats,
    André Munhoz
    andre.munhoz@bematech.com.br

    • Marcado como Resposta Ricardo Wojcik sexta-feira, 26 de fevereiro de 2010 13:18
    quinta-feira, 25 de fevereiro de 2010 12:27

Todas as Respostas

  • Olá Ricardo,

    Vc está usando a BemaFI32.dll versão 5.10.6.5 ?

    Se sim, experimente declarar a função desta forma:

    function Bematech_FI_DataHoraGravacaoUsuarioSWBasicoMFAdicional( dataUsuario, dataSoftwareBasico: string; var letraAdicional: char ): integer; stdcall; external 'BEMAFI32.DLL';

    E usa-la assim, exemplo:

    procedure TfrmPrincipal.Button5Click(Sender: TObject);
    var
       iRetorno, iConta: integer;
       dataUsuario, dataSWBasico, texto: string;
       MFAdicional : char;
    begin

       for iConta := 1 to 20 do
          begin
             dataUsuario  := dataUsuario  + ' ';
             dataSWBasico := dataSWBasico + ' ';
          end;

       MFAdicional := ' ';

       iRetorno := Bematech_FI_DataHoraGravacaoUsuarioSWBasicoMFAdicional( dataUsuario, dataSWBasico, MFAdicional );

       texto := 'Data de gravação do Usuário: ' + copy( dataUsuario, 1, length( dataUsuario ) - 1 ) + #13 + #10 +
                'Data de gravação do SW Básico: ' + copy( dataSWBasico, 1, length( dataSWBasico ) -1 ) + #13 + #10 +
                'MF Adicional: ' + MFAdicional;

       Application.MessageBox( pchar( texto ), 'Informação', MB_ICONINFORMATION + MB_OK );

    end;

    Procure não usar o SetLength para inicializar as variáveis string, pois ele coloca sujeira de memória nelas.

    Qualquer coisa, me avise.

    Ats,
    André Munhoz
    andre.munhoz@bematech.com.br

    • Marcado como Resposta Ricardo Wojcik sexta-feira, 26 de fevereiro de 2010 13:18
    quinta-feira, 25 de fevereiro de 2010 12:27
  • Olá Ricardo,

    Vc está usando a BemaFI32.dll versão 5.10.6.5 ?

    Se sim, experimente declarar a função desta forma:

    function Bematech_FI_DataHoraGravacaoUsuarioSWBasicoMFAdicional( dataUsuario, dataSoftwareBasico: string; var letraAdicional: char ): integer; stdcall; external 'BEMAFI32.DLL';

    E usa-la assim, exemplo:

    procedure TfrmPrincipal.Button5Click(Sender: TObject);
    var
       iRetorno, iConta: integer;
       dataUsuario, dataSWBasico, texto: string;
       MFAdicional : char;
    begin

       for iConta := 1 to 20 do
          begin
             dataUsuario  := dataUsuario  + ' ';
             dataSWBasico := dataSWBasico + ' ';
          end;

       MFAdicional := ' ';

       iRetorno := Bematech_FI_DataHoraGravacaoUsuarioSWBasicoMFAdicional( dataUsuario, dataSWBasico, MFAdicional );

       texto := 'Data de gravação do Usuário: ' + copy( dataUsuario, 1, length( dataUsuario ) - 1 ) + #13 + #10 +
                'Data de gravação do SW Básico: ' + copy( dataSWBasico, 1, length( dataSWBasico ) -1 ) + #13 + #10 +
                'MF Adicional: ' + MFAdicional;

       Application.MessageBox( pchar( texto ), 'Informação', MB_ICONINFORMATION + MB_OK );

    end;

    Procure não usar o SetLength para inicializar as variáveis string, pois ele coloca sujeira de memória nelas.

    Qualquer coisa, me avise.

    Ats,
    André Munhoz
    andre.munhoz@bematech.com.br

    Muito Obrigado André.

    A dll aceitou normalmente passando como "char", e pelo menos me retornou um " ". Só não pude testar com uma ecf com MF-ADC, pois não tenho uma para testar, a nossa pra desenvolvimento não tem MF-ADC.

    Se puderem, coloquem no help da bematech, pois seguindo ele nao tem como implementar corretamente o uso da função.
    sexta-feira, 26 de fevereiro de 2010 16:17
  • Olá Ricardo,

    Sim, já atualizamos o help da dll, e quando desejar consulte o help on-line que fica sempre atualizado.

    http://www.bematech.com.br/suporte/bemafi32/index.html

    Ats,

    André Munhoz
    andre.munhoz@bematech.com.br
    segunda-feira, 1 de março de 2010 01:22