Buenos días, lancé esta misma pregunta en la comunidad global y me dieron la respuesta, explico la solución:
El problema que tenía con los $c(0) es que se insertaban cuando por SQL hacía un insert en un campo de tipo %String con el valor de string vacio ""
Este es un comportamiento estandar de cache para las propiedades de tipo %String. La solución que me dieron era sobreescribir el comportamiento del metodo Normalize, para esto creé una clase que extendiese de %String y sobreescribí el metodo Normalize modificando su comportamiento para que en la devolución hiciese la traducción del $c(0) por ""
Clase Extendida de %String con el metodo Normalize sobreescrito:
Class User.StringNoEmpty Extends %String [ Language = objectscript ] {
ClassMethod Normalize(%val As %RawString) As %String [ CodeMode = generator, ServerOnly = 1 ]
{
{
set code="%val"
if %parameter("TRUNCATE"),%parameter("MAXLEN")'="" { set code="$e(%val,1,"_(+%parameter("MAXLEN"))_")" }
$$$GENERATE(" RETURN $tr("_code_",$c(0),"""")")
RETURN $$$OK
}
}
Y luego en la clase defino la propiedad del nuevo tipo en lugar de String
Property myString As User.StringNoEmpty;
Espero que le sirva a alguien mas de ayuda.
Un saludo
Buenos días Pierre,
Gracias por tu respuesta, el problema que tengo con lo $c(0) en los globals es que si hago por ejemplo esto:
(Imaginemos que en este nodo del global solo guardo por id de cliente un teléfono y para este idCliente tengo un $c(0) donde debería estar el teléfono)
Set telefono = $G(^myGlobalTelefonoCliente(idCliente))
if (telefono '=""){
....
}
como telefono sería igual a $c(0) entraría en la condición y no es lo que quiero.
Tengo funciones de limpieza de caracteres para evitar esto pero si se pudiese traducir los $c(0) directamente en la inserción no tendría que estar controlandolo en N sitios.
Se me ocurrió crear un trigger en la clase que compruebe los campos antes de grabar pero no me ha funcionado, ejemplo:
{
S:({telefono}=$c(0)) {telefono}=""
}
Un saludo,







Buenos días Kurro,
A mi me pasaba lo mismo al hacer inserts por SQL, lo solucioné generándome una clase que extendiese de String y parseando el $c(0) por ""
Mira este artículo donde escribí la solución que me funcionó a mi:
https://es.community.intersystems.com/post/evitar-c0-en-globals#comment-...
Espero que te sea de ayuda .