|
Passage de tableau a WEBSERVICES |
Iniciado por HLM, 05,ago. 2022 15:42 - 5 respuestas |
| |
| | | |
|
| |
Miembro registrado 133 mensajes Popularité : +3 (3 votes) |
|
Publicado el 05,agosto 2022 - 15:42 |
| |
| |
| | | |
|
| | |
| |
Miembro registrado 123 mensajes Popularité : +7 (9 votes) |
|
Publicado el 09,agosto 2022 - 09:52 |
Bonjour HLM
Il faut écrire la sérialisation/déserialisation soit même pour qu'il sérialise bien les variables binaires... Voici un exemple de ma classe wxRecord qui sérialise sa classe et les enregistrements avec mémos binaires inclus. N'import quelle autre langage sait bien sérialiser en standard les champs de type binaire...
Le code ci-dessous peut vous donner une idée: Sérialisation:
FUNCTION ObjSerialise(_MsgLst is wxMessageList, _IncludeTextMemos is boolean = True, _IncludeBinaryMemos is boolean = True):(boolean,JSON)
Msg is wxMessage SerBuf is Buffer ResJSON is JSON
_MsgLst:ClearListForCaller(dbgInfo(dbgElement,dbgCurrentProcess))
WHEN EXCEPTION IN Serialize(object,SerBuf,psdJSON) IF NOT ErrorOccurred THEN ResJSON = SerBuf FieldList is string = HListItem(QRYRec, hLstDetail) FOR EACH STRING FieldDef OF FieldList SEPARATED by CR FieldName is string = ExtractString(FieldDef,1,TAB) FieldType is string = ExtractString(FieldDef,3,TAB) IF NOT FieldType IN (hItemBinary, hItemBinaryMemo, hItemBinaryMemo4, hItemPicture, hItemTextMemo, hItemUnicodeMemo ) THEN {"ResJSON.QryRec."+FieldName} = {":QRYRec."+FieldName} END END IF _IncludeTextMemos _OR_ _IncludeBinaryMemos THEN FOR EACH STRING FieldDef OF FieldList SEPARATED by CR FieldName is string = ExtractString(FieldDef,1,TAB) FieldType is string = ExtractString(FieldDef,3,TAB) IF FieldType IN (hItemBinary, hItemBinaryMemo, hItemBinaryMemo4, hItemPicture, hItemTextMemo, hItemUnicodeMemo ) THEN SerBinB64 is string SerBinB64 = Encode({":QRYRec."+FieldName},encodeBASE64NoCR) {"ResJSON.QryRec.###BinaryData###."+FieldName+".Content"} = SerBinB64 IF FieldType IN (hItemTextMemo, hItemUnicodeMemo) AND _IncludeTextMemos THEN {"ResJSON.QryRec.###BinaryData###."+FieldName+".WXType"}="TextMemo" ELSE IF _IncludeBinaryMemos THEN IF FieldType = hItemPicture THEN {"ResJSON.QryRec.###BinaryData###."+FieldName+".WXType"}="ImageMemo" ELSE {"ResJSON.QryRec.###BinaryData###."+FieldName+".WXType"}="BinaryMemo" END END <COMPILE IF ConfigurationType<>Android> BinInfo is string = HInfoMemo({":QryRec."+FieldName}) {"ResJSON.QryRec.###BinaryData###."+FieldName+".Type"}=ExtractString(BinInfo,1,TAB) {"ResJSON.QryRec.###BinaryData###."+FieldName+".Name"}=ExtractString(BinInfo,2,TAB) {"ResJSON.QryRec.###BinaryData###."+FieldName+".Size"}=ExtractString(BinInfo,3,TAB) {"ResJSON.QryRec.###BinaryData###."+FieldName+".Date"}=ExtractString(BinInfo,4,TAB) {"ResJSON.QryRec.###BinaryData###."+FieldName+".Time"}=ExtractString(BinInfo,5,TAB) {"ResJSON.QryRec.###BinaryData###."+FieldName+".Info"}=ExtractString(BinInfo,6,TAB) <END> END END END END ResJSON.Metadata.SerialiseVersion = SerialiseVersion ResJSON.Metadata.DataSource = object..Class ResJSON.Metadata.PrimaryTable = DBRec..AssociatedFile RESULT (True, ResJSON) ELSE Msg.AddToList(_MsgLst,wxMessage.MSG_SYSERROR,ErrorInfo(errCode),"An error occurred while serialising the object.",ErrorInfo(errMessage)) RESULT (False, ResJSON) END DO Msg.AddToList(_MsgLst,wxMessage.MSG_SYSEXCEPTION,ExceptionInfo(errCode),"An exception was encountered.",ExceptionInfo(errMessage)) wxApplication.LogException(_MsgLst) <COMPILE IF ConfigurationType<>Android> ExceptionEnable() <END> RESULT (False, ResJSON) END
Déserialisation:
FUNCTION ObjDeserialise(_MsgLst is wxMessageList, _JSON is JSON):boolean
Msg is wxMessage SerBuf is Buffer <useful>
_MsgLst:ClearListForCaller(dbgInfo(dbgElement,dbgCurrentProcess))
WHEN EXCEPTION IN IF _JSON.Metadata.DataSource ~= object..Class <Compile IF ConfigurationType=Android> FOR EACH Mbr OF _JSON IF NOT Lower(Mbr..Name) IN ("qryrec","metadata") THEN {":"+Mbr..Name} = Mbr..Value END END <ELSE> ObjDef is Definition = GetDefinition(object) FOR EACH Mbr OF ObjDef.Variable IF Mbr.Definition <> Null THEN IF Mbr.Definition.Type IN (wlInt, wlInt_1, wlInt_2, wlInt_4, wlInt_8, wlUnsignedInt_1, wlUnsignedInt_2, wlUnsignedInt_4, wlUnsignedInt_8, ... wlReal, wlReal_4, wlReal_8, wlNumeric, wlCurrency, ... wlUUID, wlUUID_128, wlUUID_256, wlString, wlAnsiString, wlFixedString, wlASCIIZString, wlCharacter, ... wlDate, wlDateTime, wlTime, wlDuration, ... wlBoolean, wlEmpty) IF {"_JSON."+Mbr..Name}..Exist THEN {":"+Mbr..Name} = {"_JSON."+Mbr..Name}..Value END END END END <END> FieldList is string = HListItem(QRYRec, hLstDetail) FOR EACH STRING FieldDef OF FieldList SEPARATED by CR FieldName is string = ExtractString(FieldDef,1,TAB) FieldType is string = ExtractString(FieldDef,3,TAB) IF FieldType IN (hItemBinary, hItemBinaryMemo, hItemBinaryMemo4, hItemPicture, hItemTextMemo, hItemUnicodeMemo) SerBinB64 is Buffer SerBinB64 = Decode({"_JSON.QryRec.###BinaryData###."+FieldName+".Content"}..Value,encodeBASE64NoCR) {":QRYRec."+FieldName} = SerBinB64 ELSE {":QRYRec."+FieldName} = {"_JSON.QryRec."+FieldName}..Value END END RESULT True ELSE Msg.AddToList(_MsgLst,wxMessage.MSG_SYSERROR,ErrorInfo(errCode),"An error occurred while deserialising into the object.",... "Incompatible Data Source types: "+_JSON.Metadata.DataSource+"/"+object..Class+" (Info: "+_JSON.Metadata.PrimaryTable+"/"+DBRec..AssociatedFile+")") RESULT False END DO Msg.AddToList(_MsgLst,wxMessage.MSG_SYSEXCEPTION,ExceptionInfo(errCode),"An exception was encountered.",ExceptionInfo(errMessage)) wxApplication.LogException(_MsgLst) <COMPILE IF ConfigurationType<>Android> ExceptionEnable() <END> RESULT False END
-- Peter Holemans www.mcs2.eu | www.pixontri.eu |
| |
| |
| | | |
|
| | |
| |
Publicado el 09,agosto 2022 - 21:46 |
Bonsoir, J'ai aimé, mais
Msg is wxMessage Serialize(object,SerBuf,psdJSON) QRYRec
J'aimerais savoir comment vous gérez la variable object, wxMessage et QRYREC. J;aimerais bien en savoir plus |
| |
| |
| | | |
|
| | |
| |
Publicado el 09,agosto 2022 - 21:46 |
Bonsoir, J'ai aimé, mais
Msg is wxMessage Serialize(object,SerBuf,psdJSON) QRYRec
J'aimerais savoir comment vous gérez la variable object, wxMessage et QRYREC. J;aimerais bien en savoir plus |
| |
| |
| | | |
|
| | |
| |
Miembro registrado 133 mensajes Popularité : +3 (3 votes) |
|
Publicado el 14,agosto 2022 - 14:49 |
a part des erreur dés le copier/coller, je n'obtient rien de fonctionnel.
wxMessageList inconnu, pas de class en webdev. |
| |
| |
| | | |
|
| | |
| |
Miembro registrado 123 mensajes Popularité : +7 (9 votes) |
|
Publicado el 15,agosto 2022 - 16:30 |
Ralph IGCI a écrit :
Bonsoir, J'ai aimé, mais MsgiswxMessage Serialize(object,SerBuf,psdJSON) QRYRec J'aimerais savoir comment vous gérez la variable object, wxMessage et QRYREC. J;aimerais bien en savoir plus
Bonjour
C'est un simple copier/coller de mon framework de base pour faire de la sérialisation de classes et des données dedans. Le but était didactique... Pour clarifier un peu: 1/ wxMessage et wxMessageList - les classes wxMessage et wxMessageList sont utilisés pour passer et communiquer des messages entre les différents composants d'exécution de mes programmes. Ils ont encore évolué un peu mais tu peux trouver une explication sur le concept de ces classes dans la vidéo, l'exemple et la doc pdf ici: https://depot.pcsoft.fr/resource.awp…
2/ Object - 'object' est un mot clé WX qui est égale à 'this' (comme dans des autres langages) depuis la version 20 (je crois) Ce que je fait ici est sérialiser l'instance de la classe qui est en cours d'exécution. Par exemple la classe wxLogItem qui répresante un enregistrement de type LogItem dans la base de données
Elle hérite la plupart de ses méthodes de la classe générique wxRecord (comme la sérialisation et déserialisation) de base. Cette classe de base wxRecord gère également toute l'IO avec la base de données... Comme vous voyez, wxLogItem est une classe simple sans beaucoup de membres spécifiques. Les champs de la base de données ne sont pas dupliqué dans la classe comme membres car implictement elles y sont déjà par deux autres membres: QRYRec (qui peut contenir une vue beaucoup plus complête des données en faisaint des jointures avec des autres tables) et DBRec qui représente la table unique primaire de la requête. La source de données est la vue principale d'un poin de vue utilisation de la classe. Pour ça elle est publique. Le membre DBRec est utilisé pour sauvegarder vers la base et est donc protégé. Dans ce cas-ci aucun des membres sera sérialisé parce qu'ils ont tous l'attribut <Serialize=false>. Le code Serialize(object,SerBuf,psdJSON) de la classe wxRecord de base en prend compte de ces attributs en sérialisant l'instance de la classe.
Les données de la base sont implictement représenté dans le membre requête comem source de données de la classe
Ceci-dit, la méthode de sérialisation de la classe va sérialiser les données/champs/images/memos de cette requête avec la méthode dans mon précedent message.
Exemple en exécution... Prenons le test scenario pour aller chercher un wxLogItem de la base de données et de la sérialiser:
En exécution:
Et aussi les champs binaires (memos textes, images, fichiers, ...) de la BDD/requête sont sérailisés:
C'est un framework générique assez complet et ce forum ne donne pas l'espace pour expliquer tout en détail mais j'espère que cela te monter le concept lequel tu peux implémenter afin de sérialiser et déserialiser un objet un peu plus compliqué qu'un type standard.
-- Peter Holemans www.mcs2.eu | www.pixontri.eu |
| |
| |
| | | |
|
| | | | |
| | |
|