El SelectBoldElement proporciona una función reutilizables y flexible para seleccionar objetos o listas.

función SelectBoldElement (Raíz: TBoldElement; sOCL: string; Params: array de const;
EClass: ExceptClass; errmsg: string;
Contenedor: TBoldElement = nil;
INPS: Boolean = False;
Vars: TBoldExternalVariableList = nil): TBoldElement;
const
cLastElement = $ FFFF;
var
OCL: string;
id: TBoldIndirectElement;
ReturnListElementX: Boolean;
Elemento: Integer;
empezar
resultado: = nil;
Elemento: = 0;
ReturnListElementX: = False;

si raíz = nil entonces
Raíz: = TBoldSystem.DefaultSystem;

Afirmar (no (es TBoldObject de contenedores), «SelectBoldElement no pueden regresar BoldObjects contenedor en el parámetro ');
Afirmar (Asignación (raíz), "Intento seleccionar sin un sistema abierto ');

id: = TBoldIndirectElement.Create;
intentar

OCL: = Formato (sOCL, Params);

/ / Este código permite a esta rutina para seleccionar una forma transparente "primera" o "último" objeto en el PS
si (en mayúsculas (Copy (OCL, Longitud (OCL) -6, 8)) = '-> PRIMERA') y (INPS) then begin
SetLength (OCL, Longitud (OCL) -7);
ReturnListElementX: = true;
final;
si (en mayúsculas (Copy (OCL, Longitud (OCL) -5, 8)) = '-> Última') y (INPS) then begin
SetLength (OCL, Longitud (OCL) -6);
ReturnListElementX: = true;
Elemento: = cLastElement;
final;

Root.EvaluateExpression (OCL, id, INPS, Vars);

/ / Si no fue seleccionado, salir, ya sea mediante el aumento de los proporcionados por el usuario error, o en silencio
if (no asignado (id.Value)) o
((id.Value es TBoldList) y (TBoldList (id.Value). Count = 0)) entonces
si se ha asignado (eClass) y luego
aumentar EClass.Create (errmsg)
algo más
Salir / / Nada de lo dispuesto para volver, salir

/ / Valores de propiedad no pueden ser devueltos en el resultado, por lo que debe tener un contenedor, a menos que sea una selección INPS (ReturnListElementX)
y si id.OwnsValue
(que no se haya asignado (de contenedores)) y
(no ReturnListElementX) y luego
/ / Si lo desea, puede sustituir esta clase de error con algo más específico para facilitar la trampa
aumentar Exception.CreateFmt ( 'SelectBoldElement no pueden regresar seleccionado el tipo de% s', [id.Value.ClassName]);

id.Value si es TBoldObject then begin
/ / BoldObjects son propiedad por el sistema y sólo pueden volver en el resultado
resultado: = id.Value;
end else id.Value si es TBoldObjectReference then begin
/ / SingleLinks celebrar propiedad de los objetos que se remontan en el resultado
resultado: = (id.Value como TBoldObjectReference). BoldObject;
end else if (id.Value es TBoldList) then begin
/ / Algunas listas son propiedad y puede volver en el resultado
si no entonces id.OwnsValue
resultado: = id.Value;

/ / INPS Una selección siempre devuelve una lista, la persona que llama si quería que el primer elemento, esto se
si ReturnListElementX then begin
Afirmar (TBoldList (id.Value). Conde> 0, 'Lógica fracaso, SelectBoldElement');
Elemento = si entonces cLastElement
resultado: = TBoldList (id.Value) [TBoldList (id.Value). conde-1]
algo más
resultado: = TBoldList (id.Value) [0] / / El caso de cero ya fue tomado el cuidado de
end else
/ / Si el usuario ha superado un contenedor para el resultado, puesto que existe
if (contenedores es TBoldList) y luego
TBoldList (contenedores). AddList (TBoldList (id.Value));
end else if (id.Value es TBoldAttribute) then begin
si se ha asignado (contenedores) y (contenedores es TBoldAttribute) y luego
/ / Esto depende de la persona que llama para obtener el derecho de clases, planteará una excepción si incorrecta
TBoldAttribute (contenedores). Asignar (id.Value);

resultado: = id.Value;
final;
finalmente
id.Free;
final;
final;

SelectBoldElement puede ser utilizado directamente, pero es útil para crear envoltorios para simplificar llamándolo. Por ejemplo, si uno suele ser necesario para recuperar los valores desde una simple seleccionar, una función como la siguiente podría ser útil:

función SelectInteger (sOCL: string; Default: Integer = 0): Integer;
var
anInt: TBAInteger;
empezar
anInt: = TBAInteger.Create;
intentar
intentar
SelectBoldElement (nil, sOCL, [], de excepción,'', anInt);
resultado: = anInt.AsInteger;
excepto
resultado: = por defecto;
final;
finalmente
anInt.Free;
final;
final;

/ / Este ejemplo busca un producto de base de datos por la UPC y PLU, lo que demuestra
/ / El uso del parámetro de eClass.
TProduct.GetProduct función de la clase (PLU, UPC: string;): TProduct;
const
cPLUOCL = 'Product.allInstances-> seleccionar (plu =''% s'')-> primer';
cUPCOCL = 'Product.allInstances-> seleccionar (UPC =''% s'')-> primer';
empezar
/ / Intento de localizar primero por la UPC
resultado: = SelectBoldElement (nil, cUPCOCL, [UPC],
nil,'') como TProduct;

si no asignados (resultado) y luego
/ / ¿No encuentras la UPC, pruebe con el PLU
resultado: = SelectBoldElement (nil, cPLUOCL, [PLU],
EProductNotFound, 'No encontrado') como TProduct;
/ / Esto incluye una clase de una excepción, de modo que si el producto todavía no se encuentra,
/ / EProductNotFound el error se incrementará en otros lugares y manipulados
final;



/ / Este método tonto de permisos demuestra la manipulación de selección utilizando
/ / Una raíz que no sea el sistema.
función TEmployee.GetPermissions (Categoría: string): TPermissionList;
const
CoCl = 'permisos-> seleccionar (categoría =''% s'');
empezar
SelectBoldElement (self, CoCl, [Categoría], nil,'', resultado);
final;

Average rating: