Short of creating a tutorial, here is something that's not too difficult. This was stolen from a beautiful blog post by Eric van Ballegoij that you can find at
http://www.erikvanballegoij.com/Hom...-way.aspx. To do this, you first need to create a function in your database. You should be able to do this by pasting this on the Host, SQL page and running as a script:
CREATE FUNCTION [dbo].[udf_UserProfileField]
(
@PropertyName NVARCHAR(50)
)
RETURNS @ProfileFieldTable TABLE
(
PortalId INT,
UserID INT,
PropertyName NVARCHAR(50),
PropertyValue NVARCHAR(3750)
)
AS BEGIN
INSERT INTO @ProfileFieldTable
SELECT PPD.PortalID,
UP.UserID,
PPD.PropertyName,
UP.PropertyValue
FROM dbo.Users AS U
INNER JOIN dbo.UserProfile AS UP ON U.UserID = UP.UserID
INNER JOIN dbo.ProfilePropertyDefinition AS PPD ON UP.PropertyDefinitionID = PPD.PropertyDefinitionID
WHERE ( PPD.PropertyName = @PropertyName )
RETURN
END
This creates a function named udf_UserProfileField that can be used with the reports module.
Next, paste this as the query for an instance of the reports module.
SELECT U.UserId, U.Username, U.FirstName, U.LastName, U.DisplayName, U.Email,
UserCompany.PropertyValue AS Company, UserCity.PropertyValue AS City
FROM dbo.udf_UserProfileField('City') AS UserCity RIGHT OUTER JOIN
dbo.vw_Users AS U ON UserCity.PortalId = U.PortalId AND UserCity.UserID = U.UserId LEFT OUTER JOIN
dbo.udf_UserProfileField('Company') AS UserCompany ON U.UserId = UserCompany.UserID AND U.PortalId = UserCompany.PortalId
With some work, you should be able to figure out how to extend this to additional profile properties via addition LEFT OUTER JOIN clauses.
As for a module that lets users build their own reports, I'm not sure that this is a good idea. You will also be giving them the ability to look at the entire DotNetNuke database, and that includes stuff to which users should not have access.
I'm not aware of a module that gives access to only selected tables in the database.