[Perl] Generando reportes, calculando anchos...
¿Opinión?
Gunnar Wolf
gwolf@campus.iztacala.unam.mx
Wed, 29 May 2002 11:55:59 -0500 (CDT)
Necesito su ayuda para discernir cuál es la mejor opción de entre las
siguientes - O si hay alguna que no he considerado.
Hice un generador de reportes del cual estoy bastante orgulloso. Quien lo
ha visto -supongo- entenderá por qué - Me costó uno y medio ;-) Pero tengo
una duda: ¿Cómo me conviene averiguar el ancho que tendrá cada una de las
columnas de mi reporte? No, no tengo manera de saberlo de antemano. Esto
porque tengo campos de ancho variable, o porque el usuario puede solicitar
que se le aplique una función (SUM, COUNT, TRIM) al campo, y no puedo
depender de los anchos que declaré al crear cada campo.
Mi base de datos es relativamente pequeña - Actualmente tengo unos 7000
registros en la tabla más grande, y estimo que manejaré máximos de 15000.
La computadora que actuará como servidor (tanto de BD, con Postgres, como
de aplicación, con CGIs en Perl [no conocí mod_perl a tiempo para diseñar
el programa como cómodos modulitos :-( ]) calculo que será una PII a unos
400MHz, y dudo que tenga más de 64MB RAM.
Se me ocurren dos maneras de averiguar el ancho máximo de cada columna,
aunque ambos tienen importantes puntos en contra.
El camino que creo tomar, a menos que me persuadan de lo contrario, es
hacer la consulta completa dos veces. La primera vez, simplemente
manteniendo registro de cuál fue el resultado más largo en cada campo, y
la segunda vez generando el reporte (no, no podría generar el reporte con
los resultados de la primera vuelta, pues estoy reportando hacia la
impresora, y no puedo corregir el ancho de lo que ya imprimí si me llega
algo más ancho). Algo así:
$sth=$dbh->prepare($sql);
$sth->execute;
while ($cosa = $sth->fetchrow_arrayref) {
calc_max($cosa,$maximos);
}
$sth->finish;
prepara_rep($maximos);
$sth=$dbh->prepare($sql);
$sth->execute;
while ($datos = $sth->fetchrow_arrayref) {
reporta_lin($datos);
}
$sth->finish;
El otro camino sería jalar el reporte completo a memoria, y desde memoria
calcular los máximos y reportar... Asumiendo las mismas funciones que
no muestro en el ejemplo anterior, algo así:
$reporte = $dbh->selectall_arrayref($sql);
prepara_rep(calc_max($reporte));
reporta($reporte);
Claro, el segundo caso es mucho más simple conceptualmente, pero puede
requerir BASTANTE memoria - Un cálculo conservador: 7000 renglones, 250
bytes por renglón me da 1,750,000 bytes... Pero me da miedo estarme
quedando corto. Recuerden que la máquina es pequeña. Eso sí, podría
ponerle un buen swap, pero... No sé, no me encanta abusar del tamaño de un
programa en memoria
¿Qué me sugieren?
--
Gunnar Wolf - gwolf@campus.iztacala.unam.mx - (+52-55)5623-1118
PGP key 1024D/8BB527AF 2001-10-23
Fingerprint: 0C79 D2D1 2C4E 9CE4 5973 F800 D80E F35A 8BB5 27AF