Member 12314309 Ответов: 1

Как с помощью хранимой процедуры из запроса КТР по таблице обновления GridView в C# с ASP.NET?


мне нужна помощь в том, как запрос CTE будет использоваться для обновления в asp.net веб-приложение c# gridview.

Просто я хочу обновить INTime и OUTTime результат значений будет автоматически вычисляться в соответствии с определенным условием.

Что я уже пробовал:

<pre>PROCEDURE [dbo].[GetMachineAttendanceFinal2]
@StartDate Datetime,
@Enddate   Datetime,

@INTIME    Datetime,
@OUTTIME   DateTime
AS

BEGIN

      SET NOCOUNT ON;

     
;WITH Dates (ReportingDate) 
AS (
   SELECT CONVERT(date, '2018-11-26 00:00:00.000', 120) AS ReportingDate
   UNION ALL
   SELECT DATEADD(day, 1, d.ReportingDate)
   FROM Dates d
   WHERE d.ReportingDate < CONVERT(date, '2018-12-25 00:00:00.000', 120))

,CTE As
    (
    select EmployeeDetails.EmpID,EmployeeDetails.EmpName,EmployeeDetails.OTEntitled,EmployeeDetails.Empcur,EmployeeDetails.Dhour,EmployeeDetails.LTime from EmployeeDetails where Empcur='Join'
    )
    ,CTE4 As
    (
    Select MachineAttendance.EmpID,MachineAttendance.Datetime,MachineAttendance.INOUT from MachineAttendance
    ) 
    
    ,cte1 AS
    (
    SELECT CTE4.EmpID, CAST(CTE4.Datetime as Date) AS [Date], 
    CASE WHEN CTE4.INOUT = 1 THEN CTE4.DateTime END AS INOUT_INTIME,
    CASE WHEN CTE4.INOUT = 2 THEN CTE4.DateTime END AS INOUT_OUTTIME
    From 
     CTE4
    
    ), 
   cte2 
    as
    (
    select cte1.EmpID, Date, MAX(INOUT_INTIME) AS INTIME, 
                          MAX(INOUT_OUTTIME) AS OUTTIME
    , DATEDIFF(Hour, MAX(INOUT_INTIME), MAX(INOUT_OUTTIME)) as [Hours]
    FROM CTE1
    GROUP BY EmpID, [Date]
    )
    select cte.EmpID,cte.EmpName,d.ReportingDate,cte2.Date, cte.OTEntitled,CTE.Empcur,CTE.Dhour,cte.LTime,cte2.INTIME,  cte2.OUTTIME,  cte2.[Hours]
    , CASE WHEN  cte2.[Hours] >= 8 THEN 1
    WHEN  cte2.[Hours] = 0 THEN 0
    WHEN  cte2.[Hours] >= 6 THEN 0.5 END AS [Day],
    CASE WHEN  cte2.[Hours] > CTE.Dhour then  cte2.[Hours] - CTE.Dhour else 0 End as OT,
    CASE when   
    cte.OTEntitled = 'Yes'  AND cte2.[Hours] >= CTE.Dhour 
THEN (( cte2.[Hours] - 8) * 100) else 0 END AS OTAMount,  

   
    Convert(varchar(10), cte2.INTIME,108) as [Time],
   Case When Convert(Time, cte2.INTIME,108) > cte.LTime Then 1 else 0 end as Late    
    from cte Cross Apply Dates d 
		Left Join cte2 ON cte2.EmpId= cte.EmpID AND cte2.Date=d.ReportingDate
    order by cte.EmpID asc 
     
  
END

1 Ответов

Рейтинг:
2

MadMyche

Что вам нужно будет сделать, так это добавить UPDATE запрос к вашей процедуре; вероятно, самый простой способ сделать это-создать еще один CTE в вашей процедуре, чтобы обернуть этот финал SELECT и затем JOIN это к вашей целевой таблице в рамках вышеупомянутого соединения

Поскольку вы не предоставили схему таблицы для назначения, можно сделать только предположения, которые я действительно не хочу делать, поэтому я предоставлю только основы. Я также не собираюсь проверять ваш предыдущий код, даже если он явно сомнителен.

-- earlier CTEs not listed
; WITH cteFinal AS (
	select	cte.EmpID,cte.EmpName
	,	d.ReportingDate,cte2.Date
	,	cte.OTEntitled
	,	CTE.Empcur
	,	CTE.Dhour
	,	cte.LTime
	,	cte2.INTIME
	,	cte2.OUTTIME
	,	cte2.[Hours]
	,	CASE
			WHEN cte2.[Hours] >= 8 THEN 1
			WHEN cte2.[Hours] = 0 THEN 0
			WHEN cte2.[Hours] >= 6 THEN 0.5
		END AS [Day]
	,	CASE
			WHEN cte2.[Hours] > CTE.Dhour then cte2.[Hours] - CTE.Dhour 
			else 0
		End as OT
	,	CASE
			when cte.OTEntitled = 'Yes' AND cte2.[Hours] >= CTE.Dhour tHEN (( cte2.[Hours] - 8) * 100)
			else 0
		END AS OTAMount
	,	Convert(varchar(10), cte2.INTIME,108) as [Time]
	,	Case
			When Convert(Time, cte2.INTIME,108) > cte.LTime Then 1
			else 0
		end as Late
	from	cte
	Cross Apply Dates d 
	Left Join cte2 ON cte2.EmpId= cte.EmpID AND cte2.Date=d.ReportingDate
)

UPDATE  dt
SET     dt.[Date] = cF.[Date]
,       dt.OTEntitled = cD.OTEntitled
-- other values being set
FROM   [DestinationTable]  dt
LEFT JOIN cteFinal         cF ON dt.EmpID = cF.EmpID


Member 12314309

Уважаемые MadMyche
я немного запутался,моя структура таблицы такова, что у меня есть две таблицы, одна таблица-это Machineattendance, а другая-посещаемость сотрудников, в которой идет INtime и Outime, где я буду обновлять INtime и OUtime тех сотрудников, чьи intime и outime будут недоступны

MadMyche

У вас есть все эти данные, собранные вместе, но нет никаких обновлений. Это то, что вам нужно сделать, если вы хотите обновить таблицу.
Конечно, если вы просто хотите просмотреть данные, извлеките результирующий набор из своей процедуры и поместите его в таблицу данных.
.. Или есть проблема с вашим запросом, с которой вам нужна помощь?

Member 12314309

Уважаемый MadMyche, я просто хочу обновить INTIME и OUTTIME в посещаемости сотрудников против идентификатора посещаемости ,остальная часть запроса так же выполняется,как я уже упоминал выше ,теперь как будет обновляться INTIME и OUTTIME в запросе cte, я пробовал, что вы сказали, но я думаю, что это не решение моего запроса...Пожалуйста пожалуйста помогите