Ayuda en impresión

No sé si me puedas dar una ayudita, estoy haciendo un reporte utilizando la sentencia print mostrando datos numéricos, cuando envío a imprimir sale descuadrado el reporte. He intentando poniéndole el format al número, utilizando el space. Te envío un ejemplo para que me entiendas mejor:
Printer. Print "INGRESOS"
Printer. Print
Printer.Print Space(33) & "1 Sem." & Space(9) & "2 Sem." & Space(9) & "3 Sem." & Space(9) & "4 Sem." & Space(9) & "TOTAL"
Printer.Print
Do While Not tablafm.EOF
tfila = tablafm!primera + tablafm!segunda + tablafm!tercera + tablafm!cuarta
Printer.Print Trim(tablafm!des_servicio) & Space(33 - Len(Trim(tablafm!des_servicio))) & Format(tablafm!primera, "##,##0.00") & Space(5) & Format(tablafm!segunda, "##,##0.00") & Space(5) & Format(tablafm!tercera, "##,##0.00") & Space(5) & Format(tablafm!cuarta, "##,##0.00") & Space(5) & Format(tfila, "##,##0.00")
tiprimera = tiprimera + tablafm!primera
tisegunda = tisegunda + tablafm!segunda
titercera = titercera + tablafm!tercera
ticuarta = ticuarta + tablafm!cuarta
tingreso = tiprimera + tisegunda + titercera + ticuarta
tablafm.MoveNext
Loop
Printer.Print
Printer.Print "*********************************************************************************"
Printer.Print "Total Ingresos:" & Space(19) & Format(tiprimera, "##,##0.00") & Space(5) & Format(tisegunda, "##,##0.00") & Space(5) & Format(titercera, "##,##0.00") & Space(5) & Format(ticuarta, "##,##0.00") & Space(5) & Format(tingreso, "##,##0.00")

1 Respuesta

Respuesta
1
Se descuadra, debido a que ests utilizando Space, ya que no todos los datos tienen la misma longitud, por ejemplo, si imprimes:
12...(9 espacios)... 23.5
9.56...(9 espacios)... 34
Te va a salir la segunda fila un espacio más a la derecha. Lo que puedes hacer es lo siguiente:
Printer.Print "1 Sem." & Chr(9) & "2 Sem." & Chr(13) & ...etc.
Con Chr(9) estas insertando un Tab (tabulador), es decir una tabulación, con eso haces que independiente de la longitud del dato (siempre que el la longitud no exceda a la cantidad de caracteres que tiene una tabulación), siempre coloque en una intentar el siguiente dato. Si la long. del dato es mayor que una tabulacion, escribes dos tabuladores ... & Chr(9) & Chr(9) & ...
Intentalo, puedes jugar con eso, creo que eso es lo que necesitas... otros son Chr(13) para insertar un Enter o NewLine, etc. En realidad el 9 y el 13 son los códigos ASCII del Tab y el Enter, si te consigues la tabla de códigos ASCII encuentras el código de todos los caracteres, por ejemplo, el Chr(65) es la A mayúscula.
Hola Ragyis, gracias por la ayuda, seguí tu sugerencia pero tengo un problema el reporte me sale ahora así:
Total 1Sem. 2Sem.
--------------------------
xxxxx 25,275 941
xxxxx 5,930 45,000
xxxxx 31,229 5,257.48
xxxxx 4,650 3,265
xxxxx 825 952
xxxxx -1,215 485
xxxxx 0 0
--------------------------
Donde xxxxx son caracteres con longitud fija, he usado left(xxx, 16) pero dos palabras con la misma longitud debido a que unos caracteres son más anchos que otros ocupa más espacio y me crea otro tab adicional, es el caso de la primera fila, el texto es "Convenios Comerc" imprime el monto con tab más.
En la segunda fila el texto es: "Gastos Operativo" al imprimir ocupa menos espacio y el monto esta en el lugar correcto.
Ahora cuando la longitud del monto es superior a los 8 dígitos incluyendo la coma y los decimales también coloca el monto con un tab más, es el caso de la tercera fila.
He intentado adicionando tabs chr(9) y nada, he cambiado la letra a arial, y sigue igual.
¿Qué puede estar pasando?
Gracias.
Me imagino que el resultado después de hacer lo que te dije, se acerca más a lo que quieres...
Bueno, no entendí muy bien tu nuevo problema, pero creo que sucede debido a lo que te comentaba en el mensaje anterior. Si la longitud del dato es mayor que la de una tabulación, la tabulación es tomada a partir de la siguiente, por ejemplo:
(Supongamos que todas las tabulaciones tienen 5 caracteres de longitud)
"Chile" & chr(9) & ":)"
"Concepcion" & chr(9) & ":)"
seria algo asi:
tab=5tab=5tab=5
Chile :)
tab=5tab=5tab=5
Concepción :)
En el primer caso, la longitud del dato es igual que la del primer tabulador, entonces cuando agregamos un tab esta bien. Lo que sucede en el segundo caso, es que la long. Del dato es mayor que la de la tabulación, por eso, cuando agregamos un tab, lo corre a la tercera tabulación (toma la siguiente tabulación).
Bueno, ¿cómo solucionamos el problema? Muy fácil, pero un poco fastidioso:
1° Debes determinar de cuantos caracteres son las tabulaciones.
2° (Supongamos que después de cada datos agregas chr(9) & chr(9), e.d. dos tabuladores) Cada vez que vas a imprimir un dato, debes preguntar por su longitud, si esta es mayor que la del tabulador, debes agregar solo un tabulador, sino agregas los dos.
En tu código quedaría algo así:
Printer.Print chr(9) & chr(9) & "1 Sem." & chr(9) & chr(9) & "2 Sem." & chr(9) & chr(9) & "3 Sem." & chr(9) & chr(9) & "4 Sem." & chr(9) & chr(9) & "TOTAL"
...
Str = chr(9) & chr(9) & Trim(tablafm!des_servicio)
if (Len(tablafm!des_servicio) > 5) Then 'suponiendo que la long. del tab es 5
Str = Str & chr(9)
else
Str = Str & chr(9) & chr(9)
end if
Str = Str & tablafm!primera
if (Len(tablafm!primera) > 5) Then 'suponiendo que la long. del tab es 5
Str = Str & chr(9)
else
Str = Str & chr(9) & chr(9)
end if
Str = Str & tablafm!segunda
if (Len(tablafm!segunda) > 5) Then 'suponiendo que la long. del tab es 5
Str = Str & chr(9)
else
Str = Str & chr(9) & chr(9)
end if
... etc...
Printer. Print Str
(Obvie algunas cosas como Trim y Format)
¿Te das cuenta? Ahora si quieres que tu código quede un poco más optimo, puedes hacer el if en una función, algo así:
(En un modulo)
Public Sub Largo(Dato As String) As String
if (Len(Dato) > 5) Then 'suponiendo que la long. del tab es 5
Dato = Dato & chr(9)
else
Dato = Dato & chr(9) & chr(9)
end if
Return Dato
End Sub
(y en tu codigo)
Str = chr(9) & chr(9) & Dato(tablafm!des_servicio) & Dato(tablafm!primera) & Dato(tablafm!segunda) & ....etc...
Printer. Print Str
Espero haberme explicado bien, y que esto sea lo que realmente necesitas... que tengas suerte con tu código.
PD: Si tienes más preguntas por favor házmelas apartes, por favor... necesito los puntos ;)

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas