Article: AN0001766Updated: 31.07.2018
ObjectGears system can be easily extended also on the database level. This extension is supported by several stored procedures and functions.
Name |
Description |
Get_AuthenticateUsersRoleCode |
Function returns constant with code of the role for all the authenticated users. |
Get_ReportRoleCode |
Function returns constant with code of the role for reports. |
Get_AllUsersRoleCode |
Function returns constant with code of the role for all users. |
Get_NoAuthenticateUsersRoleCode |
FunkcFunction returns constant with code of the role for all unauthenticated users. |
FindClassDef(@modelCode varchar(100), @classDefCode varchar(100)) |
Function returns ID of a class according to the model code and class code. |
FindColumnDbName( @classDefId int, @columnCode varchar(100)) |
Function returns database name of the column according to the defined class ID and column code.. |
FindColumnId(@classDefId int, @columnCode varchar(100)) |
Function returns column id according to the input class ID and column code. |
Use the functions Get_...RoleCode instead of hardcoding of the name in your code to avoid future compatibility issues.
Use of function for mapping role ID (role ID can be different in each ObjectGears instance).
select r.id, r.code
from [role] r
where r.Code = dbo.Get_AuthenticateUsersRoleCode()
select r.id, r.code
from [role] r
where r.Code = dbo.Get_ReportRoleCode()
Functions FindClassDef and FindColumnDbName are used to get class ID and database name of columns. These names are necessary for dynamic creating SQL on the database level in order it can be portable to other instances.
ALTER PROCEDURE [dbo].[AddStatistics]
AS
BEGIN
SET NOCOUNT ON;
declare @m_code varchar(100)
set @m_code = 'systemutil'
Declare @date varchar(200)
select @date = 'DateAdd(day, ' + cast( datepart( day, getdate()) as varchar(10)) + ' - 1, DateAdd(month, ' + cast( datepart( month, getdate()) as varchar(10)) + ' - 1, DateAdd(Year, ' + cast( datepart( year, getdate()) as varchar(10)) + ' - 1900, DateAdd(Hour, ' + cast( datepart( hour, getdate()) as varchar(10)) + ', DateAdd(Minute, ' + cast( datepart( minute, getdate()) as varchar(10)) + ', 0)))))'
declare @clName varchar(50)
declare @col_rowsName varchar(50)
declare @col_total_space varchar(50)
declare @col_total_used varchar(50)
declare @sql varchar(max)
declare @cl_id int
--nacist cl
set @cl_id = dbo.FindClassDef( @m_code, 'stat_system')
set @col_rowsName = dbo.FindColumnDbName( @cl_id, 'rows')
set @col_total_space = dbo.FindColumnDbName( @cl_id, 'total_space_kb')
set @col_total_used = dbo.FindColumnDbName( @cl_id, 'total_used_space_kb')
set @clName = 'DataRow' + cast( @cl_id as varchar(10))
--spocitat pocet zaznamu
set @sql = 'insert into ' + @clName + '(created, CreatedDataSourceId, Creator, ShortDescription, ' + @col_rowsName + ', ' + @col_total_space + ', ' + @col_total_used + ')
select ' + @date + ', 4, ''SYSTEM'', t.name, p.rows, SUM(a.total_pages) * 8 AS TotalSpaceKB, SUM(a.used_pages) * 8 AS UsedSpaceKB
from sys.tables t
INNER JOIN sys.indexes i ON t.OBJECT_ID = i.object_id
INNER JOIN sys.partitions p ON i.object_id = p.OBJECT_ID AND i.index_id = p.index_id
INNER JOIN sys.allocation_units a ON p.partition_id = a.container_id
LEFT OUTER JOIN sys.schemas s ON t.schema_id = s.schema_id
where t.type_desc = ''USER_TABLE''
and t.name not in ( ''appversion'')
and t.name not like ''datarow%''
and t.name not like ''aspnet_%''
and (t.name not like ''wp%'' or t.name = ''wpbase'')
and s.Name = ''dbo''
GROUP BY t.Name, s.Name, p.Rows'
exec ( @sql)
END
You can create a View or a Stored procedure also in case when finding information by means of ObjectGears scripts would be labour intensive, demanding on computing or lead to a forced use of the functionality. You can build ObjectGears Query over the View or Stored procedure and then filter, sort and use the query where you need.