0

ユーザーが検証(データのある種のユーザーキー)を行った後、キャプチャソフトウェアであるAbbyyFlexiCaptureを使用しています。キャプチャしたデータをSQLServer2008R2にエクスポートします

SQL Serverは、挿入されたデータ(新しい行)があることを識別すると、ビジネスルールに基づいてテーブルAbbyyを更新するコードをトリガーします。

テーブルには、とという2つの列がProcessingDateあります。DateOfService

私のビジネスルールの要件は

  1. 処理日がサービス日より7か月後の場合、TableAbbyyが更新されます
    • CouponStatus拒否」の列、
    • RejectCodeA5 」の列。
  2. 処理日がServiceDateの7か月より前の場合、TableAbbyyが更新されます
    • 「承認」の列CouponStatus
    • RejectCode「null」の列。

処理日がサービス日7か月を超えるCouponStatus挿入データがあり、列が「承認」になるため、エラーが発生します。

トリガーコードの問題なのか、日付形式の問題なのかわかりません。ユーザーが検証を行う場合、日付形式はdd/mm/yy

SQL Server 2008 R2では、myProcessingDateDateOfServicecolumnのデータ型は次の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

誰もがこの問題を解決するためのガイドラインを私に与えることができることを感謝します。ありがとうございました。

4

1 に答える 1

1

両方の値を同じ形式に変換するために、比較の前にある種の日付の書式設定を行います

例 :

WHERE CONVERT(VARCHAR,ProcessingDate,102) = CONVERT(VARCHAR,@ProDate,102)

また

WHERE CONVERT(DATE,ProcessingDate,102) = CONVERT(DATE,@ProDate,102)
于 2012-10-03T04:52:20.263 に答える