Tạo View, Action & Automation Cho App Bán Hàng (P.2)

app quan ly ban hang nhap xuat ton

Ở Phần 1 Tự Tay Xây App Quản Lý Bán Hàng Bằng AppSheet mình đã dựng xong cấu trúc dữ liệu và khung sườn app. Sang Phần 2, mục tiêu chính là làm cho các bảng dữ liệu “nói chuyện” được với nhau: công nợ tự tính đúng số dư, đổi tên khách hàng ở một chỗ thì mọi nơi khác tự cập nhật theo, tồn kho tự trừ cộng theo phiếu nhập/xuất – tất cả nhờ vào App Formula, Action và Automation (bot tự động) của AppSheet.

Thêm cột “Tính tiền” để công nợ có dấu âm/dương

Ban đầu cột Số tiền trong bảng Công nợ khách hàng và Công nợ nhà cung cấp luôn là số dương, dù giao dịch là tăng hay giảm công nợ. Vậy nên không thể cộng dồn trực tiếp để ra số dư.

Giải pháp: thêm một cột mới tên Tính tiền (kiểu Number) ở cả hai bảng công nợ, với App Formula dạng:

IF([Loại giao dịch] = "Tăng công nợ", [Số tiền], [Số tiền] * -1)

Nghĩa là: tăng công nợ thì giữ nguyên số dương, giảm công nợ thì tự động chuyển thành số âm. Nhờ vậy sau này chỉ cần cộng (SUM) cột Tính tiền là ra đúng số dư thực tế.

Video P2 hướng dẫn tạo ứng dụng quản lý bán hàng bằng appsheet

Nhóm (Group) view công nợ để xem số dư theo từng khách hàng

Vào view Công nợ khách hàng, thiết lập:

  • Sort by: Ngày (giảm dần – mới nhất lên trên)
  • Group by theo thứ tự: Mã khách hàng → Loại giao dịch → Ngày
  • Ở phần Group aggregate, chọn Sum của cột Tính tiền

Kết quả: mở view lên là thấy ngay từng khách hàng còn nợ bao nhiêu, thay vì phải cộng tay từng dòng. Làm tương tự cho view Công nợ nhà cung cấp.

Vấn đề: đổi tên khách hàng nhưng dữ liệu liên quan không tự cập nhật

Khi sửa tên một khách hàng (ví dụ “anh Phong” → “anh Phong Đồng Tháp”) trong bảng Khách hàng, các bảng Công nợ khách hàng và Phiếu xuất không tự đổi tên theo, vì lúc tạo dòng dữ liệu, App Formula chỉ lấy tên tại thời điểm đó rồi lưu cứng vào ô, chứ không tự “nghe” khi bảng gốc thay đổi.

Giải pháp gồm hai bước: Action (lệnh cập nhật) + Automation (bot tự động chạy lệnh đó mỗi khi có thay đổi).

Tạo Action “Cập nhật” cho từng bảng

Ở mỗi bảng có cột Cập nhật, tạo một Action kiểu Data: set the values of some columns in this row, chỉ set cột Cập nhật bằng NOW(). Việc này chỉ đơn giản là “chạm” vào dòng dữ liệu để force nó tính lại các App Formula liên quan. Tạo action tương tự cho: Sản phẩm, Khách hàng, Nhà cung cấp, Công nợ khách hàng, Công nợ nhà cung cấp, Phiếu nhập, Phiếu nhập chi tiết, Phiếu xuất, Phiếu xuất chi tiết.

Tạo Automation “Cập nhật tên khách hàng”

Vào Automation > Create a Bot:

  • Event: khi bảng Khách hàng có thay đổi, chỉ bắt sự kiện Update (không cần Add/Delete vì lúc đó chưa có gì để đồng bộ).
  • Step 1 – Run a data action on Công nợ khách hàng, dùng công thức:
SELECT(Công nợ khách hàng[ID], [Mã khách hàng] = [_THISROW].[ID])

rồi gọi Action “Cập nhật công nợ khách hàng” đã tạo ở trên – tức là tìm tất cả các dòng công nợ có Mã khách hàng trùng với khách hàng vừa sửa, rồi ép chúng tính lại tên.

  • Step 2 – Run a data action on Phiếu xuất, dùng cùng logic:
SELECT(Phiếu xuất[ID], [Mã khách hàng] = [_THISROW].[ID])

rồi gọi Action “Cập nhật phiếu xuất”.

Đặt tên bot là “Cập nhật tên khách hàng” để sau này dễ bảo trì.

Tạo Automation “Cập nhật tên nhà cung cấp”

Làm tương tự: Event là bảng Nhà cung cấp có Update, hai bước cập nhật sang Công nợ nhà cung cấp và Phiếu nhập, cùng dùng SELECT() lọc theo Mã nhà cung cấp = ID vừa sửa.

Kiểm tra lại bằng cách đổi tên một khách hàng và một nhà cung cấp – các bảng công nợ và phiếu nhập/xuất liên quan đổi tên theo ngay lập tức.

Đưa Tổng số lượng và Tổng giá trị từ phiếu chi tiết ra phiếu chính

Ở Phiếu nhập (bảng cha), hai cột Tổng số lượng và Tổng giá trị cần tự cộng từ các dòng trong Phiếu nhập chi tiết (bảng con) tương ứng. Công thức:

SUM(SELECT(Phiếu nhập chi tiết[Số lượng], [ID phiếu nhập] = [_THISROW].[ID]))

và tương tự cho Tổng giá trị, chỉ đổi Số lượng thành Thành tiền. Làm y hệt cho cặp Phiếu xuất / Phiếu xuất chi tiết.

Vì đây là quan hệ cha–con nên khi viết công thức cần đúng cú pháp lồng bảng (Tên bảng con[Tên cột]) để AppSheet hiểu đang duyệt qua các dòng con của dòng cha hiện tại.

Tự động cập nhật khi phiếu chi tiết thay đổi

Công thức trên chỉ tính lại khi người dùng bấm sửa (Edit) thủ công vào phiếu chính. Để tự động, tạo thêm hai Automation:

  • “Cập nhật số lượng và giá trị từ phiếu nhập chi tiết sang phiếu nhập”: Event là bảng Phiếu nhập chi tiết có Add/Update/Delete → chạy Action cập nhật trên Phiếu nhập, với điều kiện:
SELECT(Phiếu nhập[ID], [ID] = [_THISROW].[ID phiếu nhập])
  • “Cập nhật số lượng và giá trị từ phiếu xuất chi tiết sang phiếu xuất”: làm tương tự với cặp Phiếu xuất / Phiếu xuất chi tiết.

Test thử: thêm một dòng sản phẩm mới vào phiếu nhập chi tiết, hoặc xóa bớt một dòng – Tổng số lượng và Tổng giá trị ở phiếu chính tự động cộng/trừ theo ngay, không cần vào sửa tay phiếu chính nữa.

Đưa tổng công nợ ra bảng Khách hàng và Nhà cung cấp

Muốn khi mở bảng Khách hàng là thấy luôn cột Công nợ hiện số dư hiện tại, không cần qua bảng công nợ riêng để tra. Bước đầu thử công thức:

SUM(SELECT(Công nợ khách hàng[Tính tiền], TRUE))

nhưng công thức này bị sai vì nó cộng Tính tiền của tất cả khách hàng gộp chung, chứ không lọc riêng cho từng khách. Sửa lại bằng cách thêm điều kiện lọc theo mã khách hàng:

SUM(SELECT(Công nợ khách hàng[Tính tiền], [Mã khách hàng] = [_THISROW].[ID]))

Làm tương tự cho cột Công nợ ở bảng Nhà cung cấp, lọc theo Mã nhà cung cấp.

Tự động cập nhật số dư khi công nợ thay đổi

Tạo thêm 2 Automation:

  • “Cập nhật số dư công nợ khách hàng ra bảng khách hàng”: Event là bảng Công nợ khách hàng có Add/Update/Delete → Action cập nhật trên bảng Khách hàng, lọc [ID] = [_THISROW].[Mã khách hàng].
  • “Cập nhật số dư công nợ nhà cung cấp ra bảng nhà cung cấp”: tương tự cho Nhà cung cấp.

Sau khi test, mở bảng Khách hàng lên là thấy đúng số nợ còn lại của từng người, cập nhật theo thời gian thực mỗi khi có giao dịch công nợ mới.

Tính tồn kho tự động cho bảng Sản phẩm

Ban đầu có ý định giữ cả cột Giá trị tồn (để ước lượng lời/lỗ), nhưng công thức lấy tổng giá trị nhập trừ tổng giá trị xuất dễ gây hiểu nhầm (ví dụ nhập giá thấp nhưng bán giá cao thì con số hiển thị không phản ánh đúng lợi nhuận thực). Vậy nên bỏ cột Giá trị tồn, chỉ giữ lại cột Tồn kho (số lượng) với công thức:

SUM(SELECT(Phiếu nhập chi tiết[Số lượng], [Mã sản phẩm] = [_THISROW].[ID]))
-
SUM(SELECT(Phiếu xuất chi tiết[Số lượng], [Mã sản phẩm] = [_THISROW].[ID]))

Tức là tổng nhập trừ tổng xuất của đúng mã sản phẩm đó.

Tự động cập nhật tồn kho khi có phiếu nhập/xuất mới

Tạo 2 Automation:

  • “Cập nhật số lượng tồn sản phẩm khi nhập kho”: Event là Phiếu nhập chi tiết có Add/Update/Delete → Action cập nhật trên bảng Sản phẩm, lọc [ID] = [_THISROW].[Mã sản phẩm].
  • “Cập nhật số lượng tồn sản phẩm khi xuất kho”: tương tự cho Phiếu xuất chi tiết.

Test lại bằng cách nhập thêm hàng và xuất bán thử – cột Tồn kho ở bảng Sản phẩm tự cộng/trừ đúng ngay khi lưu phiếu, không cần thao tác gì thêm.

Kết luận

Sau Phần 2, hệ thống đã có thể tự vận hành ở mức cơ bản:

  • Công nợ khách hàng/nhà cung cấp tự tính đúng số dư (tăng/giảm) và hiện tổng ngay trên bảng Khách hàng, Nhà cung cấp.
  • Đổi tên khách hàng, nhà cung cấp ở một nơi thì mọi bảng liên quan tự cập nhật theo.
  • Tổng số lượng, tổng giá trị của mỗi phiếu nhập/xuất tự cộng từ các dòng chi tiết.
  • Tồn kho sản phẩm tự trừ/cộng theo từng phiếu nhập, phiếu xuất- không cần tính tay.

Ở Phần 3, sẽ đi vào việc ràng buộc trạng thái phiếu: khi một phiếu đã chuyển sang “Đã khóa” thì không ai được sửa hoặc xóa nữa, đảm bảo dữ liệu lịch sử không bị thay đổi ngoài ý muốn. Hẹn gặp lại các bạn ở phần tiếp theo!

Hoặc xem trên Youtube: P2.Tự tạo phần mềm quản lý bán hàng nhập xuất tồn kho, quản lý công nợ và khách hàng bằng appsheet

Chúc thành công

Để lại một bình luận

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *