Làm thế nào để lấy số dư trong cùng 1 bảng.

dtngoc

Member
Hội viên mới
Thưa các huynh, muội đang làm một bài kiểm tra về kế toán bằng Access. Bài của muội có 1 bảng gồm các cột như sau:

|Số tiền thu chính| | Số tiền thu khác | | Số tiền trả lại | | Số dư|

Trong đó: Số dư = (Số tiền thu chính + Số tiền thu khác) - Số tiền trả lại

Vậy, muội mong được các huynh chỉ muội cách làm công thức trên trong VBA, kết quả trên không những chỉ thể hiện trên form mà còn đi vào bảng dữ liệu nữa ah.
Muội xin cảm ơn các huynh!
 
Sửa lần cuối:
Ðề: Làm thế nào để lấy số dư trong cùng 1 bảng.

Với những dạng dữ liệu đơn giản thế này không cần thiết phải dùng VBA.
Bản thân công thức em viết trên đã dùng được rồi, nhét nó vào query để lọc cho nhanh
 
Ðề: Làm thế nào để lấy số dư trong cùng 1 bảng.

Nhưng anh ơi, em đã làm qua Query rồi nhưng sao kết quả lại không có trong bảng ah.
Cụ thể thế này nha, em làm 1file Server (chỉ có bảng), 1file Client (có tất cả mọi thứ ngoại trừ bảng). Client link đến Server để lấy dữ liệu (vì một cơ quan có thể có nhiều hơn 1 máy tính). Như thế, nếu em chỉ để ở Query thì nghe chừng không hay lắm.
Thế anh chỉ em cách làm bằng Query nhưng số liệu lại đi vào bảng nhé:
SoDu = PSTang1 + PSTang2 -PSGiam
Trong đó SoDu trong bảng có kết quả như phép tính ở trên.
Query hay VBA cũng được anh ah, miễn sao trong bảng cũng có số liệu từ phép toán đó.
Cảm ơn anh!
 
Sửa lần cuối:
Ðề: Làm thế nào để lấy số dư trong cùng 1 bảng.

Giả sử đã có table1 gồm các cột: MaKH, thuchinh, thuphu, trave
Làm cái query:
SELECT *, thuchinh+thuphu-trave AS sodu FROM table1
 
Ðề: Làm thế nào để lấy số dư trong cùng 1 bảng.

Dạ em đã làm theo như cách của anh muontennguoi.
Nhưng anh ơi, kết quả cũng chỉ thể hiện trên Query thôi anh ah, mà em vào trong table thì ko có kết quả đó.
Thế có cách nào khác không ah?hay em làm như thế không đúng.
 
Sửa lần cuối:
Ðề: Làm thế nào để lấy số dư trong cùng 1 bảng.

Về nguyên tắc thì không lưu nếu nó không phải là "cơ sở" (chữ BASE trong database).

Các số thu chính, thu phụ, travề mới là cơ sở (để tính toán ra các kết quả khác). Chỉ có chúng mới được lưu vào data.

Rộng hơn: những con số thu, chi là căn cứ vào giấy tờ mà người ta (khách hàng, thủ quỹ, Giám đốc...) đã ký vào -> nhập vào máy.
Những con số không có ai ký nhận thì có lưu vào máy cũng không có giá trị.

Nó giống như trong Excel: các cột A,B, C là ghi các giá trị thực còn cột D (ghi số dư) thì chỉ là công thức "=A1+B1-C1" chứ không phải là giá trị thực.


Nếu muốn lưu vào table thì mở query đó ra -> duyệt dọc theo query đó -> đọc từng record của query -> inert vào table.
(Chú ý: vì đảm bảo toàn vẹn cơ sở dữ liệu -> chỉ ghi vào table nháp, không ghi vào table cũ).
 
Ðề: Làm thế nào để lấy số dư trong cùng 1 bảng.

Thế ah anh!
Vậy thì tóm lại, để toàn vẹn cơ sở dữ liệu thì Số dư kia không lằm trong table mà nó lại lằm trong Query.
Vì mỗi khi Thu chính, Thu thêm hay Trả lại đề có trong table. Còn mỗi cái ông Số dư kia thì không có ---->> Vậy khi em làm Report thì cũng lấy dữ liệu từ Query chứ ko phải từ table, phải không anh?
 
Ðề: Làm thế nào để lấy số dư trong cùng 1 bảng.

Nếu nâng lên 1 bước yêu cầu công việc nữa thì ta thấy rằng các khoản thu - chi tiền là tổng hợp của nhiều lần phát sinh trong 1 kỳ.
Nghĩa là trong bảng để in ra đó các số liệu cũng là do tổng của các Phiếu thu - chi hàng ngày.
Bảng ta in ra là bảng báo cáo 1 kỳ (tháng hoặc quý, năm ...gì đó).
Như thế bảng này cũng chỉ là bảng nháp mà thôi.
Khi báo cáo tháng thì ta tính tổng số "thu chính", "thu phụ", "trả lại" từ 1 bảng gốc lưu số phát sinh của từng lần phát sinh trong kỳ.
Và giả sử, ta cần báo cáo 17 ngày của tháng thì ta tính tổng từ ngày 1 đến ngày 17 và update số tổng đó vào bảng để in ở trên ...
Việc này ta chỉ cần viết 1 đoạn code. Khi báo cáo thì máy sẽ tính toán.
Đừng lo nó tính nhiều sẽ mệt. Máy chỉ tính trong chớp mắt là có kết quả thôi.

Túm lại : các số trong bảng này chỉ là số do tính toán mà có. Và chúng thay đổi theo kỳ của báo cáo cần in.
Không cần lưu xuống đĩa. Khi cần báo cáo thì bắt máy tính lại.

===========
Cái ta cần lưu trong data lại là bảng lưu các số phát sinh kìa.
Nó là bảng lưu nội dung các chứng từ (bằng giấy trắng mực đen, ký tá đầy đủ...).
Bảng lưu số phát sinh này mới đủ nghĩa "base". Đó sẽ là bảng mà ta cần giữ gìn bảo quản như giữ gìn con ngươi trong mắt mình.
Mất mát hư hỏng dữ liệu đó là chỉ có nước cuốn gói mà đi thôi.
 
Ðề: Làm thế nào để lấy số dư trong cùng 1 bảng.

Vậy anh ơi, anh viết một code cho em xem đi ah. Từ đó em học hỏi và chế biến thành của mình.
Thật lòng mà nói, em đang tự mày mò nghiên cứu nên chưa có hiểu biết gì nhiều, mà đang tự học qua các ví dụ của anh hay của anh chị khác. Từ đó đúc kết thành điều mình cần.

Cảm ơn anh!
 
Ðề: Làm thế nào để lấy số dư trong cùng 1 bảng.

Nếu lấy 1 ví dụ đầy đủ thì nó sẽ như đám rừng.
Vì vậy tôi nghĩ là ta nên cùng làm từ cái ban đầu. Trong quá trình đó bạn sẽ dễ theo dõi hơn.

Để bắt đầu ta nên làm cái dễ: truy vấn dữ liệu.

Kèm theo đây là 3 file:
1 file là data với một ít số liệu để làm mẫu.
1 file SOKT.adp là ví dụ về connect vào data để lấy số liệu về số phát sinh của 1 TK
1 file SOKT2.adp là cái form cũ và có thêm thắt 1 ít. Hãy so sánh với cái cũ trong SOKT.adp để theo dõi phần đoạn mới thêm.

http://www.webng.com/soicon/soketoan.rar
 
Ðề: Làm thế nào để lấy số dư trong cùng 1 bảng.

Từ form SOKT2.adp giới hạn chỉ truy vấn số liệu của TK1111, thêm thắt 1 ít để tạo ra 1 cái form và save thành SOKT3.adp để truy vấn Sổ Cái Tài Khoản.
Để thuận tiện, trong data nên tạo sẵn câu query mà kết quả của nó sẽ có hình dáng mẫu sổ cái mà ta sẽ cần để in ra sau này.

Hãy tạo 1 query mới trong data và đặt tên là socaiTK: (Về sau trong Access ta chỉ cần gọi " SELECT * FROM socaiTK")
SELECT sdps2004.QUY, sdps2004.CTU,sdps2004.SO, sdps2004.NGAY, sdps2004.NOIDUNG, sdps2004.TEN, sdps2004.TKNO as TK, sdps2004.MSNO as MS, sdps2004.TIEN as TIENNO, 0 as TIENCO, sdps2004.TKCO as TKDOIUNG
FROM sdps2004
UNION ALL SELECT sdps2004.QUY, sdps2004.CTU, sdps2004.SO, sdps2004.NGAY, sdps2004.NOIDUNG, sdps2004.TEN, sdps2004.TKCO as TK, sdps2004.MSCO as MS, 0 as TIENNO, sdps2004.TIEN as TIENCO, sdps2004.TKNO as TKDOIUNG
FROM sdps2004;

http://www.webng.com/soicon/soketoan3.rar
 
Ðề: Làm thế nào để lấy số dư trong cùng 1 bảng.

Hôm nay ta làm tiếp Bảng cân đối số phát sinh.
http://webng.com/soicon/soketoanBCD.rar

Trong phần này ta sẽ dùng Command Object để gọi thực hiện 1 query trong Access (đối với SQL server thì nó gọi là Stored Procedure).
Mục đích dùng Command Object (thay vì Recordset) là vì cần truyền tham số xuống cho query.

Cụ thể là trong data ta sẽ tạo thêm các query sau (ngoài cái query socaiTK đã có ở phần trước):
Query: BCD_DK (để lấy số 2 cột SDDK Nợ - Có - kết xuất từ query socaiTK mà ta đã tạo trước đó)
SELECT socaiTK.TK, sum(socaiTK.TIENNO-socaiTK.TIENCO) AS spsNO, 0 AS spsCO
FROM socaiTK
WHERE socaiTK.QUY<parakydau
GROUP BY socaiTK.TK
HAVING sum(socaiTK.TIENNO-socaiTK.TIENCO)>0
UNION ALL SELECT socaiTK.TK, 0 AS spsNO, sum(-socaiTK.TIENNO+socaiTK.TIENCO) AS spsCO
FROM socaiTK
WHERE socaiTK.QUY<parakydau
GROUP BY socaiTK.TK
HAVING sum(-socaiTK.TIENNO+socaiTK.TIENCO)>0;
Query: BCD_CK (lấy 2 cột SDCK Nợ - Có, tương tự như BCD_DK)
SELECT socaiTK.TK, sum(socaiTK.TIENNO-socaiTK.TIENCO) AS spsNO, 0 AS spsCO
FROM socaiTK
WHERE socaiTK.QUY<=parakycuoi
GROUP BY socaiTK.TK
HAVING sum(socaiTK.TIENNO-socaiTK.TIENCO)>0

UNION ALL SELECT socaiTK.TK, 0 AS spsNO, sum(-socaiTK.TIENNO+socaiTK.TIENCO) AS spsCO
FROM socaiTK
WHERE socaiTK.QUY<=parakycuoi
GROUP BY socaiTK.TK
HAVING sum(-socaiTK.TIENNO+socaiTK.TIENCO)>0;
Query: BCD_PS (tất nhiên là dể lấy 2 cột TongSPS Nợ - Có phát sinh trong kỳ)
SELECT socaiTK.TK, sum(socaiTK.TIENNO) AS spsNO, sum(socaiTK.TIENCO) AS spsCO
FROM socaiTK
WHERE socaiTK.QUY>=parakydau And socaiTK.QUY<=parakycuoi
GROUP BY socaiTK.TK;

Vậy là đã đủ 6 cột của Bảng Cân Đối Số Phát Sinh, chỉ cần Join chúng lại với bảng danh mục Hệ Thống Tài Khoản là xong.
Hãy làm nốt cái query nối chúng lại:
Query: BCD_TK
SELECT httk.tk, httk.ten, BCD_DK.spsNO AS SDDKNO, BCD_DK.spsCO AS SDDKCO, BCD_PS.spsNO, BCD_PS.spsCO, BCD_CK.spsNO AS SDCKNO, BCD_CK.spsCO AS SDCKCO
FROM ((httk LEFT JOIN BCD_DK ON httk.tk=BCD_DK.TK) LEFT JOIN BCD_PS ON httk.tk=BCD_PS.TK) LEFT JOIN BCD_CK ON httk.tk=BCD_CK.TK
WHERE BCD_DK.spsNO<>0 Or BCD_DK.spsCO<>0 Or BCD_PS.spsNO<>0 Or BCD_PS.spsCO<>0 Or BCD_CK.spsNO<>0 Or BCD_CK.spsCO<>0;

Dĩ nhiên là khi ta gọi query BCD_TK thì nó sẽ gọi dắt dây các query BCD_DK, BCD_CK, BCD_PS và socaiTK, sdps2004 ... và rồi cuối cùng cũng sẽ gọi mở data thực là 3 cái table HTTK, ps2004, sd2004.
Và cũng dĩ nhiên là khi đụng đến các query BCD_DK, BCD_CK, BCD_PS thì máy sẽ hỏi giá trị các tham số parakydau , parakycuoi
Trong bcdsps.adp bạn sẽ thấy cách truyền tham số (parameter) xuống cho 1 query.
Kết quả trả về của Command Object là 1 dạng recordset và ta sẽ gán nó vào form.
 
Ðề: Làm thế nào để lấy số dư trong cùng 1 bảng.

Mùi đời cần biết là:

Hãy tận dụng mệnh đề WHERE.
Chính vì trong Where đã loại trước các record không tham dự vào việc tính toán ra kết quả nên sẽ giúp nó tính toán nhanh hơn.

Đặt sẵn các query mà sau này có thể gọi lại nó trong các tình huống khác.
Lưu ý: vẫn phải đảm bảo ý nghĩa đối tượng quản lý của query đó.
Như ví dụ trên thì query socaiTK bản thân nó chính là tổng hợp của tất cả các sổ cái và nó cũng được gọi lại khi tính BCDSPS.
Các query khác cũng thế. Việc đảm bảo ý nghĩa dai diện cho 1 lớp đối tượng nào đó giúp nó còn tồn tại theo thời gian.
Cố gắng đặt các query mà sau này có thể sẽ dùng lại.
Thay vì đặt 1 query dài thì cố đặt thành vài query ngắn để dễ dùng lại và cũng dễ kiểm tra lỗi.

Hạn chế dùng recordset object vì thao tác trên đó rất chậm.
Nếu recordset tươgn đối nhỏ thì nên đổ nó ra mảng để xử lý. DÙng hàm GetRows.
Với mảng có thể nhảy ngay đến ô dữ liệu cần (ví dụ msgbox(a_httk(m,n)) <- lấy ngay giá trị dòng m, cột n).
Nếu dùng recordset thì con trỏ bản ghi sẽ phải đi dọc theo recordset đến dòng cần tìm, nó sẽ di chuyển từng bước từng bước như vậy. Chưa kể nếu phải đi xuống rồi lại đi lên thì sẽ rất chậm.

Cố gắng đóng thật nhanh connection để máy nhẹ hơn.
Dĩ nhiên nếu cần mở liên tục thì ngược lại: nên dồn hết các việc lấy dữ liệu vào cùng 1 đợt mở data.
Sau khi lấy đủ thì hãy làm tiếp việc khác.
Vì phương pháp như thế nên sẽ đòi hỏi sử dụng thành thạo Command object sẽ dùng trong các thao tác thêm, xoá, sửa data.


1 vài kinh nghiệm nhỏ, trao đổi cùng các bạn.
 
Ðề: Làm thế nào để lấy số dư trong cùng 1 bảng.

Chà chà .... mênh mông biển cả quá anh ơi. Có lẽ em phải làm theo các thủ công (được hướng dẫn trên ketoanvoiaccess).
Điều này chắc còn phải làm phiền anh muontennguoi cũng như các anh chị khác hơi bị nhiều đây.
 

CẨM NANG KẾ TOÁN TRƯỞNG


Liên hệ: 090.6969.247

KÊNH YOUTUBE DKT

Cách làm file Excel quản lý lãi vay

Đăng ký kênh nhé cả nhà

SÁCH QUYẾT TOÁN THUẾ


Liên hệ: 090.6969.247

Top