113 lines
3.4 KiB
ObjectPascal
113 lines
3.4 KiB
ObjectPascal
unit uRestriccionesUsuarioUtils;
|
||
|
||
interface
|
||
|
||
uses
|
||
uDAInterfaces, uROSessions;
|
||
|
||
{ 'FiltrarAccesoUsuario' sirve para filtrar un dataset a las empresas
|
||
que el usuario puede acceder }
|
||
procedure FiltrarAccesoUsuario (ASession: TROSession;
|
||
AConnection: IDAConnection; ASchema: IDASchema; ADataset: IDADataset;
|
||
const FieldNameID_EMPRESA : String = 'ID_EMPRESA');
|
||
|
||
procedure _FiltrarAccesoUsuario (ASession: TROSession;
|
||
AConnection: IDAConnection; ASchema: IDASchema; ADataset: IDADataset;
|
||
const FieldNameID_EMPRESA : String = 'ID_EMPRESA');
|
||
|
||
|
||
implementation
|
||
|
||
uses
|
||
Classes, SysUtils, uDatabaseUtils, uUsersManager, uDataModuleServer,
|
||
Dialogs;
|
||
|
||
|
||
procedure _FiltrarAccesoUsuario (ASession: TROSession;
|
||
AConnection: IDAConnection; ASchema: IDASchema; ADataset: IDADataset;
|
||
const FieldNameID_EMPRESA : String);
|
||
var
|
||
AUserInfo : TUserInfo;
|
||
WhereAnterior : String;
|
||
begin
|
||
|
||
{
|
||
<E38080>TENCI覰!!! MOVIDA MENTAL!!!!!!!
|
||
|
||
En el caso de la tabla contactos hay definida en el
|
||
esquema una cl醬sula where (p.e: where categoria = :categoria).
|
||
Si el cliente manda alguna clausula where, DA lo hace
|
||
mal y PISA la clausula where del esquema con el where
|
||
que le manda el cliente. Pero despu閟 falla todo por
|
||
que trata de rellenar el par醡etro :CATEGORIA que ya
|
||
no existe en el where por que lo ha pisado con el
|
||
where del cliente.
|
||
|
||
SOLUCI覰: si el cliente manda alguna cl醬sula where,
|
||
anteponer AND para unirla al where definido en el esquema.
|
||
}
|
||
|
||
{ Antes de filtrar ADataset, hay que saber si el cliente manda
|
||
alguna cl醬sula where en ADataset. Si hay where hay que
|
||
anteponer AND para unirla al where definido en el esquema. }
|
||
|
||
// Mirar si hay WHERE en el ADataSet que viene desde el cliente
|
||
if ADataSet.Where.NotEmpty then
|
||
begin
|
||
// Hay where en el dataset del cliente
|
||
|
||
// 縃ay WHERE en ese ADataSet definido en el esquema?
|
||
if HayClausulaWhere(ASchema.GetDatasetText(AConnection, ADataSet.Name)) then
|
||
begin
|
||
// Hay que juntar los dos WHERE en uno
|
||
WhereAnterior := ADataSet.Where.Clause;
|
||
ADataSet.Where.Clear;
|
||
ADataSet.Where.AddOperator(opAND);
|
||
ADataSet.Where.AddText(WhereAnterior);
|
||
end;
|
||
end;
|
||
|
||
{ Aqu<71> se asegura que el usuario s髄o accede a las filas
|
||
de las empresas a las que tiene permiso para acceder }
|
||
|
||
AUserInfo := TUserInfo.Create(ASession);
|
||
try
|
||
if not AUserInfo.EsAdministrador then
|
||
begin
|
||
if ADataSet.Where.NotEmpty then
|
||
ADataSet.Where.AddOperator(opAND);
|
||
ADataSet.Where.AddCondition(FieldNameID_EMPRESA,
|
||
cIn, '(' + AUserInfo.Empresas + ')');
|
||
end;
|
||
finally
|
||
FreeAndNil(AUserInfo);
|
||
end;
|
||
end;
|
||
|
||
procedure FiltrarAccesoUsuario (ASession: TROSession;
|
||
AConnection: IDAConnection; ASchema: IDASchema; ADataset: IDADataset;
|
||
const FieldNameID_EMPRESA : String);
|
||
var
|
||
AUserInfo : TUserInfo;
|
||
begin
|
||
{ Aqu<71> se asegura que el usuario s髄o accede a las filas
|
||
de las empresas a las que tiene permiso para acceder }
|
||
AUserInfo := TUserInfo.Create(ASession);
|
||
try
|
||
if not AUserInfo.EsAdministrador then
|
||
begin
|
||
with ADataSet.DynamicWhere do
|
||
Expression := NewBinaryExpression(NewField('', FieldNameID_EMPRESA),
|
||
NewConstant(AUserInfo.Empresas, datString), dboIn);
|
||
end;
|
||
finally
|
||
FreeAndNil(AUserInfo);
|
||
end;
|
||
end;
|
||
|
||
|
||
|
||
|
||
|
||
end.
|