Seguindo o exemplo disponibilizado pelo HASA, estou tentando implementar a impressão sem uso de dll. Usando minigui extended 2.3.5 e harbour. Para compilar o exemplo abaixo utilize assim:
Abaixo está a rotina modificada, que ainda estou testando, mas não estou conseguindo implementar a leitura de mais de um item de produto.
Código: Selecionar todos
/*****************************************************************************
* SISTEMA : ROTINA EVENTUAL *
* PROGRAMA : SAT-IMPRIMIR.PRG *
* OBJETIVO : Imprimir Cupom Fiscal Eletrônico Sem Dll *
* AUTOR : Marcelo Antonio Lázzaro Carli *
* DATA : 07.10.2015 *
* ULT. ALT.: 08.10.2015 *
*****************************************************************************/
#include <minigui.ch>
Procedure Main()
REQUEST HB_LANG_PT
HB_LangSelect([PT])
REQUEST HB_CODEPAGE_PT850 &&& PARA INDEXAR CAMPOS ACENTUADOS
HB_SETCODEPAGE([PT850]) &&& PARA INDEXAR CAMPOS ACENTUADOS
Set wrap on
Set talk off
Set date briti &&& data no formato dd/mm/aaaa
Set dele on &&& ignora registros marcados por deleção
Set score off
Set exact on
Set ToolTip on
Setcancel(.F.) &&& evitar cancelar sistema c/ ALT + C
Set cent on &&& ano com 4 dígitos
Set epoch to 2000 &&& ano a partir de 2000
Set excl off &&& abre arquivos em modo compartilhado
Set navigation extended &&& enter no lugar do tab
Set language to portuguese &&& mensagens em português
Set multiple off warning &&& abrir 1 cópia somente
Set browsesync on &&& para o comando browse funcionar ok
Set tooltipstyle balloon &&& para mensagem dos campos em forma de balão
Set menustyle extended &&& padrão é standard, extended estilo office 2007
Set programmaticchange off &&& introduzida na build 1.9.94
define window main at 0, 0 width 500 height 300 ICON "demo.ico" NOTIFYICON "demo.ico" MAIN title [Cupom Fiscal Eletrônico - Sweda] NOSIZE NOMAXIMIZE on init {|| fImprimirNfce()}
define button btn_EnviarVenda
row 50
col 90
width 120
caption [&Imprimir Cfe]
action {|| fImprimirNfce()}
DEFAULT .t.
end button
on key escape action {|| Thiswindow.Release}
end window
main.center()
main.activate()
Return (Nil)
Procedure fImprimirNfce()
Local I:= 1, cNfce:= cFilePath(GetFile({{[Arquivos Xml], [*.xml]}}, [Abrir Arquivo], [], .F., .F.)), cPrinter:= GetPrinter(), cTexto:= []
Private cChave:= substr(cNfce, 4, 44)
If Empty(cNfce)
MsgStop([Arquivo Xml não Selecionado!], [Erro])
Return (Nil)
Endif
cTexto:= memoread(cNfce)
If Empty(cPrinter)
MsgStop([Impressora não Selecionada!], [Erro])
Return (Nil)
EndIf
ferase([NFCE.TXT])
Setalternate([NFCE.TXT])
Set Margin TO 0
SetPrc(0, 0)
fImp_Cabecalho(cTexto)
? "#|COD|DESC|QTD|UN|VL UN R$|(VLTR R$)*|VL ITEM R$"
? REPLI([-], 48)
? CHR(27) + CHR(33) + CHR(1) && Muda para a FontB para que o Texto seja impresso em 1 linha
z:= 1
For i:= 1 to len(cTexto) ///////// aqui que não consegui implementar a leitura de vários ítens de produtos
If [det nItem="] + str(i) + ["] == [det nItem="] + str(z) + ["]
? STRZERO( I++, 3, 0 )
?? [ ] + Retiratag([cProd], cTexto)
?? [ ] + Retiratag([xProd], cTexto)
?? [ ] + Transf(Retiratag([qCom], cTexto), [9,9999])
?? [ ] + Retiratag([uCom], cTexto)
?? [ ] + "X"
?? [ ] + Transf(Retiratag([vUnCom], cTexto), [9,999,999.99])
?? [ ] + Transf(Retiratag([vProd], cTexto), [9,999,999.99])
z++
Endif
msginfo(str(i) + [ <== i z ==> ] + str(z))
if i > 5
exit
endif
Next
? CHR(27) + CHR(33) + CHR(0) && Volta para a FontA
fImp_Totais(cTexto, cChave)
SetPrc(0, 0)
Setalternate()
WIN_PrintFileRaw(cPrinter, [NFCE.TXT], [TESTE])
Return (Nil)
Procedure fImp_Cabecalho(cTexto)
*** aqui o melhor é pegar os dados do arquivo de parâmetros do sistema, pois não tem por exemplo,
*** o nome fantasia e a tag CNPJ é comum para o cnpj da softhouse e do emitente
? PADC(Retiratag([xNome], cTexto), 48)
? PADC([Nome Fantasia], 48)
? PADC(Retiratag([xLgr], cTexto) + [ No ] + Retiratag([nro], cTexto) , 48)
? PADC(Retiratag([xBairro], cTexto) + [ Cep ] + Retiratag([CEP], cTexto) , 48)
? PADC(Retiratag([xMun], cTexto) + [/SP], 48)
? PADC([CNPJ ] + Retiratag([CNPJ], cTexto) + [ IE ] + Retiratag([IE], cTexto) + [ IM ] + Retiratag([IM], cTexto), 48)
? REPLI([-], 48)
? PADC([Extrato No: ] + Retiratag([nCFe], cTexto) , 48)
? PADC( "CUPOM FISCAL ELETRONICO - SAT", 48)
? REPLI([-], 48)
? [CPF/CNPJ do Consumidor: ] + Retiratag([CPF], cTexto)
? REPLI([-], 48)
Return (Nil)
Procedure fImp_Totais(cTexto, cChave)
Local i:= 0, aString:= HB_ATOKENS(Retiratag([xTexto], cTexto), [;]), cPagto:= Retiratag([cMP], cTexto)
? [TOTAL R$]
?? PADL(Transf(Retiratag([vCFe], cTexto), [9,999,999.99]), 40)
If cPagto == [01]
? [Dinheiro]
?? PADL(Transf(Retiratag([vMP], cTexto), [9,999,999.99]), 40)
Elseif cPagto == [02]
? [Cheque]
?? PADL(Transf(Retiratag([vMP], cTexto), [9,999,999.99]), 42)
Elseif cPagto == [03]
? [Cartão de Crédito]
?? PADL(Transf(Retiratag([vMP], cTexto), [9,999,999.99]), 31)
Elseif cPagto == [04]
? [Cartão de Débito]
?? PADL(Transf(Retiratag([vMP], cTexto), [9,999,999.99]), 32)
Elseif cPagto == [05]
? [Crédito Loja]
?? PADL(Transf(Retiratag([vMP], cTexto), [9,999,999.99]), 36)
Elseif cPagto == [10]
? [Vale Alimentação]
?? PADL(Transf(Retiratag([vMP], cTexto), [9,999,999.99]), 32)
Elseif cPagto == [11]
? [Vale Refeição]
?? PADL(Transf(Retiratag([vMP], cTexto), [9,999,999.99]), 35)
Elseif cPagto == [12]
? [Vale Presente]
?? PADL(Transf(Retiratag([vMP], cTexto), [9,999,999.99]), 35)
Elseif cPagto == [13]
? [Vale Combustível]
?? PADL(Transf(Retiratag([vMP], cTexto), [9,999,999.99]), 32)
Elseif cPagto == [99]
? [Outros]
?? PADL(Transf(Retiratag([vMP], cTexto), [9,999,999.99]), 42)
Endif
? REPLI([-], 48)
? PADC([SAT No. ] + Retiratag([nserieSAT], cTexto) , 48)
? PADC(dtoc(STOD(Retiratag([dEmi], cTexto))) + [ - ] + Transf(Retiratag([hEmi], cTexto), [@R 99:99:99]), 48)
? CHR(10) + CHR(27) + CHR(97) + CHR(49) && Centraliza a Impressão
? CHR(27) + CHR(33) + CHR(1) && Muda para a FontB para que o Texto seja impresso em 1 linha
? PADC(Transf(cChave, [@R 9999 9999 9999 9999 9999 9999 9999 9999 9999 9999 9999]), 56 )
? CHR(27) + CHR(33) + CHR(0) && Volta para a FontA
f_QRCODE8(cChave, Retiratag([dEmi], cTexto) + Retiratag([hEmi], cTexto), Retiratag([vCFe], cTexto), Retiratag([signAC], cTexto), [])
? CHR(27) + "a" + CHR(0) && Volta a justificar à esquerda
* For i:= 1 to len(aString)
* ? PADC(aString[i] , 48)
* Next
? REPLI([-], 48)
aString:= HB_ATOKENS(Retiratag([infCpl], cTexto), [;])
For i:= 1 to len(aString)
? PADC(aString[i] , 48)
Next
? REPLI([-], 48)
? ""
? CHR(29) + CHR(86) + CHR(0) && Aciona Guilhotina
Return (Nil)
Procedure f_QRCODE8(cChave, cDatahora, cValor, cAssinatura, cCnpj)
Local x_URL_QrCode:= cChave + "|" + cDatahora + "|" + cValor + "|" + cCnpj + "|" + cAssinatura, iTamanho, iLow, iHigh, iCount, ComandoQR
* BYTES PARA COMPOR O QRCODE
iTamanho := Len( x_URL_QrCode ) + 3
iLow := MOD( iTamanho, 256 )
iHigh := iTamanho / 256
? CHR(29) + "h" + CHR(60) && Altura do código de barras
? CHR(29) + "w" + CHR(2) && Largura das barras
? CHR(29) + "H0" && Apresentação numérica do código DE BARRAS / H0 = INIBE, H2 = MOSTRA
* Imprime o Code128C com 44 algarismos
ComandoQR := CHR(29) + CHR(107) + CHR(73) + CHR(24) + "{C"
For iCount:= 0 To 22
ComandoQR += CHR( VAL( SUBSTR( cChave, (iCount * 2) + 1, 2 ) ) )
Next
? []
? ComandoQR
* Fim da impressão do Code128C
* Impressão do QRCode
? CHR(29) + "(k" + CHR(iLow) + CHR(iHigh) + CHR(49) + CHR(80) + CHR(48) + x_URL_QrCode && QRCode PROPRIAMENTE DITO
? CHR(29) + "(k"+ CHR(3) + CHR(0) + CHR(49) + CHR(81) + CHR(48)
Return (Nil)
Procedure Setalternate(cParam)
If cParam == Nil
Set Cons on
Set Alter to
Set Alter off
Else
Set cons off
Set Alter to &cParam
Set Alter on
Endif
Return (Nil)
Function Retiratag(cParam, cTexto)
Local nTagI:= len(alltrim(cParam)) + 2, cTagI:= [<] + alltrim(Upper(cParam)) + [>], cTagF:= [</] + alltrim(Upper(cParam)) + [>], nInicio:= at(cTagI, Upper(cTexto)), nFim:= at(cTagF, Upper(cTexto)), cEspaco:= [ ]
If nInicio == 0 .or. nFim == 0
Return(cEspaco)
Endif
Return(substr(cTexto, (nInicio + nTagI), nFim - (nInicio + nTagI)))
Function cFilePath(cPathMask)
Local n:= RAt([\], cPathMask )
Return (If( n > 0, Upper(substr(cPathMask, n + 1)), Upper(cPathMask)))