ユーザーが検証(データのある種のユーザーキー)を行った後、キャプチャソフトウェアであるAbbyyFlexiCaptureを使用しています。キャプチャしたデータをSQLServer2008R2にエクスポートします
SQL Serverは、挿入されたデータ(新しい行)があることを識別すると、ビジネスルールに基づいてテーブルAbbyyを更新するコードをトリガーします。
テーブルには、とという2つの列がProcessingDate
あります。DateOfService
私のビジネスルールの要件は
- 処理日がサービス日より7か月後の場合、TableAbbyyが更新されます
CouponStatus
「拒否」の列、RejectCode
「A5 」の列。
- 処理日がServiceDateの7か月より前の場合、TableAbbyyが更新されます
- 「承認」の列
CouponStatus
、 RejectCode
「null」の列。
- 「承認」の列
処理日がサービス日7か月を超えるCouponStatus
挿入データがあり、列が「承認」になるため、エラーが発生します。
トリガーコードの問題なのか、日付形式の問題なのかわかりません。ユーザーが検証を行う場合、日付形式はdd/mm/yy
、
SQL Server 2008 R2では、myProcessingDate
とDateOfService
columnのデータ型は次のdate
形式になっていますyyyy-mm-dd
これが私のトリガーコードです、plsフォーカスは86行目から始まります
USE [master]
GO
/****** Object: Trigger [dbo].[BusinessRule] Script Date: 10/03/2012 11:28:05 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author: <Author,,Name>
-- Create date: <Create Date,,>
-- Description: <Description,,>
-- =============================================
ALTER TRIGGER [dbo].[BusinessRule]
ON [dbo].[Abbyy]
AFTER INSERT
AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;
DECLARE @Identity varchar(225);
DECLARE @RegNo varchar(225);
DECLARE @ProDate date;
DECLARE @SerDate date;
DECLARE @PriKey varchar(255);
SELECT @Identity=EngineNo, @RegNo=VehRegNo, @ProDate=ProcessingDate, @SerDate=DateOfService,@PriKey=DocID FROM Inserted
--If EngineNo not exist in db, update Reject & A1
IF EXISTS (Select EngineNo
From Abbyy
Where
NOT EXISTS
(Select EngineNo
From eDaftarOwnerDetail
where eDaftarOwnerDetail.EngineNo = @Identity))
UPDATE Abbyy
SET CouponStatus = 'Reject', RejectCode = 'A1'
WHERE EngineNo = @Identity
and DocID=@PriKey
--If Vehicle Registration No not exist in db, update Reject & A2
Else If EXISTS (Select VehRegNo
From Abbyy
Where
NOT EXISTS
(Select VehRegNo
From eDaftarOwnerDetail
Where eDaftarOwnerDetail.VehRegNo = @RegNo))
UPDATE Abbyy
SET CouponStatus = 'Reject', RejectCode = 'A2'
WHERE VehRegNo = @RegNo
and DocID=@PriKey
--If EngineNo & Vehicle Registration No does not matched, update Reject & A3
Else If EXISTS (Select EngineNo, VehRegNo
From Abbyy
Where
NOT EXISTS
(Select EngineNo, VehRegNo
From eDaftarOwnerDetail
Where eDaftarOwnerDetail.EngineNo = @Identity
and eDaftarOwnerDetail.VehRegNo = @RegNo))
UPDATE Abbyy
SET CouponStatus = 'Reject', RejectCode = 'A3'
WHERE EngineNo = @Identity
and VehRegNo = @RegNo
and DocID=@PriKey
-- If EngineNo exist in db more then twice, update Reject & A4
Else If EXISTS (Select COUNT(1)
From Abbyy
Where EngineNo = @Identity
Group by EngineNo
Having COUNT(1)>2)
UPDATE Abbyy
SET CouponStatus = 'Reject', RejectCode = 'A4'
WHERE EngineNo = @Identity
and DocID=@PriKey
-- If ProcessingDate more than ServiceDate 210 days, update Reject & A5
Else If EXISTS (Select ProcessingDate, DateOfService
From Abbyy
Where
datediff(day, @SerDate, @ProDate)>210)
UPDATE Abbyy
SET CouponStatus = 'Reject', RejectCode = 'A5'
WHERE ProcessingDate = @ProDate
and DateOfService = @SerDate
and DocID=@PriKey
Else
UPDATE Abbyy
Set CouponStatus = 'Approve', RejectCode = ''
WHERE EngineNo = @Identity
-- Insert statements for trigger here
END
誰もがこの問題を解決するためのガイドラインを私に与えることができることを感謝します。ありがとうございました。