Page 1 of 2

Resoluciones de las impresoras X TReport/TPrinter

Posted: Thu May 17, 2007 5:01 pm
by Kleyber
Hola foro,

De vez en cuando me deparo con este problema: Mis reportes hechos con TReport o TPrinter (con este ultimo usando CmSay) cuando usados en impresoras con diferentes resoluciones me muestra resultados diferentes en el preview. Entonces pregunto: ¿No hay manera de hacer todos los reportes o con TReport o con TPrinter y que tengan el mismo resultado en cualquier impresora con resolucion diferente? ¿Cuales son sus experiencias en este tema?

Saludos,

Posted: Thu May 17, 2007 9:25 pm
by Kleyber
¿No hay nadie que tenga alguna experiencia con esto?

Saludos,

Posted: Thu May 17, 2007 10:14 pm
by carlos vargas
Kleyber
Lamentablemente parece que nop.

Yo mismo he sufrido este problema, aun cuando uso CmSay
las posiciones no son identicas. :-(

incluso ahora mismo tengo este problema y por mas que le he dado vuelta al asunto nada :-(

mirate este codigo, aun cuando uso cmsay me sale en diferentes posiciones en diferentes impresoras.

salu2
carlos vargas

Code: Select all

PROCEDURE Contratos_ImprimirFormato()
    LOCAL oPrn
    LOCAL oFont1,oFont2,oFont3
    LOCAL cCodCon,cNomSus,cDirSus,cTelSus,cFecNac,cEdaSus,cCedSus,cEstCiv,cProSus,cDirTra,cTelTra
    LOCAL cJardin,cBloque,cLote,cPrecio
    LOCAL cTotal,cPrima,cSaldo
    LOCAL cCTotal,cCPrima,cCSaldo
    LOCAL cNumCuo,cValCuo,cDiaPag
    LOCAL cDia,cMes,cAno

    /*pasa datos a variables de tipo caracter*/
    cCodCon := oCont:mc_codcon
    cNomSus := ft_proper(oCont:mc_nomsus)
    cDirSus := ft_proper(oCont:mc_dirsus)
    cTelSus := oCont:mc_teldom
    cFecNac := DToC(oCont:mc_fecnac)
    cEdaSus := Transform(nEdad,"999")
    cCedSus := oCont:mc_cedula
    cEstCiv := IIf(oCont:mc_casado,"Casado","Soltero")
    cProSus := ft_proper(oCont:mc_prosus)
    cDirTra := ft_proper(oCont:mc_dirtra)
    cTelTra := oCont:mc_teltra

    cTotal  := Transform(oCont:mc_totcon,"999,999.99")
    cPrima  := Transform(oCont:mc_pagpri,"999,999.99")
    cSaldo  := Transform(oCont:mc_salfin,"999,999.99")

    cCTotal := Transform(oCont:mc_totconc,"999,999.99")
    cCPrima := Transform(oCont:mc_pagpric,"999,999.99")
    cCSaldo := Transform(oCont:mc_salfinc,"999,999.99")

    cNumCuo := Transform(oCont:mc_numcuo,"999")
    cValCuo := Transform(oCont:mc_valabo,"999,999.99")
    cDiaPag := Transform(Day(oCont:mc_diapag),"99")
    //cDiaPag := DToC(oCont:mc_diapag)

    cDia := Transform(Day(oCont:mc_feccon),"99")
    cMes := CMonth(oCont:mc_feccon)
    cAno := Transform(Year(oCont:mc_feccon),"9999")

    /*define objeto printer*/
    PRINTER oPrn FROM USER

        /*valida si selecciono una impresora*/
        IF Empty( oPrn:hDC )
            RETURN
        ENDIF

        /*define fuentes a usar*/
        DEFINE FONT oFont1 NAME "Times New Roman" SIZE 0,-12 OF oPrn
        DEFINE FONT oFont2 NAME "Times New Roman" SIZE 0,-08 OF oPrn
        DEFINE FONT oFont3 NAME "Times New Roman" SIZE 0,-14 OF oPrn BOLD

        /*define tama¤o del papel*/
        oPrn:SetPage(DMPAPER_LETTER)

        /*ajuste*/
        //oPrn:nXOffset:=oPrn:cm2Pix(nXFix)
        //oPrn:nYOffset:=oPrn:cm2Pix(nYFix)

        /*inicia pagina*/
        PAGE

            /*inserta datos en pagina*/
            /*generales del contratantes*/
            oPrn:CmSay(03.80,16.80,cCodCon,oFont3,oPrn:cm2Pix(04.50))  // numero de contrato
            oPrn:CmSay(04.80,05.50,cNomSus,oFont1,oPrn:cm2Pix(15.00))  // nombre del suscriptor
            oPrn:CmSay(05.60,03.30,cDirSus,oFont1,oPrn:cm2Pix(12.50))  // direccion del suscriptor
            oPrn:CmSay(05.60,17.60,cTelSus,oFont1,oPrn:cm2Pix(03.00))  // telefono del suscriptor
            oPrn:CmSay(06.50,05.50,cFecNac,oFont1,oPrn:cm2Pix(03.20))  // fecha de nacimiento
            oPrn:CmSay(06.50,10.40,cEdaSus,oFont1,oPrn:cm2Pix(01.00))  // edad
            oPrn:CmSay(06.50,12.70,cCedSus,oFont2,oPrn:cm2Pix(02.80))  // cedula
            oPrn:CmSay(06.50,17.60,cEstCiv,oFont1,oPrn:cm2Pix(03.00))  // estado civil
            oPrn:CmSay(07.30,03.30,cProSus,oFont1,oPrn:cm2Pix(05.50))  // profesion
            oPrn:CmSay(07.30,11.60,cDirTra,oFont2,oPrn:cm2Pix(03.70))  // trabajo
            oPrn:CmSay(07.30,17.60,cTelTra,oFont1,oPrn:cm2Pix(03.00))  // telefono

            /*localizacion de lotes*/
            DBSELECT "LOTE"
            LOTE->(DBGoTop())

            /*inicializa variable*/
            nFila := 10

            /*procesa cada lote*/
            DO WHILE !LOTE->(Eof())

                /*pasa valores a variables cadena*/
                cJardin := ft_proper(StrTran(JARD->MJ_NOMJAR,"JARDIN",""))
                cBloque := StrToken(LOTE->ML_CODLOT,2,"-")
                cLote   := StrToken(LOTE->ML_CODLOT,3,"-")
                cPrecio := Transform(LOTE->ML_PREVEN,"999,999.99")

                /*imprime datos*/
                oPrn:CmSay(nFila,04.50,cLote,  oFont1,oPrn:cm2Pix(01.80))             // lote
                oPrn:CmSay(nFila,07.20,cJardin,oFont1,oPrn:cm2Pix(04.80))             // jardin
                oPrn:CmSay(nFila,14.00,cBloque,oFont1,oPrn:cm2Pix(01.30))             // bloque
                oPrn:CmSay(nFila,16.60,cPrecio,oFont1,oPrn:cm2Pix(02.40),,PAD_RIGHT)  // precio

                /*incrementa fila*/
                nFila+=0.5

                /*salta hacia el proximo lote*/
                LOTE->(DBSkip())

            ENDDO

            /*restaura area*/
            LOTE->(DBGoTop())
            DBSELECT "CONT"

            /*total*/
            oPrn:CmSay(12.50,15.50,cTotal,oFont1,oPrn:cm2Pix(03.00),,PAD_RIGHT)   //  total

            /**/
            oPrn:CmSay(13.70,07.00,cTotal, oFont1,oPrn:cm2Pix(03.00),,PAD_RIGHT)  //  total U$
            oPrn:CmSay(14.20,07.00,cPrima, oFont1,oPrn:cm2Pix(03.00),,PAD_RIGHT)  //  prima U$
            oPrn:CmSay(14.70,07.00,cSaldo, oFont1,oPrn:cm2Pix(03.00),,PAD_RIGHT)  //  total U$

            oPrn:CmSay(13.70,15.50,cCTotal,oFont1,oPrn:cm2Pix(03.00),,PAD_RIGHT)  //  total C$
            oPrn:CmSay(14.20,15.50,cCPrima,oFont1,oPrn:cm2Pix(03.00),,PAD_RIGHT)  //  prima C$
            oPrn:CmSay(14.70,15.50,cCSaldo,oFont1,oPrn:cm2Pix(03.00),,PAD_RIGHT)  //  total C$

            oPrn:CmSay(15.20,06.20,cNumCuo,oFont1,oPrn:cm2Pix(01.00),,PAD_RIGHT)  //  numero de cuotas
            oPrn:CmSay(15.20,13.50,cDiaPag,oFont1,oPrn:cm2Pix(02.20),,PAD_RIGHT)  //  dias de pago

            oPrn:CmSay(15.70,03.50,cValCuo,oFont1,oPrn:cm2Pix(03.20),,PAD_RIGHT)  //  valor de cuotas

            oPrn:CmSay(16.60,03.00,cDia,oFont1,oPrn:cm2Pix(01.00))  //  dia
            oPrn:CmSay(16.60,05.50,cMes,oFont1,oPrn:cm2Pix(03.00))  //  mes
            oPrn:CmSay(16.60,10.50,cAno,oFont1,oPrn:cm2Pix(02.00))  //  a¤o

        ENDPAGE

   ENDPRINT

   oFont1:End()
   oFont2:End()
   oFont3:End()

RETURN


Posted: Thu May 17, 2007 10:29 pm
by Kleyber
Hola Carlos,

Gracias por contestar. Veo entonces que esto es malo, pues no me gusta mucho tener que usar herramientas de terceros, cuando tenemos el propio de FWH... Antonio, ¿puedes ayudarnos?

Saludos,

Posted: Fri May 18, 2007 2:26 am
by Armando Picon
Hola Kleyber

Tiempo atrás en el foro dejé un codigo para impresiones para facturas. En el utilicé como medida de ajuste un factor referido a dimensiones del papel antes que a los píxels de la máquina.Voy a ubicarlo para que veas si te sirve el estilo.

Saludos

Kleyber wrote:¿No hay nadie que tenga alguna experiencia con esto?

Saludos,

Posted: Fri May 18, 2007 2:58 am
by Armando Picon
Encontré el codigo para la clase tprinter.

/* Listar la base de datos del padron de productos
Autor: Econ. Armando Picón S., Lima, Perú
*/
#include "fivewin.ch"
#include "report.ch"

PROCEDURE listar( oDlg )
LOCAL nReg := 1
LOCAL Fil := 0 // aqui estuvo el error
LOCAL Col := 0
LOCAL nCol := 115 // columnas que tiene el papel
LOCAL nFil := 64 // filas que tiene el papel
LOCAL LstCol := 112 // ultima columna a utilizar
LOCAL LstFil := 59 // ultima fila para datos
LOCAL nFil1 := 0
LOCAL c, f, cMedio
LOCAL oFnt1, oFnt2, oFnt3, oPen1
*
LOCAL nPag := 0
LOCAL oPrn
LOCAL cDate := STR( DAY( DATE() )) + " de " + ;
sp_mes( MONTH( DATE() ) ) + " del " +;
str(Year(DATE()))
LOCAL TITULO:="LISTADO GENERAL DE REPUESTOS"
LOCAL nLongTit, nMedio
//LOCAL aPagos //:= {} // esto también fue error, no se utiliza

DBSELECTAREA("STOCK")
nReg := RECNO()

PRINTER oPrn PrEVIEW MODAL

oPrn:setup()

IF EMPTY(oPrn:hDC)
MsgStop("Impresora no lista","ATENTO")
RETURN NIL
ENDIF

* características del papel
oPrn:SetPage( 10 ) // Papel A4==>10
oPrn:SetLandScape() // Orientacion echada

* Factor de resolución para columnas y filas (para colocar los datos en su lugar)
c:= oPrn:nHorzRes()/nCol
f:= oPrn:nVertRes()/nFil
cMedio := INT(LstCol / 2) + 1

DEFINE FONT oFnt1 NAME "Sans Serif" SIZE 0,-16 OF oPrn
DEFINE FONT oFnt2 NAME "Sans Serif" SIZE 0,-12 OF oPrn
DEFINE FONT oFnt3 NAME "Sans Serif" SIZE 0,-9 OF oPrn

DBGOTOP()
DO WHILE !EOF()

DO CASE

CASE Fil == 0

oPrn:Startpage()
Fil++
Fil++
Fil++
Fil++
nPag := oPrn:nPage
oPrn:Say(Fil*f, (cMedio - ( LEN(TITULO)/2 ))*c, TITULO, oFnt2)
Fil++
Fil++
oPrn:Say(Fil*f, (cMedio - ( LEN(oApp:membrete)/2 ))*c, oApp:membrete, oFnt2)
Fil++
Fil++
* Linea separador de titulo - encabezados
oPrn:Line(Fil*f,000*c, Fil*f, LstCol*c)
nFil1 := Fil
Fil++
* cabecera de columnas
oPrn:Say(Fil*f, 001*c, "ANDM" , oFnt3 ) // ANDAMIO
oPrn:Say(Fil*f, 005*c, "CASL" , oFnt3 ) // CASILLA
oPrn:Say(Fil*f, 011*c, "CODIGO" , oFnt3 ) // CODIGO
oPrn:Say(Fil*f, 024*c, "PROC" , oFnt3 ) // PROCEDENCIA
oPrn:Say(Fil*f, 030*c, "NOMBRE" , oFnt3 ) // NOMBRE
oPrn:Say(Fil*f, 061*c, "UNIDAD" , oFnt3 ) // UNIDAD DE MEDIDA
oPrn:Say(Fil*f, 069*c, "PREC.VTA" , oFnt3 ) // PRECIO DE VENTA
oPrn:Say(Fil*f, 079*c, "DSCTO" , oFnt3 ) // DESCUENTO EN VALOR
oPrn:Say(Fil*f, 089*c, "IGV" , oFnt3 ) // IGV DE PRECIO-DCTO
oPrn:Say(Fil*f, 099*c, "PREC.PUBLICO.", oFnt3 ) // PRECIO FACTURADO
Fil++
oPrn:Say(Fil*f, 069*c, " US$ " , oFnt3 ) // PRECIO DE VENTA
oPrn:Say(Fil*f, 079*c, " US$ " , oFnt3 ) // DESCUENTO EN VALOR
oPrn:Say(Fil*f, 089*c, "US$" , oFnt3 ) // IGV DE PRECIO-DCTO
oPrn:Say(Fil*f, 099*c, " US$ ", oFnt3 ) // PRECIO FACTURADO
Fil++
Fil++
* Linea separadora entre encabezados e impresion de datos
oPrn:Line(Fil*f,000*c, Fil*f, LstCol*c)
Fil++

CASE Fil > LstFil
Fil++
* Linea de cierre de impresion de datos
oPrn:Line(Fil*f,000*c, Fil*f, LstCol*c)

* Linea verticales de impresion de datos
oPrn:Line(nFil1*f,000*c, Fil*f,000*c)
oPrn:Line(nFil1*f,005*c, Fil*f,005*c)
oPrn:Line(nFil1*f,009*c, Fil*f,009*c)
oPrn:Line(nFil1*f,022*c, Fil*f,022*c)
oPrn:Line(nFil1*f,028*c, Fil*f,028*c)
oPrn:Line(nFil1*f,059*c, Fil*f,059*c)
oPrn:Line(nFil1*f,067*c, Fil*f,067*c)
oPrn:Line(nFil1*f,077*c, Fil*f,077*c)
oPrn:Line(nFil1*f,087*c, Fil*f,087*c)
oPrn:Line(nFil1*f,097*c, Fil*f,097*c)
oPrn:Line(nFil1*f,LstCol*c, Fil*f,LstCol*c)

* Fin cuadro de impresion de datos
Fil++
oPrn:Say(Fil*f, 002*c, "Pag. No. : ", oFnt3 )
oPrn:Say(Fil*f, 014*c, ALLTRIM(STR(nPag,10,0)), oFnt3 )
Fil++
oPrn:endpage()
Fil := 0

OTHER
oPrn:Say(Fil*f, 002*c, STOCK->ANDAMIO, oFnt3 )
oPrn:Say(Fil*f, 006*c, STOCK->CASILLA, oFnt3 )
oPrn:Say(Fil*f, 010*c, STOCK->CODIGO , oFnt3 )
oPrn:Say(Fil*f, 023*c, STOCK->ORIG , oFnt3 )
oPrn:Say(Fil*f, 029*c, STOCK->NOMBRE , oFnt3 )
oPrn:Say(Fil*f, 060*c, STOCK->UNIDAD , oFnt3 )
oPrn:Say(Fil*f, 075*c, TRANSFORM(STOCK->XPRECIOV,"@ 99,999.999"), oFnt3,,,,1 ) // PRECIO DE VENTA
oPrn:Say(Fil*f, 085*c, TRANSFORM(STOCK->XDCTO ,"@ 99,999.999"), oFnt3,,,,1 ) // DESCUENTO EN VALOR
oPrn:Say(Fil*f, 095*c, TRANSFORM(STOCK->XIGV ,"@ 99,999.999"), oFnt3,,,,1 ) // IGV DE PRECIO-DCTO
oPrn:Say(Fil*f, 105*c, TRANSFORM(STOCK->XPRECIOF,"@ 999,999.99"), oFnt3,,,,1 ) // PRECIO FACTURADO

Fil++
SKIP

ENDCASE

ENDDO
*
Fil++
* Linea de cierre de impresion de datos
oPrn:Line(Fil*f,000*c, Fil*f, LstCol*c)

* Linea verticales de impresion de datos
oPrn:Line(nFil1*f,000*c, Fil*f,000*c)
oPrn:Line(nFil1*f,005*c, Fil*f,005*c)
oPrn:Line(nFil1*f,009*c, Fil*f,009*c)
oPrn:Line(nFil1*f,022*c, Fil*f,022*c)
oPrn:Line(nFil1*f,028*c, Fil*f,028*c)
oPrn:Line(nFil1*f,059*c, Fil*f,059*c)
oPrn:Line(nFil1*f,067*c, Fil*f,067*c)
oPrn:Line(nFil1*f,077*c, Fil*f,077*c)
oPrn:Line(nFil1*f,087*c, Fil*f,087*c)
oPrn:Line(nFil1*f,097*c, Fil*f,097*c)
oPrn:Line(nFil1*f,LstCol*c, Fil*f,LstCol*c)
* Fin cuadro de impresion de datos
Fil++
oPrn:Say(Fil*f, 002*c, "Pag. No. : ", oFnt3 )
oPrn:Say(Fil*f, 014*c, ALLTRIM(STR(nPag,10,0)), oFnt3 )
oPrn:endpage()

ENDPRINT


oFnt1:End()
oFnt2:End()
oFnt3:End()
oPrn:SetPortrait() // Orientacion parada
oPrn:End()

DBGOTOP()
DBGOTO( nReg )

RETURN
*

/*
Formulario de la lista Productos

ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÂÄ¿
³ANDM CASL CODIGO PROC NOMBRE UNIDAD PREC.VTA DSCTO IGV PREC.FACT.³³
ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÁÄÙ
12 123 123456789012 12345 123456789012345678901234567890 1234567 12345.789 12345.789 12345.789 123457.89
01234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012
1 2 3 4 5 6 7 8 9 0 1

Caracteristicas de la base de datos
=======================
Cliente----: 12345678901 123456789012345678901234567890123456789012345
Dirección--: 123456789012345678901234567890123456789012345
123456789012345678901234567890123456789012345
123456789012345678901234567890123456789012345
Teléfono---: 123456789012

Loc.Entrega: 123456789012345678901234567890123456789012345
Dirección--: 123456789012345678901234567890123456789012345
Teléfono---: 123456789012
------------------------------------------------------------------------
NOM_CLIENT" ,"C", 45,0},; // nombre del cliente
DIR_CLIENT" ,"C", 45,0},; // direccion1 del cliente
DIR_CLIEN2" ,"C", 45,0},; // direccion2 del cliente
DIR_CLIEN3" ,"C", 45,0},; // direccion3 del cliente
LOC_CLIENT" ,"C", 45,0},; // local de entrega
LOC_DIRCLI" ,"C", 45,0},; // direc. local de entrega
TF1_CLIENT" ,"C", 12,0},; // telefono cliente
TF2_CLIENT" ,"C", 12,0} ; // telefono local de entrega

*/

Posted: Fri May 18, 2007 2:06 pm
by Kleyber
Armando,

Gracias por la contestación y ejemplo, pero lo que deseo es que fuera algo propio de la clase TPrinter para que se quede mas facil la previsualización en cualquier impresora con resolución diferente. Si hago reportes con TReport, el problema me aparece nuevamente y no hay nada que se pueda hacer.

Saludos,

Posted: Fri May 18, 2007 2:14 pm
by Armando Picon
Tienes razón... Habría que modificar la clase para darle las características que indicas.

Posted: Fri May 18, 2007 2:57 pm
by Kleyber
Por eso pregunto: Antonio, ¿Puedes ayudarnos?

saludos,

Posted: Fri May 18, 2007 5:10 pm
by carlos vargas
Bueno algo habia hecho similar, agregandolo a la clase tprinter unas datas y metodos mediante las extenciones de xharbour.

Tal vez habria que darle una revisada a este codigo y modificarlo para que haga lo que nos indica Armando. :-)

Modificacion de clase tprinter

Code: Select all

    ...
    EXTEND CLASS TPRINTER WITH METHOD Cm2Pix
    EXTEND CLASS TPRINTER WITH METHOD OSay
    EXTEND CLASS TPRINTER WITH DATA      nPxL
    EXTEND CLASS TPRINTER WITH DATA      nPxC
    ...

Code: Select all

/*-------------------------------------------------------------------------------*/

STATIC FUNCTION Cm2Pix(nCm)
    LOCAL SELF := HB_QSelf()

    IF ValType( ::nXOffset ) == "U"
        ::nXoffset := 0
    ENDIF

    nPix := Max( 0, ( nCm * 10 * ::nHorzRes() / ::nHorzSize() ) - ::nXoffset )

RETURN nPix

/*-------------------------------------------------------------------------------*/

STATIC FUNCTION OSay(nRow,nCol,cText,oFont,nWidth,nClrText,nBkMode,nPad)
    LOCAL SELF := HB_QSelf()
    LOCAL nRowT := ::nPxL * nRow
    LOCAL nColT  := ::nPxC * nCol
    LOCAL nWidT

    DEFAULT nWidth := 0

    nWidT := ::nPxC * nWidth

    ::Say(nRowT,nColT,OemToAnsi(cText),oFont,nWidT,nClrText,nBkMode,nPad)

RETURN NIL

/*-------------------------------------------------------------------------------*/
Implementacion de las data y methodos agregados.

Code: Select all

/*-------------------------------------------------------------------------------*/
/*OK*/
PROCEDURE Contratos_ImprimirEstado()
    LOCAL nLin := 0
    LOCAL oPrn
    LOCAL nPxL  //pixel por linea
    LOCAL nPxC  //pixel por columna
    LOCAL nRec := LOTE->(RecNo())
    LOCAL nTamLin,nLineas,x


    /*objeto print*/
    PRINT oPrn NAME "Estado actual de contrato" PREVIEW MODAL

        /*fuentes a usar*/
        DEFINE FONT oFntNor NAME "Courier New" SIZE 0, -10 OF oPrn
        DEFINE FONT oFntTit NAME "Courier New" SIZE 0, -10 OF oPrn BOLD

        oPrn:setpage(1)

        /*obtiene resolucion de impresora*/
        nVer := oPrn:nVertRes()
        nHor := oPrn:nHorzRes()

        /*establece numero de lineas y columnas*/
        nPxL := (nVer/66)
        nPxC := (nHor/82)

        /*pasa calculo a objeto tprinter*/
        oPrn:nPxL := nPxL
        oPrn:nPxC := nPxC

        PAGE
            oPrn:osay(01,02,"Fecha y Hora : "+DToC(Date())+"/"+Time(),oFntNor)
            oPrn:osay(03,02,NOM_EMPRESA,oFntTit)
            oPrn:osay(04,02,"ESTADO ACTUAL DE CONTRATO",oFntTit)

            oPrn:osay(06,02,Replicate("=",91),oFntNor)

            oPrn:osay(07,02,"Contrato    : "+CONT->MC_CODCON,oFntNor)
            oPrn:osay(07,40,"Estado      : "+Upper(CONT->MC_ESTADO),oFntTit)

            oPrn:osay(08,02,"Suscriptor  : "+CONT->MC_NOMSUS,oFntNor)

            oPrn:osay(09,02,"Domicilio   : "+CONT->MC_DIRSUS,oFntNor)
            oPrn:osay(10,02,"Trabajo     : "+CONT->MC_DIRTRA,oFntNor)
            oPrn:osay(11,02,"Tel‚fonos   : "+RTrim(CONT->MC_TELDOM)+"/"+RTrim(CONT->MC_TELTRA),oFntNor)

            oPrn:osay(12,02,"C‚dula      : "+CONT->MC_CEDULA,oFntNor)
            oPrn:osay(12,40,"Profesi¢n   : "+CONT->MC_PROSUS,oFntNor)

            oPrn:osay(13,02,"Fecha venta : "+DToC(CONT->MC_FECCON),oFntNor)
            oPrn:osay(13,40,"Tasa cambio : "+Tran(CONT->MC_TASCAM,"C$99.9999"),oFntNor)

            oPrn:osay(14,02,"Fecha naci. : "+DToC(CONT->MC_FECNAC),oFntNor)
            oPrn:osay(14,40,"Edad        : "+Tran(nEdad,"99 A¤os"),oFntNor)

            oPrn:osay(15,02,"Estado civil: "+IIf(CONT->MC_CASADO,"CASADO(A)","SOLTERO(A)"),oFntNor)
            oPrn:osay(15,40,"Tasa Interes: "+Tran(CONT->MC_PORINT,"99%"),oFntNor)

            oPrn:osay(16,02,Replicate("=",91),oFntNor)

            /*titulo de lotes*/
            oPrn:osay(17,02,"LOTE NO.", oFntTit)
            oPrn:osay(17,14,"JARDIN",   oFntTit)
            oPrn:osay(17,50,"BLOQUE",   oFntTit)
            oPrn:osay(17,60,"PRECIO U$",oFntTit)

            nLin := 17

            /*cambia puntero a tabla LOTES*/
            DBSELECT "LOTE"
            LOTE->(DBGoTop())

            /*procesa cada lote del contrato*/
            DO WHILE !LOTE->(Eof())

                /*imprime datos de lotes*/
                oPrn:osay(++nLin, 02, StrToken(LOTE->ML_CODLOT,3,"-"),  oFntNor)
                oPrn:osay(  nLin, 14, JARD->MJ_NOMJAR,                  oFntNor)
                oPrn:osay(  nLin, 50, StrToken(LOTE->ML_CODLOT,2,"-"),  oFntNor)
                oPrn:osay(  nLin, 60, Tran(LOTE->ML_PREVEN,"$99,999.99"),oFntNor)

                LOTE->(DBSkip())

            ENDDO

            /*restaura puntero a tabla CONTRATOS*/
            LOTE->(DBGoTop(nRec))
            DBSELECT "CONT"

            oPrn:osay(++nLin,02,Replicate("=",91),oFntNor)

            /*imprime datos de valores*/
            oPrn:osay(++nLin,02,"Valor de contrato U$:" + tran(CONT->MC_TOTCON, "999,999.99"),oFntNor)
            oPrn:osay(  nLin,40,"Valor de contrato C$:" + tran(CONT->MC_TOTCONC,"999,999.99"),oFntNor)

            oPrn:osay(++nLin,02,"Valor de prima    U$:" + tran(CONT->MC_PAGPRI, "999,999.99"),oFntNor)
            oPrn:osay(  nLin,40,"Valor de prima    C$:" + tran(CONT->MC_PAGPRIC,"999,999.99"),oFntNor)

            oPrn:osay(++nLin,02,"Saldo a pagar     U$:" + tran(CONT->MC_SALFIN, "999,999.99"),oFntNor)
            oPrn:osay(  nLin,40,"Saldo a pagar     C$:" + tran(CONT->MC_SALFINC,"999,999.99"),oFntNor)

            oPrn:osay(++nLin,02,Replicate("-",91),oFntNor)

            oPrn:osay(++nLin,02,"N£mero de cuotas: " + tran(CONT->MC_NUMCUO, "999"),oFntNor)
            oPrn:osay(  nLin,29,"Fecha 1er. pago: " + DToC(CONT->MC_DIAPAG),oFntNor)
            oPrn:osay(  nLin,55,"Valor abono U$:" + tran(CONT->MC_VALABO, "99,999.99"),oFntNor)

            oPrn:osay(++nLin,02,Replicate("-",91),oFntNor)

            oPrn:osay(++nLin,02,"Vendedor: " + VEND->MV_NOMVEN,oFntNor)
            oPrn:osay(  nLin,40,"Colector: " + COLE->MC_NOMCOL,oFntNor)

            oPrn:osay(++nLin,02,Replicate("-",91),oFntNor)

            oPrn:osay(++nLin,02,"Beneficiario #1: " + CONT->MC_BENSE1,oFntNor)
            oPrn:osay(++nLin,02,"C‚dula       #1: " + CONT->MC_BENCE1,oFntNor)
            oPrn:osay(++nLin,02,"Beneficiario #2: " + CONT->MC_BENSE2,oFntNor)
            oPrn:osay(++nLin,02,"C‚dula       #2: " + CONT->MC_BENCE2,oFntNor)

            oPrn:osay(++nLin,02,Replicate("-",91),oFntNor)

            oPrn:osay(++nLin,02,"Titulo Numero: " + CONT->MC_NUMTIT,oFntNor)
            oPrn:osay(  nLin,40,"Fecha Emici¢n: " + DToC(CONT->MC_FECTIT),oFntNor)

            oPrn:osay(++nLin,02,Replicate("=",91),oFntNor)

            oPrn:osay(++nLin,02,"Esta Asegurado  : " + IIf(CONT->MC_INISER,"SI","NO"),oFntNor)
            oPrn:osay(++nLin,02,"Nombre de fiador: " + CONT->MC_NOMFIA,oFntNor)
            oPrn:osay(++nLin,02,"Direccion       : " + CONT->MC_DIRFIA,oFntNor)
            oPrn:osay(++nLin,02,"Tel‚fono        : " + CONT->MC_TELFIA,oFntNor)
            oPrn:osay(  nLin,40,"C‚dula: " + CONT->MC_CEDFIA,oFntNor)

            oPrn:osay(++nLin,02,Replicate("=",91),oFntNor)

            oPrn:osay(++nLin,02,"NOTAS:",oFntTit)

            /*imeprime lineas de anotaci¢n*/
            IF !Empty(CONT->MC_NOTAS)
                nTamLin := 65
                nLineas := MLCount(CONT->MC_NOTAS,nTamLin)
                FOR x:=1 TO nLineas
                    oPrn:oSay(nLin+x,02,MemoLine(CONT->MC_NOTAS,nTamLin,x,,TRUE),oFntNor)
                NEXT
            ENDIF

        ENDPAGE

    ENDPRINT

RETURN

/*-------------------------------------------------------------------------------*/
salu2
carlos vargas

Posted: Fri May 18, 2007 5:43 pm
by Kleyber
Hola Carlos,

Muy interesante tu ejemplo. Solo dos preguntas:
1 - ¿Como se quedaria con un ejemplo usando TReport?
2 - ¿No seria un poco mas sencillo cambiar el metodo CmSay() en la TPrinter para que funcione con todas las resoluciones?

Gracias y saludos,

Posted: Fri May 18, 2007 5:57 pm
by Antonio Linares
Kleyber,

CmSay() debería imprimir en la misma posición exactamente. De no hacerlo es un bug que hay que corregir

Posted: Fri May 18, 2007 6:23 pm
by Kleyber
Antonio
CmSay() debería imprimir en la misma posición exactamente. De no hacerlo es un bug que hay que corregir
Gracias por tu contestación. Entonces me quedo aguardando la solución para esto y para cuando for usar la TReport también, pues no me gusta tener que usar herramientas de terceros.

Saludos,

Posted: Sat May 19, 2007 1:32 am
by Armando Picon
Carlos

Es interesante la adaptación que señalas. ¿Puedo considerarlo en el futuro para mis desarrollos personales?

Saludos

Armando

Posted: Tue May 22, 2007 8:29 pm
by jacgsoft
Lo que yo hago es simple, tengo una funcion simplemente para PREVISUALIZAR y otra para imprimir.

Para el Preview uso: TPrint(Asi me olvido del modelo de la impresora)
-----------------------

Define Font oFont Name 'Arial' Size 16,25

Print oPrn Preview
Page

oprn:Say(10,10,'ejemplo',oFont)

EndPage



para Impresion directamente a Impresora uso: TdosPrn()
------------------------------------------------------