• Publicidad

Problemas Perl/Tk

Todo acerca de las bases de datos que existen: SQL, MySQL, Oracle, Postgres, CSV, etc.

Problemas Perl/Tk

Notapor Tifa » 2007-11-08 07:49 @367

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:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
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;
    }
}
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4
Tifa
Perlero nuevo
Perlero nuevo
 
Mensajes: 11
Registrado: 2007-10-27 10:41 @487

Publicidad

Notapor explorer » 2007-11-08 08:56 @414

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
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
if ($bb == 0) {
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

por
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
if ( $coneccion and $peticion ) {
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
Última edición por explorer el 2007-11-08 14:10 @632, editado 1 vez en total
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Notapor Tifa » 2007-11-08 11:03 @502

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 :P
Tifa
Perlero nuevo
Perlero nuevo
 
Mensajes: 11
Registrado: 2007-10-27 10:41 @487

Notapor explorer » 2007-11-08 14:16 @636

Naturalmente, Tifa... Perl está haciendo exactamente lo que estas pidiendo:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
    my $coneccion = Mysql->connect(
        "$hostname",
        "$entrada7",
        "$entrada5",
        "$entrada6"
    )
        or die ("$!\n");
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


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().
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

=)

Notapor Tifa » 2007-11-08 14:49 @659

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:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
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;
    }
};
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


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.
Tifa
Perlero nuevo
Perlero nuevo
 
Mensajes: 11
Registrado: 2007-10-27 10:41 @487

Notapor Tifa » 2007-11-09 08:19 @388

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:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
 my $coneccion = Mysql->connect(
        "$hostname",
        "$entrada7",
        "$entrada5",
        "$entrada6"
    )
        or die ("$!\n");
    my $peticion  = $coneccion->query(
        "create table $entrada9 ($entrada11);"
    )
        or die ("$!\n");
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


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 :)
Tifa
Perlero nuevo
Perlero nuevo
 
Mensajes: 11
Registrado: 2007-10-27 10:41 @487

Notapor explorer » 2007-11-09 10:34 @481

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.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España


Volver a Bases de datos

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 0 invitados