Routine générique pour sélectionner les éléments en gras
Le SelectBoldElement fonction fournit une réutilisables et flexible pour sélectionner des objets ou des listes.
fonction de SelectBoldElement( Racine: TBoldElement sOCL: string Params: tableau de const
& ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & nbsp EClass: ExceptClass ErrMsg: string
& ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & nbsp Conteneur:TBoldElement=nil
& ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & nbsp InPS: Boolean = False
& ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & nbsp Vars: TBoldExternalVariableList = nil ): TBoldElement
const
& nbsp & nbsp & nbsp cLastElement = $FFFF
var
& nbsp & nbsp & nbsp ocl : string
& nbsp & nbsp & nbsp id : TBoldIndirectElement
& nbsp & nbsp & nbsp ReturnListElementX : Boolean
& nbsp & nbsp & nbsp Élément : Integer
begin
& nbsp & nbsp & nbsp résultat := nil
& nbsp & nbsp & nbsp Élément := 0
& nbsp & nbsp & nbsp ReturnListElementX := False
& nbsp & nbsp & nbsp si Racine = nil then
& ! & ! & ! & ! & ! & nbsp Racine := TBoldSystem.DefaultSystem
& nbsp & nbsp & nbsp Assert( pas (Conteneur est TBoldObject), 'SelectBoldElement ne peut pas retourner BoldObjects dans le conteneur' )
& nbsp & nbsp & nbsp Assert( Attribué( de la Racine ), 'Tentative de Sélectionner sans un système ouvert' )
& nbsp & nbsp & nbsp id := TBoldIndirectElement.Créer
& nbsp & nbsp & nbsp essayer
& ! & ! & ! & ! & ! & nbsp ocl := Format( sOCL, Params )
& ! & ! & ! & ! & ! & nbsp // Ce code permet à cette routine pour sélectionner, en toute transparence une 'première' ou de la 'dernière' de l'objet dans le PS
& ! & ! & ! & ! & ! & nbsp si (en Majuscules(Copie( ocl, Longueur(ocl)-6, 8)) = '->d'ABORD') et (InPS), puis commencer
& ! & ! & ! & ! & ! & ! & ! & ! & nbsp SetLength( ocl, Longueur(ocl)-7)
& ! & ! & ! & ! & ! & ! & ! & ! & nbsp ReturnListElementX := true
& ! & ! & ! & ! & ! & nbsp fin
& ! & ! & ! & ! & ! & nbsp si (en Majuscules(Copie( ocl, Longueur(ocl)-5, 8)) = '->LAST') et (InPS), puis commencer
& ! & ! & ! & ! & ! & ! & ! & ! & nbsp SetLength( ocl, Longueur(ocl)-6)
& ! & ! & ! & ! & ! & ! & ! & ! & nbsp ReturnListElementX := true
& ! & ! & ! & ! & ! & ! & ! & ! & nbsp Élément := cLastElement
& ! & ! & ! & ! & ! & nbsp fin
& ! & ! & ! & ! & ! & nbsp Racine.EvaluateExpression( ocl, id, InPS, Vars )
& ! & ! & ! & ! & ! & nbsp // si rien n'a été sélectionné, sortir, soit en augmentant fourni par l'utilisateur de l'erreur, ou tranquillement
& ! & ! & ! & ! & ! & nbsp si (non Affecté( id.Valeur )) ou
& ! & ! & ! & ! & ! & ! & ! & ! & nbsp ((id.La valeur est TBoldList) et (TBoldList(id.Valeur).Count = 0)) then
& ! & ! & ! & ! & ! & ! & ! & ! & nbsp si Affecté(Ecl)
& ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & nbsp élever EClass.Créer( ErrMsg )
& ! & ! & ! & ! & ! & ! & ! & ! & nbsp else
& ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & nbsp Sortie // Rien pour rentrer, sortir
& ! & ! & ! & ! & ! & nbsp // Propriété des valeurs ne peuvent pas être retournés en conséquence, il doit avoir un conteneur, sauf si c'est un InPS sélection (ReturnListElementX)
& ! & ! & ! & ! & ! & nbsp si l'id.OwnsValue et
& ! & ! & ! & ! & ! & ! & ! & ! & nbsp (non Affecté( Conteneur )) et
& ! & ! & ! & ! & ! & ! & ! & ! & nbsp (pas ReturnListElementX) puis
& ! & ! & ! & ! & ! & ! & ! & ! & nbsp // Vous voudrez peut-être remplacer cette classe d'erreur avec quelque chose de plus précis pour le rendre plus facile à piéger
& ! & ! & ! & ! & ! & ! & ! & ! & nbsp raise Exception.CreateFmt( 'SelectBoldElement ne peut pas retourner de type sélectionné de %s', [id.De la valeur.ClassName] )
& ! & ! & ! & ! & ! & nbsp si l'id.La valeur est TBoldObject puis commencer
& ! & ! & ! & ! & ! & ! & ! & ! & nbsp // BoldObjects sont détenus par le système et ne peut revenir en arrière dans le résultat
& ! & ! & ! & ! & ! & ! & ! & ! & nbsp résultat := id.Valeur
& ! & ! & ! & ! & ! & nbsp fin else if id.La valeur est TBoldObjectReference puis commencer
& ! & ! & ! & ! & ! & ! & ! & ! & nbsp // SingleLinks détenir la propriété des objets qui remontent dans le résultat
& ! & ! & ! & ! & ! & ! & ! & ! & nbsp result := (id.Valeur TBoldObjectReference).BoldObject
& ! & ! & ! & ! & ! & nbsp fin else if (id.La valeur est TBoldList), puis commencer
& ! & ! & ! & ! & ! & ! & ! & ! & nbsp // Certaines listes sont la propriété et de pouvoir retourner dans le résultat
& ! & ! & ! & ! & ! & ! & ! & ! & nbsp si pas d'id.OwnsValue puis
& ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & nbsp résultat := id.Valeur
& ! & ! & ! & ! & ! & ! & ! & ! & nbsp // Un InPS sélection renvoie toujours une liste, si l'appelant voulait que le premier élément, ce sera définie
& ! & ! & ! & ! & ! & ! & ! & ! & nbsp si ReturnListElementX puis commencer
& ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & nbsp Assert( TBoldList(id.Valeur).Count > 0, 'la Logique de l'échec, SelectBoldElement' )
& ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & nbsp si l'Élément = cLastElement puis
& ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & nbsp résultat := TBoldList(id.Valeur)[TBoldList(id.Valeur).Count-1]
& ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & nbsp else
& ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & nbsp résultat := TBoldList(id.Valeur)[0] // Le cas de comptage à zéro était déjà pris en charge
& ! & ! & ! & ! & ! & ! & ! & ! & nbsp fin else
& ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & nbsp // Si l'utilisateur a passé un conteneur pour le résultat, mettre il y a
& ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & nbsp si (Conteneur est TBoldList)
& ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & nbsp TBoldList(Conteneur).AddList( TBoldList(id.Valeur) )
& ! & ! & ! & ! & ! & nbsp fin else if (id.La valeur est TBoldAttribute), puis commencer
& ! & ! & ! & ! & ! & ! & ! & ! & nbsp si Affecté( Conteneur ) et (Conteneur est TBoldAttribute)
& nbsp & nbsp nbsp & & ! & ! & ! & ! & ! & ! & ! & ! & nbsp // cela dépend de l'appelant pour obtenir les classes à droite, déclenche une exception si incorrect
& ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & nbsp TBoldAttribute( Conteneur ).Attribuer( id.Valeur )
& ! & ! & ! & ! & ! & ! & ! & ! & nbsp résultat := id.Valeur
& ! & ! & ! & ! & ! & nbsp fin
& nbsp & nbsp & nbsp enfin
& ! & ! & ! & ! & ! & nbsp id.Gratuit
& nbsp & nbsp & nbsp fin
fin
SelectBoldElement peut être utilisé directement, mais il est utile de créer des wrappers pour simplifier l'appel. Par exemple, si on a souvent besoin de récupérer les valeurs de nombre entier à partir d'un select simple, une fonction comme la suite allait être utile:
fonction de SelectInteger( sOCL: string valeur par Défaut:Integer=0 ): Integer
var
& nbsp & nbsp & nbsp unint : TBAInteger
begin
& nbsp & nbsp & nbsp unint := TBAInteger.Créer
& nbsp & nbsp & nbsp essayer
& ! & ! & ! & ! & ! & nbsp essayer
& ! & ! & ! & ! & ! & ! & ! & ! & nbsp SelectBoldElement( nil, sOCL, [], d'Exception ', unint )
& ! & ! & ! & ! & ! & ! & ! & ! & nbsp résultat := unint.AsInteger
& ! & ! & ! & ! & ! & nbsp à l'exception de
& ! & ! & ! & ! & ! & ! & ! & ! & nbsp résultat := par Défaut
& ! & ! & ! & ! & ! & nbsp fin
& nbsp & nbsp & nbsp enfin
& ! & ! & ! & ! & ! & nbsp unint.Gratuit
& nbsp & nbsp & nbsp fin
fin
// Cet exemple recherche d'un produit de base de données par UPC et PLU, en démontrant
// l'utilisation de l'EClass paramètre.
fonction de classe TProduct.GetProduct( PLU, UPC :string ):TProduct
const
& nbsp & nbsp & nbsp cPLUOCL = 'Produit.allInstances->select( plu ='%s')->d'abord '
& nbsp & nbsp & nbsp cUPCOCL = 'Produit.allInstances->select( upc ='%s')->d'abord '
begin
& nbsp & nbsp & nbsp // tenter de localiser par UPC premier
& nbsp & nbsp & nbsp résultat := SelectBoldElement( nil, cUPCOCL, [ UPC ],
& ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & nbsp néant, ') comme TProduct
& nbsp & nbsp & nbsp si non Affecté( suite ) puis
& ! & ! & ! & ! & ! & nbsp // vous N'avez pas trouvé l'UPC, essayez le PLU
& ! & ! & ! & ! & ! & nbsp résultat := SelectBoldElement( nil, cPLUOCL, [ PLU],
& ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & nbsp EProductNotFound, 'Produit non trouvé') comme TProduct
& ! & ! & ! & ! & ! & nbsp // Ce prévoit une exception de la classe, donc si le produit n'est toujours pas trouvé,
& ! & ! & ! & ! & ! & nbsp // le EProductNotFound d'erreur seront soulevées et traitées ailleurs
fin
// Cette stupide méthode de gestion des autorisations démontre sélection à l'aide de
// une racine autre que le système.
fonction de TEmployee.GetPermissions( Catégorie: string ): TPermissionList
const
& nbsp & nbsp & nbsp cOCL = 'permissions->select( catégorie = '%s' )'
begin
& nbsp & nbsp & nbsp SelectBoldElement( auto, cOCL, [Catégorie], nil, ', result )
fin
Routine generique pour selectionner les elements en gras
Routine generique pour selectionner les elements en gras : Plusieurs milliers de conseils pour vous faciliter la vie.
Le SelectBoldElement fonction fournit une reutilisables et flexible pour selectionner des objets ou des listes.
fonction de SelectBoldElement( Racine: TBoldElement sOCL: string Params: tableau de const
& ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & nbsp EClass: ExceptClass ErrMsg: string
& ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & nbsp Conteneur:TBoldElement=nil
& ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & nbsp InPS: Boolean = False
& ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & nbsp Vars: TBoldExternalVariableList = nil ): TBoldElement
const
& nbsp & nbsp & nbsp cLastElement = $FFFF
var
& nbsp & nbsp & nbsp ocl : string
& nbsp & nbsp & nbsp id : TBoldIndirectElement
& nbsp & nbsp & nbsp ReturnListElementX : Boolean
& nbsp & nbsp & nbsp Element : Integer
begin
& nbsp & nbsp & nbsp resultat := nil
& nbsp & nbsp & nbsp Element := 0
& nbsp & nbsp & nbsp ReturnListElementX := False
& nbsp & nbsp & nbsp si Racine = nil then
& ! & ! & ! & ! & ! & nbsp Racine := TBoldSystem.DefaultSystem
& nbsp & nbsp & nbsp Assert( pas (Conteneur est TBoldObject), 'SelectBoldElement ne peut pas retourner BoldObjects dans le conteneur' )
& nbsp & nbsp & nbsp Assert( Attribue( de la Racine ), 'Tentative de Selectionner sans un systeme ouvert' )
& nbsp & nbsp & nbsp id := TBoldIndirectElement.Creer
& nbsp & nbsp & nbsp essayer
& ! & ! & ! & ! & ! & nbsp ocl := Format( sOCL, Params )
& ! & ! & ! & ! & ! & nbsp // Ce code permet a cette routine pour selectionner, en toute transparence une 'premiere' ou de la 'derniere' de l'objet dans le PS
& ! & ! & ! & ! & ! & nbsp si (en Majuscules(Copie( ocl, Longueur(ocl)-6, 8)) = '->d'ABORD') et (InPS), puis commencer
& ! & ! & ! & ! & ! & ! & ! & ! & nbsp SetLength( ocl, Longueur(ocl)-7)
& ! & ! & ! & ! & ! & ! & ! & ! & nbsp ReturnListElementX := true
& ! & ! & ! & ! & ! & nbsp fin
& ! & ! & ! & ! & ! & nbsp si (en Majuscules(Copie( ocl, Longueur(ocl)-5, 8)) = '->LAST') et (InPS), puis commencer
& ! & ! & ! & ! & ! & ! & ! & ! & nbsp SetLength( ocl, Longueur(ocl)-6)
& ! & ! & ! & ! & ! & ! & ! & ! & nbsp ReturnListElementX := true
& ! & ! & ! & ! & ! & ! & ! & ! & nbsp Element := cLastElement
& ! & ! & ! & ! & ! & nbsp fin
& ! & ! & ! & ! & ! & nbsp Racine.EvaluateExpression( ocl, id, InPS, Vars )
& ! & ! & ! & ! & ! & nbsp // si rien n'a ete selectionne, sortir, soit en augmentant fourni par l'utilisateur de l'erreur, ou tranquillement
& ! & ! & ! & ! & ! & nbsp si (non Affecte( id.Valeur )) ou
& ! & ! & ! & ! & ! & ! & ! & ! & nbsp ((id.La valeur est TBoldList) et (TBoldList(id.Valeur).Count = 0)) then
& ! & ! & ! & ! & ! & ! & ! & ! & nbsp si Affecte(Ecl)
& ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & nbsp elever EClass.Creer( ErrMsg )
& ! & ! & ! & ! & ! & ! & ! & ! & nbsp else
& ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & nbsp Sortie // Rien pour rentrer, sortir
& ! & ! & ! & ! & ! & nbsp // Propriete des valeurs ne peuvent pas etre retournes en consequence, il doit avoir un conteneur, sauf si c'est un InPS selection (ReturnListElementX)
& ! & ! & ! & ! & ! & nbsp si l'id.OwnsValue et
& ! & ! & ! & ! & ! & ! & ! & ! & nbsp (non Affecte( Conteneur )) et
& ! & ! & ! & ! & ! & ! & ! & ! & nbsp (pas ReturnListElementX) puis
& ! & ! & ! & ! & ! & ! & ! & ! & nbsp // Vous voudrez peut-etre remplacer cette classe d'erreur avec quelque chose de plus precis pour le rendre plus facile a pieger
& ! & ! & ! & ! & ! & ! & ! & ! & nbsp raise Exception.CreateFmt( 'SelectBoldElement ne peut pas retourner de type selectionne de %s', [id.De la valeur.ClassName] )
& ! & ! & ! & ! & ! & nbsp si l'id.La valeur est TBoldObject puis commencer
& ! & ! & ! & ! & ! & ! & ! & ! & nbsp // BoldObjects sont detenus par le systeme et ne peut revenir en arriere dans le resultat
& ! & ! & ! & ! & ! & ! & ! & ! & nbsp resultat := id.Valeur
& ! & ! & ! & ! & ! & nbsp fin else if id.La valeur est TBoldObjectReference puis commencer
& ! & ! & ! & ! & ! & ! & ! & ! & nbsp // SingleLinks detenir la propriete des objets qui remontent dans le resultat
& ! & ! & ! & ! & ! & ! & ! & ! & nbsp result := (id.Valeur TBoldObjectReference).BoldObject
& ! & ! & ! & ! & ! & nbsp fin else if (id.La valeur est TBoldList), puis commencer
& ! & ! & ! & ! & ! & ! & ! & ! & nbsp // Certaines listes sont la propriete et de pouvoir retourner dans le resultat
& ! & ! & ! & ! & ! & ! & ! & ! & nbsp si pas d'id.OwnsValue puis
& ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & nbsp resultat := id.Valeur
& ! & ! & ! & ! & ! & ! & ! & ! & nbsp // Un InPS selection renvoie toujours une liste, si l'appelant voulait que le premier element, ce sera definie
& ! & ! & ! & ! & ! & ! & ! & ! & nbsp si ReturnListElementX puis commencer
& ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & nbsp Assert( TBoldList(id.Valeur).Count > 0, 'la Logique de l'echec, SelectBoldElement' )
& ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & nbsp si l'Element = cLastElement puis
& ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & nbsp resultat := TBoldList(id.Valeur)[TBoldList(id.Valeur).Count-1]
& ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & nbsp else
& ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & nbsp resultat := TBoldList(id.Valeur)[0] // Le cas de comptage a zero etait deja pris en charge
& ! & ! & ! & ! & ! & ! & ! & ! & nbsp fin else
& ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & nbsp // Si l'utilisateur a passe un conteneur pour le resultat, mettre il y a
& ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & nbsp si (Conteneur est TBoldList)
& ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & nbsp TBoldList(Conteneur).AddList( TBoldList(id.Valeur) )
& ! & ! & ! & ! & ! & nbsp fin else if (id.La valeur est TBoldAttribute), puis commencer
& ! & ! & ! & ! & ! & ! & ! & ! & nbsp si Affecte( Conteneur ) et (Conteneur est TBoldAttribute)
& nbsp & nbsp nbsp & & ! & ! & ! & ! & ! & ! & ! & ! & nbsp // cela depend de l'appelant pour obtenir les classes a droite, declenche une exception si incorrect
& ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & nbsp TBoldAttribute( Conteneur ).Attribuer( id.Valeur )
& ! & ! & ! & ! & ! & ! & ! & ! & nbsp resultat := id.Valeur
& ! & ! & ! & ! & ! & nbsp fin
& nbsp & nbsp & nbsp enfin
& ! & ! & ! & ! & ! & nbsp id.Gratuit
& nbsp & nbsp & nbsp fin
fin
SelectBoldElement peut etre utilise directement, mais il est utile de creer des wrappers pour simplifier l'appel. Par exemple, si on a souvent besoin de recuperer les valeurs de nombre entier a partir d'un select simple, une fonction comme la suite allait etre utile:
fonction de SelectInteger( sOCL: string valeur par Defaut:Integer=0 ): Integer
var
& nbsp & nbsp & nbsp unint : TBAInteger
begin
& nbsp & nbsp & nbsp unint := TBAInteger.Creer
& nbsp & nbsp & nbsp essayer
& ! & ! & ! & ! & ! & nbsp essayer
& ! & ! & ! & ! & ! & ! & ! & ! & nbsp SelectBoldElement( nil, sOCL, [], d'Exception ', unint )
& ! & ! & ! & ! & ! & ! & ! & ! & nbsp resultat := unint.AsInteger
& ! & ! & ! & ! & ! & nbsp a l'exception de
& ! & ! & ! & ! & ! & ! & ! & ! & nbsp resultat := par Defaut
& ! & ! & ! & ! & ! & nbsp fin
& nbsp & nbsp & nbsp enfin
& ! & ! & ! & ! & ! & nbsp unint.Gratuit
& nbsp & nbsp & nbsp fin
fin
// Cet exemple recherche d'un produit de base de donnees par UPC et PLU, en demontrant
// l'utilisation de l'EClass parametre.
fonction de classe TProduct.GetProduct( PLU, UPC :string ):TProduct
const
& nbsp & nbsp & nbsp cPLUOCL = 'Produit.allInstances->select( plu ='%s')->d'abord '
& nbsp & nbsp & nbsp cUPCOCL = 'Produit.allInstances->select( upc ='%s')->d'abord '
begin
& nbsp & nbsp & nbsp // tenter de localiser par UPC premier
& nbsp & nbsp & nbsp resultat := SelectBoldElement( nil, cUPCOCL, [ UPC ],
& ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & nbsp neant, ') comme TProduct
& nbsp & nbsp & nbsp si non Affecte( suite ) puis
& ! & ! & ! & ! & ! & nbsp // vous N'avez pas trouve l'UPC, essayez le PLU
& ! & ! & ! & ! & ! & nbsp resultat := SelectBoldElement( nil, cPLUOCL, [ PLU],
& ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & nbsp EProductNotFound, 'Produit non trouve') comme TProduct
& ! & ! & ! & ! & ! & nbsp // Ce prevoit une exception de la classe, donc si le produit n'est toujours pas trouve,
& ! & ! & ! & ! & ! & nbsp // le EProductNotFound d'erreur seront soulevees et traitees ailleurs
fin
// Cette stupide methode de gestion des autorisations demontre selection a l'aide de
// une racine autre que le systeme.
fonction de TEmployee.GetPermissions( Categorie: string ): TPermissionList
const
& nbsp & nbsp & nbsp cOCL = 'permissions->select( categorie = '%s' )'
begin
& nbsp & nbsp & nbsp SelectBoldElement( auto, cOCL, [Categorie], nil, ', result )
fin
Routine générique pour sélectionner les éléments en gras
By commentfaire
Routine générique pour sélectionner les éléments en gras : Plusieurs milliers de conseils pour vous faciliter la vie.