Generar reportes con el objeto TextArea
Este es mi primer aporte en este foro y espero que les guste y les sea útil.
¿Porque uso este objeto para generar reportes?
a) se puede exportar los datos reportados hasta cualquier procesador de texto
b) es compatible con cualquier impresora previamente instalada
c) es rápido
d) muy flexible. (tan flexible que puedo consultar de 1 hasta 50 tablas si fuera necesario)
e) en un solo formulario se pueden hacer hasta 20 reportes y mas
f) puedo tomar decisiones (if the else) en medio de la consulta
g) puedo introducir valores en medio de la consulta, Ej, se puede introducir una tasa de interés, un valor o rango de valores para que se aplique a ciertos registros que cumplan con determinadas características.
h) puede ordenar los datos y hacer cualquier calculo en vertical y horizontal, entre otras cosas...
Manos a la Obra.
Objetos necesarios:
1-labels
2-valuebox
3-combobox
4-command
5-textArea
Nota: Como vengo de visual basic 6.0 en ocasiones llamo a los controles como en VB6.0.
También advierto que soy Lic. en Contabilidad y uso algunos términos de esa profesión
Nombre de los controle
valuebox=hasta
combobox=empleados
command=ver
command=imprimir
textarea=reporte
Nota: Considere también que hay funciones definidas por 'mi' que no funcionaran y deberá ignorarlas, así como también
debe crear las tablas y las conexiones de tal manera que funcionen.
he publicado en la siguiente dirección otro articulo que contiene algunas de mis funciones:http://alessandricp.wordpress.com/
Aquí esta el código del reporte completo.
' gambas class file
PRIVATE Ado1 AS Result 'Ado de consulta
PRIVATE Ado2 AS Result 'Ado de consulta
PRIVATE Ado3 AS Result 'Ado de consulta
PRIVATE res AS Integer 'Resultado de MSQ¿?
PRIVATE Vrep AS String ' Contiene el reporte
PRIVATE ln AS String 'Salto de linea
PRIVATE lineas AS Integer 'Cantidad de lineas actuales
PRIVATE pagina AS Integer 'Numero de pagina
PRIVATE informe AS String[400] 'Contiene el informe paginado
PRIVATE ACTL2 AS Integer 'Numero de pagina actual para imprimir
PRIVATE fechaV AS String 'fecha del movimiento
PRIVATE codigoV AS String 'codigo de cobro
PRIVATE transaccionV AS String 'numero de transaccion
PRIVATE clienteV AS String 'nombre del cliente****puede que no la utilice
PRIVATE valorV AS String 'valor de recibo****puede que no la utilice
PRIVATE usuarioV AS String 'codigo de usuario
PRIVATE indice AS Integer 'Indice de lista
PRIVATE cod AS Integer 'Codigo del empleado
PUBLIC SUB Form_Open()
Module1.Conectar2 'Conecta a base de datos
EstadoEmpleados.x = FMain2.X
EstadoEmpleados.Y = FMain2.Y
CarList()
END
PUBLIC SUB Timer1_Timer() ' Sistema de privilegios de formularios ***** puede que tenga que comentar este SUB
IF FMain2.p30 = 0 THEN
Timer1.Stop()
Module1.MSC("No tiene autorización.")
ME.Close()
ENDIF
Timer1.Stop()
END
PRIVATE FUNCTION Fnumeros(Cadena AS String) AS String 'Formate a numero DE 9999.44 a 9,999.44
DIM tm AS String
DIM l AS Single
DIM z AS String
DIM final AS String
Cadena = Trim(Cadena)
Cadena = Module1.Numeros(Cadena)
Cadena = Format(Cadena, "$,##0.#0")
tm = Len(cadena)
FOR l = 1 TO tm
z = Mid(Cadena, l, 1)
IF z <> "$" THEN final = final & z
NEXT
RETURN LTrim(final)
END
PUBLIC SUB desde_KeyPress() 'permite mandar el foco de un objeto a otro con ENTER
IF Key.Code = Key.Enter OR Key.Code = Key.Return THEN hasta.SetFocus
END
PUBLIC SUB hasta_KeyPress() 'permite mandar el foco de un objeto a otro con ENTER y llama un SUB
IF Key.Code = Key.Enter OR Key.Code = Key.Return THEN ver_Click()
END
PUBLIC SUB ver_Click() 'Funcion personalizada ESDATE()
IF Module1.Esdate(hasta.Text) = FALSE THEN
Module1.MSE("Fecha final Incorrecta.")
hasta.SetFocus
RETURN
END IF
IF Module1.Esdate(empleados.Text) = "" OR cod = "" THEN
Module1.MSE("Debe seleccionar un Empleado.") 'Funcion personalizada de mensajeria
hasta.SetFocus
RETURN
END IF
reporte.Text = ""
BuscarD() 'Busca los datos a reportar
END
PUBLIC SUB imprimir_Click()
DIM ACTL AS Integer 'Numero de pagina actual a imprimir
res = Module1.MSQ("Desea imprimir este Reporte?")
IF res = 1 THEN
FOR ACTL = 0 TO pagina - 1
ACTL2 = ACTL
Imprime() ' Imprime el REPORTE
NEXT
END IF
END
PRIVATE SUB Imprime() ' Imprime el REPORTE
Draw.Begin(Printer)
Draw.Font.Name = "Courier"
Draw.Font.Size = 9
Printer.Orientation = Printer.Portrait
Draw.Text(informe[ACTL2], 200, 200)
Draw.End
END
PRIVATE SUB BuscarD() 'Busca los datos a reportar
DIM toc AS Integer 'Total clients
DIM tot AS Single 'Total de cxc
DIM i AS Integer 'Control de ciclo
DIM des AS String 'Fecha inicial
DIM has AS String 'Fecha final
DIM fec AS String 'Fecha de transaccion
DIM det AS String 'Detalle de transaccion
DIM tra AS String 'Numero de transaccion
DIM deb AS String 'Debito entransaccion
DIM cre AS String 'Credito en transaccion
DIM blc AS Single 'Balance en Movimiento
pagina = 0
Titulo1() 'Pone el titulo
ln = Chr$(10)
has = Module1.FecSQL(hasta.Text)
'REPORTE COMPLETO DE empleados/ Aqui selecciono cada campo de la base de datos que me interesa
Ado1 = Module1.conn2.Exec("select fecha,detalle,debito,credito,transaccion from mov_empleados use index (codigo) where codigo=" & cod & " and fecha<= '" & has & "' order by transaccion asc")
WHILE Ado1.Available
'Aqui los cargo en las variables previamente definidas
fec = Module1.FecSQL2(Ado1!fecha) ' esta funcion cambia el formato de YYYY/MM/DD A DD/MM/YYYY
tra = Ado1!transaccion
det = Ado1!detalle
deb = Fnumeros(Ado1!debito)
cre = Fnumeros(Ado1!credito)
blc = blc + (Ado1!debito - Ado1!credito)
'Esta LAAARRRRRGA linea representa cada columna y linea del Reporte
Vrep = Vrep & fec & " " & det & Space(26 - Len(det)) & tra & Space(9 - Len(tra)) & Space(13 - Len(deb)) & deb & Space(14 - Len(cre)) & cre & Space(14 - Len(Fnumeros(blc))) & Fnumeros(blc) & ln
lineas = lineas + 1 ' aqui cuento cada linea ingresada
IF lineas = 54 THEN ' aqui se decide si se debe escribir en la pagina siguiente
informe[pagina - 1] = Vrep
lineas = 0
Titulo1 'Prepara la siguiente pagina
ENDIF
toc = toc + 1
Ado1.MoveNext
WEND
Vrep = Vrep & ln
informe[pagina - 1] = Vrep 'Carga la ultima pagina
'Aqui se concatenan cada pagina en el TextArea
FOR i = 0 TO pagina - 1
reporte.Text = reporte.Text & informe[i] & ln & ln
NEXT
' pagina = 0
toc = 0
lineas = 0
toc = 0
END
PRIVATE SUB Titulo1() 'Este es el titulo del reporte
ln = Chr$(10)
pagina += 1
Vrep = Module1.Memb & ln & ln ' Datos del formulario principal de la aplicacion que es el membrete de la EMPRESA/ anular esta linea
Vrep = Vrep & " Página:" & pagina & ln
Vrep = Vrep & " ESTADO DE CUENTA DE EMPLEADO" & ln & ln
Vrep = Vrep & "Nombr:" & UCase(empleados.Text) & ln
Vrep = Vrep & "Hasta:" & hasta.Text & ln
Vrep = Vrep & "Fecha:" & Now & ln
Vrep = Vrep & "---------- ------------------------- -------- ------------- ------------- -------------" & ln
Vrep = Vrep & "Fecha Detalle Transacc Débito Crédito Balance" & ln
Vrep = Vrep & "---------- ------------------------- -------- ------------- ------------- -------------" & ln
END
PRIVATE SUB CarList() 'Carga la lista de empleados desde la tabla empleados
Ado1 = Module1.conn.Exec("select nombre from empleados where estado='1' order by nombre asc")
indice = 0
empleados.Clear
DO WHILE Ado1.Available
indice += 1
empleados.Add(Ado1!nombre, indice)
Ado1.MoveNext
LOOP
END
PUBLIC SUB empleados_Click() 'Busca codigo de empleado
Ado1 = Module1.conn2.Exec("select codigo from empleados where nombre='" & empleados.Text & "'")
cod = Ado1!codigo
END
PRIVATE Ado1 AS Result 'Ado de consulta
PRIVATE Ado2 AS Result 'Ado de consulta
PRIVATE Ado3 AS Result 'Ado de consulta
PRIVATE res AS Integer 'Resultado de MSQ¿?
PRIVATE Vrep AS String ' Contiene el reporte
PRIVATE ln AS String 'Salto de linea
PRIVATE lineas AS Integer 'Cantidad de lineas actuales
PRIVATE pagina AS Integer 'Numero de pagina
PRIVATE informe AS String[400] 'Contiene el informe paginado
PRIVATE ACTL2 AS Integer 'Numero de pagina actual para imprimir
PRIVATE fechaV AS String 'fecha del movimiento
PRIVATE codigoV AS String 'codigo de cobro
PRIVATE transaccionV AS String 'numero de transaccion
PRIVATE clienteV AS String 'nombre del cliente****puede que no la utilice
PRIVATE valorV AS String 'valor de recibo****puede que no la utilice
PRIVATE usuarioV AS String 'codigo de usuario
PRIVATE indice AS Integer 'Indice de lista
PRIVATE cod AS Integer 'Codigo del empleado
PUBLIC SUB Form_Open()
Module1.Conectar2 'Conecta a base de datos
EstadoEmpleados.x = FMain2.X
EstadoEmpleados.Y = FMain2.Y
CarList()
END
PUBLIC SUB Timer1_Timer() ' Sistema de privilegios de formularios ***** puede que tenga que comentar este SUB
IF FMain2.p30 = 0 THEN
Timer1.Stop()
Module1.MSC("No tiene autorización.")
ME.Close()
ENDIF
Timer1.Stop()
END
PRIVATE FUNCTION Fnumeros(Cadena AS String) AS String 'Formate a numero DE 9999.44 a 9,999.44
DIM tm AS String
DIM l AS Single
DIM z AS String
DIM final AS String
Cadena = Trim(Cadena)
Cadena = Module1.Numeros(Cadena)
Cadena = Format(Cadena, "$,##0.#0")
tm = Len(cadena)
FOR l = 1 TO tm
z = Mid(Cadena, l, 1)
IF z <> "$" THEN final = final & z
NEXT
RETURN LTrim(final)
END
PUBLIC SUB desde_KeyPress() 'permite mandar el foco de un objeto a otro con ENTER
IF Key.Code = Key.Enter OR Key.Code = Key.Return THEN hasta.SetFocus
END
PUBLIC SUB hasta_KeyPress() 'permite mandar el foco de un objeto a otro con ENTER y llama un SUB
IF Key.Code = Key.Enter OR Key.Code = Key.Return THEN ver_Click()
END
PUBLIC SUB ver_Click() 'Funcion personalizada ESDATE()
IF Module1.Esdate(hasta.Text) = FALSE THEN
Module1.MSE("Fecha final Incorrecta.")
hasta.SetFocus
RETURN
END IF
IF Module1.Esdate(empleados.Text) = "" OR cod = "" THEN
Module1.MSE("Debe seleccionar un Empleado.") 'Funcion personalizada de mensajeria
hasta.SetFocus
RETURN
END IF
reporte.Text = ""
BuscarD() 'Busca los datos a reportar
END
PUBLIC SUB imprimir_Click()
DIM ACTL AS Integer 'Numero de pagina actual a imprimir
res = Module1.MSQ("Desea imprimir este Reporte?")
IF res = 1 THEN
FOR ACTL = 0 TO pagina - 1
ACTL2 = ACTL
Imprime() ' Imprime el REPORTE
NEXT
END IF
END
PRIVATE SUB Imprime() ' Imprime el REPORTE
Draw.Begin(Printer)
Draw.Font.Name = "Courier"
Draw.Font.Size = 9
Printer.Orientation = Printer.Portrait
Draw.Text(informe[ACTL2], 200, 200)
Draw.End
END
PRIVATE SUB BuscarD() 'Busca los datos a reportar
DIM toc AS Integer 'Total clients
DIM tot AS Single 'Total de cxc
DIM i AS Integer 'Control de ciclo
DIM des AS String 'Fecha inicial
DIM has AS String 'Fecha final
DIM fec AS String 'Fecha de transaccion
DIM det AS String 'Detalle de transaccion
DIM tra AS String 'Numero de transaccion
DIM deb AS String 'Debito entransaccion
DIM cre AS String 'Credito en transaccion
DIM blc AS Single 'Balance en Movimiento
pagina = 0
Titulo1() 'Pone el titulo
ln = Chr$(10)
has = Module1.FecSQL(hasta.Text)
'REPORTE COMPLETO DE empleados/ Aqui selecciono cada campo de la base de datos que me interesa
Ado1 = Module1.conn2.Exec("select fecha,detalle,debito,credito,transaccion from mov_empleados use index (codigo) where codigo=" & cod & " and fecha<= '" & has & "' order by transaccion asc")
WHILE Ado1.Available
'Aqui los cargo en las variables previamente definidas
fec = Module1.FecSQL2(Ado1!fecha) ' esta funcion cambia el formato de YYYY/MM/DD A DD/MM/YYYY
tra = Ado1!transaccion
det = Ado1!detalle
deb = Fnumeros(Ado1!debito)
cre = Fnumeros(Ado1!credito)
blc = blc + (Ado1!debito - Ado1!credito)
'Esta LAAARRRRRGA linea representa cada columna y linea del Reporte
Vrep = Vrep & fec & " " & det & Space(26 - Len(det)) & tra & Space(9 - Len(tra)) & Space(13 - Len(deb)) & deb & Space(14 - Len(cre)) & cre & Space(14 - Len(Fnumeros(blc))) & Fnumeros(blc) & ln
lineas = lineas + 1 ' aqui cuento cada linea ingresada
IF lineas = 54 THEN ' aqui se decide si se debe escribir en la pagina siguiente
informe[pagina - 1] = Vrep
lineas = 0
Titulo1 'Prepara la siguiente pagina
ENDIF
toc = toc + 1
Ado1.MoveNext
WEND
Vrep = Vrep & ln
informe[pagina - 1] = Vrep 'Carga la ultima pagina
'Aqui se concatenan cada pagina en el TextArea
FOR i = 0 TO pagina - 1
reporte.Text = reporte.Text & informe[i] & ln & ln
NEXT
' pagina = 0
toc = 0
lineas = 0
toc = 0
END
PRIVATE SUB Titulo1() 'Este es el titulo del reporte
ln = Chr$(10)
pagina += 1
Vrep = Module1.Memb & ln & ln ' Datos del formulario principal de la aplicacion que es el membrete de la EMPRESA/ anular esta linea
Vrep = Vrep & " Página:" & pagina & ln
Vrep = Vrep & " ESTADO DE CUENTA DE EMPLEADO" & ln & ln
Vrep = Vrep & "Nombr:" & UCase(empleados.Text) & ln
Vrep = Vrep & "Hasta:" & hasta.Text & ln
Vrep = Vrep & "Fecha:" & Now & ln
Vrep = Vrep & "---------- ------------------------- -------- ------------- ------------- -------------" & ln
Vrep = Vrep & "Fecha Detalle Transacc Débito Crédito Balance" & ln
Vrep = Vrep & "---------- ------------------------- -------- ------------- ------------- -------------" & ln
END
PRIVATE SUB CarList() 'Carga la lista de empleados desde la tabla empleados
Ado1 = Module1.conn.Exec("select nombre from empleados where estado='1' order by nombre asc")
indice = 0
empleados.Clear
DO WHILE Ado1.Available
indice += 1
empleados.Add(Ado1!nombre, indice)
Ado1.MoveNext
LOOP
END
PUBLIC SUB empleados_Click() 'Busca codigo de empleado
Ado1 = Module1.conn2.Exec("select codigo from empleados where nombre='" & empleados.Text & "'")
cod = Ado1!codigo
END
****************El reporte se ve Asi.....***************
Espero les sea útil...