[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