2009-11-14 18:14 @801 |
|
|
Lor
Perlero Frecuente
|
Registrado: 2005-04-28 05:47 @282 Mensajes: 188
|
|
|
Ajax, Bucle, Llamado a función
|
Estoy trabajando con CGI::Ajax y no puedo resolver el siguiente problema. Tengo una aplicación en Perl que tira en pantalla datos resumidos de una tabla, resultado de una consulta MySQL. Mi idea es que el usuario pueda hacer clic sobre el dato y se despliegue con Ajax UN DETALLE. Es decir, un ejemplo similar a un tipo árbol de directorio, hago clic en una carpeta y se me despliegan las subcarpetas que lo componen. En mi caso despliego primero un numero N de nombres de usuarios, el operador elije uno con un CLIC por ejemplo, y con AJax le despliego un detalle e información relacionada al usuario seleccionado. Por ejemplo de la consulta obtengo los usuarios logueados en mi sistema: Using text Syntax Highlighting Usuario1
Usuario2
.
.
UsuarioN Yo anexaría algún objeto form delante del nombre del usuario para que frente a algún evento se pueda desplegar el conjunto de horas en que se logueo al sistema el usuario elegido durante el último mes. Para lograr este detalle debo llamar a una función que primeramente busque en la base de datos el resultado a mostrar para el usuario seleccionado. Para lo cual necesito enviar el id del usuario elegido. ¿Cómo lo envío? ¿Qué nombre toma esta variable que difiere de valor para cada usuario en particular? Mi problema está en 'argv__$id_usuario': (lo siguiente se repite para cada usuario $i mostrado) Using perl Syntax Highlighting $myhtml = $myhtml . TR( {-valign=>'top', -bgcolor=>'#FFFFFF'},
td({-align=>'left',-class=>'smallfonts'},
textfield(-name=>'usuario'. $i ,
-id=>'usuario'. $i ,
-maxlength=>1,
-class=>'texto_form',
-OnKeyUp=>"load_sesiones(['argv__$id_usuario'], ['$resultado'], 'POST')",
-size=>1)),
.....
sub load_sesiones {
# ¿Cómo leo el id del usuario para buscar los datos en la tabla?
# Recibo el id del usuario elegido. ¿Cómo, en qué forma?
# Genero la consulta y obtengo los datos resultado
# Conformo el código HTML con el resultado para el usuario elegido
return ($codigo_resultado_usuarioXX);
} Espero me sepan entender; ya voy tres días con este problema y no logro resolverlo. Muchísimas gracias. 
| Última edición por explorer el 2009-11-14 21:44 @947, editado 2 veces en total |
| Estilo, ortografía, código, spainglish |
|
2009-11-14 22:55 @996 |
|
|
 |
explorer
Administrador
|
Registrado: 2005-07-24 18:12 @800 Ubicación: Valladolid, España Mensajes: 10216
|
|
|
Re: Ajax, Bucle, Llamado a función
|
Estás usando, correctamente, la forma especial 'argv__$id_usuario'es decir, la presencia de '__' hace que la URL a llamar sea de la forma script.pl?argv=<valor de $id_usuario>Y la forma de recuperarlo será con my $id = $cgi->params('argv');Tal cual lo tienes escrito Using perl Syntax Highlighting -OnKeyUp=>"load_sesiones(['argv__$id_usuario'], ['$resultado'], 'POST')", es correcto: está entrecomillado doble por lo que hará una expansión de las variables $resultado y $id_usuario. Y suponemos que $id_usuario contiene el id de usuario que queremos recibir y que $resultado es nombre de la capa que recibirá el resultado HTML. La llamada llegará a load_sesiones(), y la forma de leerlo será como te he dicho antes, con el params() (esto último es necesario porque no usas el valor estándar args). Bueno, esto lo he dicho de memoria. Habría que hacer una prueba...
_________________ JF^D Perl programming
|
2009-11-15 18:32 @814 |
|
|
Lor
Perlero Frecuente
|
Registrado: 2005-04-28 05:47 @282 Mensajes: 188
|
|
|
Re: Ajax, Bucle, Llamado a función
|
Explorer, ¡¡¡ gracias por tu respuesta !!! Pero no puedo detectar el error. En el log del Apache me aparece lo siguiente: returning Bad Request status 400. He intentado poner en la misma aplicación otros objetos conjuntamente con éste con llamada a Ajax y andan perfectamente pero éste no funciona. No llega a ejecutar la función load_sesiones() porque estoy poniendo banderas de impresión en la misma y no se imprimen en pantalla, señal que no llega a ejecutarse... Parte del código : (aquí debe estar el error, pero no lo detecto) Using perl Syntax Highlighting $myhtml = $myhtml . TR( {-valign=>'top', -bgcolor=>'#FFFFFF'},
td({-align=>'left',-class=>'smallfonts'},
textfield(
-name=>'usuario'. $i ,
-id=>'usuario'. $i ,
-maxlength=>1,
-class=>'texto_form',
-OnKeyUp=>"load_sesiones(['argv__$id_usuario'], ['$nombre_res'], 'POST')",
-size=>1
)
),
# ........
sub load_sesiones {
# CREO que NO llega a ejecutarse
my $cgi= new->CGI;
my $id_login = $cgi->param('argv');
#.
#.
# .
return (resultado);
} Realmente estoy desorientada, porque pongo otras llamadas a Ajax en la misma aplicación corriendo conjuntamente y funcionan pero ésta que tiene características REPETITIVAS ya que la misma se ejecuta para cada usuario seleccionado tiene problemas. ¿Estará el problema en el nombre CONCATENADO con $i de las variables? Bueno, espero si me puedes dar una mano, porque ¡¡¡¡hoy domingo también estuve con este tema y sin solución!!!! ¡¡¡¡Muchas gracias!!!! 
|
2009-11-15 20:09 @881 |
|
|
 |
explorer
Administrador
|
Registrado: 2005-07-24 18:12 @800 Ubicación: Valladolid, España Mensajes: 10216
|
|
|
Re: Ajax, Bucle, Llamado a función
|
Para que sea llamada la función load_sesiones() dentro de Perl, en alguna parte del programa Perl debe haber una línea así: Using perl Syntax Highlighting my $pjx = new CGI::Ajax( 'load_sesiones' => \&load_sesiones); El primer load_sesiones() se refiere a la función Javascript que recibirá el evento de la textarea y realizará la llamada Ajax. Y el segundo es el nombre de la función Perl que será llamada por CGI::Ajax. El primer load_sesiones() es necesario porque es así como lo tienes puesto en el evento OnKeyUp. Recuerda que tienes a tu disposición los métodos JSDEBUG() y DEBUG(). Con $pjx->JSDEBUG(1); muestra la URL que genera la petición. Con $pjx->DEBUG(1); muestra información en los logs en la parte del servidor.
_________________ JF^D Perl programming
|
2009-11-16 04:57 @248 |
|
|
Lor
Perlero Frecuente
|
Registrado: 2005-04-28 05:47 @282 Mensajes: 188
|
|
|
Re: Ajax, Bucle, Llamado a función
|
Gracias, explorer, todo esto ya lo estoy usando, pero sigo sin detectar el problema. Me doy por vencida. Using perl Syntax Highlighting if ($Q::consultar) {
my $cgi = new CGI;
my $pjx = new CGI::Ajax('load_sesiones' => \&load_sesiones);
$pjx->JSDEBUG(1);
$pjx->DEBUG(1);
print $pjx->build_html( $cgi, \&show_html);
}
.....
sub show_html() {
my $tmphtml = generate_html();
my $myhtml = <<EOHTML;
$tmphtml
EOHTML
return($myhtml);
}
...
sub generate_html() {
my $myhtml;
While..(cantidad usuarios) ...
$myhtml = $myhtml . TR( {-valign=>'top', -bgcolor=>'#FFFFFF'},
td({-align=>'left',-class=>'smallfonts'},
textfield(-name=>'usuario'. $i ,
-id=>'usuario'. $i ,
-maxlength=>1,
-class=>'texto_form',
-OnKeyUp=>"load_sesiones(['argv__$id_usuario','sid'], ['$nombre_res'], 'POST')",
-size=>1)),
td({-align=>'left'}, $razon_social ),
td({-align=>'center'}, $cant_sesiones ),
td({-align=>'center'}, $fecha_ultima_sesion) );
$myhtml_2 = $myhtml_2 . TR(td({-colspan=>5}, div({-id=>"$nombre_res"} ). ' ') );
......
}
sub load_sesiones {
my $cgi= new->CGI;
my $id_usuario = $cgi->params('argv');
.......
return(...);
} Bueno, gracias por todo.
|
2009-11-16 10:52 @494 |
|
|
Lor
Perlero Frecuente
|
Registrado: 2005-04-28 05:47 @282 Mensajes: 188
|
|
|
Re: Ajax, Bucle, Llamado a función RESUELTO
|
¡¡¡¡¡¡¡¡RESUELTO!!!!!!!! En mi país decimos persevera y triunfarás. Detecté el problema. No estaba en la llamada a la función load_sesiones(), eso está correcto. El problema estaba en la definición de la función; por eso no se ejecutaba. Explorer, ¡¡¡¡¡MUCHÍSIMAS GRACIAS!!!!! 
| Última edición por explorer el 2009-11-16 11:07 @504, editado 1 vez en total |
| Ortografía, anglicismos |
|
2009-11-17 06:12 @300 |
|
|
Lor
Perlero Frecuente
|
Registrado: 2005-04-28 05:47 @282 Mensajes: 188
|
|
|
Re: Ajax, Bucle, Llamado a función
|
Explorer, para que no te quedes con la duda de lo que pasaba aquí te mando un poco de código, el objetivo de la aplicación y te marco dónde estaba el error. ¡¡¡Gracias, por todo!!! Adjunto:
Comentario: Imagen que desplaya la aplicacion generada
explica.gif [ 52.87 KiB | Visto 2255 veces ]
Using perl Syntax Highlighting #-------------------------------------------------------------------------------
# SCRIPT Consulta sesiones de usuarios: El operador mete en un formulario lo
# que desea consultar; un usuario en particular o todos, un rango de fechas, etc.
# Al ejecutarse la consulta tira en pantalla cada usuario con la CANTIDAD de
# ACCESOS que ha tenido. Si se quiere un mayor nivel de detalle se presiona sobre
# la imagen y este detalle se despliega en pantalla.
#-------------------------------------------------------------------------------
use strict;
use CGI ':all';
use CGI qw/:standard *table/;
use DBI;
use CGI::Session;
use CGI::Ajax;
$ENV{DBDATE} = "DMY4";
require("../comunes/Crypt.pm");
require("../comunes/i_funciones.pm");
{
# FORM INICIAL : Muestra el formulario de especificación de consulta
#----------------------------------------------------------------------------
if ($control_form eq "" || $control_form eq "T"){
my $cgi = new CGI;
my $pjx = new CGI::Ajax('load_usuarios' => \&load_usuarios);
# Aquí estaba el error: load_sesiones y limpiar_sesiones deben especificarse TAMBIÉN
# Aquí, como éstas se utilizan en el resultado y NO en el form inicial yo pensaba que
# no era necesario.
$pjx->register('load_sesiones' => \&load_sesiones);
$pjx->register('limpiar_sesiones' => \&limpiar_sesiones);
$pjx->JSDEBUG(1);
$pjx->DEBUG(1);
print $pjx->build_html( $cgi, \&show_html);
}
#-------------------------------------------------------------------------------
# Concatena TODO el HTML que hay que desplayar relacionado al FORM de CONSULTA
#-------------------------------------------------------------------------------
sub generate_html() {
my $myhtml;
........
$myhtml = $myhtml . TR(td({-align=>'left', -height=>'20' ,-colspan=>20}," " ));
$myhtml = $myhtml . TR( td({-align=>"left",-colspan=>3 , -height=>'40'},
"Tipo de Usuario " . scrolling_list(-name=>"tipo_usuario_abm",
-id=>"tipo_usuario_abm",
-override=>1,
-default=>$tipo_usuario_abm,
-size=>1,
-value=>\@tipos_usuarios,
-labels=>\%tipos_usuarios,
-onChange=>"load_usuarios(['tipo_usuario_abm','sid'],['div_usuarios'],'POST')",
-class=>'texto_form') ),
td({-align=>"left",-colspan=>2 },
div({-id=>'div_usuarios'},
scrolling_list(-name=>"id_tipo_usuario_abm",
-id=>"id_tipo_usuario_abm",
-override=>1,
-default=>$id_tipo_usuario_abm,
-size=>1,
-value=>\@asoc_usuarios,
-labels=>\%asoc_usuarios,
-class=>'texto_form') )));
$myhtml = $myhtml . TR({-align=>'center'},
td({-align=>'left', -colspan=>5, -height=>30}, ' ' ));
............
# Botonera al pie del formulario
#---------------------------------------------------------------------------
$myhtml = $myhtml . TR({ -valign=>"center"},
td({-align=>"left",-height=>20, -colspan=>5 }, ' '));
$myhtml = $myhtml . TR({ -valign=>"center", -bgcolor=>'#E5E5E5'},
td({-align=>"left",-height=>20, -colspan=>5 },
submit(-name=>'consultar', -value=>'Consultar', -class=>'boton'),
submit(-name=>'limpiar', -value=>'Limpiar Form', -class=>'boton'),
...............
return ($myhtml);
}
#-------------------------------------------------------------------------------
# AJAX - Función 1 - inicial
#-------------------------------------------------------------------------------
sub show_html() {
my $tmphtml = generate_html();
my $myhtml = <<EOHTML;
$tmphtml
EOHTML
return($myhtml);
}
##-----------------------------------------------------------------------------
# Si presiono el botón consultar debo armar todo el resultado a desplayar
##-----------------------------------------------------------------------------
if ($Q::consultar ) {
my $cgi = new CGI;
my $pjx = new CGI::Ajax('load_sesiones' => \&load_sesiones);
$pjx->register('limpiar_sesiones' => \&limpiar_sesiones);
$pjx->JSDEBUG(1);
$pjx->DEBUG(1);
print $pjx->build_html( $cgi, \&show_html_2);
}
#-------------------------------------------------------------------------------
# Concatena TODO el HTML RESULTADO CONSULTA que hay que desplayar,
#-------------------------------------------------------------------------------
sub generate_html_2() {
my $myhtml_2;
............
while ( $sth->fetch() ) {
.....
$myhtml_2 = $myhtml_2 . TR( {-valign=>'top', -bgcolor=>'#FFFFFF'},
td({-align=>'left', -width=>20},
div({-id=>"div_imagen_$id_login_usu"},
img({-name=>'login_' . $id_login_usu ,
-id=>'login_' . $id_login_usu ,
-src=>"/images/ico_desplegar_on.gif",
-border=>0,
-value=> $id_login_usu ,
-onClick=>"load_sesiones(['login_$id_login_usu','fecha_inicio_i', 'fecha_fin_i','sid'],['div_sesiones_$id_login_usu', 'div_imagen_$id_login_usu'],'POST')"}) )),
td({-align=>'left'}, " " . $apellido_usu . ', ' . $nombre_usu),
td({-align=>'left'}, $razon_social ),
td({-align=>'center'}, $cant_sesiones ),
td({-align=>'center'}, $fecha_ultima_sesion) );
$myhtml_2 = $myhtml_2 . TR( td({-colspan=>5, -class=>'tabla'},
div({-id=>"div_sesiones_$id_login_usu"})));
$myhtml_2 = $myhtml_2 . TR( td({-colspan=>5},' '));
$i = $i + 1;
}# END while
........
return ($myhtml_2);
}
#-------------------------------------------------------------------------------
# Función llama a generate_html_2() y obtiene todo el código HTML RESULTADO de
# lo que se quiere consultar a desplayar
#-------------------------------------------------------------------------------
sub show_html_2() {
my $tmphtml = generate_html_2();
my $myhtml_2 = <<EOHTML_2;
$tmphtml
EOHTML_2
return($myhtml_2);
}
# AJAX - Función que desplaya usuarios dependiendo del tipo de usuario seleccionado
#-----------------------------------------------------------------------------------
sub load_usuarios {
my $tipo_usuario_abm = shift;
my $myhtml;
%asoc_usuarios = ('-1'=>" Todos ");
my $ref = $dbh_i->selectall_arrayref(" SELECT e.codent, e.razsoc " .
" FROM entidad e, vendcli vc ," .
" usuarios u " .
...... );
${$_}[1]=~ tr/áéíóúüñçÁÉÍÓÚÜÑÇ/aeiouuncAEIOUUNC/;
foreach (@$ref) {$asoc_usuarios{${$_}[0] . '_S'} = ${$_}[1]; }
(@asoc_usuarios) = sort { $asoc_usuarios{$a} cmp $asoc_usuarios{$b}} keys %asoc_usuarios;
$myhtml = $myhtml . scrolling_list(-name=>"id_tipo_usuario_abm",
-id=>"id_tipo_usuario_abm",
-override=>1,
-default=>$id_tipo_usuario_abm,
-size=>1,
-value=>\@asoc_usuarios,
-labels=>\%asoc_usuarios,
-class=>'texto_form');
.....
return($myhtml);
}
#-------------------------------------------------------------------------------
# AJAX - Función que desplaya el detalle de las sesiones del usuario
#-------------------------------------------------------------------------------
sub load_sesiones {
my $id_login = shift;
my $fecha_inicio_i = shift;
my $fecha_fin_i = shift;
my $myhtml_2;
my $myhtml_3;
my $query = " SELECT TO_CHAR(se.fecha_inicio_sesion,'%d/%m/%Y %I:%M:%S %p')" .
" FROM sesiones_h se " ........ ;
print $query if $DEBUG;
my $sth = $dbh_i->prepare($query) or die "ERROR prepare $query ";
$sth->execute() or die "ERROR execute $query ";
my ($fecha);
my @cols = (\$fecha);
$sth->bind_columns(undef, @cols);
$sth->{ ChopBlanks } = 1;
my $count = 0;
while ($sth->fetch()) {
$myhtml_2 = $myhtml_2 . $fecha . ' - ' ;
} # end While
$myhtml_3 = $myhtml_3 . img({-name=>'login_' . $id_login ,
-id=>'login_' . $id_login ,
-src=>"/images/ico_desplegar_off.gif",
-border=>0,
-value=> $id_login ,
-onClick=>"limpiar_sesiones(['login_$id_login','sid'],['div_sesiones_$id_login', 'div_imagen_$id_login'],'POST')"});
return($myhtml_2, $myhtml_3);
}
#-------------------------------------------------------------------------------
# AJAX - Función limpia el detalle desplayado y cambia la imagen mostrada
#-------------------------------------------------------------------------------
sub limpiar_sesiones {
my $id_login_usu = shift;
my $myhtml_2 = ' ' ;
my $myhtml_3;
$myhtml_3 = $myhtml_3 . img({-name=>'login_' . $id_login_usu ,
-id=>'login_' . $id_login_usu ,
-src=>"/images/ico_desplegar_on.gif",
-border=>0,
-value=> $id_login_usu ,
-onClick=>"load_sesiones(['login_$id_login_usu','fecha_inicio_i', 'fecha_fin_i','sid'],['div_sesiones_$id_login_usu', 'div_imagen_$id_login_usu'],'POST')"});
return($myhtml_2, $myhtml_3);
}
|
2009-11-17 10:37 @484 |
|
|
 |
explorer
Administrador
|
Registrado: 2005-07-24 18:12 @800 Ubicación: Valladolid, España Mensajes: 10216
|
|
|
Re: Ajax, Bucle, Llamado a función
|
Aún no me queda muy claro que sea necesario crear objetos CGI::Ajax de esa manera, pero en fin... lo miraré más adelante. En cuanto al código, solo indicarte que Using perl Syntax Highlighting use CGI ':all';
use CGI qw/:standard *table/; lo puedes dejar en Using perl Syntax Highlighting También, Using perl Syntax Highlighting my $pjx = new CGI::Ajax('load_usuarios' => \&load_usuarios);
$pjx->register('load_sesiones' => \&load_sesiones);
$pjx->register('limpiar_sesiones' => \&limpiar_sesiones); por Using perl Syntax Highlighting my $pjx = CGI::Ajax->new(
load_usuarios => \&load_usuarios,
load_sesiones => \&load_sesiones,
limpiar_sesiones => \&limpiar_sesiones,
);
_________________ JF^D Perl programming
|
|
Página 1 de 1
|
[ 10 mensajes ] |
|
| Reglas del Foro |
No puedes abrir nuevos temas en este Foro No puedes responder a temas en este Foro No puedes editar tus mensajes en este Foro No puedes borrar tus mensajes en este Foro No puedes enviar adjuntos en este Foro
|
|
Socializa |
 |
|