Jue Nov 08, 2007 6:49 am
|
 |
Tifa
Perlero Nuevo

|
Registrado: 27 Oct 2007
Mensajes: 11
|
|
| Problemas Perl/Tk |
|
|
No sé si pregunto en el lugar correcto debido a que es sobre un código Perl/Tk.
Resulta ser que el programita en cuestión realiza consultas a Mysql; tengo una función que cuando la subconsulta se realiza satisfactoriamente, le avisa al usuario que se realizo satisfactoriamente... pero cuando falla la consulta (ya sea porque existe la tabla, o error de conexión a Mysql, o cualquiera error) debería imprimir en pantalla "Error No se pudo" y es esta partecita que no realiza no sé por qué razón no lo hace si dentro del código le especifico con un if - else que si es satisfactorio haga una sentencia y sino haga la otra, pero el me obvia por toda vía el resultado que debería mostrar a la hora de errores, me obvia el ELSE no importa cuantos cambios yo haga, el ELSE lo obvia por todas maneras.
He aquí el código que explico haber si alguien puede ayudar:
| Perl: | sub ingreso {
my $entrada5 = $entrada-> get();
my $entrada6 = $entrada1-> get();
my $entrada7 = $entrada3-> get();
my $entrada9 = $entrada8-> get();
my $entrada11 = $entrada10-> get();
my $coneccion = Mysql-> connect(
"$hostname",
"$entrada7",
"$entrada5",
"$entrada6"
)
or die ("$!\n");
my $peticion = $coneccion-> query(
"create table $entrada9 ($entrada11);"
)
or die ("$!\n");
my $bb = "$?";
if ($bb == 0) {
my $popup = $ventana-> DialogBox(
-title => "Detalles Genesix",
-buttons => ["Cerrar"],
-background => 'black',
-foreground => 'white'
);
$popup-> add(
"Label",
-text => "Tabla Creada Satisfactoriamente",
-background => 'black',
-foreground => 'white'
)-> pack;
$popup-> Show;
}
else {
my $popup1 = $ventana-> DialogBox(
-title => "Error",
-buttons => ["OK"],
-background => 'black',
-foreground => 'white'
);
$popup1-> add(
"Label",
-text => "Error No se pudo crear la Tabla",
-background => 'black',
-foreground => 'white'
)-> pack;
$popup1-> Show;
}
} |
|
|
|
|


Jue Nov 08, 2007 10:03 am
|
 |
Tifa
Perlero Nuevo

|
Registrado: 27 Oct 2007
Mensajes: 11
|
|
|
|
|
Gracias por la ayuda Explorer.
Pero la solución de insertar las dos variables en if tampoco resultan sigue dándome el mismo resultado... cuando la subconsulta a Mysql es satisfactoria imprime el DialogBox.
Cuando es negativa (por algún error) está supuesta a imprimir otro resultado, pero sigue obviándolo y solo imprime el error en el terminal (si ejecuto la aplicación desde el terminal)
Soy completamente nueva en programación con Tk para darle gráfico a Perl. Hice el mismo programita pero en Perl y funciona de maravilla, pero hay usuarios que si no ven un gráfico no quieren una aplicación, así que me he aventurado con Tk. Pero no logro que la parte de error mande una petición al dialogbox. La razón aun no la entiendo, pero estoy tratando de buscarla  |
|

Jue Nov 08, 2007 1:16 pm
|
 |
explorer
Moderador

|
Registrado: 24 Jul 2005
Mensajes: 4130
Ubicación: Valladolid, España
|
|
|
|
|
Naturalmente, Tifa... Perl está haciendo exactamente lo que estas pidiendo:
| Perl: | my $coneccion = Mysql-> connect(
"$hostname",
"$entrada7",
"$entrada5",
"$entrada6"
)
or die ("$!\n"); |
Fíjate... le estás diciendo que... o se conecta... o se muere...
Y eso es lo que pasa... que en caso de error, el programa se muere.
Cambia los die() por warn(). |
|

Jue Nov 08, 2007 1:49 pm
|
 |
Tifa
Perlero Nuevo

|
Registrado: 27 Oct 2007
Mensajes: 11
|
|
| =) |
|
|
Hola nuevamente, sé que es un poco complicado preguntar cosas de Tk por estos lados, sobretodo no sé por qué me he metido a usar esa herramienta gráfica habiendo tantas para Perl...
Pero ya lo pude resolver el problema estaba en el primer if efectivamente, pero se resolvió con:
| Perl: | sub ingreso {
my $entrada5 = $entrada->get();
my $entrada6 = $entrada1->get();
my $entrada7 = $entrada2->get();
my $entrada9 = $entrada8->get();
my $entrada11 = $entrada10->get();
my $coneccion = Mysql->connect(
"$hostname",
"$entrada7",
"$entrada5",
"$entrada6"
);
my $peticion = $coneccion->query(
"create table $entrada9 ($entrada11);"
);
if ($peticion) {
my $popup = $ventana->DialogBox(
-title => "Detalles Genesix",
-buttons => ["Cerrar"],
-background => 'black',
-foreground => 'white'
);
$popup->add(
"Label",
-text => "Tabla Creada Satisfactoriamente",
-background => 'black',
-foreground => 'white'
)->pack;
$popup->Show;
}
else {
my $popup1 = $ventana->DialogBox(
-title => "Detalles Genesix",
-buttons => ["Cerrar"],
-background => 'black',
-foreground => 'white'
);
$popup1->add(
"Label",
-text => "Error No se pudo crear la Tabla",
-background => 'black',
-foreground => 'white'
)->pack;
$popup1->Show;
}
}; |
Solo tuve que poner if ($peticion) y ya está. Cuando da error muestra el segundo dialog; cuando es efectivo muestra el primero
Mil gracias de antemano, esto me ha alegrado mucho. |
|

Vie Nov 09, 2007 7:19 am
|
 |
Tifa
Perlero Nuevo

|
Registrado: 27 Oct 2007
Mensajes: 11
|
|
|
|
|
Vuelvo a responder..... para que a otro que quiera intentar con Perl/Tk y Mysql.
El error de mi software no estaba tanto en el if-else, estaba en la variable de conexión a Mysql y el query:
| Perl: | my $coneccion = Mysql-> connect(
"$hostname",
"$entrada7",
"$entrada5",
"$entrada6"
)
or die ("$!\n");
my $peticion = $coneccion-> query(
"create table $entrada9 ($entrada11);"
)
or die ("$!\n"); |
Realmente hay que quitar los 'or die ("$!\n") o warn()' cual sea el caso... removerlos de la sentencia de conexión, ya que esto es lo que provocaba que todo se imprimiera en terminal y no en pantalla como yo quería.
Besos  |
|

Vie Nov 09, 2007 9:34 am
|
 |
explorer
Moderador

|
Registrado: 24 Jul 2005
Mensajes: 4130
Ubicación: Valladolid, España
|
|
|
|
|
No hay nada de malo en que los errores saliesen por la terminal. De hecho, la mayor parte de los programas gráficos en Linux siguen sacando los errores críticos por la salida estándar de error.
La forma de trabajo en modo gráfico cambia un poco, como has dicho.
La situación ideal sería: construir una función llamada, por ejemplo, dialogo_error() cuya función sea la de presentar el error que se le pase como argumento en una caja de diálogo al usuario. De esa manera, en tu código, cuando se produce la situación de error, presentas el error con esta función (te ahorras código) y luego terminas o continúas o reintentas (según la gravedad del error) la parte que falló.
Es más. Podrías presentar una segunda caja de diálogo al usuario preguntándole que es lo que quiere hacer: reintentar o cancelar. |
|
Powered by phpBB © 2001, 2005 phpBB Group
|