No artigo de hoje, vamos demonstrar em como usar a classe FWMSPrinter imprimindo direto na impressora padrão sem usar a FWPrintSetup.
A dica de hoje foi enviada pelo grande Tiago Fonseca Lima de Moraes ( LinkedIn ).
Se você já teve a necessidade de gerar um relatório usando a FWMSPrinter direto para a impressora padrão instalada no Windows, basicamente você vai precisar:
- No parâmetro nDevice, informar IMP_SPOOL (para ir direto para impressora)
- No parâmetro cPrinter, informar o nome da impressora padrão
- Usar a função GetImpWindows para buscar a impressora padrão no sistema operacional
Abaixo então um trecho de como ficaria:
//Busca as impressoras instaladas aImpressoras := GetImpWindows(.F.) //Se encontrou impressoras If Len(aImpressoras) > 0 //Pega a impressora padrão cImprPadrao := aImpressoras[1] //Cria o relatório oPrintRel := FWMSPrinter():New(; "TESTE_REL",; // cFilePrintert IMP_SPOOL,; // nDevice .F.,; // lAdjustToLegacy ,; // cPathInServer ,; // lDisabeSetup ,; // lTReport ,; // oPrintSetup cImprPadrao,; // cPrinter .F.; // lServer ) //Restante do seu código // ... EndIf
E abaixo um exemplo que foi gentilmente disponibilizado pelo Tiago, onde caso não tenha impressora padrão, será exibido uma tela para escolha da impressora com a FWPrintSetup.
//Bibliotecas
#Include "Totvs.ch"
#Include "TopConn.ch"
#Include "protheus.ch"
#Include "RPTDef.ch"
#Include "FWPrintSetup.ch"
#Include "Rwmake.ch"
#Include "TbiConn.CH"
#Include "APWIZARD.CH"
#Include "FILEIO.CH"
#include "parmtype.ch"
/*/{Protheus.doc} GeraDanfe
(Função que imprime as danfes)
@type User Function
@author Tiago Fonseca Lima
@since 02/06/2023
@version 12.1.33
@param aAux, Array, Array com as notas para impressão
@param cSerie, character, serie
/*/
User Function GeraDanfe(aAux, cSerie)
Local aArea := FwGetArea()
Local cIdent := ""
Local lEnd := .F.
Local nTamNota := TamSX3("F2_DOC")[1]
Local nTamSerie := TamSX3("F2_SERIE")[1]
Local dDataDe := Date() - 365
Local dDataAte := Date() + 365
Local lAdjustToLegacy := .F.
Local lDisableSetup := .T.
Local oDanfe := Nil
Local aImpr := GetImpWindows(.F.)
Local lSetup := .T.
Local cPrinter := ""
Private PixelX
Private PixelY
Private nConsNeg
Private nConsTex
Private oRetNF := Nil
Private nColAux
Default aAux := {}
Default cArquivo := ""
Default cSerie := ""
If Len(aImpr) > 0
cPrinter := aImpr[1]
lSetup := .F.
EndIf
cIdent := RetIdEnti()
cArquivo := aAux[1] + "_" + dToS(Date()) + "_" + StrTran(Time(), ":", "-") + ".pdf"
Pergunte("NFSIGW",.F.)
MV_PAR01 := PadR(aAux[1], nTamNota) //Nota Inicial
MV_PAR02 := PadR(aAux[Len(aAux)], nTamNota) //Nota Final
MV_PAR03 := PadR(cSerie, nTamSerie) //Série da Nota
MV_PAR04 := 2 //NF de Saida
MV_PAR05 := 2 //Frente e Verso = Nao
MV_PAR06 := 2 //DANFE simplificado = Nao
MV_PAR07 := dDataDe //Data De
MV_PAR08 := dDataAte //Data Até
If !lSetup
oDanfe:= FwMSPrinter():New(cArquivo, IMP_SPOOL, lAdjustToLegacy,, lDisableSetup,,, cPrinter, .F.)
Else
Aviso("Impressora Padrão", "Não existe impressora padrão definida, será exibido o Setup de Impressão!!!", {"Ok"}, 1, , , , , 2000)
oDanfe:= FwMSPrinter():New(cArquivo, IMP_SPOOL, lAdjustToLegacy,, lDisableSetup,,,,,,,)
oDanfe:Setup()
EndIf
oDanfe:SetResolution(78)
oDanfe:SetPortrait()
oDanfe:SetPaperSize(9)
oDanfe:SetMargin(60, 60, 60, 60)
PixelX := oDanfe:nLogPixelX()
PixelY := oDanfe:nLogPixelY()
nConsNeg := 0.4
nConsTex := 0.5
oRetNF := Nil
nColAux := 0
If !lSetup
FWMsgRun(, {|| u_DanfeProc(@oDanfe, @lEnd, cIdent, , , .F.)}, "Aguarde...", "Imprimindo Danfe......")
oDanfe:Print()
Else
If oDanfe:nModalResult == PD_OK
FWMsgRun(, {|| u_DanfeProc(@oDanfe, @lEnd, cIdent, , , .F.)}, "Aguarde...", "Imprimindo Danfe......")
oDanfe:Print()
EndIf
EndIf
FwRestArea(aArea)
Return
Bom pessoal, por hoje é só.
Abraços e até a próxima.