Imprimindo etiqueta em impressora térmica com MSCBPrinter – Maratona AdvPL e TL++ 358

Nesse vídeo demonstraremos a utilização da função MSCBPrinter, que serve para gerar e imprimir etiquetas em impressoras térmicas (como a famosa Zebra).

Abaixo o código fonte desenvolvido para o exemplo em vídeo acima:

//Bibliotecas
#Include "TOTVS.ch"
#Include "TopConn.ch"

/*/{Protheus.doc} User Function zExe358
Realiza a impressão de uma etiqueta em uma impressora térmica
@type Function
@author Atilio
@since 26/03/2023
@see https://tdn.totvs.com/display/public/mp/MSCBPrinter+-+Configura+Impressora+--+30557
@obs 
    Função MSCBPrinter
    Parâmetros
        + cModelPrt   , Caractere        , String com o nome do modelo da impressora
        + cPorta      , Caractere        , String com o número da porta
        + nDensidade  , Numérico         , Número com densidade
        + nTamanho    , Numérico         , Tamanho da etiqueta em milímetros
        + lSrv        , Lógico           , Se .T. imprime no servidor se .F. na estação
        + nPorta      , Numérico         , Número da porta (outro server)
        + cServer     , Caractere        , Endereço de IP (outro server)
        + cEnv        , Caractere        , Ambiente (outro server)
        + nMemoria    , Numérico         , Número do bloco de memória da impressora
        + cFila       , Caractere        , Pasta onde será gravada a fila de impressão
        + lDrvWin     , Lógico           , Indica se será usado os drivers instalados no Windows
        + cPathSpool  , Caractere        , Diretório do spooler de impressão que irá controlar a fila
    Retorno
        Função não tem retorno

    **** Apoie nosso projeto, se inscreva em https://www.youtube.com/TerminalDeInformacao ****
/*/

User Function zExe358()
    Local aArea     := FWGetArea()
    Local aPergs    := {}
	Local cPedido   := Space(TamSX3('C5_NUM')[1])
    
    //Adicionando os parametros do ParamBox
    aAdd(aPergs, {1, "Pedido",  cPedido,  "", ".T.", "SC5", ".T.", 80,  .F.}) // MV_PAR01
    
    //Se a pergunta for confirma, cria as definicoes do relatorio
    If ParamBox(aPergs, "Informe os parâmetros", , , , , , , , , .F., .F.)
         Processa({|| fMontaRel()}, "Processando...")
    EndIf
     
    FWRestArea(aArea)
Return

Static Function fMontaRel()
    Local cPorta     := "LPT1"
    Local nQtdCopias := 1
    Local nVolIniPvt := 1
    Local nVolFimPvt := 1

    DbSelectArea("SC5")
    SC5->(DbSetOrder(1)) // C5_FILIAL + C5_NUM
    DbSelectArea("SA1")
    SA1->(DbSetOrder(1)) // A1_FILIAL + A1_COD + A1_LOJA
    DbSelectArea("SA4")
    SA4->(DbSetOrder(1)) // A4_FILIAL + A4_COD

    //Somente se conseguir posicionar no pedido
    If SC5->(MsSeek(FWxFilial("SC5") + MV_PAR01))
    
        //Cria a etiqueta com configuração de etiqueta de 80mm
        MSCBPrinter("S600", cPorta, , , .F.)
        MSCBChkStatus(.F.) //Alguns modelos exigem esse comando
        MSCBInfoEti("ETIQUETA", "ROTULO")
        MSCBBegin(nQtdCopias, 6, 81) //Qtde de copias, velocidade (1 a 6) e tamanho da etiqueta em mm
        MSCBBox(02, 03, 98, 78, 3)
            
        //Dados da Empresa com linha de separação
        MSCBSay(005, 006, "Remet.: ",                           "N", "0", "029, 036")
        MSCBSay(026, 006, "Nome da Empresa",                    "N", "0", "043, 053", .F.)
        MSCBSay(005, 013, "Rua Teste 123, Fone: 014 0000-1111", "N", "0", "024, 034")
        MSCBSay(023, 017, "CEP 17000-111, Bauru-SP",            "N", "0", "024, 034")
        MSCBLineH(02, 21, 98, 3)
        
        //Dados do Cliente com linha de separação
        If SA1->(MsSeek(FWxFilial("SA1") + SC5->C5_CLIENTE + SC5->C5_LOJACLI))
            MSCBSay(005, 022, "Codigo: " + SC5->C5_CLIENTE,                                             "N", "0", "029, 036")
            MSCBSay(005, 026, "Cliente: " + SubStr(SA1->A1_NOME, 1, 40),                                "N", "0", "029, 036")
            MSCBSay(005, 030, "End.: " + Alltrim(SA1->A1_END),                                          "N", "0", "024, 034")
            MSCBSay(005, 034, "Bairro: " + Alltrim(SA1->A1_BAIRRO) + "   CEP: " + Alltrim(SA1->A1_CEP), "N", "0", "029, 036")
            MSCBSay(005, 038, "Cidade: " + Alltrim(SA1->A1_MUN) + "   UF: " + Alltrim(SA1->A1_EST),     "N", "0", "026, 036")
            MSCBSay(005, 042, "Telefone: (" + Alltrim(SA1->A1_DDD) +  ") " + Alltrim(SA1->A1_TEL),      "N", "0", "029, 036")
        EndIf
        MSCBLineH(02, 46, 98, 3)
        
        //Dados da Transportadora com linha de separação
        If SA4->(MsSeek(FWxFilial("SA4") + SC5->C5_TRANSP))
            MSCBSay(005, 048, "Transp.: " + Alltrim(SA4->A4_NOME),                                                 "N", "0", "029, 036")
            MSCBSay(005, 052, "Munic.:  " + Alltrim(SA4->A4_MUN),                                                  "N", "0", "021, 031")
            MSCBSay(005, 056, "Redesp.: " + SubStr(SA4->A4_NOME, 1, 20) + " (" + SA4->A4_DDD + ") " + SA4->A4_TEL, "N", "0", "021, 031")
            MSCBSay(005, 060, Alltrim(SA4->A4_END),                                                                "N", "0", "021, 031")
            MSCBSay(005, 064, "Munic.: " + AllTrim(SubStr(SA4->A4_MUN, 1, 20)) + "/" + SA4->A4_EST,                "N", "0", "021, 031")
        EndIf
        MSCBLineH(02, 68, 98, 3)
        
        //Dados da NF
        MSCBSay(005, 069, "Nota Fiscal: " + SC5->C5_NOTA,                                      "N", "0", "024, 034")
        MSCBSay(005, 069, "Pedido n.: " + Alltrim(SC5->C5_NUM) + " (Consta no DANFe)",         "N", "0", "024, 034")
        MSCBSay(037, 073, cValToChar(SC5->C5_VOLUME1) + " " + Upper(Alltrim(SC5->C5_ESPECI1)), "N", "0", "043, 053")
        MSCBSay(005, 073, "Volume: " + cValToChar(nVolIniPvt) + "/" + cValToChar(nVolFimPvt),  "N", "0", "024, 034")

        //Finaliza a etiqueta
        MSCBEnd()
        MSCBClosePrinter()
    EndIf

    FWRestArea(aArea)
Return

Bom pessoal, por hoje é só.

Abraços e até a próxima.

Dan (Daniel Atilio)
Cristão de ramificação protestante. Especialista em Engenharia de Software pela FIB, graduado em Banco de Dados pela FATEC Bauru e técnico em informática pelo CTI da Unesp. Entusiasta de soluções Open Source e blogueiro nas horas vagas. Autor e mantenedor do portal Terminal de Informação.

2 Responses

  1. LUIZ SILVA CORREIA JUNIOR disse:

    Grande Danilo ficou show este material.
    Gostaria de contribuir seu prestigiado site, para aqui inserir o link deste mesmo assunto, mas que trata a impressão com comandos de linha, quadros, letras com fundo vasado e até a impressão do Logo.
    Espero aqui ajudar a todos, pois é escasso material sobre este assunto. Segue o link: 😉
    https://www.linkedin.com/posts/luiz-silva-correia-junior-1660bb85_imprimindo-com-o-protheus-as-etiquetas-t%C3%A9rmicas-activity-6988912197242359808-CwKe?utm_source=share&utm_medium=member_desktop

    • Boa tarde Luiz, tudo joia?

      Opa, primeiramente obrigado pelo comentário e pelo elogio no prestigiado, é muita bondade e principalmente generosidade sua.

      Quanto ao seu link, parabéns pela iniciativa em disseminar o conhecimento, ficou show de bola a matéria do LinkedIn.

      Ah se algum dia precisar também, no Autumn Code Maker, tem um gerador de etiquetas para impressora térmica, mas usando a FWMSPrinter, segue um vídeo de exemplo: https://www.youtube.com/watch?v=OIV2pLratrU

      Observação: meu nome é Daniel, não Danilo.

      Um grande abraço.

Deixe uma resposta

Terminal de Informação