Convertendo Sistema do GASPRO para Harbour

Projeto [x]Harbour - Compilador de código aberto compatível com o Clipper.

Moderador: Moderadores

clipsis
Usuário Nível 2
Usuário Nível 2
Mensagens: 79
Registrado em: 02 Jun 2010 11:53
Localização: brasil

Convertendo Sistema do GASPRO para Harbour

Mensagem por clipsis »

Olá e bom dia a todos!

Olá Pablo César. Da forma como você postou agora, entendi o que você havia dito sobre os comandos ESC/P estarem nos locais corretos.

Lembro também que os relatórios foram gerados automaticamente pelo GASPro 4.0 e se faço envio do relatório para uma impressora LX-300 (por exemplo) ele sai de forma correta com esses mesmos comandos nesses mesmos locais. Também: se gero o relatório em arquivo e depois envio para o DOSPRINTER a impressão sai correta, em qualquer impressora e também nas "impressoras" que geramm PDF.

Segue abaixo o código fonte:

Código: Selecionar todos

#include "sisirmao.ch"  // inicializa constantes manifestas

PRIV dele_atu, cur_atual, getlist:={}, so_um_reg, sit_dbf
PARA lin_menu, col_menu, imp_reg
PRIV  tem_borda:=.t., op_menu:=VAR_COMPL, l_s:=6, c_s:=13, l_i:=10, c_i:=70, tela_fundo:=SAVESCREEN(0,0,MAXROW(),79)
nucop=1
so_um_reg=(PCOUNT()>2)
IF !so_um_reg                             // vai receber a variaveis?
   SETCOLOR(drvtittel)
   vr_memo=NOVAPOSI(@l_s,@c_s,@l_i,@c_i)  // pega posicao atual da tela
   CAIXA(mold,l_s,c_s,l_i,c_i)            // monta caixa da tela
   @ l_s,c_s+19 SAY " IMPRESSŽO DE PEDIDO "
   SETCOLOR(drvcortel)
   @ l_s+01,c_s+1 SAY "Pedido n§:"
   @ l_s+02,c_s+1 SAY "Emiss„o__:"
   @ l_s+03,c_s+1 SAY "Cliente__:"
ENDI
PRIV scodped:=SPAC(8)                                        // Pedido
PRIV lin_med:=SPAC(1)                                        // Lin_med
DO WHILE .t.
   rola_t=.f.
   cod_sos=56
   IF !so_um_reg
      SET KEY K_ALT_F8 TO ROLATELA
      SETCOLOR(drvcortel+","+drvcorget+",,,"+corcampo)
      @ l_s+01 ,c_s+12 GET  scodped;
                       PICT "99999999";
                       VALI CRIT("PTAB(scodped,'PEDI0000',1).AND.PTAB(scodped,'PECL0000',1).AND.PTAB(PECL0000->codcli,'CLIE0000',1)~N£mero de pedido n„o encontrado")
                       AJUDA "Entre com o n£mero de pedido....|{F8 - consulta}"
                       CMDF8 "VDBF(6,11,20,77,'PEDI0000',{'codped','datped','totped','totmad','totdiv'},1,'codped',[])"
                       MOSTRA {"LEFT(TRAN(PEDI0000->datped,[@D]),10)", 2 , 12 }
                       MOSTRA {"LEFT(TRAN(CLIE0000->nomcli,[@!]),45)", 3 , 12 }

      @ l_s+01 ,c_s+22 GET  lin_med;
                       VALI CRIT("!EMPT(lin_med)~Necess rio informar LIN_MED");
                       WHEN ".f."

      READ
      SET KEY K_ALT_F8 TO
      IF rola_t
         ROLATELA(.f.)
         LOOP
      ENDI
      IF LASTKEY()=K_ESC                                     // se quer cancelar
         RETU                                                // retorna
      ENDI
   ENDI

   #ifdef COM_REDE
      IF !USEARQ("PEDI0000",.f.,10,1)                        // se falhou a abertura do arq
         RETU                                                // volta ao menu anterior
      ENDI
   #else
      USEARQ("PEDI0000")                                     // abre o dbf e seus indices
   #endi

   PTAB(codven,"VEND0000",1,.t.)                             // abre arquivo p/ o relacionamento
   SET RELA TO codven INTO VEND0000                          // relacionamento dos arquivos
   titrel:=criterio := ""                                    // inicializa variaveis
   cpord=""
   chv_rela:=chv_1:=chv_2 := ""
   tps:=op_x:=ccop := 1
   arq_=drvporta                                             // porta de saida configurada
   IF !so_um_reg
      fil_ini="codped=M->scodped"
      IF !opcoes_rel(lin_menu,col_menu,1,11,fil_ini)         // nao quis configurar...
         CLOS ALL                                            // fecha arquivos e
         LOOP                                                // volta ao menu
      ENDI

   #ifdef COM_REDE

      ELSE

         tps=lin_menu

   #endi

   ENDI
   IF tps=2                                                  // se vai para arquivo/video
      arq_=ARQGER()                                          // entao pega nome do arquivo
      IF EMPTY(arq_)                                         // se cancelou ou nao informou
         LOOP                                                // retorna
      ENDI
   ELSE
      arq_=drvporta                                          // porta de saida configurada
   ENDI
   SET PRINTER TO (arq_)                                     // redireciona saida
   EXIT
ENDD
cur_atual=SETCURSOR(0)
criterio_=criterio                                           // salva criterio e ordenacao
cpord_=cpord                                                 // definidos se huver
criterio=""

#ifdef COM_REDE
   IF !USEARQ("PECL0000",.f.,10,1)                           // se falhou a abertura do arq
      RETU                                                   // volta ao menu anterior
   ENDI
#else
   USEARQ("PECL0000")                                        // abre o dbf e seus indices
#endi

PTAB(codcli,"CLIE0000",1,.t.)                                // abre arquivo p/ o relacionamento
SET RELA TO codcli INTO CLIE0000                             // relacionamento dos arquivos
cpord="codped"
criterio=""
INDTMP()

#ifdef COM_REDE
   IF !USEARQ("PEIT0000",.f.,10,1)                           // se falhou a abertura do arq
      RETU                                                   // volta ao menu anterior
   ENDI
#else
   USEARQ("PEIT0000")                                        // abre o dbf e seus indices
#endi

cpord="codped"
criterio=""
INDTMP()

#ifdef COM_REDE
   IF !USEARQ("PEIT0000",.f.,10,1)                           // se falhou a abertura do arq
      RETU                                                   // volta ao menu anterior
   ENDI
#else
   USEARQ("PEIT0000")                                        // abre o dbf e seus indices
#endi

cpord="codped"
criterio=""
INDTMP()

#ifdef COM_REDE
   IF !USEARQ("PETT0000",.f.,10,1)                           // se falhou a abertura do arq
      RETU                                                   // volta ao menu anterior
   ENDI
#else
   USEARQ("PETT0000")                                        // abre o dbf e seus indices
#endi

PTAB(codcon,"COND0000",1,.t.)                                // abre arquivo p/ o relacionamento
SET RELA TO codcon INTO COND0000                             // relacionamento dos arquivos
cpord="codped"
criterio=""
INDTMP()

#ifdef COM_REDE
   IF !USEARQ("PEPG0000",.f.,10,1)                           // se falhou a abertura do arq
      RETU                                                   // volta ao menu anterior
   ENDI
#else
   USEARQ("PEPG0000")                                        // abre o dbf e seus indices
#endi

PTAB(codcar,"CART0000",1,.t.)                                // abre arquivo p/ o relacionamento
PTAB(codban,"BANC0000",1,.t.)
SET RELA TO codcar INTO CART0000,;                           // relacionamento dos arquivos
         TO codban INTO BANC0000
cpord="codped+codcon"
criterio=""
INDTMP()
criterio=criterio_                                           // restabelece criterio e
cpord=cpord_                                                 // ordenacao definidos
SELE PEDI0000
dele_atu:=SET(_SET_DELETED,.t.)                              // os excluidos nao servem...
POE_GAUGE("[ESC] Interrompe","AGUARDE...","Emitidos:")
SET DEVI TO PRIN                                             // inicia a impressao
maxli=56                                                     // maximo de linhas no relatorio
BEGIN SEQUENCE
   DO WHIL ccop<=nucop                                       // imprime qde copias pedida
      pg_=1; cl=50000
      IF so_um_reg
         GO imp_reg
      ELSE
         INI_ARQ()                                           // acha 1o. reg valido do arquivo
      ENDI
      IF EOF()
         EXIT
      ENDI
      ccop++                                                 // incrementa contador de copias
      ult_imp=0                                              // ultimo reg impresso
      DO WHIL !EOF().AND.(!so_um_reg.OR.imp_reg=RECN()).AND.POE_GAUGE()
         IF IN_KEY()=K_ESC                                   // se quer cancelar
            IF canc()                                        // pede confirmacao
               BREAK                                         // confirmou...
            ENDI
         ENDI
         REL_CAB(1,.t.)                                      // soma cl/imprime cabecalho
         IMPCTL(drvpeli)                                     // comprime os dados
         @ cl,000 SAY "Vendedor  :"
         @ cl,012 SAY TRAN(VEND0000->nomven,"@!")            // Nome vendedor
         IMPCTL(drvteli)                                     // retira comprimido
         ult_imp=RECNO()                                     // ultimo reg impresso
         chv029=codped
         SELE PECL0000
         SEEK chv029
         IF FOUND()
            IF cl+3>maxli                                    // se cabecalho do arq filho
               REL_CAB(0,.t.)                                // nao cabe nesta pagina
            ENDI                                             // salta para a proxima pagina
            IMPCTL(drvpeli)                                  // comprime os dados
            cl+=1                                            // soma contador de linha
            @ cl,000 SAY "Cliente   :"
            @ cl,012 SAY TRAN(nomcli,"@!")                   // Nome cliente
            @ cl,059 SAY "Telefone:"
            @ cl,069 SAY TRAN(foncli,"@R (99)9999-9999")     // 1§ Fone
            cl+=1                                            // soma contador de linha
            @ cl,000 SAY "Entrega   :"
            @ cl,012 SAY '('+IF(tipent='C','Cliente retira','Entregar')+')'// Tipo
            IF !EMPTY(datent)                                // pode imprimir?
               @ cl,029 SAY TRAN(datent,"@D")                // Data
            ENDI
            IMPCTL(drvteli)                                  // retira comprimido
            DO WHIL ! EOF() .AND. chv029=LEFT(&(INDEXKEY(0)),LEN(chv029)).AND.POE_GAUGE()
               IF IN_KEY()=K_ESC                             // se quer cancelar
                  IF canc()                                  // pede confirmacao
                     BREAK                                   // confirmou...
                  ENDI
               ENDI
               IF (tipent='E') //.OR. so_um_reg                // se atender a condicao...
                  REL_CAB(1)                                 // soma cl/imprime cabecalho
                  IMPCTL(drvpeli)                            // comprime os dados
                  @ cl,000 SAY "Endereco  :"
                  @ cl,012 SAY TRAN(endent,"@!")             // Endere‡o
                  @ cl,059 SAY "Bairro:"
                  @ cl,067 SAY TRAN(baient,"@!")             // Bairro
                  IMPCTL(drvteli)                            // retira comprimido
                  REL_CAB(1)                                 // soma cl/imprime cabecalho
                  IMPCTL(drvpeli)                            // comprime os dados
                  @ cl,000 SAY "Referencia:"
                  @ cl,012 SAY TRAN(refent,"@!")             // Referˆncia
                  IMPAC("Melhor hor rio:",cl,065)
                  @ cl,081 SAY horent                        // Hor rio
                  IMPCTL(drvteli)                            // retira comprimido
                  SKIP                                       // pega proximo registro
               ELSE                                          // se nao atende condicao
                  SKIP                                       // pega proximo registro
               ENDI
            ENDD
            IF cl+1>maxli                                    // se cabecalho do arq filho
               REL_CAB(0,.t.)                                // nao cabe nesta pagina
            ENDI                                             // salta para a proxima pagina
            IMPCTL(drvpeli)                                  // comprime os dados
            cl+=1                                            // soma contador de linha
            @ cl,000 SAY REPL("-",96)
            IMPCTL(drvteli)                                  // retira comprimido
         ENDI
         SELE PEDI0000                                       // volta ao arquivo pai
         chv029=codped+"M"
         SELE PEIT0000
         SEEK chv029
         IF FOUND()
            IF (tipite='M') //.OR. so_um_reg                // se atender a condicao...
               IF cl+4>maxli                                    // se cabecalho do arq filho
                  REL_CAB(0,.t.)                                // nao cabe nesta pagina
               ENDI                                             // salta para a proxima pagina
               IMPCTL(drvpeli)                                  // comprime os dados
               cl+=1                                            // soma contador de linha
               IMPEXP(cl,002,'*** Madeira ***',30)              // Titulo
               cl+=1                                            // soma contador de linha
               IMPAC("Produto/Descricao                         Qtdade    Medida  Unit rio     Total",cl,002)
               cl+=1                                            // soma contador de linha
               @ cl,002 SAY REPL("-",78)
               IMPCTL(drvteli)                                  // retira comprimido
            ENDI
            DO WHIL ! EOF() .AND. chv029=LEFT(&(INDEXKEY(0)),LEN(chv029)).AND.POE_GAUGE()
               IF IN_KEY()=K_ESC                             // se quer cancelar
                  IF canc()                                  // pede confirmacao
                     BREAK                                   // confirmou...
                  ENDI
               ENDI
               IF (tipite='M') //.OR. so_um_reg                // se atender a condicao...
                  REL_CAB(1)                                 // soma cl/imprime cabecalho
                  IMPCTL(drvpeli)                            // comprime os dados
                  @ cl,002 SAY TRAN(codite,"99999")          // C¢digo
                  IF PTAB(codite,'MADE0000',1)
                     @ cl,008 SAY TRAN(LEFT(ALLTRIM(MADE0000->desmad)+' '+codaca,35),"@!")   // Descri‡„o
                  ENDI
                  @ cl,044 SAY TRAN(qtdite,"@E 999999.99")   // Qtdade
                  @ cl,054 SAY TRAN(comite,"@E 999.99")      // Comprimento
                  @ cl,061 SAY TRAN(vlrite,"@E 99,999.99")   // Unit rio
                  @ cl,071 SAY TRAN(vlrite*qtdite,"@E 99,999.99")// Valor total
                  IMPCTL(drvteli)                            // retira comprimido
                  SKIP                                       // pega proximo registro
               ELSE                                          // se nao atende condicao
                  SKIP                                       // pega proximo registro
               ENDI
            ENDD
            cl+=1                                            // soma contador de linha
         ENDI
         SELE PEDI0000                                       // volta ao arquivo pai
         chv029=codped+"D"
         SELE PEIT0000
         SEEK chv029
         IF FOUND()
            IF (tipite='D') //.OR. so_um_reg                // se atender a condicao...
               IF cl+4>maxli                                    // se cabecalho do arq filho
                  REL_CAB(0,.t.)                                // nao cabe nesta pagina
               ENDI                                             // salta para a proxima pagina
               IMPCTL(drvpeli)                                  // comprime os dados
               cl+=1                                            // soma contador de linha
               IMPEXP(cl,002,'*** Diversos ***',32)             // Titulo
               cl+=1                                            // soma contador de linha
               IMPAC("Produto/Descricao                                 Qtdade   Unit rio      Total",cl,002)
               cl+=1                                            // soma contador de linha
               @ cl,002 SAY REPL("-",78)
               IMPCTL(drvteli)                                  // retira comprimido
            ENDI
            DO WHIL ! EOF() .AND. chv029=LEFT(&(INDEXKEY(0)),LEN(chv029)).AND.POE_GAUGE()
               IF IN_KEY()=K_ESC                             // se quer cancelar
                  IF canc()                                  // pede confirmacao
                     BREAK                                   // confirmou...
                  ENDI
               ENDI
               IF (tipite='D') //.OR. so_um_reg                // se atender a condicao...
                  REL_CAB(1)                                 // soma cl/imprime cabecalho
                  IMPCTL(drvpeli)                            // comprime os dados
                  @ cl,002 SAY TRAN(codite,"99999")          // C¢digo
                  IF PTAB(codite,'DIVE0000',1)               // pode imprimir?
                     @ cl,008 SAY TRAN(LEFT(DIVE0000->desdiv,35),"@!")// Descri‡„o
                  ENDI
                  @ cl,049 SAY TRAN(qtdite,"@E 999999.99")   // Qtdade
                  @ cl,060 SAY TRAN(vlrite,"@E 99,999.99")   // Unit rio
                  @ cl,071 SAY TRAN(vlrite*qtdite,"@E 99,999.99")// Valor total
                  IMPCTL(drvteli)                            // retira comprimido
                  SKIP                                       // pega proximo registro
               ELSE                                          // se nao atende condicao
                  SKIP                                       // pega proximo registro
               ENDI
            ENDD
            cl+=1                                            // soma contador de linha
         ENDI
         SELE PEDI0000                                       // volta ao arquivo pai
         chv029=codped
         SELE PETT0000
         SEEK chv029
         IF FOUND()
            IF cl+2>maxli                                    // se cabecalho do arq filho
               REL_CAB(0,.t.)                                // nao cabe nesta pagina
            ENDI                                             // salta para a proxima pagina
            IMPCTL(drvpeli)                                  // comprime os dados
            cl+=1                                            // soma contador de linha
            @ cl,000 SAY REPL("-",96)
            IMPCTL(drvteli)                                  // retira comprimido
            DO WHIL ! EOF() .AND. chv029=LEFT(&(INDEXKEY(0)),LEN(chv029)).AND.POE_GAUGE()
               IF IN_KEY()=K_ESC                             // se quer cancelar
                  IF canc()                                  // pede confirmacao
                     BREAK                                   // confirmou...
                  ENDI
               ENDI
               REL_CAB(1)                                    // soma cl/imprime cabecalho
               IMPCTL(drvpeli)                               // comprime os dados
               @ cl,002 SAY "Madeiras :"
               @ cl,013 SAY TRAN(PEDI0000->totmad,"@E 9999,999.99")// Total madeira
               @ cl,031 SAY "Diversos :"
               @ cl,042 SAY TRAN(PEDI0000->totdiv,"@E 9999,999.99")// Total diversos
               @ cl,065 SAY "Total do pedido :"
               @ cl,083 SAY TRAN(totpet,"@E 9999,999.99")    // Total cobrado
               IMPCTL(drvteli)                               // retira comprimido
               chv030=codped+codcon
               SELE PEPG0000
               SEEK chv030
               IF FOUND()
                  IF cl+3>maxli                              // se cabecalho do arq filho
                     REL_CAB(0,.t.)                          // nao cabe nesta pagina
                  ENDI                                       // salta para a proxima pagina
                  cl+=1                                      // soma contador de linha
                  @ cl,002 SAY "Vencimento       Valor  Pagamento"
                  IF tippag='1'                              // pode imprimir?
                     @ cl,052 SAY 'Agencia'                  // Agˆncia nome
                  ENDI
                  IF tippag='1'                              // pode imprimir?
                     @ cl,063 SAY 'Conta'                    // Conta numero
                  ENDI
                  cl+=1                                      // soma contador de linha
                  @ cl,002 SAY "---------- -----------  -----------------------------------------------"
                  DO WHIL ! EOF() .AND. chv030=LEFT(&(INDEXKEY(0)),LEN(chv030)).AND.POE_GAUGE()
                     IF IN_KEY()=K_ESC                       // se quer cancelar
                        IF canc()                            // pede confirmacao
                           BREAK                             // confirmou...
                        ENDI
                     ENDI
                     REL_CAB(1)                              // soma cl/imprime cabecalho
                     @ cl,002 SAY TRAN(datpag,"@D")          // Vencimento
                     @ cl,013 SAY TRAN(vlrpag,"@E 9999,999.99")// Valor
                     @ cl,026 SAY IF(tippag='0','Dinheiro',IF(tippag='1','Cheque',IF(tippag='2','Cart„o',IF(tippag='3','Boleto','NP/Carteira'))))// Tipo
                     IF tippag$'12'                          // pode imprimir?
                        @ cl,036 SAY TRAN(IF(tippag='1',BANC0000->nomban,CART0000->nomcar),"@!")// Cart„o/Banco
                     ENDI
                     @ cl,052 SAY TRAN(ageban,"@!")          // Agˆncia
                     @ cl,063 SAY TRAN(conban,"@!")          // Conta
                     SKIP                                    // pega proximo registro
                  ENDD
                  cl+=1                                      // soma contador de linha
               ENDI
               SELE PETT0000                                 // volta ao arquivo pai
               SKIP                                          // pega proximo registro
            ENDD
         ENDI
         SELE PEDI0000                                       // volta ao arquivo pai
         SKIP                                                // pega proximo registro
      ENDD
      IMPCTL(drvpeli)                                        // comprime os dados
      REL_RDP(.t.)                                           // imprime rodape' do relatorio
      IMPCTL(drvteli)                                        // retira comprimido
   ENDD ccop
   EJEC                                                      // salta pagina
END SEQUENCE
SETCURSOR(cur_atual)
SET PRINTER TO (drvporta)                                    // fecha arquivo gerado (se houver)
SET DEVI TO SCRE                                             // direciona saida p/ video
IF tps=2                                                     // se vai para arquivo/video
   BROWSE_REL(arq_,2,3,MAXROW()-2,78)
ENDI                  // mostra o arquivo gravado
GRELA(1)                                                     // grava variacao do relatorio
SELE PEPG0000                                                // seleciona arquivo
SET RELA TO                                                  // retira os relacionamentos
SELE PETT0000                                                // seleciona arquivo
SET RELA TO                                                  // retira os relacionamentos
SELE PECL0000                                                // seleciona arquivo
SET RELA TO                                                  // retira os relacionamentos
SELE PEDI0000                                                // seleciona arquivo
SET RELA TO                                                  // retira os relacionamentos
SET(_SET_DELETED,dele_atu)                                   // os excluidos serao vistos
IF so_um_reg
   POINTER_DBF(sit_dbf)
ENDI
RETU

STATIC PROC REL_RDP(volta_reg)                               // rodape'
LOCAL ar_:=ALIAS(), reg_atual
SELE PEDI0000                                                // volta ao arquivo pai
reg_atual=RECNO()
IF volta_reg .AND. ult_imp>0
   GO ult_imp                                                // ajusta reg p/ imp de campos no rodape'
ENDI
IF pg_>1
   IMPCTL(drvpenf)                                  // comprime os dados
   @ 57,000 SAY TRAN(PADC(ALLTRIM(M->mensa1),96),"@!")       // Rodap‚ pedido
   @ 58,000 SAY TRAN(PADC(ALLTRIM(M->mensa2),96),"@!")       // Rodap‚ pedido
   @ 59,000 SAY TRAN(PADC(ALLTRIM(M->mensa3),96),"@!")       // Rodap‚ pedido
   @ 60,000 SAY TRAN(PADC(ALLTRIM(M->mensa4),96),"@!")       // Rodap‚ pedido
   IMPCTL(drvtenf)                                  // comprime os dados
   @ 61,000 SAY REPL("-",96)
   IF R00102F9()                                             // pode imprimir?
      @ 62,000 SAY lin_med                                   // Linha das m‚dias
   ENDI
   @ 63,000 SAY REPL("=",96)
ENDI
IF volta_reg
   GO reg_atual                                              // retorna reg a posicao original
 ult_imp = reg_atual
ENDI
SELE (ar_)
RETU

STATIC PROC REL_CAB(qt, volta_reg)                           // cabecalho do relatorio
LOCAL ar_:=ALIAS()
volta_reg=IF(volta_reg=NIL,.f.,volta_reg)
IF qt>0                                                      // se parametro maior que 0
   cl=cl+qt                                                  // soma no contador de linhas
ENDI
IF cl>maxli .OR. qt=0                                        // quebra de pagina
   IMPCTL(drvpeli)                                           // comprime os dados
   REL_RDP(volta_reg)                                        // imprime rodape' do relatorio
   SELE PEDI0000                                             // volta ao arquivo pai
   @ 0,000 SAY REPL("=",96)
   @ 1,000 SAY PADC('Impress„o de pedido para simples conferencia',96)// Titulo
   IMPEXP(2,000,PADC(ALLTRIM(M->nemp),48),96)                // Empresa
   @ 3,000 SAY PADC(ALLTRIM(M->endemp)+' - '+ALLTRIM(M->baiemp)+' - '+TRANS(M->cepemp,'@R 99999-999'),96)// Endere‡o
   @ 4,000 SAY PADC(R00101F9(),96)                           // Cidade
   @ 5,000 SAY REPL("=",96)
   @ 6,000 SAY "Pedido    :"
   IMPEXP(6,012,TRAN(codped,"99999999"),16)                  // Pedido
   @ 6,041 SAY "Emissao:"
   IMPEXP(6,050,TRAN(datped,"@D"),20)                        // Data
   SELE (ar_)
   IMPCTL(drvteli)                                           // retira comprimido
   cl=qt+6 ; pg_++
ENDI
RETU

* \\ Final de SIS_R001.PRG
Aqui a função que coloca os comando ESC/P para impressora

Código: Selecionar todos

/*
   Sintaxe: IMPCTL( <ExpC> )
   Funcao.: Imprime codigo de controle na impressora
              ExpC = codigo de controle
   Retorna: NIL
*/
FUNC IMPCTL(ctl_)
LOCAL li_:=PROW(), co_:=PCOL()   // salva posicao do carro da impressora
IF LEN(ctl_)>0                   // se foi passado um codigo de controle
   lp_=SET(_SET_PRINTER,.t.)     // liga "echo" para impressora
   lc_=SET(_SET_CONSOLE,.f.)     // desliga saidas para video
   ?? &ctl_.                     // imprime caracteres de controle
   SET(_SET_PRINTER,lp_)         // retorna o "echo" original da impressora
   SET(_SET_CONSOLE,lc_)         // impressao no video habilitada
   SETPRC(li_,co_)               // retorna cabeca impressora
ENDI
RETURN NIL                       // para a posicao original
Abaixo os comando usados para impressão

Código: Selecionar todos

    Ativa comprime 17,5 cpp CHR(15)                     
 Desativa comprime 17,5 cpp CHR(18)                     
    Ativa comprime 20 cpp.. CHR(27)+'M'+CHR(15)         
 Desativa comprime 20 cpp.. CHR(27)+'P'                 
    Ativa elite............ CHR(27)+'M'                 
 Desativa elite............ CHR(27)+'P'                 
    Ativa negrito.......... CHR(27)+'E'                 
 Desativa negrito.......... CHR(27)+'F'                 
    Ativa expandido........ CHR(27)+'W'+CHR(1)          
 Desativa expandido........ CHR(27)+'W'+CHR(0)          
    Ativa 8 lin/pol........ CHR(27)+'0'                 
 Desativa 8 lin/pol........ CHR(27)+'2' 
Agradeço pela atenção fico no aguardo

Abraços
Clipper 5.2/Blinker
Harbour 3.0/Mingw
Avatar do usuário
Pablo César
Usuário Nível 7
Usuário Nível 7
Mensagens: 5312
Registrado em: 31 Mai 2006 10:22
Localização: Curitiba - Paraná

Convertendo Sistema do GASPRO para Harbour

Mensagem por Pablo César »

Faltou você listar o sisirmao.ch. Não sei se é aqui que você define as variáveis drvpeli e drvteli ou se você colocou os comandos de impressão em DBF (se for gostaria que você anexasse na sua prox. mensagem).

Na linha 202 aqui do seu código, está:

IMPCTL(drvpeli) // comprime os dados

No entanto no arquivo ordem_de_pedido.txt que você enviou estão os dois comandos, ativa e desativa (ao mesmo
tempo):
Tela61.PNG
Então, algo de errado está na definição dessas variáveis, pois não coincidem com os comandos que você expus:
clipsis escreveu:Abaixo os comando usados para impressão

Código: Selecionar todos

    Ativa comprime 17,5 cpp CHR(15)                     
 Desativa comprime 17,5 cpp CHR(18)                     
    Ativa comprime 20 cpp.. CHR(27)+'M'+CHR(15)         
 Desativa comprime 20 cpp.. CHR(27)+'P'                 
    Ativa elite............ CHR(27)+'M'                 
 Desativa elite............ CHR(27)+'P'                 
    Ativa negrito.......... CHR(27)+'E'                 
 Desativa negrito.......... CHR(27)+'F'                 
    Ativa expandido........ CHR(27)+'W'+CHR(1)          
 Desativa expandido........ CHR(27)+'W'+CHR(0)          
    Ativa 8 lin/pol........ CHR(27)+'0'                 
 Desativa 8 lin/pol........ CHR(27)+'2' 
Outra coisa. Na minha opinião, na função FUNCTION IMPCTL(ctl_) na linha onde está ?? &ctl_. deveria ser @ li_,co_ SAY &ctl_. pois há diferenças de método entre ? e @... say
Um clip-abraço !

Pablo César Arrascaeta
Compartilhe suas dúvidas e soluções com todos os colegas aqui do fórum.
Evite enviar as dúvidas técnicas por MPs ou eMails, assim todos iremos beneficiar-nos.
Avatar do usuário
Toledo
Administrador
Administrador
Mensagens: 3133
Registrado em: 22 Jul 2003 18:39
Localização: Araçatuba - SP
Contato:

Convertendo Sistema do GASPRO para Harbour

Mensagem por Toledo »

clipsis, se for possível, anexar um arquivo de relatório que tenha mais de uma página para que eu possa fazer alguns testes.

Abraços,
Toledo - Clipper On Line
toledo@pctoledo.com.br
Harbour 3.2/MiniGui/HwGui
Faça uma doação para o fórum, clique neste link: http://www.pctoledo.com.br/doacao
Avatar do usuário
Pablo César
Usuário Nível 7
Usuário Nível 7
Mensagens: 5312
Registrado em: 31 Mai 2006 10:22
Localização: Curitiba - Paraná

Convertendo Sistema do GASPRO para Harbour

Mensagem por Pablo César »

Toledo, eu acho que é isso mesmo que indiquei sobre colocar @ li_,co_ SAY &ctl_.

A função IMPCTL(ctl_) eu implementei a muitos anos em Clipper e uma das adaptações que eu tive que fazer é justamente isso, porque eu usava com SET ALTERNATE. Esperemos que ele faça o teste mas acho que é isso mesmo.
Um clip-abraço !

Pablo César Arrascaeta
Compartilhe suas dúvidas e soluções com todos os colegas aqui do fórum.
Evite enviar as dúvidas técnicas por MPs ou eMails, assim todos iremos beneficiar-nos.
clipsis
Usuário Nível 2
Usuário Nível 2
Mensagens: 79
Registrado em: 02 Jun 2010 11:53
Localização: brasil

Convertendo Sistema do GASPRO para Harbour

Mensagem por clipsis »

Olá e boa tarde a todos!!

Olá Pablo César, fiz a modificação como você disse mas o resultado foi o mesmo.

Olá Toledo, mesmo relatório com mais de uma página.

Abraços
Anexos
Ordem_de_pedido_2_paginas.pdf
O arquivo PDF é o resultado quando mando o mesmo relatório para o doPDF7
(73.04 KiB) Baixado 412 vezes
Ordem_de_pedido_2_paginas.txt
O arquivo TXT é o relatório em Arquivo/Video com os comandos ESC/P
(7.2 KiB) Baixado 448 vezes
Clipper 5.2/Blinker
Harbour 3.0/Mingw
Avatar do usuário
Pablo César
Usuário Nível 7
Usuário Nível 7
Mensagens: 5312
Registrado em: 31 Mai 2006 10:22
Localização: Curitiba - Paraná

Convertendo Sistema do GASPRO para Harbour

Mensagem por Pablo César »

clipsis escreveu:Olá Pablo César, fiz a modificação como você disse mas o resultado foi o mesmo.
E quanto ao resto que eu te pedi ?

1. Faltou você listar o sisirmao.ch
2. Não sei se é aqui que você define as variáveis drvpeli e drvteli ou se você colocou os comandos de impressão em DBF (se for gostaria que você anexasse na sua prox. mensagem).
Um clip-abraço !

Pablo César Arrascaeta
Compartilhe suas dúvidas e soluções com todos os colegas aqui do fórum.
Evite enviar as dúvidas técnicas por MPs ou eMails, assim todos iremos beneficiar-nos.
clipsis
Usuário Nível 2
Usuário Nível 2
Mensagens: 79
Registrado em: 02 Jun 2010 11:53
Localização: brasil

Convertendo Sistema do GASPRO para Harbour

Mensagem por clipsis »

Olá, boa noite!

Plabo César me desculpe, pensei que já havia postado essa resposta.
Imaginei que você fosse familiarizado com os fontes do GASPro.

drvpeli = Ativa elite............ CHR(27)+'M'
drvteli = Desativa elite............ CHR(27)+'P'

São variáveis públicas que são carregadas toda vez que se escolhe uma impressora. Deixei como impressora padrão Epson no sistema do GASPro. Não tenho outra impressora configurada, logo todos os relatórios terão os comando ESC/P.

Código: Selecionar todos

drvpcom = CHR(15)              //Ativa comprime 17,5 cpp
drvtcom = DesatiCHR(18)        //Desativa comprime 17,5 cpp
drvpc20 = CHR(27)+'M'+CHR(15)  //Ativa comprime 20 cpp
drvpc20 = CHR(27)+'P'          //Desativa comprime 20 cpp
drvpeli = CHR(27)+'M'          //Ativa elite
drvteli = CHR(27)+'P'          //Desativa elite
drvpenf = CHR(27)+'E'          //Ativa negrito
drvtenf = CHR(27)+'F'          //Desativa negrito
drvpexp = CHR(27)+'W'+CHR(1)   //Ativa expandido
drvtexp = CHR(27)+'W'+CHR(0)   //Desativa expandido
drvpde8 = CHR(27)+'0'          // Ativa 8 lin/pol
drvtde8 = CHR(27)+'2'          //Desativa 8 lin/pol
Outra coisa vc viu como fica a impressão ? Os códigos de formatação de fonte ESC/P são impressos.

Abraços
Clipper 5.2/Blinker
Harbour 3.0/Mingw
Avatar do usuário
Pablo César
Usuário Nível 7
Usuário Nível 7
Mensagens: 5312
Registrado em: 31 Mai 2006 10:22
Localização: Curitiba - Paraná

Convertendo Sistema do GASPRO para Harbour

Mensagem por Pablo César »

Outra coisa vc viu como fica a impressão ? Os códigos de formatação de fonte ESC/P são impressos.
Pelo que estou entendendo você está mandando a impressão para uma impressora que gera PDF. O que eu pedi, era você escanear, para saber o que está imprimindo errado. Assim com palavras não dá para se situar. E esse arquivo PDF que você está anexando, não representa a impressão. Você disse que em impressora Epson LX 300 funciona bem, mas em qual outra impressora estaria imprimindo ?
clipsis escreveu:Imaginei que você fosse familiarizado com os fontes do GASPro.

drvpeli = Ativa elite............ CHR(27)+'M'
drvteli = Desativa elite............ CHR(27)+'P'
Sim, mas eu queria ter certeza que as declarações de tais variáveis estivessem de acordo e pelo que vejo está. A não ser que em alguma parte do seu código estivesse redefinindo a variável drvpeli como se fosse assim: drvpeli=drvpeli+drvteli

Sabe porque digo isto ? É porque no TXT aparece os dois comandos ativa e desativa juntos e de acordo o seu código isso não acontece.
Um clip-abraço !

Pablo César Arrascaeta
Compartilhe suas dúvidas e soluções com todos os colegas aqui do fórum.
Evite enviar as dúvidas técnicas por MPs ou eMails, assim todos iremos beneficiar-nos.
clipsis
Usuário Nível 2
Usuário Nível 2
Mensagens: 79
Registrado em: 02 Jun 2010 11:53
Localização: brasil

Convertendo Sistema do GASPRO para Harbour

Mensagem por clipsis »

Olá a todos e bom dia!!
Pelo que estou entendendo você está mandando a impressão para uma impressora que gera PDF. O que eu pedi, era você escanear, para saber o que está imprimindo errado. Assim com palavras não dá para se situar. E esse arquivo PDF que você está anexando, não representa a impressão. Você disse que em impressora Epson LX 300 funciona bem, mas em qual outra impressora estaria imprimindo ?
Me desculpe novamente, é que estava sem impressora alguma para imprimir e escanear. Como em impressões feitas por outro programas ( Word, Excell...) sempre obtenho o mesmo resultado, tanto nas impressoras quanto em PDF, imaginei que o mesmo ocorreria agora. Vou providenciar !
Sabe porque digo isto ? É porque no TXT aparece os dois comandos ativa e desativa juntos e de acordo o seu código isso não acontece.
Verifiquei que realmente isso acontece e é devido anão mudança de linha no momento de executar o IMPCTL. A variável cl é incrementada mas a posição da impressão não.

REL_CAB(1)
//incrementa cl

mas ...

IMPCTL(drvpeli)
//envia o comando com o ?? - não muda a posição da impressão com o cl

Fiz uma modificação no fonte para corrigir isso (linhas 06, 07 e 08). Os comandos são enviados na posição correta agora, mas o resultado é o mesmo.

Código: Selecionar todos

FUNC IMPCTL(ctl_)
LOCAL li_:=PROW(), co_:=PCOL()   // salva posicao do carro da impressora
IF LEN(ctl_)>0                   // se foi passado um codigo de controle
   lp_=SET(_SET_PRINTER,.t.)     // liga "echo" para impressora
   lc_=SET(_SET_CONSOLE,.f.)     // desliga saidas para video
   IF ctl_$(drvpeli+"|"+drvpde8) .AND. cl < 50000   //alteracao feita para
      ?                                             //corrigir o envio de comandos na impressora
   ENDI                                             //para o local correto
   ?? &ctl_.                     // imprime caracteres de controle
   SET(_SET_PRINTER,lp_)         // retorna o "echo" original da impressora
   SET(_SET_CONSOLE,lc_)         // impressao no video habilitada
   SETPRC(li_,co_)               // retorna cabeca impressora
ENDI
RETURN NIL                       // para a posicao original
Abraços
Clipper 5.2/Blinker
Harbour 3.0/Mingw
Avatar do usuário
Pablo César
Usuário Nível 7
Usuário Nível 7
Mensagens: 5312
Registrado em: 31 Mai 2006 10:22
Localização: Curitiba - Paraná

Convertendo Sistema do GASPRO para Harbour

Mensagem por Pablo César »

envia o comando com o ?? - não muda a posição da impressão com o cl
Você já disse que já provou substituir ?? por @ say... pode fazer o teste novamente ? Pois a intenção da função IMPCTL é justamente não alterar a posição do carro.
Um clip-abraço !

Pablo César Arrascaeta
Compartilhe suas dúvidas e soluções com todos os colegas aqui do fórum.
Evite enviar as dúvidas técnicas por MPs ou eMails, assim todos iremos beneficiar-nos.
Avatar do usuário
Toledo
Administrador
Administrador
Mensagens: 3133
Registrado em: 22 Jul 2003 18:39
Localização: Araçatuba - SP
Contato:

Convertendo Sistema do GASPRO para Harbour

Mensagem por Toledo »

Amigos, segue mais uma atualização do Gas4Harbour:

Gas4Harbour - Conversor GASPRO40 para Harbour

Não fiz teste de impressão com relatórios utilizando Itálico ( CHR(27)+'4' ), sublinhado ( CHR(27)+'5' ), 8 linhas/polegadas e impressão em modo paisagem.

O modo Itálico e sublinhado é ativado e desativado usando o mesmo código:

- Itálico = CHR(27)+'4'
- Sublinhado = CHR(27)+'5'

Abraços,
Toledo - Clipper On Line
toledo@pctoledo.com.br
Harbour 3.2/MiniGui/HwGui
Faça uma doação para o fórum, clique neste link: http://www.pctoledo.com.br/doacao
clipsis
Usuário Nível 2
Usuário Nível 2
Mensagens: 79
Registrado em: 02 Jun 2010 11:53
Localização: brasil

Convertendo Sistema do GASPRO para Harbour

Mensagem por clipsis »

Olá e boa noite a todos!

Toledo baixei sua ultima versão e funcionou muito bem. Inclusive usando uma impressora que gera PDF.

Tive apenas que fazer uma alteração, pois da maneira como estava no seu fonte, as matrizes aDrvp_ e aDrvt_, estavam ficando com o texto e não os caracteres de controle.
Apenas acrescentei o "&" (macro) antes dos nomes das variáveis de impressão.

Era assim:

Código: Selecionar todos

Local aDrvp_:={{drvpcom,17},{drvpc20,20},{drvpeli,12},{drvpexp,5},{drvpenf,.T.},{drvpde8,.T.},{CHR(27)+'4',.T.},{CHR(27)+'5',.T.}}
Local aDrvt_:={{drvtcom,17},{drvtc20,20},{drvteli,12},{drvtexp,5},{drvtenf,.F.},{drvtde8,.F.},{CHR(27)+'4',.F.},{CHR(27)+'5',.F.}}
Ficou assim:

Código: Selecionar todos

Local aDrvp_:={{&drvpcom.,17},{&drvpc20.,20},{&drvpeli.,12},{&drvpexp.,5},{&drvpenf.,.T.},{&drvpde8.,.T.},{CHR(27)+'4',.T.},{CHR(27)+'5',.T.}}
Local aDrvt_:={{&drvtcom.,17},{&drvtc20.,20},{&drvteli.,12},{&drvtexp.,5},{&drvtenf.,.F.},{&drvtde8.,.F.},{CHR(27)+'4',.F.},{CHR(27)+'5',.F.}}
Ficou muito bom !!
Faltam apenas alguns ajustes nas margens. Vou fazer mais alguns teste e alterações.
Tendo novidades posto aqui

Mais uma vez parabéns e obrigado pela contribuição.

Abraços
Clipper 5.2/Blinker
Harbour 3.0/Mingw
Avatar do usuário
Pablo César
Usuário Nível 7
Usuário Nível 7
Mensagens: 5312
Registrado em: 31 Mai 2006 10:22
Localização: Curitiba - Paraná

Convertendo Sistema do GASPRO para Harbour

Mensagem por Pablo César »

Clipsis escreveu:Tive apenas que fazer uma alteração, pois da maneira como estava no seu fonte, as matrizes aDrvp_ e aDrvt_, estavam ficando com o texto e não os caracteres de controle.
Apenas acrescentei o "&" (macro) antes dos nomes das variáveis de impressão
Boa garoto !! Descobriu algo que estava muito estranho o comportamento.

Então o código fonte do GAS4Harbour terá que ser corrigido.
Um clip-abraço !

Pablo César Arrascaeta
Compartilhe suas dúvidas e soluções com todos os colegas aqui do fórum.
Evite enviar as dúvidas técnicas por MPs ou eMails, assim todos iremos beneficiar-nos.
Avatar do usuário
Toledo
Administrador
Administrador
Mensagens: 3133
Registrado em: 22 Jul 2003 18:39
Localização: Araçatuba - SP
Contato:

Convertendo Sistema do GASPRO para Harbour

Mensagem por Toledo »

clipsis escreveu:Apenas acrescentei o "&" (macro) antes dos nomes das variáveis de impressão.
Isto não é preciso não! Eu fiz vários testes aqui de impressão, inclusive usei o arquivo do relatório que você anexou aqui em sua mensagem anterior e tudo funcionou certinho.

Você fez algum teste de impressão antes de acrescentar o & (macro)? Deu algum erro ou o relatório não imprimiu corretamente?

Abraços,
Toledo - Clipper On Line
toledo@pctoledo.com.br
Harbour 3.2/MiniGui/HwGui
Faça uma doação para o fórum, clique neste link: http://www.pctoledo.com.br/doacao
clipsis
Usuário Nível 2
Usuário Nível 2
Mensagens: 79
Registrado em: 02 Jun 2010 11:53
Localização: brasil

Convertendo Sistema do GASPRO para Harbour

Mensagem por clipsis »

Olá boa noite a todos!!
Toledo escreveu:
Você fez algum teste de impressão antes de acrescentar o & (macro)? Deu algum erro ou o relatório não imprimiu corretamente?
Fiz teste sim. O relatório não imprimiu corretamente.

Ficou como estava antes, os códigos de formatação de fonte ESC/P eram impressos.

Com o &(macro) funcionou corretamente. A unica coisa são as margens: superior e esquerda que não consegui alterar para enquadrar melhor o relatorio. A impressão fica muito "rente" a borda da página.

Abraços
Clipper 5.2/Blinker
Harbour 3.0/Mingw
Responder