[Perl] PROBLEMAS CGI-DBI
Juan Carlos Lopez
jclp77@yahoo.com.mx
Mon, 26 May 2003 14:16:50 -0500 (CDT)
Creo que no me doy a entender, bueno voy a tratar de
explicarlo nuevamente:
Tengo 2 scripts, el primero se llama base_1.cgi y este
script hace una consulta a la base de datos familia
(ACCESS+ODBC) trayendo los parámetros de la consulta
SQL a realizar. Es decir, en un formulario HTML
aparecen las opciones de consulta (Consulta por Jefe
de familia, Pais, region, escolaridad, etc). Cuando
envió estas opciones de consulta al 2° script que se
llama consulta_1.cgi, en este script se obtienen esos
parámetros de consulta y construyó una sentencia SQL
con esos mismos parámetros. Al ejecutar la sentencia
SQL y mandarla a imprimir, tengo que generar una tabla
html con los registros obtenidos a partir de la
consulta. El problema esta que cuando mando a imprimir
alrededor de 4000 registros. Se imprimen algunos
registros pero el browser hace un refresh (no se
porque) y se borran los parámetros de consulta y por
lo tanto no imprime ninguna tabla.
El codigo es el siguiente:
#!c:\perl\bin\perl.exe
use CGI;
use DBI;
use CGI::Carp qw(fatalsToBrowser);
$query = new CGI;
#Captacion de tablas
$region_pais=$query->param('Region_pais'); #Sub_region
o Codigo de Pais-proyecto
$parentesco=$query->param('Parentesco');
$genero=$query->param('Genero');
$alfabetismo=$query->param('Alfabetismo');
$siguen_estudiando=$query->param('Siguen_estudiando');
$ocupacion=$query->param('Ocupacion');
$edad=$query->param('Edad');
$escolaridad=$query->param('Escolaridad');
$comunidad=$query->param('Comunidad');
$familia=$query->param('Familia');
#Captacion de restricciones
$condicion_sub_region=$query->param('Subregion_condicion');
$condicion_parentesco=$query->param('Parentesco_condicion');
$condicion_genero=$query->param('Genero_condicion');
$condicion_alfabetismo=$query->param('Alfabetismo_condicion');
$condicion_siguen_estudiando=$query->param('Siguen_estudiando_condicion');
$condicion_ocupacion=$query->param('Ocupacion_condicion');
#Captacion de restricciones para promedio y rangos
$Edad_condicion=$query->param('Edad_condicion');
$Edad_rango_condicion_min=$query->param('Edad_Rango_condicion_Min');
$Edad_rango_condicion_max=$query->param('Edad_Rango_condicion_Max');
$Edad_condicion_especifica=$query->param('Edad_Especifica_condicion');
#Promedio,Rango y Especifica
$Edad_rango_condicion_especifica=$query->param('Edad_Rango_condicion_especifica');
$Escolaridad_condicion=$query->param('Escolaridad_condicion');
$Escolaridad_rango_condicion_min=$query->param('Escolaridad_Rango_condicion_Min');
$Escolaridad_rango_condicion_max=$query->param('Escolaridad_Rango_condicion_Max');
$Escolaridad_condicion_especifica=$query->param('Escolaridad_Especifica_condicion');
#Promedio,Rango y Especifica
$Escolaridad_rango_condicion_especifica=$query->param('Escolaridad_Rango_condicion_especifica');
@tablas_temp=($region_pais, $parentesco, $genero,
$alfabetismo, $siguen_estudiando, $ocupacion);
@restricciones_temp=($condicion_sub_region,$condicion_parentesco,$condicion_genero,$condicion_alfabetismo,$condicion_siguen_estudiando,$condicion_ocupacion);
@operadores=("","<",">","<>","<=",">=","=");
my @tablas_descripcion;
my @tablas_id;
my @tablas_red_lac;
my @tablas_count;
my @tablas_match;
my @tablas;
my @tablas_restricciones;
my @restricciones;
my @count;
my @num;
#Procedimiento que coloca las tablas de acuerdo a lo
que se selecciono
foreach (@tablas_temp) {
if ($_ =~ /\w/g) {
push(@tablas_descripcion, $tablas_descripcion=$_ .
"\." . "Descripcion");
push(@tablas_id,$tablas_id=$_ . "\." . "id");
push(@tablas_red_lac, $tablas_red_lac="RED_LAC" .
"\." .$_);
push(@tablas_count, $tablas_count="Count(RED_LAC" .
"\." . $_ . ")");
push(@tablas,$tablas=$_);
}
}
for (0..@tablas_temp) {
if ($tablas_temp[$_] =~ /\w/g) {
push
(@tablas_restricciones,$tablas_restricciones=$restricciones_temp[$_]);
}
}
for (0..(@tablas_restricciones)-1) {
if ($tablas_restricciones[$_] =~ /TODOS/g) {next;
}
else {$restricciones[$_]=$tablas_descripcion[$_] .
"=" . "\'$tablas_restricciones[$_]\'"}
}
foreach (reverse(@restricciones)) {
if ($_ =~ /^$/) {next;
}
else{$detalle=$_ . " AND " . $detalle}
}
$detalle =~ s/\ AND $//g;
if ($edad =~ /\w/g) {
if ($Edad_condicion =~ /Promedio/g) {
$proyeccion_edad=" AVG(". $edad .")"
}elsif ($Edad_condicion =~ /Rango/g){
$restriccion_edad=$edad . " BETWEEN " .
$Edad_rango_condicion_min . " AND " .
$Edad_rango_condicion_max}
elsif ($Edad_condicion =~ /Especifica/g){
$restriccion_edad=$edad .
$operadores[$Edad_condicion_especifica] .
$Edad_rango_condicion_especifica}
}
if ($escolaridad =~ /\w/g) {
if ($Escolaridad_condicion =~ /Promedio/g) {
$proyeccion_escolaridad=" AVG(". $escolaridad .")"
}elsif ($Escolaridad_condicion =~ /Rango/g){
$restriccion_escolaridad=$escolaridad . " BETWEEN "
. $Escolaridad_rango_condicion_min . " AND " .
$Escolaridad_rango_condicion_max}
elsif ($Escolaridad_condicion =~ /Especifica/g){
$restriccion_escolaridad=$escolaridad .
$operadores[$escolaridad_condicion_especifica] .
$escolaridad_rango_condicion_especifica}
}
#La variable $proyeccion contiene la cadena de la
sentencia SELECT
foreach (reverse(@tablas_descripcion)) {
$proyeccion=$_ ."\, " . $proyeccion;
}
$proyeccion =~ s/\, $//g;
if ($comunidad =~ /\w/g) {
$proyeccion=$proyeccion ."," . "
RED_LAC.".$comunidad;
}
if ($familia =~ /\w/g) {
$proyeccion=$proyeccion ."," . " RED_LAC.".$familia;
}
if ($proyeccion_edad =~ /AVG\(Edad\)/g) {
$proyeccion=$proyeccion . "," . $proyeccion_edad;
}
if ($proyeccion_escolaridad =~ /AVG\(Escolaridad\)/g)
{
$proyeccion=$proyeccion . "," .
$proyeccion_escolaridad;
}
foreach ((@tablas_count)) {
if (($_ =~ /Pais_proyecto|Sub_region/g) || ($n==1)) {
next;
}else{
push(@count,$count=$_);
$n=1;
$proyeccion=$proyeccion . ", " . $_}
}
#La varible proyeccionde contiene la cadena de la
sentencia FROM
foreach (@tablas) {
$proyeccionde=$_ . ", " . $proyeccionde;
}
$proyeccionde=$proyeccionde . "RED_LAC";
#Procedimiento para colocar el signo de igual a las
tablas
for(0..(@tablas_id)-1) {
$tablas_match[$_]=$tablas_id[$_] . "=" .
$tablas_red_lac[$_];
}
#Procedimiento para convertir en una cadena los match
de las tablas
foreach (@tablas_match) {
$condicion=$_ . " AND " . $condicion;
}
if ($detalle =~ /\w/g) {
$condicion=$condicion . $detalle
}else{$condicion =~ s/\ AND $//g;}
if ($restriccion_edad =~ /\w/g) {
$condicion=$condicion . " AND " . $restriccion_edad;
}
if ($restriccion_escolaridad =~ /\w/g) {
$condicion=$condicion . " AND " .
$restriccion_escolaridad;
}
#Procedimiento para convertir en una cadena para la
sentencia GROUP BY
foreach (reverse(@tablas_descripcion)) {
$agruparen=$_ ."\, " . $agruparen;
}
$agruparen =~ s/\, $//g;
if ($comunidad =~ /\w/g) {
$agruparen=$agruparen ."," . " RED_LAC.".$comunidad;
}
if ($familia =~ /\w/g) {
$agruparen=$agruparen ."," . " RED_LAC.".$familia;
}
$post_consulta=uc("SELECT " . $proyeccion . " FROM " .
$proyeccionde . " WHERE " . $condicion . " GROUP BY "
. $agruparen .";");
@num=(@tablas_descripcion);
if ($comunidad =~ /\w/g) {
push(@num,$num="Comunidad")
}
if ($familia =~ /\w/g) {
push(@num,$num="Familia")
}
if ($proyeccion_edad =~ /\w/) {
push(@num,$num="Edad")
}
if ($proyeccion_escolaridad =~ /\w/) {
push(@num,$num="Escolaridad")
}
push (@num,@count);
push (@num,$num="Porcentaje");
my $dbh = DBI->connect('dbi:ODBC:familia','','') ||
die "<P>\nError al abrir la base datos:
$DBI::errstr</P>\n";
my $sth = $dbh->prepare ($post_consulta);
$sth->execute();
my $table = $sth->fetchall_arrayref();
my($i, $j);
for $i ( 0 .. $#{$table} ) {
$num_total=($table->[$i][-1])+$num_total;
}
#$n=$n-1;
###################################################################
###################### Empieza el script CGI
######################
###################################################################
print $query->header;
print $query->start_html("Consulta");
print <<JAVA;
<script language='JavaScript1.2'>
<!--
// Maximizar Ventana por Nick Lowe
(nicklowe@ukonline.co.uk)
window.moveTo(0,0);
if (document.all) {
top.window.resizeTo(screen.availWidth,screen.availHeight);
}
else if (document.layers||document.getElementById) {
if
(top.window.outerHeight<screen.availHeight||top.window.outerWidth<screen.availWidth){
top.window.outerHeight = screen.availHeight;
top.window.outerWidth = screen.availWidth;
}
}
//-->
</script>
JAVA
print $post_consulta;
print "<P><BR><H4 align='center'>Para otra consulta
presione <a
href=\"/cgi-bin/base_1.cgi\">aqui</A></H4><BR><BR>";
print "<TABLE BORDER=1 align='center'>\n";
foreach (@num) {
$_ =~ s/\.Descripcion|\_/ /g;
$_ =~ s/^Count\(\w*\s\w*\.*\w*\s?\w*\)*/ n /g;
print "<TD align='CENTER' bgcolor='#990000'><H3><font
color='#FFFFFF'>$_</font></H3></TD>";
}
###+++++AQUI ES DONDE ESTA EL PROBLEMA######
for $i ( 0 .. $#{$table} ) {
print "<TR>";
for $j ( 0 .. $#{$table->[$i]} ) {
print "<TD>$table->[$i][$j]</TD>";
}
$promedio=(($table->[$i][-1])*100)/$num_total;
$promediogral=$promediogral+$promedio;
printf ("<TD align='CENTER'>%.2f %</TD>",$promedio);
print "</TR>";
}
$sth->finish();
print "<TR>";
foreach (@num) {
if ($_ =~ / n /) {
print "<TD align='CENTER'
bgcolor='#990000'><H4><font
color='#FFFFFF'>$num_total</font></H4></TD>";
}elsif ($_ =~ /Porcentaje/) {printf ("<TD
align='CENTER' bgcolor='#990000'><H4><font
color='#FFFFFF'>%.2f
%</font></H4></TD>",$promediogral);}
else{print "<TD></TD>";next}
}
print "</TR>";
print "</TABLE>";
print "<P>";
$dbh->disconnect || warn "\nFallo al
desconectar.\nError: $DBI::errstr\n";
print "<BR><h4 align='center'>Para imprimir presione
<a href=\"#\"
onClick=\"javascript:window.print()\">aqui</A></h4>";
print $query->end_html;
_________________________________________________________
Do You Yahoo!?
La mejor conexión a internet y 25MB extra a tu correo por $100 al mes. http://net.yahoo.com.mx