Arobase et notation objet

Bonjour à tous,

J’utilise un api de Microsoft Azure qui me retourne un json dont certains noms d’attributs commencent par un arobase (@).

Exemple:
{
“capabilityModel”: {
@id”: “urn:rigado:RS40_Occupancy_Sensor:1”,
@type”: [
“CapabilityModel”
],

Est-ce que quelqu’un sait comment lire ceci en notation objet?
capabilityModel.@id ne fonctionne pas.

La commande OB Lire fonctionne bien mais le code est trop générique pour mixer cette commande avec de la notation objet.

Existe-t-il une façon de ne pas considérer l’arobase en notation objet?
J’ai essayé la propriété de “Base de données - Comparaison de texte - Considérer @ comme joker uniquement au début et à la fin des chaînes de caractères” mais ça ne change rien.

Merci à l’avance.

En effet, ça sent la notation objet non active.
Si tu es en C/S, tu as re démarré le serveur ?
Tu as testé sur une mini base fraichement créée ?

: Bernard VACHE

Je fais mes premiers pas en notation objet

Quand tu auras résolu ton problème:

<code 4D>
$H_Doc:=Open document("";"";Get pathname)
If (OK=1)
$T_Extension:=Path to object(document).extension
End if
</code 4D>

Cette façon de faire pourrait permettre le recours à une méthode projet

Dans le code de tes méthodes projet, ces variables interprocess, on peut pas commencer à les remplacer par des constantes ou des locales ?

Bonjour,

Êtes vous retourné dans les préférences de compatibilité pour voir si la case notation objet est bien coché ?

Si elle n’est pas cochées, c’est peut-être que votre base n’est pas prête…

https://doc.4d.com/4Dv17/4D/17.2/Page-Compatibilite.300-4402901.fr.htmlDoc >La notation objet requiert que la base fonctionne en mode Unicode (les options Mode Unicode et Enregistrer les méthodes en Unicode ne doivent pas être désélectionnées).

Oui, Bertrand.

Ça fait une trentaine d’années que j’utilise quelques variables interprocess pour améliorer la lisibilité de mon code.
<>cv pour une chaine vide, <>cr pour un retour de chariot, etc.

A l’époque (1987) on n’avait pas trop d’autre moyen et jusqu’ici, ça n’avait pas beaucoup d’inconvénients, mais maintenant, si j’ai bien compris, ça va l’empêcher de s’exécuter en préemptif.

Heureusement, j’ai une moulinette capable de remplacer une chaîne par une autre dans toutes mes méthodes (4609 occurrences pour <>cv);

Que me conseilles tu : char(NUL ASCII code) ?

: Bernard VACHE

<>cv pour une chaine vide, <>cr pour un retour de chariot, etc.

$T_String:="" // c’est une chaine vide
$T_CR:=\r // ou \n

si tu veux affecter une chaine vide à une variable texte, tu peux aussi écrire :
clear variable($T_String)

Créer des constantes avec 4D pop pour tes deux cas : extravagant imho

Tu pourrais mettre toutes ces constantes dans le storage et écrire un truc du genre :

$T_String:=MonSuperStorage.emptystring
$T_CR:=MonSuperStorage.retour

Merci Bertrand pour ces pistes.

Je vais creuser çà.

: Bertrand SOUBEYRAND

$T_CR:=
// ou \n

je voulais dire :

$T_CR:="\r" // ou “\n”

J’avais rectifié :smiley:

Merci encore

: Bertrand SOUBEYRAND

Tu pourrais mettre toutes ces constantes dans le storage et écrire un
truc du genre :

$T_String:=MonSuperStorage.emptystring
$T_CR:=MonSuperStorage.retour

4609 appels au ‘superStorage’ pour retourner un retour chariot, c’est la grosse artillerie…
La lecture dans le storage a un coût, il ne faut pas l’oublier.

Il me semble que remplacer dans le code <>cr par “\r” et <>cv par “” serait plus raisonnable.

Il n’est pas juste (ni optimisé) d’ailleurs, depuis le passage en UTF-8, de faire la comparaison avec une chaine vide car dans certains cas la comparaison retourne vrai alors que la chaine n’est pas vide (caractères non imprimables). Il faut toujours mieux faire Longeur(maChaine)=0.

: Vincent DE LACHAUX

Il me semble que remplacer dans le code <>cr par "
" et <>cv par “”
serait plus raisonnable.
Oui, à cause de Bertrand je suis tombé de ma chaise - à force de mutex l’application sera mutique.

Sinon, remplacer un \r par une variable ou la commande Caractère(retour charriot), à part détériorer lisibilité et perfs, je vois pas le but…

: Arnaud DE MONTARD

Oui, à cause de Bertrand je suis tombé de ma chaise

Je donne des exemples de choses faisables avec les versions récentes de 4D mais je n’imagine pas qu’on puisse faire autre chose que $T_String:="\r"

Relève-toi et marche

Merci Vincent.

Merci de l’astuce Longeur(maChaine)=0.

Cela dit, côté lisibilité, ça me gêne un peu. Par ailleurs, c’est plus compliqué pour ma moulinette à remplacer dans mes kilomètres de code.

Est-ce que :

ma_chaine=char(NUL ASCII code)

ça marche à tous les coups ?

ça échoue :
<code 4D>
$chaineEsTuVide:=Caractère(ASCII NUL)
ASSERT(longueur($chaineEsTuVide)=1)
</code 4D>

: Bernard VACHE

Est-ce que :

ma_chaine=char(NUL ASCII code)

ça marche à tous les coups ?

Je ne crois pas, le caractère NUL ASCII code (0) est dans tous les cas à éviter.

: doc v11…

Caractères à ne jamais utiliser dans un texteen Unicode, les codes de
caractères suivants sont réservés et ne doivent jamais être inclus
dans un texte :

Notez que vous n’aurez pas d’erreur en utilisant une expression comme
caractere(0). En mode compatibilité, vous pouvez donc toujours
l’utiliser.

Juste un truc amusant que j’ai rencontré récemment:

(Storage.Trucmuche.bidule#"") retourne VRAI (en compilé ?) si Storage.Trucmuche.bidule n’existe pas… (quelqu’un confirme ?)

Le problème c’est que plus loin dans le code on a :

C_TEXTE($Code)
$Code:=Storage.Trucmuche.bidule

du coup $Code qui retourne vraiment “” :oops:

Du coup, je vais revoir mon code pour entourer systématiquement les appels à Storage avec des fonctions (bool, num, chaine, etc…)

Bonjour,

: Manuel PIQUET

Juste un truc amusant que j’ai rencontré récemment:

(Storage.Trucmuche.bidule#"") retourne VRAI (en compilé ?) si
Storage.Trucmuche.bidule n’existe pas… (quelqu’un confirme ?)

Le problème c’est que plus loin dans le code on a :

C_TEXTE($Code)
$Code:=Storage.Trucmuche.bidule

du coup $Code qui retourne vraiment “” :oops:

Du coup, je vais revoir mon code pour entourer systématiquement les
appels à Storage avec des fonctions (bool, num, chaine, etc…)
Oui, c’est tout à fait normal et même écrit dans la doc

: La doc

La lecture d’une propriété d’un objet ou d’une valeur indéfini(e)
renvoie Indéfini ; l’affectation d’une valeur indéfinie à des
variables (hors tableaux) a le même effet qu’appeler EFFACER VARIABLE
avec elles
https://doc.4d.com/4Dv17/4D/17.2/Utiliser-la-notation-objet.300-4387353.fr.html

Cordialement,

Y a t’il bien une différence de comportement en interprété et en compilé ?

En interprété, j’ai une alerte qui me dit les arguments de cette opération ne sont pas compatibles.
et si je fais continuer, je ne passe PAS dans la boucle donc le retour de la condition est FAUX.

En compilé, j’ai l’impression que le résultat de la condition est VRAI :-?

Cela signifie qu’en compilé les propriétés d’un objet de Storage sont initialisées même si elles n’existent pas dans le Storage :?: :doubt:

Bonjour Arnaud, bonjour à tous,

Je ne pensais pas que mon fil ‘Notation objet’ lèverait autant de lièvres :

  • codage d’une chaine vide
  • Variable Document non renseignée par EXPORT DATA.

Je reviens à mon premier problème avec une petite base exemple :
https://forums.4d.com/4DBB_Main/x_User/3140774/files/31162851.zip

Comme il s’agit d’une base toute neuve créée en V17.2, l’onglet ‘Compatibilité’ de ses Propriétés est quasi vide.
Elle est censée être Unicode et reconnaître la nouvelle notation objet.

Elle démarre en mode Trace :
1 : dans la méthode ‘Sur ouverture’ quel paramètre passer à Get database parameter pour lire la propriété ‘Utiliser la notation objet pour…’ ?
2 : dans la méthode ‘Document_Extension_Lire’, les 2 modes de notation fonctionnent.
3 : dans la méthode ‘Document_Extension_Modifier’, les 2 modes de notation semblent fonctionner
mais SHOW ON DISK révèle qu’en réalité, l’extension n’a pas été modifiée !

Un défaut dans mon code ?