2017-09-12 21 views
1

通常我会有代码发布。但是,我不确定从哪一个开始。也许我错了,但这个要求与大多数(来自客户)有点不同。所以,他们需要在他们的页面中添加一项新功能。他们希望能够运行一个报告,显示给定的一周内所有员工的总小时数。他们将使用DatePicker选择一个开始日期,另一个选择和结束日期。然后,点击一个按钮来运行报告。此报告将员工姓名作为第一列,然后每个列将具有一个日期标题。因此,如果他们选择了8-5-2017和8-19-2017,则列标题将为8-5-2017 | 2017年8月12日| 2017年8月19日。这些专栏下面是每个员工在特定周内工作的总小时数。显示列标题作为日期Telerik Rad Grid

我附上了我需要做的事情的图片。希望这将提供额外的澄清。 sample display

回答

1

我有类似的情况,并设法通过使用包含我的数据的DataTable来解决它。填写您的DataTable的简单方法是创建一个存储过程。

在我的示例中,我将简单地在2个给定日期之间为每一天执行此操作,您应该能够更改此代码,使其每7天运行一次,从星期一/星期日开始,具体取决于您的要求是。如果您也需要帮助,请留下评论,如果我找到时间,我会看看我能做些什么。

CREATE TYPE [dbo].[DayTableType] AS TABLE(
    [Datum] [date] NOT NULL, 
    [DayCol] [int] NOT NULL 
) 
GO 


CREATE PROCEDURE [dbo].[MyStoredProcedure] 
    -- Add the parameters for the stored procedure here 
    @d1 datetime, @d2 datetime 
AS 
BEGIN 
    -- SET NOCOUNT ON added to prevent extra result sets from 
    -- interfering with SELECT statements. 
    SET NOCOUNT ON; 
    SET DATEFIRST 1; 

    -- Insert statements for procedure here 
DECLARE @StartDate date = CONVERT(date, @d1); 
DECLARE @EndDate date = CONVERT(date, @d2); 


DECLARE @Days dbo.DayTableType; 
WITH cte AS (
    SELECT @StartDate AS Datum 
    UNION ALL 
    SELECT DATEADD(day,1,Datum) as Datum 
    FROM cte 
    WHERE DATEADD(day,1,Datum) <= @EndDate 
) 
INSERT INTO @Days 
SELECT cte.Datum, DATEPART(DAY, cte.Datum) 
FROM cte 
OPTION(MAXRECURSION 0); 
DECLARE @dPivot NVARCHAR(MAX) 
SELECT @dPivot = '' 
SELECT @dPivot = @dPivot + '[' + CONVERT(VARCHAR(8),d.Datum,3) + '],' FROM @Days d 
SELECT @dPivot = SUBSTRING(@dPivot,1,LEN(@dPivot)-1) 

DECLARE @SQLSTR NVARCHAR(MAX); 
SET @SQLSTR = 
    'SELECT p.EmployeeId 
     ,p.LastName 
     ,p.FirstName 
     ,'+ @dPivot + ' 
    FROM (SELECT CONVERT(VARCHAR(8),d.Datum,3) AS DayCol 
      ,e.EmployeeId 
      ,e.LastName 
      ,e.FirstName 
      ,ISNULL((SELECT SUM(w.WorkedHours) FROM dbo.[EmployeeWorkDateTable] w 
        WHERE w.EmployeeId = e.EmployeeId AND CONVERT(DATE, w.WorkDate) = CONVERT(DATE, d.Datum)),0) AS DayInfo 
     FROM @Days d 
     LEFT OUTER JOIN dbo.[EmployeeTable] e ON e.IsActive = 1 
    ) t 
    PIVOT (
     MAX(t.DayInfo) 
     FOR t.DayCol IN (' + @dPivot + ') 
     ) AS p 
    ORDER BY p.LastName' 

EXECUTE SP_EXECUTESQL @SQLSTR, N'@Days DayTableType READONLY, @StartDate DATE, @EndDate DATE', @Days, @StartDate, @EndDate 

END 

这应该返回一个DataTable,看起来很像你已经张贴在你的屏幕截图什么。 为了有这个正确显示到您的GridView你需要在你的视图模型首先要获得该如下:

private DataTable _myDataTable; 
public DataTable MyDataTable 
{ 
    get { return _myDataTable; } 
    set { SetProperty(ref _myDataTable, value); } 
} 



public void FillMyDataTable(DateTime startDate, DateTime endDate) 
{ 
    using (var conn = new SqlConnection("MyConnectionString")) 
    using (var cmd = new SqlCommand("MyStoredProcedure", conn) { CommandType = System.Data.CommandType.StoredProcedure }) 
    { 
     cmd.Parameters.AddWithValue("@d1", startDate); 
     cmd.Parameters.AddWithValue("@d2", endDate); 

     var da = new SqlDataAdapter(cmd); 
     var ds = new DataSet(); 
     da.Fill(ds); 
     MyDataTable = ds.Tables[0]; 
    }  
} 

现在你应该只是你的GridView的ItemSource绑定到你的DataTableDefaultView财产,有AutoGenerateColumns="True",你更可以通过写AutoGeneratingColumn

<telerik:RadGridView x:Name="MyGridView" 
    AutoGenerateColumns="True" 
    ItemsSource="{Binding MyDataTable.DefaultView}" 
    AutoGeneratingColumn="MyGridView_OnAutoGeneratingColumn"> 
</telerik:RadGridView> 

我希望这可以帮助你与你的问题,你的自定义emplementation编辑列名和其他的东西。如果您有任何问题,请随时留下评论。

+0

这是一个非常稳固的解决方案。我必须说,对于大多数问题,答案是我收到的最好的答案。对不起,我没有及时回复接受这个解决方案。事情已经疯了。 –