Изменение хранимой процедуры - PullRequest
0 голосов
/ 12 ноября 2009

У меня есть процесс, который печатает чеки, если есть какие-либо новые чеки, которые будут напечатаны. Если нет ничего для выдачи новых чеков, они не будут печататься. Теперь я хочу изменить этот процесс, например, даже если у меня нет новых чеков для печати, он должен взять хотя бы один чек для печати (даже если он уже напечатан). Можете ли вы сказать мне, как это сделать. Здесь хранится процедура.

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

Дайте мне знать, если вам нужна дополнительная информация.

Ответы [ 3 ]

1 голос
/ 25 ноября 2009

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 ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВНУТРЕННЕЕ ПРИСОЕДИНЕНИЕ t_PCD_Claimant ВКЛ ORDER BY t_DATA_CashiersChecksIssued.Audit_DateAdded DESC

0 голосов
/ 13 ноября 2009

Вы должны решить, как вы хотите выбрать свой «хотя бы один».

Самый простой способ (вероятно) - удалить любое условие в предложении 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 где ... представляет существующий запрос, но с условием исключить уже напечатанные чеки. Если подумать, это может быть проще.

0 голосов
/ 12 ноября 2009

Используйте синтаксис 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

Хотите ли вы распечатать чек "Аннулировано / Отменено" - когда вы это сделаете?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...