Caio Moreno
08-Jan-2008, 13:23
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
08-Jan-2008, 13:30
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;
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
08-Jan-2008, 13:40
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á
É só vc fazer uma unit seguindo o exemplo que o Jackson Fraga passou.
Caio Moreno
09-Jan-2008, 06:54
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
09-Jan-2008, 13:10
CODE
MarcaImpressoraFiscal
Como eu poderia criar essa função??
Daniel Simões
09-Jan-2008, 15:46
Deixe o usuário configurar qual o modelo da impressora e salve essa informação no BD

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
09-Jan-2008, 16:25
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
09-Jan-2008, 17:13
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
10-Jan-2008, 07:06
Então, ou eu utilizo o ACBr ou Vou ter que deixar o programa cheio de IFs?
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...
Jackson Fraga
10-Jan-2008, 08:27
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
10-Jan-2008, 08:31
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
10-Jan-2008, 08:34
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
10-Jan-2008, 08:39
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
10-Jan-2008, 08:43
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
10-Jan-2008, 09:07
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
10-Jan-2008, 09:23
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
10-Jan-2008, 09:37
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
14-Jan-2008, 15:42
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
15-Jan-2008, 11:42
Tenho exemplos meio complicados...

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
15-Jan-2008, 11:56
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.