我正在尝试设计一个记录手动付款的系统,例如支票,Chaps,Bacs。
我正在努力解决的是如何连接点,在我离开应用程序的时间和我回来的时间之间点击确认
我有一个包含 3 个供应商的发票表。每 3 个都有不同的手动付款方式,具有唯一的 INVNO。
我今天来决定要付款,所以我从发票表中提取发票。我收到一份需要支付的清单。
1. CHEQUE 170 BT
2. CHAPS 300 VIRGIN
3. BACS 10 ORANGE
所以我跑到银行付款,然后回到我的应用程序,记录哪 3 笔付款涵盖了哪些发票。
我希望我输入的支票付款已经完成,此时付款入到付款表中,系统将自动分配一个新的 PAYID,以及使用新的 PAYID 更新发票表以显示 INVNO>PAYID。
问题,因此输入支票,分配新的 PAYID"1",然后转到发票表并使用新的 PAYID 更新第 1、3、6 行。
我迷路的地方是,当我输入付款并获得新身份证时,我如何识别付款所指的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
另一个表怎么样,我们称之为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 = ?