Por favor necesito que me orienten
Estoy usando TDosPrn para mis reportes
Cuando visualizo el reporte noto que ya en la segunda hoja aparece la primera linea de impresión una line antes y cuando lo mando a la impresora, ademas de lo anterior, la primera linea me la imprime a la izquierda
Reproduzco aquí un programa donde elaboro un reporte
Si esto no es suficiente y se requiere más información, por favor hagánmelo saber
Saludos
México
/* ------------------------------------------------------------------
PROGRAMA : ------------------- EMIEDO.PRG
PROPOSITO : ------------------- EMISION DE ESTADOS DE CUENTA DE
DE CLIENTES SELECTIVO Y/O GENERAL
FACTURAS PENDIENTES Y/O TODAS
LLAMADO POR : ----------------- MODULO DE CONSULTAS
AUTOR : ----------------------- JUAN ARROYO
ULT. ACTUALIZACION : ---------- 06/11/09
--------------------------------------------------------------------- */
# include "FiveWin.ch"
# include "Inkey.ch"
STATIC cCliNum, cCliNom, cSel, lSoloPen, oPrn, cTitulo, cTitRep, ;
cTitRep2, Pagina, nLinea
FUNCTION EmiEdo()
LOCAL oDlg, oCbx, oChk, oBAce
LOCAL oGet1, oGet2
LOCAL aItems := {"Selectivo", ;
"General "}
SETKEY( VK_F2,{|| VerCli()} )
USE cfac INDEX cfaccli NEW
USE pag INDEX pagfac NEW
USE cli INDEX clinum, clinom NEW
cSel := "Selectivo"
cCliNum := SPACE(4)
cCliNom := SPACE(50)
lSoloPen := .T.
DEFINE DIALOG oDlg RESOURCE "EmiEdo"
REDEFINE COMBOBOX oCbx VAR cSel ID 101 OF oDlg ;
ITEMS aItems
REDEFINE GET oGet1 VAR cCliNum ID 102 OF oDlg ;
PICTURE "9999" ;
WHEN LEFT(cSel,1) == "S" ;
VALID IIF(GetKeyState(VK_UP),.T.,OkCli(oGet2, oDlg))
REDEFINE GET oGet2 VAR cCliNom ID 103 OF oDlg
oGet2:Disable()
REDEFINE CHECKBOX oChk VAR lSoloPen ID 104 OF oDlg
REDEFINE BUTTON oBAce ID 105 OF oDlg ;
ACTION ImpEdoCta(), oDlg:End()
ACTIVATE DIALOG oDlg CENTERED
CLOSE DATABASES
RETURN NIL
//---------------------------------------------------------//
STATIC FUNCTION BuscaCli(cNomCli)
LOCAL oDlg, oLbx
cNomCli := TRIM(cNomCli)
cli->(DBSETORDER(2))
cli->(DBSEEK(cNomCli))
DEFINE DIALOG oDlg TITLE "Catálogo de clientes" ;
RESOURCE "ActCli"
REDEFINE LISTBOX olbx ;
FIELDS cli->clinum, cli->clinom, cli->agente ;
HEAD "CLAVE", PADC("NOMBRE",35," "), "VEND" ;
ALIAS "cli" ;
ID 101 ;
OF oDlg ;
ON LEFT DBLCLICK( cCliNum := cli->clinum, oDlg:End() ) Update
oLbx:bKeydown := {|nKey| IIF(nKey = 13,cCliNum := cli->clinum,)}
oLbx:cToolTip := "Seleccione con doble click o con Enter"
ACTIVATE DIALOG oDlg CENTERED
RETURN NIL
//---------------------------------------------------------//
STATIC FUNCTION Enc_Rep(mCliNum, mCliNom, cCliAte, cDirec, cColon, ;
cCiudad, cEstado, cCodPos)
LOCAL mcia := "SERRETECNO, S. A. DE C. V."
LOCAL mDirec1 := "RIVA PALACIO No. 86"
LOCAL mDirec2 := "TLALNEPANTLA, MEX."
nLinea := 5
oPrn:Command(oPrn:cNormal)
oPrn:Say( nLinea+00, 001, PADC(mCia,85," ") )
oPrn:Say( nLinea+01, 001, PADC(mDirec1,85," ") )
oPrn:Say( nLinea+02, 001, PADC(mDirec2,85," ") )
oPrn:Say( nLinea+05, 001, PADC("ESTADO DE CUENTA",85," ") )
oPrn:Say( nLinea+06, 001, PADC("----------------",85," ") )
oPrn:Say( nLinea+08, 068, "HOJA No. " + LTRIM(STR(Pagina,3)) )
IF LEFT(cSel,1) == "S"
oPrn:Say( nLinea+10, 001, PADC("*** FACTURAS PENDIENTES ***",85," ") )
ELSE
oPrn:Say( nLinea+10, 001, PADC("*** TODAS LAS FACTURAS ***",85," ") )
ENDIF
oPrn:Say( nLinea+14, 004, mCliNum )
oPrn:Say( nLinea+15, 004, mCliNom )
IF LEN(cCliAte) > 0
oPrn:Say( nLinea+16, 004, cCliAte )
oPrn:Say( nLinea+17, 004, cDirec )
IF LEN(cColon) > 0
oPrn:Say( nLinea+18, 004, cColon )
ELSE
oPrn:Say( nLinea+18, 004, cCiudad + ", " + cEstado + " " + cCodPos )
ENDIF
ELSE
oPrn:Say( nLinea+16, 004, cDirec )
IF LEN(cColon) > 0
oPrn:Say( nLinea+17, 004, cColon )
oPrn:Say( nLinea+18, 004, cCiudad + ", " + cEstado + " " + cCodPos )
ELSE
oPrn:Say( nLinea+17, 004, cCiudad + ", " + cEstado + " " + cCodPos )
ENDIF
ENDIF
oPrn:Say( nLinea+19, (78-LEN(DTOC(DATE()))), DTOC(DATE()) )
oPrn:Say( nLinea+20, 004, REPLICATE("-",76) )
oPrn:Say( nLinea+21, 004, "FACTURA" )
oPrn:Say( nLinea+21, 014, "FECHA" )
oPrn:Say( nLinea+21, 023, "VENCIM" )
oPrn:Say( nLinea+21, 039, "IMPORTE" )
oPrn:Say( nLinea+21, 058, "PAGO" )
oPrn:Say( nLinea+21, 064, "FECHA PAGO" )
oPrn:Say( nLinea+22, 004, REPLICATE("-",76) )
nLinea := 29
RETURN NIL
//---------------------------------------------------------//
STATIC FUNCTION ImpEdoCta()
local oDlg, oBtn1, oBtn2
SET _3DLOOK ON
SetMTxtPreview( .f., 5, 2, .f., .t. )
DEFINE DIALOG oDlg FROM 5, 5 TO 18, 40 ;
TITLE "Imprime todos los moviemientos de un cliente"
@ 3, 2 BUTTON oBtn1 PROMPT "&Imprimir " OF oDlg SIZE 40,12 ;
ACTION (ImpRep( .t., oDlg), oDlg:End() )
@ 3, 12 BUTTON oBtn2 PROMPT "&Cancelar" OF oDlg SIZE 40,12 ;
ACTION oDlg:End()
ACTIVATE DIALOG oDlg CENTERED
return nil
//---------------------------------------------------------//
STATIC FUNCTION ImpRep( lModal, oDlg )
LOCAL nTImp, nTPago, nTSaldo, nTxven, nT1a30, nT31a60, nT61a90, ;
nTmas90
LOCAL mCliNum, mCliNom, cCliAte, cDirec, cColon, cCiudad, cEstado, ;
cCodPos, TotPag, SaldoFac
LOCAL cFacNum, nImpFac, dVencFac, dFechaFac
nTImp := nTPago := nTSaldo := nTxven := nT1a30 := 0
nT31a60 := nT61a90 := nTmas90 := 0
mCliNum := cCliNum
mCliNom := cCliNom
cTitulo := "*** Antiguedad de saldos de clientes"
Pagina := 1
SELECT cli
mCliNum := cli->clinum
mCliNom := TRIM(cli->clinom)
cCliAte := TRIM(cli->cliate)
cDirec := TRIM(cli->direc)
cColon := TRIM(cli->colon)
cCiudad := TRIM(cli->ciudad)
cEstado := TRIM(cli->estado)
cCodPos := cli->codpos
oPrn:= TDosPrn():New()
IF ! oPrn:lCancel
oPrn:StartPage()
Enc_Rep(mCliNum, mCliNom, cCliAte, cDirec, cColon, ;
cCiudad, cEstado, cCodPos)
SELECT cli
DO WHILE cli->(!EOF())
// Inicializa variables de clientes
mCliNum := cli->clinum
mCliNom := TRIM(cli->clinom)
cCliAte := TRIM(cli->cliate)
cDirec := TRIM(cli->direc)
cColon := TRIM(cli->colon)
cCiudad := TRIM(cli->ciudad)
cEstado := TRIM(cli->estado)
cCodPos := cli->codpos
IF !cfac->(DBSEEK(cCliNum))
cli->(DBSKIP())
LOOP
ENDIF
DO WHILE cfac->clinum = cCliNum
IF cfac->tip_fac = "M"
cfac->(DBSKIP())
LOOP
ENDIF
IF cfac->estado = "C"
cfac->(DBSKIP())
LOOP
ENDIF
IF LEFT(cSel,1) == "S"
IF cfac->impfac = cfac->pagototal
cfac->(DBSKIP())
LOOP
ENDIF
ENDIF
// Inicializa variables de facturas
cFacNum := cfac->facnum
dFechaFac := cfac->fechafac
dVencFac := cfac->vencfac
nImpFac := cfac->impfac
// Imprime partidas
oPrn:Say( nLinea, 004, cFacNum )
oPrn:Say( nLinea, 012, DTOC(dFechaFac) )
oPrn:Say( nLinea, 022, DTOC(dVencFac) )
oPrn:Say( nLinea, 032, TRANSFORM(nImpFac,"999,999,999.99") )
SELECT pag
IF !pag->(DBSEEK(cFacNum))
nLinea := nLinea + 1
IF nLinea > 50
salto(mCliNum, mCliNom, cCliAte, cDirec, cColon, ;
cCiudad, cEstado, cCodPos)
ENDIF
ENDIF
totpag = 0
saldofac := 0
DO WHILE pag->facnum = cFacNum
oPrn:Say( nLinea, 048, TRANSFORM(pag->cantpag,"999,999,999.99") )
oPrn:Say( nLinea, 065, DTOC(pag->fechapag) )
TotPag := TotPag + pag->cantpag
nLinea := nLinea + 1
IF nLinea > 50
salto(mCliNum, mCliNom, cCliAte, cDirec, cColon, ;
cCiudad, cEstado, cCodPos)
ENDIF
pag->(DBSKIP())
ENDDO
nTImp := nTImp + nImpFac
nTPago := nTPago + totpag
nTSaldo := nTImp - nTPago
saldofac := nImpFac - totpag
DO CASE
CASE dVencFac >= DATE()
nTxven := nTxven + saldofac
CASE DATE() - dVencFac <= 30
nT1a30 := nT1a30 + saldofac
CASE DATE() - dVencFac <= 60
nT31a60 := nT31a60 + saldofac
CASE DATE() - dVencFac <= 90
nT61a90 := nT61a90 + saldofac
OTHERWISE
nTmas90 := nTmas90 + saldofac
ENDCASE
cfac->(DBSKIP())
ENDDO
// Imprime totales
IF nTImp <> 0
nLinea = nLinea + 1
oPrn:Say( nLinea, 032, REPLICATE("-",14) )
oPrn:Say( nLinea, 048, REPLICATE("-",14) )
nLinea = nLinea + 1
oPrn:Say( nLinea, 032, TRANSFORM(nTImp,"999,999,999.99") )
oPrn:Say( nLinea, 048, TRANSFORM(nTPago,"999,999,999.99") )
oPrn:Say( 053, 009, "NO VENCIDO " + ;
TRANSFORM(nTxven,"999,999,999.99") )
oPrn:Say( 054, 009, " 1 A 30 DIAS DE RETRASO " + ;
TRANSFORM(nT1a30, "999,999,999.99") )
oPrn:Say( 055, 009, "31 A 60 DIAS DE RETRASO " + ;
TRANSFORM(nT31a60,"999,999,999.99") )
oPrn:Say( 056, 009, "61 A 90 DIAS DE RETRASO " + ;
TRANSFORM(nT61a90,"999,999,999.99"))
oPrn:Say( 057, 009, "MAS DE 90 DIAS DE RETRASO " + ;
TRANSFORM(nTmas90,"999,999,999.99") )
oPrn:Say( 058, 035, REPLICATE("-",14) )
oPrn:Say( 059, 009, "T O T A L : - " + ;
TRANSFORM(nTSaldo,"999,999,999.99") )
DO CASE
CASE nTSaldo < 0
oPrn:Say( 061, 009, "SU SALDO A FAVOR PUEDE SER " + ;
"ACREDITADO A FUTURAS COMPRAS" )
CASE nTSaldo = 0
oPrn:Say( 061, 009, "GRACIAS POR SU PRONTO PAGO" )
CASE nTmas90 > 0
oPrn:Say( 061, 009, "SU CUENTA ESTA SERIAMENTE ATRASADA; " + ;
"FAVOR DE PAGAR" )
oPrn:Say( 062, 009, "LO MAS RAPIDAMENTE POSIBLE" )
CASE nT61a90 > 0
oPrn:Say( 061, 009, "SU CUENTA PRESENTA UN GRAN ATRASO; " + ;
"FAVOR DE ENVIARNOS" )
oPrn:Say( 062, 009, "SU PAGO LO MAS PRONTO POSIBLE" )
CASE nT31a60 > 0
oPrn:Say( 061, 009, "SU CUENTA PRESENTA UN ATRASO; " + ;
"FAVOR DE ENVIARNOS SU PAGO" )
CASE nT1a30 > 0
oPrn:Say( 061, 009, "FAVOR DE PAGAR SU CUENTA ATRASADA" )
CASE nTxven > 0
oPrn:Say( 061, 009, "LE AGRADECEREMOS ENVIE SU PAGO " + ;
"AL VENCIMIENTO" )
ENDCASE
nTImp := nTPago := nTSaldo := nTxven := 0
nT1a30 := nT31a60 := nT61a90 := nTmas90 := 0
ENDIF
cli->(DBSKIP())
IF LEFT(cSel,1) == "S"
EXIT
ENDIF
ENDDO
IF nLinea >= 33
EJECT
ENDIF
ENDIF
CLOSE DATABASES
oPrn:EndPage() // salta pagina
oPrn:End()
//--- Passar a Dialog como ultimo parametro.
if oPrn:lPreview
TxtPreview( oPrn:cDevice, cTitulo, lModal,,, oPrn, oDlg, , ;
oPrn:lModoGraf )
endif
RETURN NIL
//---------------------------------------------------------//
STATIC FUNCTION OkCli( oGet2, oDlg )
IF EMPTY(cCliNum)
MsgAlert("Introduzca un número de cliente...")
RETURN .F.
ENDIF
cli->(DBSETORDER(1))
cli->(DBSEEK(cCliNum))
cCliNom := cli->clinom
oGet2:varput(TRIM(cCliNom))
oGet2:refresh()
RETURN .T.
//---------------------------------------------------------//
STATIC FUNCTION Salto(mCliNum, mCliNom, cCliAte, cDirec, cColon, ;
cCiudad, cEstado, cCodPos)
Pagina := Pagina + 1
Enc_Rep(mCliNum, mCliNom, cCliAte, cDirec, cColon, cCiudad, ;
cEstado, cCodPos)
RETURN NIL
//---------------------------------------------------------//
STATIC FUNCTION VerCli()
LOCAL oDlg, obAce, oIco
LOCAL cNomCli := SPACE(25)
LOCAL oGet
LOCAL cSay := "Nombre"
DEFINE DIALOG oDlg TITLE "Buscar cliente" RESOURCE "Buscar" OF oDlg
REDEFINE ICON oIco ID 101 OF oDlg ;
FILENAME "find.ico"
REDEFINE GET oGet VAR cNomCli ID 103 OF oDlg ;
PICTURE "@!"
REDEFINE BUTTON obAce ID 104 OF oDlg ;
ACTION BuscaCli(cNomCli), oDlg:End()
ACTIVATE DIALOG oDlg CENTERED
KEYBOARD CHR(13)
oDlg:End()
RETURN NIL
//---------------------------------------------------------//
// FIN DE EMIEDO.PRG