Rutina genérica para seleccionar elementos en negrita
El SelectBoldElement función proporciona un reutilizable y flexible para seleccionar objetos o listas.
función SelectBoldElement( Raíz: TBoldElement sOCL: string Params: matriz de const
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp EClass: ExceptClass Error: cadena
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp Contenedor:TBoldElement=nil
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp Inp: Boolean = False
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & 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 Elemento : Integer
begin
& nbsp & nbsp & nbsp resultado := nil
& nbsp & nbsp & nbsp Elemento := 0
& nbsp & nbsp & nbsp ReturnListElementX := False
& nbsp & nbsp & nbsp si Root = nil then
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp Raíz := TBoldSystem.DefaultSystem
& nbsp & nbsp & nbsp Assert( no (Contenedor es TBoldObject), 'SelectBoldElement no puede devolver BoldObjects en el contenedor parámetro' )
& nbsp & nbsp & nbsp Assert( Asignado( Raíz ), Intento Seleccionar sin un sistema abierto' )
& nbsp & nbsp & nbsp id := TBoldIndirectElement.Crear
& nbsp & nbsp & nbsp probar
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp ocl := Format( sOCL, Params )
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp // Este código permite a esta rutina para seleccionar, de forma transparente un 'primera' o 'último' objeto en el PS
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp si (en Mayúsculas(Copia( ocl, Longitud(ocl)-6, 8)) = '->PRIMER') y (Inp), a continuación, empezar
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp SetLength( ocl, Longitud(ocl)-7)
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp ReturnListElementX := true
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp final
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp si (en Mayúsculas(Copia( ocl, Longitud(ocl)-5, 8)) = '->ÚLTIMA') y (Inp), a continuación, empezar
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp SetLength( ocl, Longitud(ocl)-6)
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp ReturnListElementX := true
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp Elemento := cLastElement
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp final
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp Raíz.EvaluateExpression( ocl, id, Inp, Vars )
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp // si no se ha seleccionado, salir, ya sea levantando el suministrado por el usuario de error, o en silencio
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp si (no Asignado( id.Valor )) o
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp ((id.Valor es TBoldList) y (TBoldList(id.Valor).Count = 0)) then
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp si se ha Asignado(EClass), a continuación,
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp elevar EClass.Crear( Error )
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp else
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp Salida // Nada para volver, salir
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp // Propiedad de los valores no pueden ser devueltos en el resultado, por lo que debe tener un recipiente, a menos de que este es un InPS selección (ReturnListElementX)
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp si id.OwnsValue y
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp (no Asignado( Contenedor )) y
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp (no ReturnListElementX) a continuación,
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp // es posible Que desee reemplazar esta clase de error con algo más específico para hacer más fácil la trampa
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp elevar la Excepción.CreateFmt( 'SelectBoldElement no se puede devolver el tipo seleccionado de %s', [id.Valor.ClassName] )
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp si id.Valor es TBoldObject, a continuación, empezar
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp // BoldObjects son poseídos por el sistema y sólo se puede ir hacia atrás en el resultado
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp resultado := id.Valor
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp end else if id.Valor es TBoldObjectReference, a continuación, empezar
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp // SingleLinks mantener propiedad de los objetos que se remontan en el resultado
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp resultado := (id.Valor como TBoldObjectReference).BoldObject
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp end else if (id.Valor es TBoldList), a continuación, empezar
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp // Algunas listas son propiedad y puede ir hacia atrás en el resultado
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp si no id.OwnsValue, a continuación,
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp resultado := id.Valor
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp // InPS selección siempre devuelve una lista, si la persona que quería que el primer elemento, esto se establecerá
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp si ReturnListElementX, a continuación, empezar
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp Assert( TBoldList(id.Valor).Count > 0, 'la Lógica falla, SelectBoldElement' )
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & si nbsp Elemento = cLastElement, a continuación,
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp resultado := TBoldList(id.Valor)[TBoldList(id.Valor).Count-1]
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp else
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp resultado := TBoldList(id.Valor)[0] // El caso de contador cero ya que estaba tomado el cuidado de
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp end else
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp // Si el usuario ha pasado de un contenedor para el resultado, puesto que no
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp si (Contenedor es TBoldList), a continuación,
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp TBoldList(Contenedor).AddList( TBoldList(id.Valor) )
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp end else if (id.Valor es TBoldAttribute), a continuación, empezar
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp si se ha Asignado( Contenedor ) y (Contenedor es TBoldAttribute), a continuación,
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp // esto depende de la persona que llama para obtener las clases de derecho, provocará una excepción si incorrecta
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp TBoldAttribute( Contenedor ).Asignar( id.Valor )
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp resultado := id.Valor
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp final
& nbsp & nbsp & nbsp finalmente
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp id.Libre
& nbsp & nbsp & nbsp final
fin
SelectBoldElement puede ser utilizado directamente, pero es útil para crear contenedores para simplificar las llamadas. Por ejemplo, si a menudo se necesita para recuperar los valores enteros desde un simple select, una función como la siguiente podría ser útil:
función SelectInteger( sOCL: string Predeterminado:Integer=0 ): Integer
var
& nbsp & nbsp & nbsp anInt : TBAInteger
begin
& nbsp & nbsp & nbsp anInt := TBAInteger.Crear
& nbsp & nbsp & nbsp probar
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp probar
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp SelectBoldElement( nil, sOCL, [], Excepción ', anInt )
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp resultado := anInt.AsInteger
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp excepto
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp resultado := valor Predeterminado
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp final
& nbsp & nbsp & nbsp finalmente
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp anInt.Libre
& nbsp & nbsp & nbsp final
fin
// Este ejemplo busca en una base de datos del producto por la UPC y la PLU, demostrando
// el uso de la EClass parámetro.
función de la clase TProduct.GetProduct( PLU, UPC :string ):TProduct
const
& nbsp & nbsp & nbsp cPLUOCL = ' Producto.allInstances->select( plu ='%s')->primer
& nbsp & nbsp & nbsp cUPCOCL = ' Producto.allInstances->select( upc ='%s')->primer
begin
& nbsp & nbsp & nbsp // intento de localizar por la UPC primera
& nbsp & nbsp & nbsp resultado := SelectBoldElement( nil, cUPCOCL, [ UPC ],
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp nil ') como TProduct
& nbsp & nbsp & nbsp si no Asignado( el resultado ) a continuación,
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp // no encontrar la UPC, pruebe el PLU
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp resultado := SelectBoldElement( nil, cPLUOCL, [ PLU],
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp EProductNotFound, 'Producto no encontrado') como TProduct
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp // Esto incluye una clase de excepción, por lo que si el producto todavía no se encuentra,
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp // el EProductNotFound error se levantó y se controla en otro lugar
fin
// Este tonto método de manejo de permisos de muestra selección con
// una raíz distinta de la del sistema.
función TEmployee.GetPermissions( Categoría: string ): TPermissionList
const
& nbsp & nbsp & nbsp cOCL = 'permisos->select( categoría = '%s' )'
begin
& nbsp & nbsp & nbsp SelectBoldElement( self, cOCL, [Categoría], nil, ', resultado )
fin
Rutina generica para seleccionar elementos en negrita
Rutina generica para seleccionar elementos en negrita : Multi-millones de consejos para hacer su vida mas facil.
El SelectBoldElement funcion proporciona un reutilizable y flexible para seleccionar objetos o listas.
funcion SelectBoldElement( Raiz: TBoldElement sOCL: string Params: matriz de const
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp EClass: ExceptClass Error: cadena
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp Contenedor:TBoldElement=nil
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp Inp: Boolean = False
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & 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 Elemento : Integer
begin
& nbsp & nbsp & nbsp resultado := nil
& nbsp & nbsp & nbsp Elemento := 0
& nbsp & nbsp & nbsp ReturnListElementX := False
& nbsp & nbsp & nbsp si Root = nil then
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp Raiz := TBoldSystem.DefaultSystem
& nbsp & nbsp & nbsp Assert( no (Contenedor es TBoldObject), 'SelectBoldElement no puede devolver BoldObjects en el contenedor parametro' )
& nbsp & nbsp & nbsp Assert( Asignado( Raiz ), Intento Seleccionar sin un sistema abierto' )
& nbsp & nbsp & nbsp id := TBoldIndirectElement.Crear
& nbsp & nbsp & nbsp probar
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp ocl := Format( sOCL, Params )
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp // Este codigo permite a esta rutina para seleccionar, de forma transparente un 'primera' o 'ultimo' objeto en el PS
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp si (en Mayusculas(Copia( ocl, Longitud(ocl)-6, 8)) = '->PRIMER') y (Inp), a continuacion, empezar
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp SetLength( ocl, Longitud(ocl)-7)
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp ReturnListElementX := true
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp final
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp si (en Mayusculas(Copia( ocl, Longitud(ocl)-5, 8)) = '->ULTIMA') y (Inp), a continuacion, empezar
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp SetLength( ocl, Longitud(ocl)-6)
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp ReturnListElementX := true
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp Elemento := cLastElement
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp final
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp Raiz.EvaluateExpression( ocl, id, Inp, Vars )
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp // si no se ha seleccionado, salir, ya sea levantando el suministrado por el usuario de error, o en silencio
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp si (no Asignado( id.Valor )) o
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp ((id.Valor es TBoldList) y (TBoldList(id.Valor).Count = 0)) then
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp si se ha Asignado(EClass), a continuacion,
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp elevar EClass.Crear( Error )
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp else
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp Salida // Nada para volver, salir
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp // Propiedad de los valores no pueden ser devueltos en el resultado, por lo que debe tener un recipiente, a menos de que este es un InPS seleccion (ReturnListElementX)
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp si id.OwnsValue y
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp (no Asignado( Contenedor )) y
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp (no ReturnListElementX) a continuacion,
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp // es posible Que desee reemplazar esta clase de error con algo mas especifico para hacer mas facil la trampa
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp elevar la Excepcion.CreateFmt( 'SelectBoldElement no se puede devolver el tipo seleccionado de %s', [id.Valor.ClassName] )
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp si id.Valor es TBoldObject, a continuacion, empezar
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp // BoldObjects son poseidos por el sistema y solo se puede ir hacia atras en el resultado
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp resultado := id.Valor
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp end else if id.Valor es TBoldObjectReference, a continuacion, empezar
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp // SingleLinks mantener propiedad de los objetos que se remontan en el resultado
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp resultado := (id.Valor como TBoldObjectReference).BoldObject
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp end else if (id.Valor es TBoldList), a continuacion, empezar
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp // Algunas listas son propiedad y puede ir hacia atras en el resultado
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp si no id.OwnsValue, a continuacion,
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp resultado := id.Valor
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp // InPS seleccion siempre devuelve una lista, si la persona que queria que el primer elemento, esto se establecera
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp si ReturnListElementX, a continuacion, empezar
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp Assert( TBoldList(id.Valor).Count > 0, 'la Logica falla, SelectBoldElement' )
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & si nbsp Elemento = cLastElement, a continuacion,
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp resultado := TBoldList(id.Valor)[TBoldList(id.Valor).Count-1]
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp else
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp resultado := TBoldList(id.Valor)[0] // El caso de contador cero ya que estaba tomado el cuidado de
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp end else
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp // Si el usuario ha pasado de un contenedor para el resultado, puesto que no
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp si (Contenedor es TBoldList), a continuacion,
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp TBoldList(Contenedor).AddList( TBoldList(id.Valor) )
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp end else if (id.Valor es TBoldAttribute), a continuacion, empezar
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp si se ha Asignado( Contenedor ) y (Contenedor es TBoldAttribute), a continuacion,
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp // esto depende de la persona que llama para obtener las clases de derecho, provocara una excepcion si incorrecta
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp TBoldAttribute( Contenedor ).Asignar( id.Valor )
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp resultado := id.Valor
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp final
& nbsp & nbsp & nbsp finalmente
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp id.Libre
& nbsp & nbsp & nbsp final
fin
SelectBoldElement puede ser utilizado directamente, pero es util para crear contenedores para simplificar las llamadas. Por ejemplo, si a menudo se necesita para recuperar los valores enteros desde un simple select, una funcion como la siguiente podria ser util:
funcion SelectInteger( sOCL: string Predeterminado:Integer=0 ): Integer
var
& nbsp & nbsp & nbsp anInt : TBAInteger
begin
& nbsp & nbsp & nbsp anInt := TBAInteger.Crear
& nbsp & nbsp & nbsp probar
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp probar
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp SelectBoldElement( nil, sOCL, [], Excepcion ', anInt )
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp resultado := anInt.AsInteger
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp excepto
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp resultado := valor Predeterminado
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp final
& nbsp & nbsp & nbsp finalmente
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp anInt.Libre
& nbsp & nbsp & nbsp final
fin
// Este ejemplo busca en una base de datos del producto por la UPC y la PLU, demostrando
// el uso de la EClass parametro.
funcion de la clase TProduct.GetProduct( PLU, UPC :string ):TProduct
const
& nbsp & nbsp & nbsp cPLUOCL = ' Producto.allInstances->select( plu ='%s')->primer
& nbsp & nbsp & nbsp cUPCOCL = ' Producto.allInstances->select( upc ='%s')->primer
begin
& nbsp & nbsp & nbsp // intento de localizar por la UPC primera
& nbsp & nbsp & nbsp resultado := SelectBoldElement( nil, cUPCOCL, [ UPC ],
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp nil ') como TProduct
& nbsp & nbsp & nbsp si no Asignado( el resultado ) a continuacion,
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp // no encontrar la UPC, pruebe el PLU
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp resultado := SelectBoldElement( nil, cPLUOCL, [ PLU],
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp EProductNotFound, 'Producto no encontrado') como TProduct
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp // Esto incluye una clase de excepcion, por lo que si el producto todavia no se encuentra,
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp // el EProductNotFound error se levanto y se controla en otro lugar
fin
// Este tonto metodo de manejo de permisos de muestra seleccion con
// una raiz distinta de la del sistema.
funcion TEmployee.GetPermissions( Categoria: string ): TPermissionList
const
& nbsp & nbsp & nbsp cOCL = 'permisos->select( categoria = '%s' )'
begin
& nbsp & nbsp & nbsp SelectBoldElement( self, cOCL, [Categoria], nil, ', resultado )
fin
Rutina genérica para seleccionar elementos en negrita
By Consejos Y Trucos
Rutina genérica para seleccionar elementos en negrita : Multi-millones de consejos para hacer su vida más fácil.