2009-11-12 84 views
0

我有一個proc打印檢查是否有任何新的檢查打印。如果沒有什麼可以發出新的檢查,它不會打印任何。現在我想修改這個過程,即使我沒有任何新的打印檢查,它也應該至少打印一張支票(即使它已經打印)。你能告訴我該怎麼做。這裏是存儲的過程。更改存儲過程

CREATE PROCEDURE [proc_1250_SELCashiersChecksForPrint] AS 

SELECT t_DATA_CashiersChecksIssued.ControlNbr, 
    t_DATA_CashiersChecksIssued.Audit_DateAdded, 
    t_DATA_CashiersChecksIssued.BatchNbr, 
    t_DATA_CashiersChecksIssued.SerialNbr, 
    t_DATA_CashiersChecksIssued.CheckRTN, 
    t_DATA_CashiersChecksIssued.CheckAccountNbr, 
    t_DATA_CashiersChecksIssued.Amount, 
    t_DATA_CashiersChecksIssued.DateIssued, 
    t_DATA_CashiersChecksIssued.Payee, 
    t_DATA_CashiersChecksIssued.Address, 
    t_DATA_CashiersChecksIssued.City, 
    t_DATA_CashiersChecksIssued.State, 
    t_DATA_CashiersChecksIssued.Zip, 
    t_DATA_Reclamation.ClaimId, 
    t_DATA_Reclamation.NoticeDate, 
    t_DATA_Reclamation.FirstName, 
    t_DATA_Reclamation.MiddleName, 
    t_DATA_Reclamation.LastName, 
    t_DATA_Reclamation.ClaimTotal, 
    t_PCD_Claimant.Name AS Agency, 
    t_DATA_CashiersChecksIssued.IDENTITYCOL 
FROM t_DATA_CashiersChecksIssued INNER JOIN 
    t_DATA_Reclamation ON 
    t_DATA_CashiersChecksIssued.ControlNbr = t_DATA_Reclamation.ControlNbr 
    INNER JOIN 
    t_PCD_Claimant ON 
    t_DATA_Reclamation.ClaimantCode = t_PCD_Claimant.ClaimantCode 
WHERE (t_DATA_CashiersChecksIssued.SerialNbr IS NULL) AND 
    (t_DATA_CashiersChecksIssued.DateIssued IS NULL) 
ORDER BY t_DATA_CashiersChecksIssued.Audit_DateAdded ASC, 
     t_DATA_CashiersChecksIssued.ControlNbr ASC 

讓我知道如果你需要更多的信息。

+2

爲什麼你要打印檢查是否已經打印了嗎?根據我的經驗,沒有什麼會損害用戶對IT系統的信任,而不是像做那樣難以解釋的事情。 – APC 2009-11-13 10:19:43

回答

1

SELECT TOP 1 t_DATA_CashiersChecksIssued.ControlNbr, t_DATA_CashiersChecksIssued.Audit_DateAdded, t_DATA_CashiersChecksIssued.BatchNbr, t_DATA_CashiersChecksIssued.SerialNbr, t_DATA_CashiersChecksIssued.CheckRTN, t_DATA_CashiersChecksIssued.CheckAccountNbr, t_DATA_CashiersChecksIssued.Amount, t_DATA_CashiersChecksIssued.DateIssued, t_DATA_CashiersChecksIssued.Payee ,t_DATA_CashiersChecksIssued.Address, t_DATA_CashiersChecksIssued.City,t_DATA_CashiersChecksIssued.State, t_DATA_CashiersChecksIssued.Zip,t_ DATA_Reclamation.ClaimId, t_DATA_Reclamation.NoticeDate,t_DATA_Reclamation.FirstName, t_DATA_Reclamation.MiddleName,t_DATA_Reclamation.LastName, t_DATA_Reclamation.ClaimTotal,t_PCD_Claimant.Name AS局, t_DATA_CashiersChecksIssued.IDENTITYCOL FROM t_DATA_CashiersChecksIssued INNER JOIN t_DATA_Reclamation ON t_DATA_CashiersChecksIssued.ControlNbr = t_DATA_Reclamation .ControlNbr INNER JOIN t_PCD_Claimant ON t_DATA_Reclamation.ClaimantCode = t_PCD_Claimant.ClaimantCode ORDER BY t_DATA_CashiersChecksIssued.Audit_DateAdded DESC

0

使用TOP N SQL語法:

if EXISTS (/* Look for an unprinted check - "date_issued is null" */) 
    /* print unprinted checks */ 
ELSE 
    select top 1 /* already-printed-checks */ 
    where .... "date_issued is not null" 

OR

你想打印 「作廢/取消」 檢查 - 當你這樣做?

+0

而不是改變VB代碼,我們可以改變存儲的PROC? – pbrp 2009-11-12 21:01:15

+2

「top 1」在Oracle中不存在 – Dan 2009-11-12 23:56:00

0

你必須決定如何選擇你的「至少一個」。

最簡單的方法(可能是)刪除WHERE子句中的任何條件都排除已打印的檢查。我們假設這是t_DATA_CashiersChecksIssued.DateIssued IS NULL。現在在SELECT子句中添加一列,如下所示:CASE WHEN t_DATA_CashiersChecksIssued.DateIssued IS NULL then 0 ELSE 1 END並在您的ORDER BY子句中首先創建該列。

現在在該過程中,從該遊標中取一行。如果這個新列的值爲0,那麼至少有一個新的檢查要處理,您應該遍歷光標,但在到達已經發布的列時停止。如果它的值爲1,則不會有新的檢查。

編輯:另一種方法是在SQL中正確執行它。保留原來的狀態,但添加如下條款: UNION ALL SELECT ... AND ROWNUM = 1其中...表示您現有的查詢,但條件是排除已打印的檢查已刪除。再想一想,這可能會更簡單。