0

我有一张表,Main,它是包含所有交易的主要会计表。我有第二张表,付款,我跟踪付款,特别是给定付款已付清的发票。

我需要一份动态灵活的报告;真的是我的会计主力。我需要的报告将在日期、客户 ID、记录状态、account1、account2 和付款状态之间进行搜索。

所以我有一个表格来处理这些输入,但我在“支付状态”方面遇到了麻烦,比如如何用它形成一个参数。我当前的代码,

SELECT Main.Invo, Main.InvoDate, Main.Amt, Main.PartyId, Main.TboInvoRloc, Main.TboDocNo, Main.TboPax
FROM Main
WHERE Main.RecSrce<>"Accounts"

AND Main.InvoDate BETWEEN [Forms]![GeneralReport]![startDate] AND [Forms]![GeneralReport]![endDate]
AND Main.PartyId =IIF([Forms]![GeneralReport]![PartyID] IS NULL, PartyID, [Forms]![GeneralReport]![PartyID])
AND Main.Status = IIF([Forms]![GeneralReport]![Status] IS NULL, Status, [Forms]![GeneralReport]![Status])
AND Main.Ac1 = IIF([Forms]![GeneralReport]![Ac1] IS NULL, Ac1, [Forms]![GeneralReport]![Ac1])
AND Main.Ac2 = IIF([Forms]![GeneralReport]![Ac2] IS NULL, Ac2, [Forms]![GeneralReport]![Ac2])
;

涵盖除“支付状态”之外的所有内容。我想做类似的事情

If checkbox=true, then include paid items, else exclude items where Main.Invo = Payments.DueInvo

我的另一个想法是在初始查询中排除付费项目,然后如果选中复选框,则将它们包含在后续联合查询中。任何帮助或想法将不胜感激。

4

2 回答 2

0

考虑将付款明细列设置为NULL取决于复选框。具体来说,加入Payments表并对SELECT分配NULL或不分配的字段运行逻辑条件。

SELECT m.Invo, m.InvoDate, m.Amt,
       m.PartyId, m.TboInvoRloc, 
       m.TboDocNo, m.TboPax,
       IIF(Forms]![GeneralReport]![myCheckBox] = True, 
           p.PaymentDetailColumn1, NULL) AS PayColumn1,
       IIF(Forms]![GeneralReport]![myCheckBox] = True, 
           p.PaymentDetailColumn2, NULL) AS PayColumn2,
       IIF(Forms]![GeneralReport]![myCheckBox] = True, 
           p.PaymentDetailColumne, NULL) AS PayColumn3
       ...
FROM Main m
LEFT JOIN Payments p ON m.Invo = p.DueInvo
WHERE m.RecSrce <> 'Accounts'   
  AND m.InvoDate BETWEEN [Forms]![GeneralReport]![startDate] 
                     AND [Forms]![GeneralReport]![endDate]
  AND m.PartyId = NZ([Forms]![GeneralReport]![PartyID], m.PartyID)
  AND m.Status = NZ([Forms]![GeneralReport]![Status], m.Status)
  AND m.Ac1 = NZ([Forms]![GeneralReport]![Ac1], m.Ac1)
  AND m.Ac2 = NZ([Forms]![GeneralReport]![Ac2], m.Ac2);

如果您希望根据条件显示或不显示动态列(即付款详细信息),这不能直接来自 SQL,而是一些连接应用程序层代码(VBA、Python 等)来构建动态查询。回想一下 SQL 是一种声明性语言,一旦分配了标识符,它们就是不可变的。但是,如果使用报告,您确实希望从记录源查询中显式定义所有列。

于 2019-08-03T21:29:27.140 回答
0

为 TripleState 设置未绑定复选框 Yes。或者使用具有 3 个选项(付费、未付费、全部)的组合框,因为用户可能会被三重状态复选框弄糊涂。

在 Payments 表上构建一个聚合查询,按发票汇总付款。将该查询加入 Main(假设发票在 Main 中是唯一的)。

计算一个字段并在该字段下设置一个参数。

如果使用复选框:
IsNotPaid: Amt <> Nz(SumOfPayments,0)
LIKE Forms![GeneralReport]!checkboxname & "*"

如果使用组合框:
PaidStatus: IIf(Amt = Nz(SumOfPayments,0), "Paid", "Unpaid")
LIKE IIf(Forms![GeneralReport]!comboboxname = "All", "*", Forms![GeneralReport]!comboboxname)

聚合查询的替代方法是 DSum() 域聚合函数,但它可能会执行较慢。

于 2019-08-03T03:14:07.303 回答