
Mẫu appsheet master detail (AppSheet gọi là Item-Detail) là cách dùng hai bảng: bảng cha «Đơn hàng» và bảng con «Chi tiết đơn», nối với nhau bằng cột Ref (cột tham chiếu sang bảng khác). Khi bật thêm tuỳ chọn Is a part of? (IsAPartOf) ở cột Ref, bạn nhập được nhiều món hàng ngay trong form của một đơn. Bài này dựng mẫu đó cho app «Bán hàng 5F»; video bên dưới làm mẫu từng bước, còn bài viết vẫn đủ để bạn làm theo mà không cần xem video.
Item-detail (appsheet master detail) là gì và gặp ở đâu?
Item-detail là mẫu thiết kế dữ liệu trong đó một bản ghi «cha» có nhiều bản ghi «con». Đơn hàng có nhiều dòng hàng, máy móc có nhiều lần kiểm tra, bài báo có nhiều nhận xét. Theo tài liệu chính thức của AppSheet, đây là một trong những mẫu thiết kế dữ liệu phổ biến nhất, gần như app có ý nghĩa nào cũng dùng ở dạng nào đó.
Với người mới, cám dỗ lớn nhất là nhét nhiều sản phẩm vào một ô, hoặc tạo các cột «Sản phẩm 1», «Sản phẩm 2», «Sản phẩm 3». Cả hai cách đều khó cộng tiền, khó lọc và bị giới hạn số món. Cách đúng là mỗi món một dòng ở bảng riêng, trỏ về đơn bằng Ref. Nếu chưa rõ khái niệm bảng, cột, khoá, hãy đọc bài Dữ liệu AppSheet hoạt động thế nào: data source, table, column.
Cách gọi «bảng cha con appsheet» và «master detail» chỉ là hai tên của cùng một ý tưởng: bảng cha giữ thông tin chung (khách, ngày), bảng con giữ từng dòng chi tiết.

Dựng hai bảng cho app bán hàng như thế nào?
Bạn cần hai bảng: Đơn hàng (cha) và Chi tiết đơn (con), con có một cột Ref trỏ về cha. Mẫu trong tài liệu Google dùng bảng Order (Id, Customer Name, Date) và LineItem (Id, OrderId là Ref, Product ID là Ref, Quantity, Cost). Áp vào cửa hàng tạp hoá, tôi đặt cột như sau:
| Bảng | Cột | Kiểu / vai trò |
|---|---|---|
| Đơn hàng | Mã đơn | Key (khoá chính) |
| Đơn hàng | Ngày | Date |
| Đơn hàng | Khách hàng, Nhân viên | Ref (tới bảng Khách hàng, Nhân viên) |
| Đơn hàng | Trạng thái | Enum (danh sách chọn) |
| Đơn hàng | Tổng tiền | Virtual column (cột ảo) |
| Chi tiết đơn | Mã dòng | Key, giá trị ban đầu UNIQUEID() |
| Chi tiết đơn | Mã đơn | Ref → Đơn hàng |
| Chi tiết đơn | Sản phẩm | Ref → Sản phẩm |
| Chi tiết đơn | Số lượng, Đơn giá, Thành tiền | Number / Price |
Thứ tự nhập là: tạo đơn với thông tin khách trước, rồi thêm một hay nhiều dòng hàng vào đơn vừa tạo. Cách chọn khoá và quyền thêm/sửa/xoá của bảng xem ở bài Table AppSheet: quyền Adds/Updates/Deletes và private table.

IsAPartOf trong AppSheet là gì và khi nào nên bật?
IsAPartOf là tuỳ chọn Is a part of? trên cột Ref, cho AppSheet biết dòng con «thuộc về» dòng cha, tức quan hệ sở hữu. Chỉ bật khi dòng con không có nghĩa nếu đứng một mình: một dòng hàng không có đơn là vô nghĩa, nên rất hợp. Theo tài liệu về Is a part of?, các bước làm là:
- Vào Data, chọn bảng Chi tiết đơn.
- Mở cột Mã đơn (kiểu Ref).
- Bật Is a part of? rồi lưu.
Hệ quả khi bật isapartof appsheet:
- Form Đơn hàng cho thêm/sửa dòng chi tiết ngay trong form, không phải rời form.
- Cả form nhiều dòng được coi là một lần cập nhật.
- Xoá đơn thì các dòng chi tiết bị xoá theo. Việc xoá kèm này không kích hoạt automation (xem tài liệu về xoá dòng con).
Lưu ý: việc thêm/sửa dòng trong form vẫn bị giới hạn bởi quyền của bảng hoặc Slice (lát cắt dữ liệu) Chi tiết đơn. Nếu bảng này không cho Adds thì form đơn cũng không thêm được dòng.
Làm sao thêm nhiều sản phẩm vào đơn trên một form?
Sau khi bật IsAPartOf, bạn nhập cả đơn và các món trên cùng một form. AppSheet tự sinh view dạng _Inline cho bảng có Ref tới bảng khác để hiện lồng trong form. Các bước thêm nhiều sản phẩm vào đơn appsheet:
- Mở form Đơn hàng, chọn Khách hàng.
- Kéo xuống mục Related Chi tiết đơns, đang hiện ngay trong form.
- Bấm New để thêm từng món, ví dụ Gạo thơm túi 5kg × 3, rồi Dầu ăn chai 1L × 6.
- Bấm Save ở form đơn để lưu cả đơn lẫn các dòng.
Dòng con của đơn đã có sẵn Mã đơn nên nhân viên không phải chọn lại. Ngược lại, nếu bấm Cancel ở form đơn, các dòng con đang thêm hoặc sửa dở cũng bị huỷ luôn. Hãy nhắc nhân viên bán hàng điều này.

Kéo thông tin từ đơn xuống dòng con bằng dereference
Dereference là việc dòng con lấy giá trị của dòng cha qua cột Ref, viết dạng [Cột Ref].[Cột cần lấy]. Ví dụ trong tài liệu Google: dòng hàng tính SubTotal bằng [Cost] * [Quantity] * [OrderId].[SalesTax].
Áp vào app của mình, giả sử đơn có thêm cột Chiết khấu (kiểu Percent). Đây là ví dụ mở rộng: app demo gốc chưa có cột này. Cột Thành tiền của Chi tiết đơn có thể là:
[Số lượng] * [Đơn giá] * (1 - [Mã đơn].[Chiết khấu])
Chủ cửa hàng đổi chiết khấu một lần trên đơn, mọi dòng hàng tự tính lại, khỏi sửa từng dòng. Cách đặt công thức cho cột xem ở bài App formula và Initial value.
Cộng tổng tiền lên đơn cha bằng virtual column
Muốn có Tổng tiền trên đơn, tạo một virtual column ở bảng Đơn hàng rồi cộng các Thành tiền của dòng con. Theo đúng mẫu của Google (bảng Order có cột Total):
SUM(SELECT(Chi tiết đơn[Thành tiền], [Mã đơn] = [_THISROW].[Mã đơn]))
Hoặc gọn hơn, dùng danh sách dòng con liên quan:
SUM([Related Chi tiết đơns][Thành tiền])
Khác biệt: SELECT() lọc bảng theo điều kiện bạn tự viết, còn REF_ROWS() (và cột Related) lấy sẵn các dòng con trỏ về dòng hiện tại qua cột Ref. Với đơn hàng, hai cách cho kết quả như nhau; cách thứ hai ngắn và khó gõ sai điều kiện. Virtual column tính lại khi cần nên có cái giá về tốc độ, xem bài về virtual column.
Giới hạn cần biết trước khi bật IsAPartOf
Có ba giới hạn chính: mỗi bảng chỉ một cột Ref được đánh IsAPartOf, inline view trong form không hiện action, và huỷ form là huỷ cả dòng con chưa lưu. So sánh nhanh:
| Tiêu chí | Ref thường | Ref có IsAPartOf |
|---|---|---|
| Nhập dòng con | Phải rời form cha để thêm | Thêm/sửa ngay trong form cha |
| Xoá dòng cha | Dòng con không bị xoá theo | Dòng con bị xoá theo, không kích hoạt automation |
| Số cột cho phép | Không giới hạn trong mẫu này | Một cột mỗi bảng |
| Action | Bình thường | Inline view trong form không hiện action và không chạy action theo sự kiện view |
| Huỷ form cha | Không ảnh hưởng dòng con đã lưu | Huỷ luôn dòng con đang thêm/sửa dở |
Một bảng có nhiều cột IsAPartOf không? Không, vì một dòng chỉ thuộc về một dòng khác. Muốn Chi tiết đơn vừa thuộc Đơn hàng vừa trỏ tới Sản phẩm, chỉ bật IsAPartOf ở Mã đơn; Sản phẩm giữ là Ref thường. Sản phẩm vẫn tồn tại độc lập, xoá một dòng hàng không làm mất sản phẩm.

Tóm tắt và bước tiếp theo
Tóm lại, appsheet master detail gồm bảng cha, bảng con và cột Ref nối hai bảng. Bật IsAPartOf cho cột Mã đơn khi dòng hàng không có nghĩa nếu thiếu đơn, để nhập nhiều món trên một form, lưu một lần và xoá kèm. Thành tiền dùng dereference, Tổng tiền dùng virtual column.
Bạn tự làm theo thứ tự này: (1) tạo hai bảng với cột Ref; (2) bật Is a part of? ở Mã đơn; (3) nhập thử đơn có hai món rồi Save; (4) thêm công thức Thành tiền và Tổng tiền; (5) thử xoá một đơn mẫu để thấy dòng con biến mất theo. Hãy thử trên dữ liệu thử, chưa dùng ngay dữ liệu thật.
Xem thêm
Tài liệu gốc về mẫu này: Item-Detail trên trang trợ giúp AppSheet. Bạn nên đối chiếu thêm vì giao diện và tuỳ chọn có thể thay đổi.
Câu hỏi thường gặp
›IsAPartOf trong AppSheet là gì?
IsAPartOf là tuỳ chọn Is a part of? trên cột Ref, thể hiện quan hệ sở hữu: dòng con thuộc về dòng cha. Chỉ nên bật khi dòng con không có nghĩa nếu đứng một mình, như dòng hàng không có đơn. Khi bật, bạn thêm/sửa dòng con ngay trong form của dòng cha.
›Làm sao nhập nhiều sản phẩm trong cùng một form đơn hàng?
Bật Is a part of? ở cột Mã đơn của bảng Chi tiết đơn. Sau đó mở form Đơn hàng, chọn khách, bấm New ở mục Related Chi tiết đơns để thêm từng món, rồi bấm Save. Dòng con đã có sẵn Mã đơn nên không phải chọn lại.
›Xoá đơn hàng thì chi tiết đơn có mất theo không?
Có, nếu cột Mã đơn đã bật Is a part of?. Các dòng chi tiết bị xoá theo đơn cha. Nếu chỉ là Ref thường thì dòng con không bị xoá kèm.
›Bot có chạy khi chi tiết đơn bị xoá theo đơn không?
Không. Theo tài liệu AppSheet, việc xoá dòng con kèm dòng cha không kích hoạt automation rules. Nếu cần ghi log hay thông báo, hãy làm ở bước xoá đơn thay vì trông vào việc xoá các dòng con.
›Một bảng có được nhiều cột IsAPartOf không?
Không, mỗi bảng chỉ một cột Ref được đánh IsAPartOf, vì một dòng chỉ thuộc về một dòng khác. Các cột Ref còn lại, như Sản phẩm, giữ là Ref thường.
Tác giả
Chuyên gia chuyển đổi số · Đại diện 5F Edu
Hơn 8 năm triển khai và tư vấn chuyển đổi số cho doanh nghiệp vừa và nhỏ: chuẩn hoá quy trình, xây phần mềm quản lý bằng AppSheet và web app, tự động hoá bằng N8N. Người làm kênh YouTube Nghiện AppSheet.



