2009-11-12 63 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其中...表示您现有的查询,但条件是排除已打印的检查已删除。再想一想,这可能会更简单。