Perl en Español

  1. Home
  2. Tutoriales
  3. Foro
  4. Artículos
  5. Donativos
  6. Publicidad
 

Problemas Perl/Tk

 
Publicar nuevo tema   Responder al tema    Foros de discusión -> Bases de Datos
Mensaje Jue Nov 08, 2007 6:49 am
Tifa
Perlero Nuevo
Perlero Nuevo
Registrado: 27 Oct 2007
Mensajes: 11
Problemas Perl/Tk Responder citando

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 Sad 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;
    }
}
Mensaje Jue Nov 08, 2007 7:56 am
explorer
Moderador
Moderador
Registrado: 24 Jul 2005
Mensajes: 4036
Ubicación: Valladolid, España
Responder citando

Bienvenida a los foros de Perl en Español, Tifa.

El problema está en el uso de la variable especial $?. Esta variable contiene el resultado de la ejecución del último proceso lanzado EXTERNAMENTE a nuestro programa (backticks, system(), qx(), pipes...), pero eso no es lo que ocurre en la ejecución de la conexión con la base de datos.

Yo cambiaría la línea
Perl:
if ($bb == 0) {

por
Perl:
if ( $coneccion and $peticion ) {


Ultima edición por explorer el Jue Nov 08, 2007 1:10 pm, editado 1 vez
Mensaje Jue Nov 08, 2007 10:03 am
Tifa
Perlero Nuevo
Perlero Nuevo
Registrado: 27 Oct 2007
Mensajes: 11
Responder citando

Gracias por la ayuda Explorer.

Pero la solución de insertar las dos variables en if tampoco resultan Sad 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 Razz
Mensaje Jue Nov 08, 2007 1:16 pm
explorer
Moderador
Moderador
Registrado: 24 Jul 2005
Mensajes: 4036
Ubicación: Valladolid, España
Responder citando

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().
Mensaje Jue Nov 08, 2007 1:49 pm
Tifa
Perlero Nuevo
Perlero Nuevo
Registrado: 27 Oct 2007
Mensajes: 11
=) Responder citando

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 Smile 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 Smile

Mil gracias de antemano, esto me ha alegrado mucho.
Mensaje Vie Nov 09, 2007 7:19 am
Tifa
Perlero Nuevo
Perlero Nuevo
Registrado: 27 Oct 2007
Mensajes: 11
Responder citando

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 Smile
Mensaje Vie Nov 09, 2007 9:34 am
explorer
Moderador
Moderador
Registrado: 24 Jul 2005
Mensajes: 4036
Ubicación: Valladolid, España
Responder citando

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.
Publicar nuevo tema   Responder al tema    Foros de discusión -> Bases de Datos Todas las horas son GMT - 6 Horas
Página 1 de 1



Powered by phpBB © 2001, 2005 phpBB Group