Question
· Oct 24, 2023

Stream dans un objet dynamique

Bonjour,

 

J'ai un petit soucis je souhaite renvoyé via une API REST des données IRIS mais j'ai une erreur sur le renvoi de données de type Stream.GlobalBinary, j'essaie de faire un "CopyFrom" via $METHOD mais je récupère un "INVALID OREF" : 

 set obj  = ##class(%ZEN.proxyObject).%New()   
   set update = $CLASSMETHOD(classname,"%OpenId",id)
if class.Properties.GetAt(i).Type = "%Stream.GlobalBinary"{
        set pnewContent = ##class(%Stream.GlobalCharacter).%New()
           do $METHOD($PROPERTY(update,propertyName),"Rewind")
              while '$PROPERTY(update,propertyName).AtEnd{
            do pnewContent.Write($system.Encryption.Base64Encode($zcvt($PROPERTY(update,propertyName).ReadLine(),"O", "UTF8")))
        }
            do pnewContent.%Save()
                                
            do $METHOD($PROPERTY(obj,sqlFieldName),"CopyFrom",pnewContent)
        }
    }
                                

J'essaie d'attribuer à une propriété dynamique le stream. 

Merci d'avance pour votre aide

Discussion (3)2
Connectez-vous ou inscrivez-vous pour continuer

Salut @Julia Pertin ,

Pour créer un un %DynamicObject tu peux utiliser les syntaxes suivantes : 

set obj = {}
; ou
Set obj = ##class(%DynamicObject).%New()

ZEN étant déprécié, j'imagine que la classe %ZEN.proxyObject l'est aussi (je déconseil son utilisation dans un nouveau développement ;-) ).  

Il y a eu des changements dans les dernières versions d'IRIS avec la gestion des streams dans les %DynamicObject, j'ai tenté d'adapter votre code en le simplifiant un peu, mais je n'ai pas vraiment pu le tester:

    Set obj = {}
    Set update = $CLASSMETHOD(classname,"%OpenId",id)
    Set property = $Property(update, propertyName)
    If $Isobject(property), property.%IsA("%Stream.GlobalBinary") {
        Set pnewContent = ##class(%Stream.GlobalCharacter).%New()
        Do property.Rewind()
        While 'property.AtEnd {
            Do pnewContent.Write($zcvt(property.ReadLine(),"O", "UTF8"))
        }
        Do obj.%Set(sqlFieldName, pnewContent, "stream>base64")
    }

La méthode %Set avec comme 3ème argument "stream>64" de set le stream dans le %DynamicObject en le convertissant directement en base64.

L'inverse est aussi possible avec la methode %Get (ex : obj.%Get(sqlFieldName,"stream<base64") ).
J'espère que ça aidera.