Quante volte avete ricevuto l’errore“Tipo di valore non supportato in un oggetto condiviso” quando avete cercato di inserire un oggetto in un oggetto condiviso?
Che cosa avete fatto? Avete scritto del codice più lungo per trasformare il vostro oggetto innocente in un oggetto condiviso, magari iterando su tutte le sue proprietà?
Che ne dite di trasferire un oggetto condiviso da un gruppo condiviso a un altro?
Una cosa interessante sugli oggetti: sapete già che possono essere usati come una mappa hash (un sistema chiave/valore), ma che ne dite di ottenere tutte le chiavi o tutti i valori con una sola riga di codice?
Continuate a leggere, perché 4D v18 R3 è uscito e porta con sé buone notizie!
COPIA di oggetti e collezioni condivise
copiare un oggetto come condiviso
Il comando OB Copy() è stato migliorato per accettare una nuova opzione che può avere il valore: ck condiviso
Nell’esempio che segue, l’oggetto $person viene copiato come oggetto condiviso nell’oggetto $copy.
Quindi, possiamo inserire l’oggetto $copy nell’oggetto condiviso $personsList .
C_OBJECT$copy ($person;$copy;$personsList)
C_TEXT ($text)
$text :=Document to text(Get 4D folder(Current resources folder)+"person.txt")
//$person is a standard object
$person :=JSON Parse($text)
$personsList :=New shared object()
//$copy is a shared object
$copy :=OB Copy($person;ck shared)
Use ($personsList)
//We can put $copy in $personsList because $copy is a shared object
$personsList .person:= xml-ph-003
End use
assegnare un oggetto condiviso da un gruppo condiviso a un altro
Il comando OB Copy() è stato migliorato per accettare un nuovo parametro: groupWith (che deve essere un oggetto condiviso o un insieme condiviso).
Il passaggio del parametro groupWith consente di inserire l’oggetto copiato nello stesso gruppo condiviso di groupWith.
Nell’esempio seguente, $sharedObj e $sharedColl appartengono a due gruppi condivisi separati.
Non possiamo inserire $sharedObj in $sharedColl senza incorrere in un errore, ma possiamo facilmente copiare $sharedObj in un nuovo oggetto appartenente allo stesso gruppo condiviso di $sharedColl.
C_OBJECT($sharedObj;$objCopy)
C_COLLECTION ($sharedColl)
//$sharedObj belongs to a shared group
$sharedObj :=New shared object("cognome"; "Smith"; "indirizzo";New shared object("città"; "New York"))
//$sharedColl belongs to another shared group
$sharedColl :=New shared collection(New shared object("cognome"; "Brown")
//$objCopy is in the same shared group as $sharedColl
$objCopy:=OB Copy($sharedObj;ck shared;$sharedColl)
//So we can put $objCopy into $sharedColl without error
Use ($sharedColl)
$sharedColl .
push($objCopy)
End use
e che dire delle collezioni condivise?
Gli esempi precedenti sono relativi al comando OB Copy() .
Il metodo membrocollection.copy() è stato migliorato esattamente nello stesso modo.
gestire un oggetto come mappa hash
Ci sono nuovi comandi che facilitano la gestione di un oggetto come mappa hash. Se avete oggetti i cui nomi di proprietà contengono dati dinamici, questi comandi fanno al caso vostro!
Spieghiamolo con un singolo esempio.
Consideriamo questo oggetto $persons che contiene nome come nome di proprietà ed età come valore di proprietà:
C_OBJECT($persons)
$persons :=New object
$persons ["John"]:=42 // John is 42
$persons ["Andy"]:=24 // Andy is 24
$persons ["Mary"]:=30 // Mary is 30
$persons ["Paul"]:=50 // Paul is 50
$persons ["Fred"]:=51// Fred is 51
Comando Chiavi OB
Questo comando restituisce i nomi delle proprietà di un oggetto sotto forma di raccolta:
ALERT("Ci sono "+String(OB Keys($persons).length)+" persone")
Comando OB Valori
Questo comando restituisce i valori delle proprietà di un oggetto sotto forma di raccolta:
ALERT("L'età media è "+String(OB Values($persons).average()))
Comando OB Voci
Questo comando restituisce un insieme di oggetti con proprietà chiave (nome della proprietà) e valore (valore della proprietà):
C_COLLECTION($agesOK)
$agesOK:=OB Entries($persons).query("valore>:1";45)
ALERT ("Ci sono "+String($agesOK.length)+" persone che hanno più di 45 anni")
ALERT ("I loro nomi sono: "+$agesOK.extract("chiave").join("-"))
L’uso di un oggetto, come mostrato sopra, consente un accesso rapido e diretto ai dati, come quando si usa un indice.
È più veloce che usare un insieme di oggetti con le proprietà firstname ed age.
Si noti anche che questi comandi restituiscono un insieme. Ciò consente di utilizzare tutti i metodi membri disponibili per le collezioni (come ad esempio average(), query(), …).