我正在尝试设计一个记录人工付款的系统,例如Check,Chaps,Bacs。
我正在努力的是如何连接点,在我离开应用程序的时间和我回来的时间点击确认
我有一张包含3家供应商的发票表。每个3都有不同的手动支付方式,具有独特的INVNO。
我今天过来决定付款,所以我从INVOICE表中提取发票。 我得到了需要支付的清单。
1. CHEQUE 170 BT
2. CHAPS 300 VIRGIN
3. BACS 10 ORANGE
所以我跑到银行去做这些付款,然后回到我的申请表,记录哪3张付款到哪个发票。
我希望我输入支票付款,此时付款被插入PAYMENT表,系统将自动分配新的PAYID,同时用新的PAYID更新INVOICE表以显示INVNO> PAYID。
问题因此输入CHECK,新的PAYID" 1"如果已分配,则转到INVOICE表并使用新的PAYID更新行1,3,6。
如果我迷路了,当我输入付款并获得新ID时,我如何识别付款所指的INVNO?或者我完全以错误的方式做这件事。
我很困惑如何链接所有2个进程。获取发票清单,确认已经支付了哪些发票而无需手动指定INVNO,因为可能有数百个要处理
INVOICE TABLE
INVNO MERCHANT T AMOUNT METHOD
1 BT 100 CHEQUE
2 VIRGIN 200 CHAPS
3 BT 50 CHEQUE
4 ORANGE 10 BACS
5 VIRGIN 100 CHAPS
6 BT 20 CHEQUE
PAYMENT TABLE
PAYID MERCHANT T AMOUNT
1 CHEQUE 170
2 CHAPS 300
3 BACS 10
INVOICE TABLE
INVNO MERCHANT T AMOUNT METHOD
1 BT 1 100 CHEQUE
2 VIRGIN 2 200 CHAPS
3 BT 1 50 CHEQUE
4 ORANGE 3 10 BACS
5 VIRGIN 2 100 CHAPS
6 BT 1 20 CHEQUE
答案 0 :(得分:0)
另一张桌子怎么样,我们称之为INVOICE_PAYMENT
,由(INVNO, PAYID)
对组成?您可以在将新条目插入PAYMENT
之后立即填充它,这将不再需要AMOUNT
列(因为可以通过加入表和分组来发现);并且现有的表都不需要T
列(因为可以通过加入INVOICE_PAYMENT
来发现)。
CREATE TABLE INVOICE_PAYMENT (
INVNO BIGINT UNSIGNED NOT NULL,
PAYID BIGINT UNSIGNED NOT NULL,
PRIMARY KEY (INVNO, PAYID),
FOREIGN KEY (INVNO) REFERENCES INVOICE (INVNO),
FOREIGN KEY (PAYID) REFERENCES PAYMENT (PAYID)
);
ALTER TABLE INVOICE DROP COLUMN T;
ALTER TABLE PAYMENT DROP COLUMN T, DROP COLUMN AMOUNT;
然后,创建付款:
INSERT INTO PAYMENT (MERCHANT) VALUES ('CHEQUE');
SET @pay_id := LAST_INSERT_ID(); -- or fetch into PHP via your API
INSERT INTO INVOICE_PAYMENT (INVNO, PAYID)
SELECT INVNO, @pay_id FROM INVOICE WHERE METHOD = 'CHEQUE' AND ... ;
要获取给定付款的详细信息,包括已支付的金额:
SELECT PAYMENT.*, SUM(INVOICE.AMOUNT)
FROM INVOICE
JOIN INVOICE_PAYMENT USING (INVID)
JOIN PAYMENT USING (PAYID)
WHERE PAYID = ?
要获取特定发票的详细信息,包括付款:
SELECT *
FROM INVOICE
JOIN INVOICE_PAYMENT USING (INVID)
JOIN PAYMENT USING (PAYID)
WHERE INVID = ?