Reporte dinamico Windows Form 2005

05/01/2008 - 21:16 por Antonio Campos | Informe spam
Estimados, he estado buscando ejemplos de reportes dinamicos en windows
form, para visual studio 2005 en C#.

No se si alguno de ustedes me puede orientar o ayudar a como realizar un
reporte de este tipo, dado que es el primero que hago

Preguntas similare

Leer las respuestas

#1 Octavio Hernandez
06/01/2008 - 00:26 | Informe spam
Antonio,

Si te refieres a informes Crystal Reports, hay muchos ejemplos
en la web del fabricante, www.businessobjects.com.
Te comento que la versión de Crystal que viene con Visual Studio
tiene ciertas limitaciones, una de ella que no permite definir los
informes en tiempo de ejecución (si a eso es a lo que te refieres con
"reportes dinámicos").

Slds - Octavio


"Antonio Campos" wrote in message
news:
Estimados, he estado buscando ejemplos de reportes dinamicos en windows
form, para visual studio 2005 en C#.

No se si alguno de ustedes me puede orientar o ayudar a como realizar un
reporte de este tipo, dado que es el primero que hago

Respuesta Responder a este mensaje
#2 Antonio Campos
06/01/2008 - 20:05 | Informe spam
a que el usuario pueda generar el reporte como el quiere.. customizarlo al
momento de realizarlo.. sin necesidad de generar muchos reportes.. tan solo
1 solo, que permita realizar muchos reportes por sus campos


"Octavio Hernandez" wrote in message
news:OsIYdJ$
Antonio,

Si te refieres a informes Crystal Reports, hay muchos ejemplos
en la web del fabricante, www.businessobjects.com.
Te comento que la versión de Crystal que viene con Visual Studio
tiene ciertas limitaciones, una de ella que no permite definir los
informes en tiempo de ejecución (si a eso es a lo que te refieres con
"reportes dinámicos").

Slds - Octavio


"Antonio Campos" wrote in message
news:
Estimados, he estado buscando ejemplos de reportes dinamicos en windows
form, para visual studio 2005 en C#.

No se si alguno de ustedes me puede orientar o ayudar a como realizar un
reporte de este tipo, dado que es el primero que hago




Respuesta Responder a este mensaje
#3 Gonzalo Rodríguez Carrera
07/01/2008 - 19:11 | Informe spam
Hombre, poder poder, se puede. Pero tampoco es un "report" por
definición.

Hace un par de semanas necesité crear una apliación que permitiera a
un usuario poder crear sus consultas y por supuesto imprimirlas, nada,
cosa sencilla, titulo, columnas y lineas.

Al ser variable y totalmente en ejecución, ahora no me acuerdo quien,
me recomendó "generar" a mano las páginas y lo cierto es que con un
poquito de trabajo quedan bien...

La función que a mi me lo hace es la siguiente, a ver si te sirve...
se que está un poco embrollada porque fue hecha a correr y sobre
remiendos, tengo en tareas pendientes limpiarla y dejarla bonita...
pero por lo menos igual te orienta.

Resumiendo, esto toma directamente el contenido de una grid y lo
"plancha" en un papel, headers incluidas... después tengo una
propiedad Titulo para el titulo del reporte y una List<string> para
subtitulos (n lineas debajo del titulo) antes de las columnas.
Los anchos de las columnas se ajustan al ancho porcentual que tengan
en la grid.

(Ah! y empleo el objeto printDocument...)

private void printDocument1_PrintPage(object sender,
System.Drawing.Printing.PrintPageEventArgs e)
{
string cabecera;
int numCaracteresImprimibles = 0;
int totalFilas = base.RowCount;
int totalColumnas = base.ColumnCount;
string cadena = "";
Font font = new Font("Courier New", 7);
Font fontCaption = new Font("Courier New", 7,
FontStyle.Bold);
Font fontCaption2 = new Font("Courier New", 7,
FontStyle.Regular);
Font fontTitulo = new Font("Courier New", 14,
FontStyle.Bold);
Int32 intPrintAreaHeight;
Int32 intPrintAreaWidth;
Int32 marginLeft;
Int32 marginTop;
Int32 marginBottom;
Int32 marginRight;

// Fijamos la cabecera
if (this.titulo != "")
cabecera = this.titulo;
else
cabecera = this.titulodefecto;

// Límites del área de impresión.
intPrintAreaHeight printDocument1.DefaultPageSettings.PaperSize.Height - margentop -
margenbottom;
intPrintAreaWidth printDocument1.DefaultPageSettings.PaperSize.Width - margenleft -
margenright;

// Minimo X
marginLeft = margenleft;

// Minimo Y
marginTop = margentop;

// Maximo X
marginRight = margenright;

// Maximo Y
marginBottom = margenbottom;

// Si es apaisado, cambiamos alto por ancho y viceversa
if (printDocument1.DefaultPageSettings.Landscape)
{
Int32 intTemp;
intTemp = intPrintAreaHeight;
intPrintAreaHeight = intPrintAreaWidth;
intPrintAreaWidth = intTemp;
}

e.Graphics.DrawString(cabecera, fontTitulo, Brushes.Black,
marginLeft, marginTop);

int ycoord = marginTop+33;
for (int k = 0; k <= this.subtitulo.Count - 1; k++)
{
e.Graphics.DrawString(this.subtitulo[k].ToString(),
fontCaption2, Brushes.Black, marginLeft, ycoord);
ycoord = ycoord + 10;
}

int xcord;
xcord = marginLeft;
int maxXcord = intPrintAreaWidth;
int ancho = 0;
float anchoPorcentajeColumna;

// -- IMPRESION DE LAS
CABECERAS
for (int j = 0; j <= totalColumnas - 1; j++)
{
// Tomamos el valor del campo
cadena = base.Columns[j].HeaderText.ToUpper();
if (cadena == "" || cadena == null)
cadena = "(s/titulo)";

// Calculamos qué porcentaje ocupa en la grid, para
ocupar lo mismo en el papel.
anchoPorcentajeColumna = base.Columns[j].Width * 100 /
base.Width;
ancho = (int)(anchoPorcentajeColumna *
intPrintAreaWidth / 100);

// La courier 7 ocupa 6 píxels de ancho... asi
obtenemos cuantos caracteres caben en la columna.
numCaracteresImprimibles = ancho / 6;
if (cadena.Length > numCaracteresImprimibles)
cadena = cadena.Substring(0,
numCaracteresImprimibles - 1) + "...";

if ((xcord > (intPrintAreaWidth - marginRight)) && !
this.landscape)
{
printDocument1.DefaultPageSettings.Landscape true;
Int32 intTemp;
intTemp = intPrintAreaHeight;
intPrintAreaHeight = intPrintAreaWidth;
intPrintAreaWidth = intTemp;
}
// Escribimos el campo en el informe.
e.Graphics.DrawString(cadena, fontCaption,
Brushes.Black, xcord, ycoord + 10);

xcord = xcord + 20 + ancho; // 20px de margen
minimiiisimo entre columnas
}

marginTop = ycoord + 20;

// Ponemos una línea horizontal separando las cabeceras
del cuerpo del informe
e.Graphics.DrawLine(Pens.Black, marginLeft, ycoord +
5, intPrintAreaWidth, ycoord + 5);

int ycord = marginTop + 20;
int contador = 0;

int i=0;
bool par = false;
SolidBrush brochaGris = new SolidBrush(Color.WhiteSmoke);
SolidBrush brochaBlanca = new SolidBrush(Color.White);

// -
IMPRIMIMOS EL CONTENIDO
//for (i = NumeroLinea; i <= NumeroLinea + 70; i++)
while(ycord<intPrintAreaHeight)
{
//NumeroLinea++;
i = LineasEscritas;
xcord = marginLeft;
// si nos salimos fuera de la hoja o hemos impreso
todas las líneas nos salimos del bucle.
if (ycord > intPrintAreaHeight || i > totalFilas - 1)
break;

// alternancia de colores entre gris y blanco para
lineas pares e impares.
if (par)
e.Graphics.FillRectangle(brochaGris,
marginLeft, ycord - 2, intPrintAreaWidth - marginRight, ycord + 15 -
1);
else
e.Graphics.FillRectangle(brochaBlanca,
marginLeft, ycord - 2, intPrintAreaWidth - marginRight, ycord + 15 -
1);
par = !par;
// recorremos las columnas para cada línea
for (int j = 0; j <= totalColumnas - 1; j++)
{
// Tomamos el valor del
campo
if (base[j, i].Value == null || base[j,
i].Value.ToString() == "")
cadena = "(vacío)";
else
cadena = base[j, i].Value.ToString(); //
oResultado[i, j].ToString();

anchoPorcentajeColumna = base.Columns[j].Width *
100 / base.Width;
ancho = (int)(anchoPorcentajeColumna *
intPrintAreaWidth / 100);

numCaracteresImprimibles = ancho / 6;
if (cadena.Length > numCaracteresImprimibles)
cadena = cadena.Substring(0,
numCaracteresImprimibles - 1) + "...";

if (xcord < intPrintAreaWidth)
{
// Escribimos el campo en el informe.
e.Graphics.DrawString(cadena, font,
Brushes.Black, xcord, ycord);
}
xcord = xcord + 20 + ancho; // 10 de margen
minimiiisimo entre columnas
}
ycord = ycord + 15;
LineasEscritas++;
}
e.Graphics.FillRectangle(brochaBlanca, marginLeft, ycord -
2, intPrintAreaWidth - marginRight, ycord + 15 - 1);

if (LineasEscritas < base.RowCount - 1)
{
e.HasMorePages = true; //si esto es true, se repetirá
la llamada a la función en recursiva para seguir generando páginas. El
calculo lo tienes que hacer tu.
}
else
{
e.HasMorePages = false;
}
//LineasEscritas = 0;
PaginasTotales++;
e.Graphics.DrawLine(Pens.Black, marginLeft, ycord,
intPrintAreaWidth, ycord);
}


Lo dicho, se que es embrolloso... pero espero que te oriente.
Cualquier duda, pregunta ¿ok?

Saludos.

Gonzalo Rodríguez Carrera
Vigo - España
email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaRespuesta Tengo una respuesta
Search Busqueda sugerida