FANDOM


En esta sección se incluyen rutinas de código que nos resultaron útiles en más de una ocasión.


Modificar la posicion de un informe Editar

Este código permite modificar la posición inicial vertical y horizontal de un informe. Es útil cuando trabajamos con un formulario preimpreso o una hoja membretada y necesitamos desplazar la impresión sin necesidad de reconfigurar el programa.

El punto embebido donde se ubica es After Open the Report.

!=====================================================
! MODIFICAR LA POSICION DEL INFORME
! El pie de página modificarlo sólo si se usa: 
! Por ejemplo se pone ahí el Nro de página o algo así.
! No es necesario cambiar los atributos de las bandas 
! de detalle adicionales que se usan en el informe.
!-----------------------------------------------------
DesplazamientoX =  getini('Parametros',|
                   'DesplazamientoX',,'.\prog.ini')
DesplazamientoY = getini('Parametros',|
                   'DesplazamientoY',,'.\prog.ini')

if DesplazamientoX or DesplazamientoY then
   SETTARGET(Report)
   x# = report{prop:Xpos}
   y# = report{prop:Ypos}
   x# += DesplazamientoX
   y# += DesplazamientoY
   target{prop:Xpos} = x#
   target{prop:Ypos} = y#
   settarget

   SETTARGET(Report,?Encabezado)
   x# = ?Encabezado{prop:Xpos}
   y# = ?Encabezado{prop:Ypos}
   x# += DesplazamientoX
   y# += DesplazamientoY
   ?Encabezado{prop:Xpos} = x#
   ?Encabezado{prop:Ypos} = y#
   settarget

   SETTARGET(Report,?PiePagina)
   x# = ?PiePagina{prop:Xpos}
   y# = ?PiePagina{prop:Ypos}
   x# += DesplazamientoX
   y# += DesplazamientoY
   ?PiePagina{prop:Xpos} = x#
   ?PiePagina{prop:Ypos} = y#
   SETTARGET
end



Generar un informe a partir de una cola en memoria Editar

(Sin pasar por el template)

Se puede definir en el módulo en la parte de DATA el reporte necesario y mandarlo a imprimir.

En DATA SECTION

WMFQue        QUEUE
PageImage       STRING(64)
              END
ReportRunDate LONG
ReportRunTime LONG
!!> Report (portrait) 
Report  REPORT,AT(1000,2000,6000,7000),THOUS,PRE(RPT),FONT('Arial',10)
        HEADER,AT(1000,1000,6000,1000)
        END
Detail   DETAIL
        END
        FOOTER,AT(1000,9000,6000,1000)
        END
        FORM,AT(1000,1000,6000,9000)
        END
      END


Luego, en el botón que imprime, poner el siguiente código:

ReportRunDate = today()
ReportRunDate = today()
ReportRunTime = clock()
OPEN(Report)
LOOP x# = 1 to records(ColaError)
   get(ColaError,x#)
   PRINT(rpt:DetalleUno)
END
ENDPAGE(Report)
ReportPreview(WMFQue) <- a mí me marca error aquí 
   y nunca me abre el reporte ? hampom@hotmail.com, ayuda por favor
IF GlobalResponse = RequestCompleted
   Report{PROP:FlushPreview} = True
END
CLOSE(Report)
FREE(WMFQue)

Este proceso usa el Print Preview de Clarion para visualizar el informe, por consiguiente, la apariencia es totalmente normal para el usuario

Proceso BATCH que funcione sincronizado con el TIMER de la ventana. Editar

En un proceso BATCH hecho a mano se puede operar en forma similar al report o al proccess, para eso hay que definir una pantalla que tenga el atributo TIMER (un valor de 1 es suficiente). El código fuente quedaría de la siguiente manera:

open(PantaTrabaja)
Accept
case event()
  of event:openwindow
     Display()
     ! Abrir pantalla, Abrir archivos, hacer el set 
     ! Inicial
  of event:timer
     ?Mensaje{prop:text} = 'Procesando...'
     display(?Mensaje)
     loop 2 times
        next(archivo)
        if errorcode() then 
           FinArchivo = true
           Break
        end
        ! HACER AQU�? ALGÚN PROCESO..
     end
  of event:closewindow
     Setcursor()
     Close(PantaTrabaja)
     Break
  End!case

case field()
  of ?BotonCancelar
     if event() = event:accepted then
        message('Proceso cancelado por el usuario.')
        post(event:closewindow)
     end
  End
end!accept


Drop Combo a mano, con opción a todos y recuerdo de último elegido Editar

En muchos de mis informes, cuando pido parámetros asumo lo siguiente, por ejemplo: Si el código de cliente es igual a 0 (cero) se imprimen todos los clientes, sino, se imprime uno solo. Este código permite armar lo mismo con un DropCombo, agregando la opción TODOS LOS XXXX (código Cero).

1. Definir una cola con la siguiente estructura ( por ejemplo ):

Cola     QUEUE,PRE(col)
descri     STRING(20)
codigo     SHORT
         END

2. Definir una variable local llamada por ejemplo

Combo1     STRING(20)

3. En la pantalla definir una drop combo a mano, en el campo FROM poner el nombre de la COLA, y en el USE poner Combo1 ( no poner ?Combo1 )

4. Cargar la cola según corresponda después de abrir archivos, poniendo como último dato el código 0 y el texto 'TODOS LOS REGISTROS' y hacer un ADD(Cola,1) para que quede al principio.

5. Definir una variable global ( o local estática) que va a guardar el resultado elegido:

Glo:codigo    short     

6. En el evento open window, ANTES de abrir la ventana va el siguiente código

loop x# = 1 to records(Cola)
  get(Cola,x#)
  if col:codigo = glo:codigo then break.
end
Combo1 = col:descri
?Combo1{prop:selected} = x#

7. Al hacer esto, el combo se abre posicionado en el último elemento elegido o en TODOS LOS REGISTROS si es la primera vez.


En un report, poner los totales en otra página Editar

En algún informe, se puede solicitar como parámetro la opción de imprimir los totales correspondientes en una página nueva. Para ello, después de abrir el report:


!---¿TOTALES EN UNA P�?GINA NUEVA?---
if glo:totpag then
   settarget(report)
   ?TituloTotalCategoria{prop:pagebefore} = 1
end


En un report, cambiar el color de un campo según alguna condición Editar

Si durante la impresión de un informe se desea cambiar algún atributo (tal como el color) de un campo puede hacer lo siguiente (antes de imprimir el detalle):

if cl:impotota <> cl:totacalc
   settarget(report)
   ?ARC:importe{PROP:FONTCOLOR} = COLOR:RED
   settarget(ProgressWindow)
else
   settarget(report)
   ?ARC:importe{PROP:FONTCOLOR} = COLOR:NONE
   settarget(ProgressWindow)
end
print(rpt:Detalle)  ! Imprimir la línea de detalle

¡Interferencia de bloqueo de anuncios detectada!


Wikia es un sitio libre de uso que hace dinero de la publicidad. Contamos con una experiencia modificada para los visitantes que utilizan el bloqueo de anuncios

Wikia no es accesible si se han hecho aún más modificaciones. Si se quita el bloqueador de anuncios personalizado, la página cargará como se esperaba.