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
|
|||
|
|
|
|||
|
|
{
|
|||
|
|
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ATENCI<EFBFBD>N!!! <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>MOVIDA MENTAL!!!!!!!
|
|||
|
|
|
|||
|
|
En el caso de la tabla contactos hay definida en el
|
|||
|
|
esquema una cl<EFBFBD>usula 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<EFBFBD>s falla todo por
|
|||
|
|
que trata de rellenar el par<EFBFBD>metro :CATEGORIA que ya
|
|||
|
|
no existe en el where por que lo ha pisado con el
|
|||
|
|
where del cliente.
|
|||
|
|
|
|||
|
|
SOLUCI<EFBFBD>N: si el cliente manda alguna cl<EFBFBD>usula where,
|
|||
|
|
anteponer AND para unirla al where definido en el esquema.
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
{ Antes de filtrar ADataset, hay que saber si el cliente manda
|
|||
|
|
alguna cl<EFBFBD>usula 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
|
|||
|
|
|
|||
|
|
// <20>Hay 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<EFBFBD> se asegura que el usuario s<EFBFBD>lo 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<EFBFBD> se asegura que el usuario s<EFBFBD>lo 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.
|