在前面的销售管理系统案例中,收款单有一个细节:选中客户后,会自动提取未付款的提货单到明细表中,已经付过款的会自动过滤掉。

这个效果并不复杂,但用到了一个很实用的设计思路——通过更新公式改变单据状态,实现整单核销控制。今天把这套方法拆开讲清楚。
第一步:在提货单上加一个“收款单号”字段
这个字段是整条逻辑的起点。
它的作用是:当提货单被收款时,系统会把对应的收款单号写进来。
一旦写进来,就表示“这笔提货单已经结清了”。

第二步:收款时,把收款单号写入对应的提货单
在收款单中配置一条表间更新公式,执行时机选“保存前”,作用是把当前收款单的单号,更新到提货单的“收款单号”字段上。

这样,提货单上就有了收款标记。
第三步:提取未收款提货单时,用“收款单号为空”作为过滤条件
在收款单中设置数据规范时,来源数据只取“收款单号为空”的提货单。

已经付过款的提货单,因为收款单号字段已经有值了,就不会再出现在下拉列表中。这就是“已付款单据自动隐藏”的实现逻辑。
第四步:防止已收款单据被误改
收款单号写进去之后,提货单就成了“已结清”状态。为了防止后续被人误改,可以在提货单上加一条校验公式:
当收款单号不为空时,不允许修改或删除这张单据。

这条校验公式能避免已结算单据被无意改动。
补充:删除收款单时,同步清除提货单上的收款单号
删除收款单时,需要把对应的提货单上的收款单号也清空。否则那张提货单会一直处于“已锁定”状态,无法被重新处理。
所以还需要配一条清除公式,执行时机选“删除时”,清空提货单上的收款单号。
一个关键细节:为什么更新公式的时机要选“保存前”?
这里涉及到Myexcel的运行机制。
当我们打开一张已存在的表单进行修改时,系统会从数据库中复制一份数据到内存中,形成“本报表”——也就是说,你在界面上修改的是这份副本,而不是数据库里的原始数据。修改完成后,系统再把本报表中的数据写回数据库,覆盖原记录。
更新公式的执行时机如果选“保存前”,就是在“写回数据库”这个动作发生之前执行。先清除提货单上旧的收款单号,再把新的收款单号写进去,这样不会产生冲突或残留数据。
总结
这套方法的本质是通过一个“状态字段”(收款单号)来标记单据是否已结算,再配合更新公式和校验规则,实现整单核销的锁定控制。
本案例中,提货单只支持整单收款,所以用“收款单号是否为空”来判断即可。如果有分笔收款的需求,则需要换一种方式处理——用内源计算未收款余额。
“加一个状态字段 → 用更新公式写值 → 用条件过滤 → 加校验防止误改”这个组合思路,也可以用在其他需要状态切换的业务场景中。如果你在设计中碰到类似的需求,可以试试这个方案。
如果本文对你有帮助,欢迎点个推荐 ❤️ —— 你的一个小动作,能让更多遇到同样问题的朋友看到这篇文章。
有疑问或想让我拆解的行业系统,欢迎留言,我会在后续文章中回复。
关注「MyExcel实战 零代码管理系统」,每周更新企业管理 + 数据库思维的实战案例,带你真正把Myexcel做成管理系统。
建议加星标 ⭐,这样就不会错过更新了。
夜雨聆风