1

我不知道如何问这个问题,但这里有。我正在尝试编写一个每晚运行的程序来检查企业的所有未付发票,然后在需要时添加服务费。我需要查询未付发票,然后检查创建日期和当前日期之间的 datediff(),然后在某些值(例如 15 天或 30 天)处,我需要对其他表进行多次插入和更新,以添加服务费和更新余额。从我读到的内容来看,循环不是要走的路,但我不确定如何跟踪当前发票或在大型更新语句中如何插入。这是我需要的一些伪代码

select * from invoice where ispaid = 0

set days = currentdate - invoicecreationdate

switch (days)

case 30

insert servicecharge
update invoice
update balance

case 60

insert servicecharge
update invoice
update balance due

case 90

insert servicecharge
update invoice
update balance

我知道这没什么好做的,但我会尽我所能获得帮助。我不确定这在没有循环的情况下如何工作,因为在每种情况下我都有几条语句要运行,这些语句需要知道我们当前正在处理的发票

4

1 回答 1

0

在您的情况下,循环不会那么糟糕。每次通过循环都会为“逾期”窗口增加 30 天,并且您似乎打算将每个窗口的所有适用行作为一组处理。那是善良。

或者,您可以使用类似这样的方法来生成适当的日期范围:

declare @Today as Date = GetDate();

select DateAdd( day, -( AgingDays + 30 ), @Today ) as StartDate,
  DateAdd( day, -( AgingDays + 1 ), @Today ) as EndDate, PenaltyPercent
  from ( values ( 30, 2 ), ( 60, 5 ), ( 90, 10 ) ) as PastDueIntervals( AgingDays, PenaltyPercent )

它可以很容易地扩展为每个范围携带额外的数据。通过将其与您的Invoice表连接,您可以一次处理所有适用的发票。

根据您表的大小,生成一个包含发票 ID、逾期间隔和任何其他适用数据的临时表可能是有意义的。然后可以使用该表来提供用于更新所有三个表的信息。

一个有用的技巧是CASEUPDATE语句中包含 a,例如:

update I
  set WatchList = case when Aging >= 60 then 1 else WatchList end,
    ...
  from Invoices as I inner join
    #PastDueInvoices as PDI on PDI.InvoiceId = I.InvoiceId

如果临时表指示发票逾期 60 天或更长时间,这将设置观察列表标志,否则保持不变。

于 2013-06-07T18:45:07.627 回答