dbo.usp_GetUsageReport.sql 6.23 KB
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[usp_GetUsageReport]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
drop procedure [dbo].[usp_GetUsageReport]
GO

CREATE PROCEDURE [dbo].[usp_GetUsageReport] 
	-- Add the parameters for the stored procedure here
	-- FromDate & ToDate are mandatory parameters
	@sFromDate varchar(20), @sToDate varchar(20), @sAccoutNumber varchar(50)='',
	@sZip varchar(20) = '', @iState int, @iCountry int,
	@pageNo int, @pageLength int, @recordCount int out 
AS
BEGIN
	IF 1=0 BEGIN
		SET FMTONLY OFF
	END
	-- SET NOCOUNT ON added to prevent extra result sets from
	SET NOCOUNT ON
	DECLARE @cGetUserDetails CURSOR
	DECLARE @iUserId INT
	DECLARE @sAccountNumber VARCHAR(50)
	DECLARE @iCardNumber INT
	DECLARE @sLoginId VARCHAR(50)
	DECLARE @sFirstName VARCHAR(100)
	DECLARE @sLastName VARCHAR(100)
	DECLARE @sUserType VARCHAR(50)
	DECLARE @dtFromDate DATETIME
	DECLARE @dtToDate DATETIME
	DECLARE @dtLicenseCreationDate DATETIME
	DECLARE @sLicenseState VARCHAR(50)
	DECLARE @sLicenseZip VARCHAR(20)
	DECLARE @sLicenseCountry VARCHAR(50)
	DECLARE @sInstitutionName VARCHAR(100)
	DECLARE @iTotalLogins INT
	DECLARE @dtLastLogin DATETIME

		-- convert the datatype of fromdate & todate parameter to datetime
	SELECT @dtFromDate = CONVERT(DATETIME,@sFromDate)
	SELECT @dtToDate = DATEADD(ms,-3,DATEADD(DAY,1,CONVERT(DATETIME,@sToDate)))
	
	-- create a temporary table to store the results of users logged into the system within a particular time period
	CREATE TABLE #UsageReport
	(
		LoginId VARCHAR(50),
		FirstName VARCHAR(100),
		LastName VARCHAR(100),
		AccountNumber VARCHAR(50),
		CardNumber INT,
		UserType VARCHAR(50),
		LicenseCreationDate DATETIME,
		LicenseState VARCHAR(50),
		LicenseZip VARCHAR(20),
		LicenseCountry VARCHAR(50),
		InstitutionName VARCHAR(100),
		TotalLogins INT,
		LastLoginDate DATETIME
	)

	-- define the forward only, read-only cursor 
	SET @cGetUserDetails = CURSOR FAST_FORWARD 
	FOR 
		SELECT LoginDetail.UserId, COUNT(1) as TotalLogins, MAX(LoginDetail.LoginTime)
		FROM LoginDetail WHERE
		(LoginTime) BETWEEN @dtFromDate AND @dtToDate
		GROUP BY LoginDetail.UserId
		
	-- open & fetch the cursor variables into the local variables
	OPEN @cGetUserDetails 
		FETCH NEXT FROM @cGetUserDetails INTO @iUserId, @iTotalLogins, @dtLastLogin  
		-- start of while loop
		WHILE @@FETCH_STATUS = 0
		BEGIN
			-- fetch account number, state, zip, country of the license to which the user is belonged		
			SELECT @sAccountNumber = License.AccountNumber,
			@dtLicenseCreationDate = License.CreationDate,
			@sInstitutionName = License.InstitutionName,
			@sLicenseState =  State.StateName,
			@sLicenseZip = License.Zip, 
			@sLicenseCountry = Country.CountryName, 
			@iCardNumber = (CASE WHEN License.CardNumber > 0 THEN License.CardNumber END)
			FROM AIAUserToLicenseEdition
			INNER JOIN LicenseToEdition ON AIAUserToLicenseEdition.LicenseEditionId = LicenseToEdition.Id
			INNER JOIN License ON LicenseToEdition.LicenseId = License.Id
            INNER JOIN State ON License.StateId = State.Id
		    INNER JOIN Country ON License.CountryId = Country.Id
			WHERE AIAUserToLicenseEdition.UserId = @iUserId
			AND License.IsActive = 1
			AND License.AccountNumber = (CASE WHEN LEN(@sAccoutNumber)>0 THEN @sAccoutNumber ELSE License.AccountNumber END)
			AND State.Id = (CASE WHEN @iState > 0 THEN @iState ELSE State.Id END)
			AND Country.Id = (CASE WHEN @iCountry > 0 THEN @iCountry ELSE Country.Id END)
			AND License.Zip = (CASE WHEN LEN(@sZip)>0 THEN @sZip ELSE License.Zip END)	
			--AND License.LicenseTypeId <> 5 
			--AND License.Country = (CASE WHEN LEN(@sCountry)>0 THEN @sCountry ELSE License.Country END)
			
			-- check whether the above query returns any row
			IF @@Rowcount > 0
			BEGIN
				-- fetch loginid, firstname, lastname, usertype of the user
				SELECT @sLoginId = AIAUser.LoginId, @sFirstName = AIAUser.Firstname, 
				@sLastName = AIAUser.LastName, @sUserType = UserType.Title
				FROM AIAUser 
				INNER JOIN UserType ON AIAUser.UserTypeId = UserType.Id
				WHERE AIAUser.Id = @iUserId
				AND AIAUser.IsActive = 1
				
				IF @@Rowcount > 0
				BEGIN
				-- insert into the temporary table
				INSERT INTO #UsageReport 
				(LoginId, FirstName, LastName, AccountNumber,CardNumber ,UserType,LicenseCreationDate, LicenseState, LicenseZip,
				LicenseCountry,InstitutionName, TotalLogins, LastLoginDate) 
				VALUES(@sLoginId, @sFirstName, @sLastName, @sAccountNumber, @iCardNumber, @sUserType,@dtLicenseCreationDate,
				@sLicenseState, @sLicenseZip, @sLicenseCountry,@sInstitutionName, @iTotalLogins, @dtLastLogin)
				END
			END
			-- fetch the next record from cursor
			FETCH NEXT FROM @cGetUserDetails INTO @iUserId, @iTotalLogins, @dtLastLogin
		-- end of while loop
		END
	-- close the cursor to free up resources
	CLOSE @cGetUserDetails
	DEALLOCATE @cGetUserDetails

	-- Selecting the desired result from temporary table
	--SELECT LoginId, FirstName, LastName, AccountNumber, CardNumber,UserType,CONVERT(VARCHAR,LicenseCreationDate,101) as LicenseCreationDate, LicenseZip, LicenseState,
	--LicenseCountry,InstitutionName, TotalLogins, CONVERT(VARCHAR,LastLoginDate,101) as LastLogin FROM #UsageReport ORDER BY AccountNumber

	Select  RowNum,LoginId, FirstName, LastName, AccountNumber, CardNumber,UserType,CONVERT(VARCHAR,LicenseCreationDate,101) as LicenseCreationDate, LicenseZip, LicenseState,
	LicenseCountry,InstitutionName, TotalLogins, LastLogin
   from (  
 SELECT   ROW_NUMBER() OVER (ORDER BY LoginId) AS RowNum ,LoginId, FirstName, LastName, AccountNumber, CardNumber,UserType,CONVERT(VARCHAR,LicenseCreationDate,101) as LicenseCreationDate, LicenseZip, LicenseState,
	LicenseCountry,InstitutionName, TotalLogins, CONVERT(VARCHAR,LastLoginDate,101) as LastLogin FROM #UsageReport) as usr
 WHERE RowNum > @pageLength * (@pageNo - 1) AND 	RowNum <= @pageLength * @pageNo   order by AccountNumber
    

	 --Calculate total number of records
  select @recordCount = count(ResultTable.LoginId) from (SELECT LoginId, FirstName, LastName, AccountNumber, CardNumber,UserType,CONVERT(VARCHAR,LicenseCreationDate,101) as LicenseCreationDate, LicenseZip, LicenseState,
	LicenseCountry,InstitutionName, TotalLogins, CONVERT(VARCHAR,LastLoginDate,101) as LastLogin FROM #UsageReport) as ResultTable;
	-- Dropping the temporary table
	DROP TABLE #UsageReport
END