Impresión Personalizada

Hola buenas tardes, yo genero un reporte para poder imprimirlo en papel continuo el modulo de impresión esta cerrado en un prg. Simplemente al pulsar el botón aceptar me carga el PRG y hago la impresión, mi impresión son más o menos 10 hojas. La pregunta es como puedo imprimir por ejm solamente la hoja 4 o las hojas 5 y 6 ya que si por algún motivo se malogra una de las hojas no voy a volver a imprimir todo de nuevo. Este es el prg que hace la impresión, tengo una variable PAG que almacena los numero de páginas pero el numero de PAG no lo imprimo ya que el papel continiuo esta legalizado.
set console off
set century off
set device to printer
set printer to name solotexto
linea=1
SELECT 1
USE h:\librosvarios\data\resumen SHARED
store 0 to d,h
scan all
if linea=1
=Cabecera()
ENDIF
=imprimeLinea()
ENDSCAN
if linea#60
do totales
endif
CLOSE DATABASES
set printer to defa
*******************
PROCEDURE cabecera
*******************
pag=pag+1
??? SPACE(120)+CHR(18)+Chr(14)+TITULO'+Chr(15)+Chr(27)+chr(13)+chr(10)
??? ' '+chr(13)+chr(10)
.........
.........
return
***********************
procedure imprimeLinea
***********************
linea=linea+1
if linea > 60
*??? ' '+chr(13)+chr(10)
??? Space(14)+replicate('-',248)+chr(13)+chr(10)
??? SPACE(196)+"VAN ......."+SPACE(24)+TRANSFORM(sum_debe,'#,###,###.##')+SPACE(6)+TRANSFORM(sum_haber,'#,###,###.##')
eject
linea=1
=Cabecera1()
endif
IF ltivo#cod_doc
=doc()
ENDIF
??? SPACE(20)+padr(n_asiento,3)+SPACE(5)+fec_ope+space(3)+PADR(nom_glosa,90)+SPACE(9)+padr(cod_libro,2)+space(10)+padr(n_corr,6)+;
space(6)+padr(doc_sust,15)+space(1)+padr(cod_cta,10)+space(1)+padr(denom,37)+; &&+padr(tipo_doc,20)
SPACE(5)+transform(debe,'#,###,###.##')+SPACE(6)+transform(haber,'#,###,###.##')+chr(13)+chr(10)
sum_debe=sum_debe+debe
sum_haber=sum_haber+haber
return
******************
Procedure totales
******************
??? Space(204)+' SALDO ANTERIOR'+space(7)+transform(saldo_ant_debe,'###,###,###.##')++SPACE(4)+transform(saldo_ant_haber,'###,###,###.##')+chr(13)+chr(10)
??? Space(204)+' TOTAL GENERAL'+space(7)+transform(nGSLdAntDebe,'###,###,###.##')++SPACE(4)+transform(nGSLdAntHaber,'###,###,###.##')+chr(13)+chr(10)
??? Space(14)+replicate('=',248)+chr(13)+chr(10)
...
...
 Return

1 Respuesta

Respuesta
1
Simplemente coloca indicadores si es una página, un rango de páginas, o el reporte e imprimes solo si se cumple ala condición, el resto lo dejas correr igual. Revisa bien el código que te envío.
Saludos
LOCAL no_print, low_val, hig_val, l, pag
low_val=1 && menor valor de pagina
high_val=9999 && mayor valor de pagina
STORE 0 TO l, pag && l=contador de lineas, pag=numero de paginas
SET DEVICE TO PRINTER
=titula()
SCAN
=q_item()
=ordena("mv2","v2_codigo")
SEEK(STR(mv1.m1_codigo))
SCAN WHILE v2_codart=mv1.m1_codigo
IF l > 60
=titula()
ENDIF
l=l+1
IF no_print
LOOP
ENDIF
@ l,01 SAY "columna1"
@ l,pcol()+1 SAY "columna2"
ENDSCAN
SELECT("mv1")
=t_item()
ENDSCAN
=t_final()
SET DEVICE TO SCREEN
=view_list(lista)
ENDFUNC
******************************************************************************************
FUNCTION titula
STORE 0 to l
pag=pag+1
IF BETWEEN(pag,low_val,high_val)
no_print=.F.
ELSE
l=l+3
no_print=.T.
RETURN
ENDIF
l=l+1
@ l,01 SAY empresa.nombre
l=l+1
@ l,01 SAY "TITULO"
@ l,pcol()+70 SAY "PAG: "+TRANSFORM(pag,"@KZ 999")
l=l+1
@ l,01 SAY REPLICATE("=",128)
ENDFUNC
******************************************************************************************
FUNCTION q_item
mi_codart=m1_codigo
IF l > 60
=titula()
ENDIF
l=l+1
IF no_print
RETURN
ENDIF
@ l,01 SAY "columna1"
@ l,pcol()+1 SAY "columna2"
ENDFUNC
******************************************************************************************
FUNCTION t_item
IF l > 60
=titula()
ENDIF
l=l+1
IF no_print
RETURN
ENDIF
@ l,01 SAY REPLICATE("-",128)
ENDFUNC
******************************************************************************************
FUNCTION t_final
IF l > 60
=titula()
ENDIF
l=l+1
IF no_print
RETURN
ENDIF
@ l,01 SAY SPACE(50)+"*** TOTAL FINAL ***"
l=l+1
@ l, 01 SAY REPLICATE("-", 128)
STORE 0 TO l
@ l, 01 SAY SPACE(10)
Endfunc
******************************************************************************************
Hola buenas tardes, la idea esta: Tengo un formulario con dos botones de opción una para vista preliminar y otra para el envío a la impresora, cuando pulso el botón para el envío a la impresaora cargo el prg que realiza la impresión, pero lo que quisiera hacer es que cuando pulso el botón para imprimir me cargue un formulario para poder elegir el rango de páginas a imprimir luego realizar la impresión supongo que debe ser tomando en cuenta la variable PAG. Gracias de antemano.
Si revisaste bien el código que envíe, el reporte se ejecuta después de haber enviado los rangos de low_val y hig_val desde un formulario, estas variables indican el rango de páginas a imprimir.
Cuando pulsas el botón imprimir de tu form, muestra el form que contiene el rango y luego cargas el prg, tal como mencionas en tu pregunta.
Buen día, estuve probando lo de la impresión personalizada para esto he creado las tres variables como publicas en el evento init del formulario low_val, hig_val y no_print, he creado dos cajas de texto txtDesde y txtHasta y en el evento valid de cada caja hice esto:
txtDesde Valid
low_val=VAL(this.value)
txtHasta              Valid
hig_val=VAL(this.value)
Después de digitar el rango de páginas en las cajas de texto cargo el prg, ahora en PRG tengo esto:
CLOSE DATABASES
set console off
set century off
set device to printer
set printer to name solotexto
linea=1
select 1
USE h:\ruta\final SHARED
go top
...
...
STORE 0 TO pag
scan all
     if linea=1
            =Cabecera() 
      ENDIF
       =imprimeLinea()
ENDSCAN
if linea#58
      do totales
endif
set printer to defa
*******************
PROCEDURE cabecera
*******************
pag=pag+1
IF BETWEEN(pag,log_val,hig_val)
     no_print=.f.
ELSE
     no_print=.t.
ENDIF
..........
...........
............
linea=linea+28
return
*******************
PROCEDURE cabecera1
*******************
pag=pag+1
IF BETWEEN(pag,log_val,hig_val)
    no_print=.f.
ELSE
    no_print=.t.
ENDIF
..........
..........
??? SPACE(94)+"VIENEN ......."+TRANSFORM(sum_deudor,'#,###,###.##')+TRANSFORM(sum_acreedor,'#,###,###.##')+SPACE(110)+TRANSFORM(sum_deudor1,'#,###,###.##')+TRANSFORM(sum_acreedor1,'#,###,###.##')+chr(13)+chr(10)
??? ' '+chr(13)+chr(10)
linea=linea+25
return
***********************
procedure imprimeLinea
***********************
&& Aqui donde iria la variable no_print
linea=linea+1
if linea > 58
??? ' '+chr(13)+chr(10)
??? space(1)+replicate('-',265)+chr(13)+chr(10)
??? SPACE(97)+"VAN ......."+TRANSFORM(sum_deudor,'#,###,###.##')+TRANSFORM(sum_acreedor,'#,###,###.##')+SPACE(110)+TRANSFORM(sum_deudor1,'#,###,###.##')+TRANSFORM(sum_acreedor1,'#,###,###.##')
eject
linea=1
=Cabecera1()
endif
??? padr(ncorr,8)+dtoc(fec_ope)+space(2)+padr(m_pago,5)+padr(desc_oper,16)+space
......
........
return
******************
Procedure totales
******************
&& Aqui donde iria la variable no_print
??? ' '+chr(13)+chr(10)
??? space(70)+padr('TOTAL INGRESOS DEL MES',22)+space(28)+transform(i,'#,###,###.##')+SPACE(66)+padr('TOTAL EGRESOS DEL MES',21)+space(35)+transform(i1,'#,###,###.##')+chr(13)+chr(10)
...
...
return
La variable no_print sirve para preguntar si pintas o no las lineas correspondientes,
El evento valid de los textBox sirve para validar el contenido de los campos más no para llenar los campos, como estas haciendo en los textbox, si quieres que sea un campo numérico para eso tienes la propiedad value del TextBox y Format del TextBox
¿El reporte lo has sacado de algún programa en BASIC?
Saludos
linea=linea+1
if linea > 58
IF no_print0.F.
??? ' '+chr(13)+chr(10)
??? space(1)+replicate('-',265)+chr(13)+chr(10)
??? SPACE(97)+"VAN ......."+TRANSFORM(sum_deudor,'#,###,###.##')+TRANSFORM(sum_acreedor,'#,###,###.##')+SPACE(110)+TRANSFORM(sum_deudor1,'#,###,###.##')+TRANSFORM(sum_acreedor1,'#,###,###.##')
eject
ENDIF
linea=1
=Cabecera1()
endif
IF no_print=.F.
??? padr(ncorr,8)+dtoc(fec_ope)+space(2)+padr(m_pago,5)+padr(desc_oper,16)+space
ENDIF
......
........
return
******************
Procedure totales
******************
&& Aqui iria la variable no_print
IF no_print=.F.
??? ' '+chr(13)+chr(10)
??? space(70)+padr('TOTAL INGRESOS DEL MES',22)+space(28)+transform(i,'#,###,###.##')+SPACE(66)+padr('TOTAL EGRESOS DEL MES',21)+space(35)+transform(i1,'#,###,###.##')+chr(13)+chr(10)
...
...
Endif
return
¿Para lograr el reporte averigüé en otros foros ya que no sabia lo de los saltos de página y como imprimir con caracteres?, en todo caso como hago para usar las dos cajas de texto y lo que ingreso en las cajas de texto (números de página) me valide en el programa para imprimir de acuerdo al numero de página que ingreso en las cajas. Gracias por tu tiempo.
Si me das tu dirección electrónica te envío un ejemplo de Formulario un reporte

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas