PC SOFT

PROFESSIONAL NEWSGROUPS
WINDEVWEBDEV and WINDEV Mobile

Home → WEBDEV 2024 → Passage de tableau a WEBSERVICES
Passage de tableau a WEBSERVICES
Started by HLM, Aug., 05 2022 3:42 PM - 5 replies
Registered member
133 messages
Popularité : +3 (3 votes)
Posted on August, 05 2022 - 3:42 PM
Bonjour,

j'ai créé un webservice qui attends en paramètre un tableau de emailattache.

Mais impossible de le faire fonctionner. Toujours l'erreur indicé.

La sérialisation ne fonctionne pas sur le type emailattache.

l'exemple https://blogs.pcsoft.fr/fr/consommation-webservice-utilisation-donnees-tableau-soaparray/231/read.awp n'apporte aucune aide.

Y-a-t-il une solution ?
Registered member
123 messages
Popularité : +7 (9 votes)
Posted on August, 09 2022 - 9:52 AM
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)
//Local variables
Msg is wxMessage
SerBuf is Buffer
ResJSON is JSON

// Clear all error messages in the list previously set by this function
_MsgLst:ClearListForCaller(dbgInfo(dbgElement,dbgCurrentProcess))

//Do logic
WHEN EXCEPTION IN
// We first serialise the object without the data sources, since natively WX cannot serialise binary fields in a data source
Serialize(object,SerBuf,psdJSON)
IF NOT ErrorOccurred THEN
//Assign the JSON
ResJSON = SerBuf

//Now add the data source into the json
FieldList is string = HListItem(QRYRec, hLstDetail)

//First we add regular fields (non-binary fields)
FOR EACH STRING FieldDef OF FieldList SEPARATED by CR
FieldName is string = ExtractString(FieldDef,1,TAB)
FieldType is string = ExtractString(FieldDef,3,TAB)
//Do we have a binary element in the QrySelect member
IF NOT FieldType IN (hItemBinary, hItemBinaryMemo, hItemBinaryMemo4, hItemPicture, hItemTextMemo, hItemUnicodeMemo ) THEN
//Serialise a Regular Field
{"ResJSON.QryRec."+FieldName} = {":QRYRec."+FieldName}
END
END

//Last we add binary fields
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)
//Do we have a binary element in the QrySelect member
IF FieldType IN (hItemBinary, hItemBinaryMemo, hItemBinaryMemo4, hItemPicture, hItemTextMemo, hItemUnicodeMemo ) THEN
//Serialise the binary field
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>
//Add also Binary Memo Metadata
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

//Add Some Meta Data
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
//Local variables
Msg is wxMessage
SerBuf is Buffer <useful>

// Clear all error messages in the list previously set by this function
_MsgLst:ClearListForCaller(dbgInfo(dbgElement,dbgCurrentProcess))

//Do logic
WHEN EXCEPTION IN
//Allow only compatible deserialisations
IF _JSON.Metadata.DataSource ~= object..Class

//Now Deserialise all basic members
<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>
//Parse all base type members from the JSON
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>

//Now deserialise the QRYRec data from the json
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)
//Do we have a binary element in the QrySelect member
IF FieldType IN (hItemBinary, hItemBinaryMemo, hItemBinaryMemo4, hItemPicture, hItemTextMemo, hItemUnicodeMemo)
//Serialise the binary field
SerBinB64 is Buffer
SerBinB64 = Decode({"_JSON.QryRec.###BinaryData###."+FieldName+".Content"}..Value,encodeBASE64NoCR)
{":QRYRec."+FieldName} = SerBinB64
ELSE
//Deserialise Field
{":QRYRec."+FieldName} = {"_JSON.QryRec."+FieldName}..Value
END
END
//Return OK
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
Posted on August, 09 2022 - 9:46 PM
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
Posted on August, 09 2022 - 9:46 PM
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
Registered member
133 messages
Popularité : +3 (3 votes)
Posted on August, 14 2022 - 2:49 PM
a part des erreur dés le copier/coller, je n'obtient rien de fonctionnel.

wxMessageList inconnu, pas de class en webdev.
Registered member
123 messages
Popularité : +7 (9 votes)
Posted on August, 15 2022 - 4:30 PM
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