Ajuda - Busca - Membros - Calendário
Versão Completa: Daruma E Bematech Comando Próprio!

Google
FórumWEB > Desenvolvimento > Automação Comercial
Caio Moreno
Olá, estou desenvolvendo para homologação TEF discado.
A pré-homologação da daruma está pronta.
Agora pensando em como implantar a bematech também no sistema e surgiu uma dúvida.
Se alguém puder ajudar ficarei muito grato.
Seria possível eu criar um comando generalizado (por exemplo, AbreCupom) e por alguma verificação o sistema escolhe qual impressora está instalada (Bematech ou Daruma) e assim com uma DLL (ou outra coisa) ele executaria o comando correto (Por exemplo, Daruma_FI_AbreCupom)??
Seria possível isso, se sim alguém poderia me auxiliar em como eu faço isso?
Muito Obrigado!

Caio Nogueira Moreno
Visual Data Informática LTDA ME
Jackson Fraga
CODE
function AbreCupomImpFiscal ( CGC_CPF : String ) : Boolean;
begin

  Result := False;

  if MarcaImpressoraFiscal = mifBematech then
  begin
    if VerificaCupomAberto then
    begin
      Mensagem('O último cupom será cancelado pois não foi finalizado', tmAviso);
      CancelaCupom_ImpFiscal;
    end;
    iRetorno := Bematech_FI_AbreCupom ( pChar ( CGC_CPF ) );
    Retorno_da_impressora ( );

  end

  else
    if MarcaImpressoraFiscal = mifDaruma then
    begin
      //Colocar aqui as funções da Daruma para abertura de cupom
    end

    else
      if MarcaImpressoraFiscal = mifSweda then
      begin
        //Colocar aqui as funções da Sweda para abertura de cupom
      end;

  if iRetorno > 0 then
    Result := True;

end;
anfm
O ACBr faz isso, basta você escolher o modelo da impressora, que o ACBr irá traduzir, por exemplo, o comando abrecupom, para os diversos modelos suportados pelo componente.

Mas vc também pode fazer isso usando as dlls dos fabricantes, só que seu programa irá ficar com vários "ifs" pois a cada comando vc terá q verificar qual modelo está sendo utilizado e chamar a DLL correspondente.
Caio Moreno
Não teria como eu fazer algo por exemplo, uma DLL, ou outra coisa, que ele verificasse sozinho isso, sem ter que encher o programa de IFs?

Com realação ao ACBr eu estou começando a ler, e também irei sugerir aqui, mas acontece que não sei se meu chefe aprovará sad.gif
anfm
É só vc fazer uma unit seguindo o exemplo que o Jackson Fraga passou.
Caio Moreno
Então eu precisaria colocar todos os comandos com os IFs ??
Isso deixaria meu sistema lento?? Pq ele vai verificar todo comando!!
E esse comando (MarcaImpressoraFiscal) existe???
Caio Moreno
CODE
MarcaImpressoraFiscal

Como eu poderia criar essa função??
Daniel Simões
Deixe o usuário configurar qual o modelo da impressora e salve essa informação no BD wink.gif

No ACBrECF existe a possibilidade de detectar o Modelo e Porta da ECF... mas isso é muito lento e deve ser usado apenas durante a configuração do sistema...
Caio Moreno
Daniel,
Andei conversando com meu chefe, e ele programa em Clipper tbm, e ele disse que no Clipper existe uma coisa que você utiliza '&' na frente duma variavel, para poder usar como um comando, isso seria possivel no Delphi?
Por exemplo, as funçoes da Daruma e Bematech para abrir cupom fiscal são: Daruma_FI_AbreCupom e Bematech_FI_AbreCupom.
Eu queria fazer o seguinte, eu definiria uma variável (Impressora) e colocaria por exemplo (Impressora := 'Daruma') e na hora de usar o comando eu usaria +/- assim: Impressora_FI_AbreCupom.
Assim não precisaria fazer a verificação nem nada, seria uma idéia mais facil.
No Clipper é possível, no delphi eu não sei, precisava saber, se você souber se tem como, favor postar aqui!
Muito Obrigado,
Caio N. Moreno
Daniel Simões
O Delphi não aceita Macro-substituição... o mais parecido com isso seria usar Polimorfismo e Herança (foi o que fizemos no ACBr)
Caio Moreno
Então, ou eu utilizo o ACBr ou Vou ter que deixar o programa cheio de IFs?
Daniel Simões
Provavelmente essa é a maneira mais simples... e não irá causar impacto perceptível na performance do programa...

A meu ver, os problemas de usar várias DLLs de fabricantes de ECF carregadas de maneira Estática são:
- Quase sempre elas "brigam" pela porta serial... e uma acaba atrapalhando a outra
- A necessidade de memória para rodar o programa aumenta (pois ele tb precisa carregar todas as DLLs na memória)
- As DLLs precisa ser obrigatóriamente distribuídas com a a aplicação... pois se não achar a DLL o EXE não inicia...


Porém se vc fizer uma carga dinâmica de DLLs esses problemas não ocorrem... mas a codificação é bem mais difícil...
Jackson Fraga
as palavras do Daniel se tornam as minhas!!!!
porem acho que não é tão complicado usar DLL carregada dinamicamente!!!

sobre usar o ACBr: 1° q ele é um componente de terceiro (mto bom por sinal). tem softhouse que não adimite usar um componente de terceiro, q é o caso da minha! eu concordo plenamente com isso por um lado!!! a equipe terá pleno conhecimento que q o componente realmente esta executando. o bom é dar uma olhada nos fonte e copiar a lógica do ACBr que lhe interessa.
Caio Moreno
Entendi.
Vlw Daniel.
Mas conversando com meu chefe decidimos que por enquanto só rodaremos para Daruma mesmo, até porque o sistema está pré-homologado para TEF com a Daruma, e não seria uma boa mecher nele agora.
Mas obrigado por tudo!
Caio N. Moreno
Jackson Fraga
outra coisa. a gente esta no ano de 2008 as arquitetura de processador é Duo, um IF a mais ou a menos vai demorar no máximo 5 nanosegundo, nem a mãe do badanha percebe...

ps. agora se seu cliente ainda usa um MX com 8mb HD de 5 Gb . com placa de rede com cabo coaxial. tem duas alternativa. troca de cliente ou faz um programa especifico para cada ECF.
Jackson Fraga
Caio, te informa melhor na software Express, eu tenho meu sistema homologado no Banrisul (banco do estado do RS), lá eles efetuam a homologação do software com uma impressora, se você alterar a rotina apenas na parte de ECF não é necessário re-homologar. agora tem q ver como funciona a software express!!! eu não sei!!!
Caio Moreno
Eu falei com a Software Expresss, e fiquei indignado, pois eles me informaram que se você for homologar com uma DARUMA FS345, seu sistema SÓ vai ser homologado para DARUMA FS345, ou seja, se for usar outro modelo da DARUMA tem que re-homologar, imagina então se quiser implantar para BEMATECH, com certeza tem que re-homologar!
Jackson Fraga
cara, quer se indignar??? os caras da software express ligaram para o banrisul dizendo q eles tinham um roteiro errado pois quem efetuava a homologação no banrisul não tinha como homologar nas outras bandeiras, o pessoal do banrisul informou que não possuia erros, pois nenhuma rotina possui algo de extraordinário!!! o responsável "bateu o pé" dizendo q tinha erro!!! e daida deu a frase final, ..."eu sou analista de sistemas, bacharel formado pela USP"... porem o maluco q estava falando por telefone é ex-mestre da USP... os caras de lá não tem mta noção.

ps. a software express e seven querem monopolizar o TEF!!! e ainda querem dificultar o processo de homologação!!! ouvi uns boatos q se você for a segunda vez lá para tentar homologar, eles cobram!!!! até se alguem souber sobre isso poderia postar aki né???
Daniel Simões
Sim... a segunda tentativa é cobrada... só não sei o valor...

O certo é fazer e refazer o roteiro de testes e ligar para o suporte deles em caso de dúvidas (pois eles nunca respondem por e-mail)
Jackson Fraga
então esta explicado pq eles passam informação incorreta, de má vontade, demoram, tentam não homologar na primeira vez!!! aqui a gente iria homologar na Software Express antes do ano novo!!! mas deixamos para depois... daqui um tempo quando "desafogar" um pouco vamos retomar o TEF!!! o banrisul já ta homologado!!! 90 % de chance de homologar na sw express.
Luciano Rigolin de Almeida
QUOTE(Daniel Simões @ 10-Jan-2008, 08:12) *
Provavelmente essa é a maneira mais simples... e não irá causar impacto perceptível na performance do programa...

A meu ver, os problemas de usar várias DLLs de fabricantes de ECF carregadas de maneira Estática são:
- Quase sempre elas "brigam" pela porta serial... e uma acaba atrapalhando a outra
- A necessidade de memória para rodar o programa aumenta (pois ele tb precisa carregar todas as DLLs na memória)
- As DLLs precisa ser obrigatóriamente distribuídas com a a aplicação... pois se não achar a DLL o EXE não inicia...


Porém se vc fizer uma carga dinâmica de DLLs esses problemas não ocorrem... mas a codificação é bem mais difícil...


Daniel, tem algum exemplo de carga dinamica de dll em Delphi?

Atenciosamente,

Luciano Rigolin
Daniel Simões
Tenho exemplos meio complicados... smile.gif

Veja na unit ACBrUtil, as funções InPort e OutPort.. Para essas funções eu uso a DLL inpout32.dll, se ela estiver instalada no Windows, caso contrário uso assembler (o que não funciona em XP)

CODE
  if Assigned( xInp32 ) then
     Result := xInp32(PortAddr)
  else
    asm
        mov dx,PortAddr;
        in al,dx
        mov Result,al
     end;


A linha if Assigned( xInp32 ) then será verdadeira se a DLL estiver presente e foi carregada com sucesso... A carga é feita no initialization da Unit
CODE
  if not FunctionDetect('inpout32.dll','Inp32',@xInp32) then
     xInp32 := NIL;

  if not FunctionDetect('inpout32.dll','Out32',@xOut32) then
     xOut32 := NIL;


No código de Function Detect é que tudo acontece...
CODE
{-----------------------------------------------------------------------------
  Tenta carregar a Biblioteca (DLL) <LibName> e veirica se a função <FuncName>
  existe na DLL. Se existir, retorna ponteiro para a DLL em <LibPointer>
  Veja Exempo de uso em InPort e OutPort (logo acima)
  ( Função encontrada na Internet - Autor desconhecido )
-----------------------------------------------------------------------------}
function FunctionDetect (LibName, FuncName: String; var LibPointer: Pointer): boolean;
var LibHandle: tHandle;
begin
Result := false;
LibPointer := NIL;
  if LoadLibrary(PChar(LibName)) = 0 then
     exit;                                 { não consegiu ler a DLL }

  LibHandle := GetModuleHandle(PChar(LibName));  { Pega o handle da DLL }
  if LibHandle <> 0 then                    { Se 0 não pegou o Handle, falhou }
  begin
     LibPointer := GetProcAddress(LibHandle, PChar(FuncName));{Procura a função}
     if LibPointer <> NIL then
        Result := true;
  end;
end;
Jackson Fraga
QUOTE(Luciano Rigolin de Almeida @ 14-Jan-2008, 15:42) *
Daniel, tem algum exemplo de carga dinamica de dll em Delphi?

Atenciosamente,

Luciano Rigolin


segue abaixo como carregar DLL dinamicamento (extraido do Dicas e truques delphi 2.8)
CODE
procedure TForm1.Button1Click(Sender: TObject);
var
  Minhafunction: function(Senha: string): Boolean;
  Hnd: THandle;
begin
  // Carrega a DLL dinamicamente
  Hnd := LoadLibrary('VERSENHA.DLL');
  if Hnd > 0 then
  begin
    // Executa a função da DLL
    @Minhafunction := GetProcAddress(Hnd, 'GetSenha');
    if @Minhafunction <> nil then
    begin
      // Aqui passamos a senha a ser verificada na funcão
      if Minhafunction('Senha') then
        ShowMessage('Senha válida!')
      else
        ShowMessage('Senha inválida!');
    end;
  end;
  // Descarrega a DLL
  Freelibrary(GetModuleHandle('VERSENHA.DLL'));
end;
Esta é uma versão simplificada de nosso conteúdo principal. Para ver a versão completa com maiores informações, formatação e imagens, por favor clique aqui.
Invision Power Board © 2001-2008 Invision Power Services, Inc.