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 { ¡¡¡¡¡ATENCIÓN!!! ¡¡¡¡¡¡¡¡MOVIDA MENTAL!!!!!!! En el caso de la tabla contactos hay definida en el esquema una clá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és falla todo por que trata de rellenar el parámetro :CATEGORIA que ya no existe en el where por que lo ha pisado con el where del cliente. SOLUCIÓN: si el cliente manda alguna clá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á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 // ¿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í se asegura que el usuario só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í se asegura que el usuario só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.