4

我正在尝试为我正在做的项目编写时间表应用程序,并且在一个月的大部分时间里,我没有在系统的关键部分方面取得进展。我需要能够通过周一至周日的每周视图编辑数据并将其添加到应用程序中。我有一个 SQL(服务器)数据透视表,它可以返回我每天输入的数据,但由于它使用动态标题作为一周中的日期,因此要编辑的 gridview 函数将不起作用。我试过绑定数据,但这有同样的问题,日期。我想我需要创建一个带有文本框的表单来输入数据并以这种方式更新,但是如何使用我拥有的查询填充这样的表单?我还需要能够添加新行。我已经走到了尽头,即将放弃编码,因为它现在让我感到压力。

这是我的 SQL,它准确地显示了我想要的数据:

ALTER PROCEDURE [dbo].[list_weekly_times]
as



DECLARE @offSetmon int, @fromdt datetime,@todt datetime,@offsetsun int, @COLName    varchar (max)
,     @SQL        varchar (max), @fromdate as date, @todate as date, @offsetmonval as int, @offsetsunval as int

SELECT @offSetmon = 1
select @fromdt = GETDATE()
SELECT @offSetSun = 7
select @todt = GETDATE()
SELECT @fromdt = CONVERT(DATETIME, CONVERT(INT, @fromdt) - (DATEPART(WEEKDAY, @fromdt) - @offSetmon))
SELECT @todt = CONVERT(DATETIME, CONVERT(INT, @todt) - (DATEPART(WEEKDAY, @todt) - @offSetsun))


select @COLName    = ''
 ,    @SQL        = ''


while @FromDt <= @ToDt
begin
      if    (@COLName = '')
      begin
            set   @COLName    = '[' + convert (varchar (10), @FromDt, 121) + ']'
      end
      else
      begin
            set   @COLName    = @COLName + ', [' + convert (varchar (10), @FromDt, 121) + ']'
      end
      set   @FromDt = dateadd (d, 1, @FromDt)
end
print @COLName
select      @SQL  = 'select project_code, activity_code,' + @COLName + 
              ' From (select project_code, activity_code, project_date, Project_time from timesheet) as P 
                pivot 
                  (     sum (Project_time)
                        for project_date in (' + @COLName + ')
                  ) as pvt
                order by project_code

              '
print @SQL
exec  (@SQL)

只是不适用于编辑,因为枢轴是为数据显示而不是数据编辑而设计的。

也许枢轴方法是错误的,需要另一个方向。

任何帮助、教程、示例都会有所帮助。

4

2 回答 2

1

停止。您正在通过动态编写的 SQL 语句将数据的客户端显示与数据的物理结构相混淆。 这会让你遇到所有可能的世界中最糟糕的情况。

理想情况下,您将在 ASP.NET 中使用或创建一个控件,该控件可以直接从timesheet表中获取漂亮而窄的行,并完全在 ASP.NET 层内处理数据输入的包装。

如果由于某种原因您无法做到这一点并且需要在服务器上保存按周的数据(例如,您有一个需要全部批准的每周工资单),您应该创建一个可更新的表或查看专用to timecard_rows,一周中的每一天都有七个字段和一些“基准日期”指示器,因此您可以强制所有七个字段进出timesheet表格。

于 2014-01-26T22:57:13.580 回答
0

为什么不为此使用触发器。

假设您有这样的视图:

create view TimeCards
as
select yourDate FirstDayOfWeek
,      sum(case when day = 1 then hours else 0) end sun
,      sum(case when day = 2 then hours else 0) end mon
,      sum(case when day = 3 then hours else 0) end tue
,      sum(case when day = 4 then hours else 0) end wed
,      sum(case when day = 5 then hours else 0) end thu
,      sum(case when day = 6 then hours else 0) end fri
,      sum(case when day = 7 then hours else 0) end sat
from   table
group
by     WeekNumber

然后在触发器中更新这样的时间:

create trigger TimeCards_Upd on TimeCards
instead of update
as
begin
    delete table
    where  date = yourDate + 0 -- sun

    insert
    into  table
    ( yourDate
    , hours
    )
    values
    ( date + 0 -- sun
    , sun -- hours from sunday
    )

    -- repeat for every other day
end;
于 2014-01-27T11:03:45.880 回答