Página 1 de 2

Win32Prn imprime so uma parte do relatorio

Enviado: 10 Fev 2016 18:37
por porter
olá pessoal, estou usando a rotina abaixo para impressão em impressora nao fiscal e jato de tinta, mas se a quantidade de linhas for muito grande, por exemplo tem um aqui com 115 linhas, nesse caso foi impresso ate a linha 73, estou passando um arquivo com extensao txt e o aquivo está correto, gostaria de saber porque imprime so uma parte, será que é porque na rotina abaixo está A4 ?

obrigado.

xHarbour, windows 7.

Código: Selecionar todos

PROCEDURE W32PRN(arqtxt,nomeimpressora,tipo_de_impressao)
      #include "WinGdi.ch"
      Local cPrinter
      Local contl := 1
	  cFileName := "C:\JATOxh\" + arqtxt
      SET PRINTER TO
      SET DEVICE TO SCREEN
      If !File("&cFileName")
         Return Nil
      Else  // Vamos colocar seu arquivo num Array
         cLinha := Nil
         aLinesPrint := {}
         cBuffer := FOpen( cFileName, 2 )
         Do While Hb_FReadLine( cBuffer, @cLinha, Nil, 255 ) = 0
            AaDd( aLinesPrint, cLinha )
         EndDo
         FClose( cBuffer )
      EndIf
*     cPrinter := PegaPrinter()  // escolhe a impressora (cPrinter retorna o nome da impressora)
      cPrinter := ALLTRIM(nomeimpressora)
	  
      If Empty( cPrinter )
         Alert(HB_ANSITOOEM("Não foi informado o nome da Impressora em Parâmetros !") )
         Return Nil
      ENDIF
	  
      If !Empty( cPrinter )
         nCopias := 1  // numero de c¢pias
         oPrinter           := Win32Prn():new( cPrinter )
         oPrinter:landscape := .F.
         oPrinter:formType  := DMPAPER_A4  // folha A4
         oPrinter:copies    := nCopias
         IF .NOT. oPrinter:create()
            Alert("Erro Tentando Acessar a Impressora ; " + alltrim(nomeimpressora) )
            Return Nil
         ENDIF
         IF .NOT. oPrinter:startDoc( "Impressao Teste" )
            Alert("Erro Tentando Enviar os Dados de Impressao")
            Return Nil
         ENDIF
*****************************************************************		 
//impressao comprimida: { 3, -50 } ‚ igual 50/3, ou seja 16.6 cpp
//          oPrinter:SetFont( "Lucida Console", 10,{3,-70} )
//impressao comprimida e negritado
//          oPrinter:SetFont( 'Courier New',    12,{3,-55},700,.F.,.F. )
//          oPrinter:SetFont( "Lucida Console", 10,{3,-60},700,.F.,.F. )
*           teste = ' "Lucida Console", 10,{3,-60},FW_BOLD,.F.,.F. '
            if UPPER(ALLTRIM(tipo_de_impressao)) = "COMPRIMIDO"
               oPrinter:SetFont( "Lucida Console", 10,{3,-60},FW_BOLD,.F.,.F. )
			endif
*           oPrinter:SetFont( teste )
*****************************************************************
         // impressao normal
*****************************************************************
*        oPrinter:SetFont( "Lucida Console", 10 )
*****************************************************************
*        oPrinter:CharSet( 0 )
*        oPrinter:bold( FW_NORMAL )  // nao negrito, nao italico, etc...
//       oPrinter:Bold( FW_SEMIBOLD )   // semi negrito
//       oPrinter:Bold( FW_BOLD )       // negrito
//       oPrinter:Bold( FW_EXTRABOLD )  // negrito extra
*****************************************************************
*        PrintBitMap(oPrinter, "C:\SYS222\Cowboy.bmp")
*****************************************************************
         For i = 1 To Len ( aLinesPrint )
             oPrinter:textOut( aLinesPrint[ i ] )  // imprime a linha
             oPrinter:newLine()  // passa para proxima linha
         Next
         oPrinter:endDoc()   // envia a impressora
         oPrinter:destroy()  // fecha documento de impressao
      EndIf
      Return Nil

Win32Prn imprime so uma parte do relatorio

Enviado: 10 Fev 2016 19:58
por Toledo
Amigo, tente o seguinte:

Código: Selecionar todos

         nLinha:=0
         For i = 1 To Len ( aLinesPrint )
             nLinha+=1
             oPrinter:textOut( aLinesPrint[ i ] )  // imprime a linha
             oPrinter:newLine()  // passa para proxima linha
             if nLinha>59  //60 linhas por folha
                oPrinter:NewPage()  //nova pagina
                nLinha:=0
             endif
         Next
Abraços,

Win32Prn imprime so uma parte do relatorio

Enviado: 10 Fev 2016 20:43
por JoséQuintas
Só complementando:

Em Windows não existe formulário contínuo, é uma folha de cada vez, por exemplo a A4.
O programa tem que testar quando acaba o espaço da folha, e começar uma folha nova.
Caso contrário, todo texto excedente será cortado.

Win32Prn imprime so uma parte do relatorio

Enviado: 11 Fev 2016 09:40
por porter
ola Toledo,
Acrescentei as linhas que você pássou, estou tentando imprimir em uma impressora nao fiscal, esta imprimindo 59 linhas pula um pedaço e começa imprimir a outra parte, nao imprime um item abaixo do outro ate o final, tem como contornar esse problema nessa rotina, ou essa rotina so da certo para impressora jato de tinta A4 ?

xHarbour, obrigado.

Win32Prn imprime so uma parte do relatorio

Enviado: 11 Fev 2016 10:38
por JoséQuintas
Vá aumentando a quantidade de linhas, até descobrir a quantidade máxima de uma página.
Ou imprima um texto numerando linhas, e veja qual o número da última.

Win32Prn imprime so uma parte do relatorio

Enviado: 11 Fev 2016 10:57
por Toledo
porter escreveu:estou tentando imprimir em uma impressora nao fiscal
É uma bobina... então neste caso seria melhor usar a função PrintFileRaw( cPrinter, cFileName, "Titulo" ), teste o seguinte código:

Código: Selecionar todos

PROCEDURE W32PRN(arqtxt,nomeimpressora,tipo_de_impressao)
Local cFileName := "C:\JATOxh\" + arqtxt
Local cPrinter := ALLTRIM(nomeimpressora)
Local nResult, cMsg:=""
      SET PRINTER TO
      SET DEVICE TO SCREEN
      If !File("&cFileName")
         Return Nil
      Else
         nResult := PrintFileRaw( cPrinter, cFileName, "Impressao Pelo Sistema" )
         IF nResult = -1
            cMsg = "Parametros Invalido, Favor Tentar Novamente"
         ELSEIF nResult = -2
            cMsg = "Falha na chamada da Impressora, Favor Verificar a Impressora"
         ELSEIF nResult = -3
            cMsg = "Falha ao Iniciar Impressão, Favor Verificar a Impressora"
         ELSEIF nResult = -4
            cMsg = "Falha ao Iniciar a Primeira Pagina, Favor Verificar a Impressora"
         ELSEIF nResult = -5
            cMsg = "Falha de Memoria da Impressora, Favor Verificar a Impressora"
         ELSEIF nResult = -6
            cMsg = "Não foi Possivel localizar o arquivo de Impressão, Favor Tentar Novamente"
         ENDIF
         IF len(alltrim(cMsg)) > 1
            Alert(HB_ANSITOOEM(cMsg) )
         ENDIF
      EndIf
      Return Nil
Abraços,

Win32Prn imprime so uma parte do relatorio

Enviado: 11 Fev 2016 11:09
por porter
ola JoséQuintas,
A quantidade máxima de uma página, eu já sei, a duvida é que quando atingir essa quantidade maxima, a proxima linha tem que ser impressa logo na linha abaixo, mas da forma como está, pula umas 20 linhas mais ou menos para começar a imprimir o restante das linhas, entendeu ?

Estou imprimindo em impressora de cupom nao fiscal termica Bematech MP 2500.

Win32Prn imprime so uma parte do relatorio

Enviado: 11 Fev 2016 11:12
por porter
ola Toledo, vou testar essa rotina, obrigado.

Win32Prn imprime so uma parte do relatorio

Enviado: 11 Fev 2016 14:54
por porter
ola Toledo, fiquei sem entender, essa rotina que você passou, eu tenho que inclui-la na minha rotina ?
Fiz um teste com ela, nao imprime nada.

Win32Prn imprime so uma parte do relatorio

Enviado: 11 Fev 2016 15:21
por Toledo
porter escreveu:eu tenho que inclui-la na minha rotina ?
Amigo, é só substituir o código da sua função W32PRN() anterior por este novo código que passei na minha última mensagem.

A chamada da função W32PRN() no seu programa não vai mudar nada, continua a mesma coisa.

Abraços,

Win32Prn imprime so uma parte do relatorio

Enviado: 11 Fev 2016 16:17
por porter
ola Toledo,
Com a rotina antiga imprime normalmente, mas com essa que você postou, entra na fila de impressao mas nao imprime nada.

Win32Prn imprime so uma parte do relatorio

Enviado: 11 Fev 2016 17:01
por Toledo
porter escreveu: entra na fila de impressao mas nao imprime nada.
Bom, pode ser que esta impressora não aceita impressão em modo RAW.

Sem ter a impressora para testar, fica complicado em ajudar.

Abraços,

Win32Prn imprime so uma parte do relatorio

Enviado: 12 Fev 2016 01:29
por Paredes01
Hola, Porter

En ese tipo de impresoras lo hago de está forma :

Código: Selecionar todos

PROCEDURE IMP_AJUSWIN()

   cDevOut          := GetDefaultPrinter()
   oPrint           := Win32Prn():New(cDevOut) // Create Printer object
   oPrint:Landscape := .F.
   oPrint:FormType  := 1  // FORM_LETTER
   oPrint:Copies    := 2
   if !oPrint:Create()
      Alert("Cannot Create Printer")
      BREAK
   End if
   oPrint:SetFont('Lucida Console',9,{3,-50}, 0, .F., .F.)
   oPrint:StartDoc()


   LIN     := 0
   NTOTAL2 := 0
   ntotal  := 0
   acumiva := 0
   TITULOAJUSTEWIN()

   FOR I = 1 TO LEN(MA)
      IF MA[I,1] <> " " .AND. LEFT(MA[I,1],3) <> "ELI"

         IF MA[I,26] = "C"
            oPrint:SetPrc(oPrint:Prow()+1,1 )
            oPrint:Textout(TRANSF(MA[I,4], "99,999.99"),.F.)
         ELSE
            oPrint:SetPrc(oPrint:Prow()+1,1 )
            oPrint:Textout(TRANSF(MA[I,4], "99,999.99"),.F.)
         ENDIF

         oPrint:SetPrc(oPrint:Prow(), 11 )
         oPrint:Textout( MA[I,9] ,.F.)

         oPrint:SetPrc(oPrint:Prow(), 18 )
         oPrint:Textout(MA[I, 2] ,.F.)

         oPrint:SetPrc(oPrint:Prow(), 54 )
         oPrint:Textout(Transf(MA[I, 12], "99,999.99") ,.F.)

         IF MA[I,26] = "C"
            oPrint:SetPrc(oPrint:Prow(), 64 )
            oPrint:Textout(Transf(ROUND((( MA[I, 4] * MA[I,24] ) * MA[I,12]),2), "999,999.99") ,.F.)
         ELSE
            oPrint:SetPrc(oPrint:Prow(), 64 )
            oPrint:Textout(Transf(ROUND( (MA[I, 4] * MA[I,12]),2) , "999,999.99") ,.F.)
            NTOTAL += ROUND(( MA[I, 4] * MA[I,12] ),2)
         ENDIF

         oPrint:SetPrc(oPrint:Prow(), 74 )
         oPrint:Textout(Transf(MA[I, 3], "999,999.99") ,.F.)

         oPrint:SetPrc(oPrint:Prow(), 84 )
         oPrint:Textout( MA[I, 14] ,.F.)

         oPrint:SetPrc(oPrint:Prow(), 85 )
         oPrint:Textout( Transf(ROUND(( MA[I, 3] * MA[I,4] ),2),"999,999.99") ,.F.)

         NTOTAL2 += ROUND(( MA[I, 3] * MA[I,4] ),2)
         IF MA[I, 30] ="S"

            DBSELECTAR("ARTICULO")
            DBSETORDER(4)
            IF DBSEEK(MA[I,9])
               X1   := 0
               bandi:= .f.
               DO WHILE ARTICULO->LIGA =  MA[I,9]
                  * CON IVA SIN OFERTA REBANADO
                  if articulo->siva = "B"  .and. (date() < articulo->vig1 .or. date() > vig2) .and. articulo->padre = "R"
                     nreba1 := ARTICULO->PRECIO*nIVA115X
                     bandi  := .t.
                  endif
                  * CON IVA SIN OFERTA MENUDEO
                  if articulo->siva = "B"  .and. (date() < articulo->vig1 .or. date() > vig2) .and. articulo->padre = "M"
                     nmenu1 := ARTICULO->PRECIO*nIVA115X
                     bandi  := .t.
                  endif
                  * COIN IVA EN OFERTA REBANADO
                  if articulo->siva = "B"  .and. (date() >= articulo->vig1 .and. date()<= vig2) .and. articulo->padre = "R"
                     nreba1 := ARTICULO->ofer_p*nIVA115X
                     creba  := "*"
                     bandi  := .t.
                  endif
                  * COIN IVA EN OFERTA MENUDEO
                  if articulo->siva = "B"  .and. (date() >= articulo->vig1 .and. date()<= vig2) .and. articulo->padre = "M"
                     nmenu1 := ARTICULO->ofer_p*nIVA115X
                     bandi  := .t.
                     cmenu  := "*"
                  endif
                  * SIN IVA SIN OFERTA REBANADO
                  if articulo->siva = "A"  .and. (date() < articulo->vig1 .or. date() > vig2) .and. articulo->padre = "R"
                     nreba1 := ARTICULO->PRECIO
                     bandi  := .t.
                  endif
                  * SIN IVA SIN OFERTA MENUDEO
                  if articulo->siva = "A"  .and. (date() < articulo->vig1 .or. date() > vig2) .and. articulo->padre = "M"
                     nmenu1 := ARTICULO->PRECIO
                     bandi  := .t.
                  endif
                  * SIN IVA CON OFERTA REBANADO
                  if articulo->siva = "A"  .and. (date() >= articulo->vig1 .and. date()<= vig2) .and. articulo->padre = "R"
                     nreba1 := ARTICULO->ofer_p
                     creba  := "*"
                     bandi  := .t.
                  endif
                  * SIN IVA CON OFERTA MENUDEO
                  if articulo->siva = "A"  .and. (date() >= articulo->vig1 .and. date()<= vig2) .and. articulo->padre = "M"
                     nmenu1 := ARTICULO->ofer_p
                     cmenu  := "*"
                     bandi  := .t.
                  endif
                  * con iva sin oferta REBANADO
                  if articulo->siva = "B"  .and. (date() < articulo->vig1 .or. date() > vig2) .and. articulo->padre = "R"
                     nreba := ARTICULO->PRECIO*nIVA115X*MA[I,4]
                     X11 += ARTICULO->PRECIO*nIVA115X*MA[I,4]
                  endif
                  * con iva sin oferta MENUDEO
                  if articulo->siva = "B"  .and. (date() < articulo->vig1 .or. date() > vig2) .and. articulo->padre = "M"
                     nmenu := ARTICULO->PRECIO*nIVA115X*MA[I,4]
                     X22 += ARTICULO->PRECIO*nIVA115X*MA[I,4]
                  endif
                  * con iva en oferta  REBANADO
                  if articulo->siva = "B"  .and. (date() >= articulo->vig1 .and. date()<= vig2) .and. articulo->padre = "R"
                     nreba := ARTICULO->ofer_p*nIVA115X*MA[I,4]
                     x11 += ARTICULO->ofer_p*nIVA115X*MA[I,4]
                  endif
                  * con iva en oferta  MENUDEO
                  if articulo->siva = "B"  .and. (date() >= articulo->vig1 .and. date()<= vig2) .and. articulo->padre = "M"
                     nmenu := ARTICULO->ofer_p*nIVA115X*MA[I,4]
                     x22 += ARTICULO->ofer_p*nIVA115X*MA[I,4]
                  endif
                  * sin iva sin oferta REBANADO
                  if articulo->siva = "A"  .and. (date() < articulo->vig1 .or. date() > vig2) .and. articulo->padre = "R"
                     nreba := ARTICULO->PRECIO*MA[I,4]
                     x11 += ARTICULO->PRECIO*MA[I,4]
                  endif
                  * sin iva sin oferta MENUDEO
                  if articulo->siva = "A"  .and. (date() < articulo->vig1 .or. date() > vig2) .and. articulo->padre = "M"
                     nmenu := ARTICULO->PRECIO*MA[I,4]
                     x22 += ARTICULO->PRECIO*MA[I,4]
                  endif
                  * sin iva con oferta REBANADO
                  if articulo->siva = "A"  .and. (date() >= articulo->vig1 .and. date()<= vig2) .and. articulo->padre = "R"
                     nreba := ARTICULO->ofer_p*MA[I,4]
                     x11 += ARTICULO->ofer_p*MA[I,4]
                  endif
                  * sin iva con oferta MENUDEO
                  if articulo->siva = "A"  .and. (date() >= articulo->vig1 .and. date()<= vig2) .and. articulo->padre = "M"
                     nmenu:=ARTICULO->ofer_p*MA[I,4]
                     x22 += ARTICULO->ofer_p*MA[I,4]
                  endif
                  DBSkip()
                  X1 += 11
               ENDDO

               *IMPRESION DE PRECIOS REBANADOS Y MENUDEOS
               if bandi
                  IF NREBA>0
                     oPrint:SetPrc(oPrint:Prow(), 96 )
                     oPrint:Textout( Transf(NREBA1,"999,999.99") ,.F.)

                     oPrint:SetPrc(oPrint:Prow(),106 )
                     oPrint:Textout(CREBA ,.F.)

                     oPrint:SetPrc(oPrint:Prow(),107 )
                     oPrint:Textout(Transf(NREBA ,"999,999.99")  ,.F.)
                  ENDIF
                  
                  NREBA := NREBA1 := NMENU := NMENU1 := 0
                  CREBA := CMENU := " "
                  BANDI := .F.
               Endif
            ENDIF
         ENDIF
         LIN++
         IF LIN >= 58
            oPrint:NewPage()
            LIN = 0
            TITULOAJUSTEWIN()
         ENDIF
      ENDIF
   NEXT

   IF LIN >= 54
      oPrint:NewPage()
      LIN = 0
      TITULOAJUSTEWIN()
   ENDIF

   oPrint:SetPrc(oPrint:Prow()+1, 0 )
   oPrint:Textout(REPLICATE("-",135)  ,.F.)

   IF !EMPTY(cCONCEP1)
      oPrint:SetPrc(oPrint:Prow()+1, 0 )
      oPrint:Textout(cCONCEP1  ,.F.)
   ENDIF
   IF !EMPTY(cCONCEP2)
      oPrint:SetPrc(oPrint:Prow()+1, 0 )
      oPrint:Textout(cCONCEP2  ,.F.)
   ENDIF
   IF !EMPTY(cCONCEP3)
      oPrint:SetPrc(oPrint:Prow()+1, 0 )
      oPrint:Textout(cCONCEP3  ,.F.)
   ENDIF

   oPrint:SetPrc(oPrint:Prow()+1, 45 )
   oPrint:Textout("TOTALES: "  ,.F.)

   oPrint:SetPrc(oPrint:Prow(), 63+1 )
   oPrint:Textout(Transf(nTotal,"999,999.99")  ,.F.)

   oPrint:SetPrc(oPrint:Prow(), 84+1 )
   oPrint:Textout(Transf(nTotal2,"999,999.99")  ,.F.)

   if x11 >0
      oPrint:SetPrc(oPrint:Prow(),106+1 )
      oPrint:Textout(Transf(X11, "999,999.99")  ,.F.)
   endif

   if x22 >0
      oPrint:SetPrc(oPrint:Prow(), 128+1 )
      oPrint:Textout(Transf(X22, "999,999.99")  ,.F.)
   endif

   oPrint:SetPrc(oPrint:Prow()+3, 5 )
   oPrint:Textout("     CAPTURO AJUSTE        "  ,.F.)

   oPrint:SetPrc(oPrint:Prow()+1, 11 )
   oPrint:Textout(ANOMUSU  ,.F.)

   oPrint:SetPrc(oPrint:Prow()+2, 5 )
   oPrint:Textout("---------------------------" ,.F.)

   oPrint:SetPrc(oPrint:Prow()+1, 5 )
   oPrint:Textout("      FIRMA Y NOMBRE       " ,.F.)

   oPrint:EndDoc(.F.)
   oPrint:Destroy()

RETURN


//---------------------
PROCEDURE TITULOAJUSTEWIN()
   IF LIN = 0

      oPrint:SetPrc(0, 0)

      oPrint:SetPrc(oPrint:Prow()+1,(INT(135-LEN(cNOM_EMP))/2) )
      oPrint:Textout(cNOM_EMP,.F.)

      oPrint:SetPrc(oPrint:Prow()+1,(INT(135-LEN("SUC : " + cSUC_EMP))/2) )
      oPrint:Textout(cSUC_EMP,.F.)

      oPrint:SetPrc(oPrint:Prow()+1,(INT(135-LEN("COMPROBANTE DE MOVIMIENTOS"))/2) )
      oPrint:Textout("COMPROBANTE DE MOVIMIENTOS",.F.)

      oPrint:SetPrc(oPrint:Prow()+1,0 )
      oPrint:Textout("FECHA : " + DTOC(DATE()) +" - "+TIME() + "  " +"FOLIO: " + cFOLIO,.F.)

      oPrint:SetPrc(oPrint:Prow()+1,0 )
      oPrint:Textout(REPLICATE("-",135),.F.)

      oPrint:SetPrc(oPrint:Prow()+1,0 )
      oPrint:Textout("MOV. :" + cCONCEP +" "+cDESCRIP,.F.)

      oPrint:SetPrc(oPrint:Prow()+1,0 )
      oPrint:Textout("CLTE/PROV : "+ cPROV+" "+cDESCPROV,.F.)

      oPrint:SetPrc(oPrint:Prow()+1,0 )
      oPrint:Textout(REPLICATE("-",135),.F.)

      oPrint:SetPrc(oPrint:Prow()+1,0 )
      oPrint:Textout("CANTIDAD  CODIGO",.F.)

      oPrint:SetPrc(oPrint:Prow(), 18 )
      oPrint:Textout("D E S C R I P C I O N",.F.)

      oPrint:SetPrc(oPrint:Prow(), 54 )
      oPrint:Textout("COSTO",.F.)

      oPrint:SetPrc(oPrint:Prow(), 64+2 )
      oPrint:Textout("T O T A L",.F.)

      oPrint:SetPrc(oPrint:Prow(), 74+2 )
      oPrint:Textout("PRECIO 1",.F.)

      oPrint:SetPrc(oPrint:Prow(), 85+2 )
      oPrint:Textout("TOTAL  P1",.F.)

      oPrint:SetPrc(oPrint:Prow(), 96+2 )
      oPrint:Textout("PRECIO 2",.F.)

      oPrint:SetPrc(oPrint:Prow(),107+2 )
      oPrint:Textout("TOTAL  P2",.F.)

      oPrint:SetPrc(oPrint:Prow()+1, 0 )
      oPrint:Textout(REPLICATE("-",135),.F.)

      LIN = 10
   ENDIF
RETURN
Saludos
Ariel

Win32Prn imprime so uma parte do relatorio

Enviado: 12 Fev 2016 08:37
por porter
bom dia pessoal,
A impressora que estou testando a impressao é uma jato de tinta:

HP Deskjet 3510 series

A impressora termica é:

Bematech MP-2500

Win32Prn imprime so uma parte do relatorio

Enviado: 12 Fev 2016 14:42
por porter
ola pessoal,

Na impressora:
HP Deskjet 3510 series
entra na fila de impressao mas nao imprime
----------------------------------------------------

Na impressora termica:
Bematech MP-2500

Imprimiu corretamente, mas nao corta o papel, o papel é cortado com algum comando ?