PiensoPienso: Porque cancela este programa?


Creo una KB de cero en Java/SQL Server y dejo todas las propiedades por default.
Tengo una tabla con un atributo que se llama Att y es que es clave.

Creo un procedure main, con el fuente

//&VarAux es Character(20)
&VarAux='usuario@gmail.com'

//&Var esta basado en el atributo Att
&Var = &VarAux

New
//Att es clave y es Character(10)
Att=&Var
EndNew

Al ejecutarlo, el programa cancela. Cual puede ser la causa?

Comentarios

  1. Depende de algunas settings el que estes viendo el error o no, pero SQL Server te lanza una excepcion si tratas de almacenar algo que es mas grande que el campo.

    El hecho de que sea C(20) o C(10) no importa, porque internamente ambas son variables strings de java. O sea que mientras no sea C(1), a cualquier variable character puede asignarsele cualquier string. El problema se da al tratar de grabarlo (creo que ahora GX incluye codigo para formatearlo, pero no estoy seguro).

    Prueba lo siguiente:
    &VarChar = "en un lugar de la mancha..."
    msg(&VarChar)
    Siendo &VarChar C(3)

    ResponderEliminar
  2. A ver si esta respuesta es la correcta?
    Porque el DBMS da error de datos truncados cuando se le asignan más caracteres de lo definido.
    GX se podría encargar de truncar antes de enviar al server, pero ese trim produciría overheads innecesarios en la mayoría de los casos. En efecto en versiones viejas de GX se hacía el trim y se quitó eso por esos motivos de performance dejando al desarrollador la responsabilidad esta.
    Saludos, Armin

    ResponderEliminar
  3. Más allá de la performance, en algunos casos puede ser más deseable dar un error que guardar datos incompletos.
    Después de todo utilizamos bases de datos que generalmente tienen fuertes restricciones de integridad y guardar datos incompletos atentaría contra estas restricciones.

    ResponderEliminar
  4. opcion 1 porque Raul cambio la IP del servidor y no aviso a nadie...

    opcion 2 porque lo programaste vos

    opcion 3 Porque tenes Windows Vista

    ResponderEliminar
  5. <... opcion 3 Porque tenes Windows Vista >


    jajaj!.. muy buena la respuesta esa!

    ResponderEliminar
  6. Willy Coyote:
    Tenes razon, en java, todo se define como string y no se controla antes de almacenarlo el largo, por lo tanto va a cancelar cuando intente almacenar un char mayor en un char(10).

    Una configuracion poco conocida es poner

    AvoidDataTruncationError=y

    en el config.gx que hace que el programa haga el trim antes de interactuar con la base de datos.

    Tal como lo dice Armin, esto tiene una penalizacion de performance.

    Lo que comenta Pablo tambien es cierto, es peligroso tener una aplicacion que maneja internamente un valor y que cuando almacena en la base de datos, guarda menos caracteres.

    Si la KB esta bien diseñada, no deberia tener problemas con la integridad referencia, pues los atributos relacionados (con subtipos o no) quedan todos del mismo tamaño. Si puede haber problemas si se relacionan por la aplicacion atributos con diferentes tamaño....

    Alejandro:
    Las tres opciones que nombras son muy probables y se acumulan.

    Como nota al margen, cuando se ejecuta con .NET este programa NO CANCELA (lo probe con GeneXus Xev1).


    SET ANSI_WARNINGS OFF
    http://technet.microsoft.com/es-es/library/ms190368.aspx

    ResponderEliminar
  7. Me quedé pensando en lo que dicen:

    1) Es peligroso
    2) En .NET funciona

    ... y me pongo a analizar que trabajar con .NET es peligroso.

    Como alguien dijo una vez, que bancos serios usan CORE Bankings sobre .NET?

    Lo único que me gustaría es que GX controlara en la SPC ese tipo de asignaciones y no me dejara generar.

    ResponderEliminar
  8. Diego:
    El generador .NET de Genexus controla que no lleguen strings mayores a la dimension de los campos en la base de datos y el generador Java, no lo hace en forma nativa.

    Ambos generadores hacen el control (acortando los valores, cuando es necesario) cuando se pone
    AvoidDataTruncationError=y en el config.gx

    Si en SQLserver, se especifica
    SQL ANSI_WARNINGS OFF,
    tampoco cancela.

    El objetivo del post, no fue mostrar la ventaja o desventaja de cada unas de las plataformas (que yo creo son muy similares en cuanto a las funcionalidades brindadas) sino a mostrar un pequeño programita que ayude a pensar en lo complejos que son los sistemas de hoy en dia, y los multiples puntos de fallas que pueden existir.

    Gracias por comentar..

    ResponderEliminar

Publicar un comentario

1) Lee el post
2) Poné tu opinión sobre el mismo.
Todos los comentarios serán leidos y la mayoría son publicados.

Entradas más populares de este blog

El Sordo

Paleta de colores en GeneXus