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?
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.
ResponderBorrarEl 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)
A ver si esta respuesta es la correcta?
ResponderBorrarPorque 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
Más allá de la performance, en algunos casos puede ser más deseable dar un error que guardar datos incompletos.
ResponderBorrarDespués de todo utilizamos bases de datos que generalmente tienen fuertes restricciones de integridad y guardar datos incompletos atentaría contra estas restricciones.
opcion 1 porque Raul cambio la IP del servidor y no aviso a nadie...
ResponderBorraropcion 2 porque lo programaste vos
opcion 3 Porque tenes Windows Vista
<... opcion 3 Porque tenes Windows Vista >
ResponderBorrarjajaj!.. muy buena la respuesta esa!
Willy Coyote:
ResponderBorrarTenes 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
Me quedé pensando en lo que dicen:
ResponderBorrar1) 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.
Diego:
ResponderBorrarEl 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..