Hướng dẫn AgentFlow

Bản ghi thực thể (Entity record)

Đọc, tìm kiếm, tạo mới, cập nhật, hoặc upsert một Bản ghi trong Thực thể trực tiếp từ bước quy trình.

Mục đích

Bước Bản ghi thực thể (Entity record) kết nối quy trình với một Thực thể trong hệ thống và thực hiện một trong năm thao tác, chia thành hai nhóm: Đọc — Get one (đọc một bản ghi theo id hoặc khóa nghiệp vụ) và Search (tìm nhiều bản ghi theo bộ lọc); Ghi — Create (luôn tạo bản ghi mới), Update (cập nhật bản ghi theo id), và Upsert (tìm theo khóa nghiệp vụ, tạo mới nếu chưa có). Với các thao tác ghi, bạn chỉ chọn những trường cần ghi và gán giá trị từ biểu mẫu, đầu ra của các bước trước, hoặc giá trị cố định — các trường không được ánh xạ giữ nguyên giá trị hiện có.

Khi nào dùng

  • Đọc một bản ghi nhà cung cấp theo id để hiển thị chi tiết trong bước Trợ lý AI (Agent) hoặc Email tiếp theo.
  • Tìm các bản ghi Đơn mua hàng thỏa một điều kiện lọc (ví dụ: quá hạn thanh toán) để xử lý hàng loạt.
  • Lưu kết quả phê duyệt vào bản ghi nhà cung cấp hoặc hợp đồng.
  • Tạo bản ghi mua hàng mới khi quy trình hoàn tất.
  • Cập nhật trạng thái bản ghi theo id được trả về từ bước trước.
  • Tìm và cập nhật bản ghi theo khóa nghiệp vụ tự nhiên (ví dụ: mã nhà cung cấp) mà không cần biết id nội bộ.

Cài đặt chính

TrườngMô tả
Thực thể (Entity)Thực thể chứa bản ghi cần đọc hoặc ghi (bắt buộc). Với Thực thể hệ thống dựng sẵn (Users, Groups), chỉ Get one và Search khả dụng — các thao tác ghi bị ẩn khỏi danh sách chọn.
Thao tác (Operation)Nhóm Đọc: Get one, Search. Nhóm Ghi: Create, Update, Upsert.
Khớp theo (Match by) — chỉ Get oneId — nhập biểu thức/đường dẫn biến trỏ đến id bản ghi; Key — ánh xạ các trường tạo thành khóa nghiệp vụ trong phần Trường bên dưới.
ID bản ghi (Record id) — Get one theo Id, UpdateBiểu thức hoặc đường dẫn biến trỏ đến id bản ghi cần đọc hoặc cập nhật.
Khớp trên khóa nào — Get one theo Key, UpsertChỉ hiện khi Thực thể khai báo nhiều hơn một khóa nghiệp vụ; chọn khóa dùng để khớp. Các trường tạo thành khóa đã chọn hiển thị dưới dạng huy hiệu.
Bộ lọc (Filters) — SearchCác điều kiện AND: chọn trường, toán tử (là, không phải, chứa, không chứa, bắt đầu bằng, kết thúc bằng, >, ≥, <, ≤, là một trong, không thuộc, trong khoảng, trống, không trống — tùy kiểu trường), và giá trị so sánh.
Tìm kiếm văn bản (Text search) — SearchTừ khóa tự do, quét trên các trường dạng văn bản có thể tìm kiếm của Thực thể.
Sắp xếp theo / Chiều — SearchSắp theo Updated at (mặc định), Created at, hoặc một trường của Thực thể. Trường được đánh dấu Nhạy cảm không thể dùng làm khóa sắp xếp — giá trị sẽ lộ qua con trỏ phân trang.
Giới hạn (Limit) — SearchSố bản ghi tối đa trả về, tối đa 100.
Trường (Fields) — Create / Update / Upsert, và Get one theo KeyDanh sách cặp Trường → Giá trị. Mỗi dòng chọn một trường ghi được của Thực thể (trường tính toán bị loại khỏi danh sách; trường owner vẫn được phép ghi — đây là cách một quy trình gán chủ sở hữu bản ghi, kèm các ràng buộc quyền nêu ở phần Quyền truy cập khi bước chạy bên dưới) và gán giá trị từ biến, template {{ }}, hoặc giá trị cố định.
Đơn vị đích (Destination unit) — Create / Upsert, chỉ trên Thực thể đã bật phân loại theo đơn vịNơi hồ sơ được tạo sẽ được lưu: Đơn vị của chủ thể (Principal's unit) — mặc định — Một đơn vị (A unit), hoặc Đơn vị của bản ghi kích hoạt (Trigger's unit). Ở chế độ Một đơn vị, ô giá trị chỉ nhận hai dạng: Giá trị tĩnh (Literal) — chọn trên cây đơn vị của tổ chức, lưu id chứ không lưu mã đơn vị vốn có thể sửa — hoặc Tham chiếu (Reference) trỏ tới một biến quy trình đang giữ id đơn vị; cố ý không có dạng biểu thức. Xem mục Đơn vị đích bên dưới.
Lưu bản ghi vào biếnĐường dẫn biến (ví dụ vars.reviewer) lưu toàn bộ bản ghi — object cho Get one / Create / Update / Upsert, hoặc toàn bộ mảng records[] cho Search. Id của bản ghi đọc qua <biến>.id, không cần một trường lưu-id riêng. Khả dụng cho mọi thao tác.

Khi khớp theo Key (ở Get one hoặc Upsert), các trường tạo thành khóa nghiệp vụ của Thực thể hiển thị dưới dạng huy hiệu. Nếu Thực thể khai báo nhiều hơn một khóa, chọn khóa cần dùng trước, rồi đảm bảo mọi trường của khóa đó đều được ánh xạ đầy đủ trong phần Trường.

Thao tác Create không kiểm tra trùng lặp. Nếu quy trình chạy lại do lỗi, bản ghi có thể bị tạo thêm lần nữa — dùng Upsert khi cần đảm bảo không trùng. Trên một Thực thể đã lưu trữ (archived), Create bị chặn hoàn toàn và Upsert chỉ có thể cập nhật bản ghi đã có (không bao giờ tạo mới); Get one, Search, Update vẫn hoạt động bình thường.

Với người dùng không có quyền instance.admin, các trường được đánh dấu Nhạy cảm trên Thực thể hiển thị dạng che trong kết quả của Get one / Search — kể cả khi được lưu qua Lưu bản ghi vào biến. Trường id và các trường hệ thống trong metadata (phiên bản, thời điểm cập nhật, …) luôn hiển thị.

Đơn vị đích (Destination unit)

Ô này chỉ hiện khi Thực thể đã chọn có bật Phân loại theo đơn vị và thao tác là Create hoặc Upsert — chỉ hai thao tác đó mới lưu một hồ sơ mới vào đơn vị nào đó. Với Get one, Search, Update, hoặc trên Thực thể không phân loại theo đơn vị, ô này không xuất hiện.

Trình thiết kế mô tả nó đúng một câu: "Nơi lưu hồ sơ được tạo. Thiết lập này không mở rộng quyền của lượt chạy — nó chỉ chọn trong số các đơn vị mà chủ thể chạy vốn đã được phép lưu vào." Nói cách khác, đây là ô chọn chỗ, không phải ô cấp quyền: gọi tên một đơn vị mà chủ thể của lượt chạy không được tạo vào thì lượt chạy vẫn bị chặn với nguyên nhân destination_ineligible — và lượt chạy ghi nhận đúng đơn vị bị từ chối, nên khi quản trị viên bấm Tiếp tục, hệ thống kiểm tra lại chính đơn vị đó chứ không phải một đơn vị nào khác. Bảng báo trên trang lượt chạy chỉ nêu nhóm nguyên nhân, không hiện tên đơn vị; muốn biết là đơn vị nào thì đọc lại chính thiết lập này.

Chế độÝ nghĩa
Đơn vị của chủ thể (Principal's unit)"Đơn vị chính đang hoạt động của danh tính mà lượt chạy đại diện." Đây là mặc định, và cũng là cách hiểu của một bước chưa từng đụng tới thiết lập này.
Một đơn vị (A unit)"Đơn vị bạn chỉ định ở đây, hoặc một biến chứa đơn vị đó."
Đơn vị của bản ghi kích hoạt (Trigger's unit)"Đơn vị của bản ghi đã kích hoạt lượt chạy."

Ở chế độ Một đơn vị, ô giá trị chỉ nhận đúng hai dạng:

  • Giá trị tĩnh (Literal) — không phải ô gõ chữ, mà là một cây đơn vị bung ra để bạn chọn. Thứ được lưu vào quy trình là id của đơn vị, không phải mã đơn vị: mã có thể được sửa về sau.
  • Tham chiếu (Reference) — trỏ tới một biến quy trình đang giữ id đơn vị.

Cố ý không có dạng biểu thức {{ }}. Biểu thức dựng ra văn bản, mà văn bản thì không bao giờ là một id đơn vị — mở dạng đó ra chỉ tạo thêm một cách đặt cái đích làm dừng lượt chạy ở mọi lần chạy.

Cây đơn vị ở đây không lọc theo tầm với của bạn. Mọi đơn vị trong tổ chức đều chọn được; chỉ đơn vị đã lưu trữ bị làm mờ — và vẫn được liệt kê, để một đích đặt từ trước khi lưu trữ không lặng lẽ biến mất khỏi danh sách. Điểm này khác hẳn ô chọn đơn vị trên biểu mẫu tạo bản ghi thủ công, nơi những đơn vị nằm ngoài phạm vi tạo của bạn bị làm mờ. Lý do: người quyết định vào lúc lượt chạy diễn ra không phải bạn, mà là chủ thể của lượt chạy do chính sách Chạy với tư cách (Run as) chỉ định — một danh tính khác với người thiết kế, và có thể được đổi sau khi quy trình đã xuất bản. Lọc theo tầm với của người thiết kế sẽ vừa giấu mất những đích hoàn toàn hợp lệ, vừa ngụ ý một bảo đảm mà lượt chạy không đưa ra được.

Trình thiết kế cảnh báo hai trường hợp, và chỉ hai:

  • Chế độ Một đơn vị nhưng chưa chọn gì: "Hãy chọn một đơn vị. Đích không xác định sẽ làm dừng lượt chạy chứ không tự suy đoán."
  • Một id đơn vị không còn trong tổ chức: "Đơn vị {id} không thuộc tổ chức này. Lượt chạy sẽ dừng nếu đơn vị không xuất hiện trở lại." Id vẫn được giữ nguyên trên màn hình để bạn còn khôi phục được.

Một Tham chiếu đã trỏ tới biến thì không bao giờ bị cảnh báo — nó được phân giải ở từng lượt chạy, nên lúc thiết kế chưa có gì để kiểm tra. (Một Tham chiếu bỏ trống vẫn rơi vào cảnh báo thứ nhất ở trên.)

Một trường hợp nữa cũng không sinh cảnh báo nào, và đáng để nhớ: một đơn vị bị lưu trữ sau khi bạn đã chọn nó. Đơn vị đã lưu trữ vẫn nằm trong tổ chức nên cảnh báo thứ hai không kích hoạt; ô chọn vẫn hiện đúng tên đơn vị ấy, chỉ kèm nhãn Đã lưu trữ khi bạn mở cây ra (và bạn không chọn lại được nó). Đơn vị đã lưu trữ không nhận hồ sơ mới, nên bước vẫn xuất bản được và lượt chạy đầu tiên mới bị chặn — cách gỡ là bỏ lưu trữ đơn vị đó, hoặc trỏ bước sang đơn vị khác.

Nếu danh sách đơn vị không tải được, khu vực này báo "Không tải được danh sách đơn vị." kèm nút Thử lại (Retry), chứ không hiện một cây rỗng — cây rỗng sẽ bị đọc nhầm thành "tổ chức này chưa có đơn vị nào".

Ở chế độ Đơn vị của bản ghi kích hoạt, trình thiết kế nhắc: "Nếu không có bản ghi kích hoạt, lượt chạy sẽ dùng đơn vị của chủ thể." Riêng thao tác Upsert luôn kèm thêm một dòng nữa, ở bất kỳ chế độ nào: "Chỉ nhánh thêm mới của upsert mới lưu hồ sơ — nhánh cập nhật giữ nguyên đơn vị."

Chuyển khỏi chế độ Một đơn vị, đơn vị đã chọn bị xóa khỏi bước. Đây là chủ ý: một đơn vị nằm im dưới chế độ khác thì không ai nhìn thấy, rồi sẽ quay lại đúng vào lúc có người đổi chế độ mà chẳng liên hệ gì tới nó. Đổi thao tác sang một thao tác không lưu hồ sơ mới cũng xóa hẳn thiết lập này. Ngược lại, một chế độ Một đơn vị bỏ trống thì được giữ nguyên như một thiết lập còn dở, không bị âm thầm hạ về mặc định: lượt chạy dừng lại, thay vì lưu hồ sơ vào một chỗ không ai yêu cầu.

Nếu về sau người quản trị tắt phân loại theo đơn vị trên Thực thể, một bước vẫn còn chỉ định đơn vị đích sẽ không chặn lượt chạy nữa và cũng không đóng dấu đơn vị nào: thiết lập bị bỏ qua và hồ sơ không nằm ở đơn vị nào cả. Bước lặng lẽ chạy tiếp — tab Hoạt động của lượt chạy không có dòng nào nói ra chuyện đó. Trong trình thiết kế, ô Đơn vị đích biến mất khỏi bảng cài đặt của bước, vì Thực thể không còn phân loại gì để mà chọn; chỉ cần mở bảng cài đặt ra là thiết lập cũ đã bị xóa khỏi bước, và lần lưu bản nháp kế tiếp không mang nó theo nữa.

Quyền truy cập khi bước chạy

Bước này không chạy với quyền của người thiết kế, và cũng không mặc nhiên chạy với quyền của người bấm nút khởi chạy. Mọi thao tác đọc và ghi của nó được cấp quyền theo chủ thể của lượt chạy — do chính sách Chạy với tư cách (Run as) của quy trình quyết định, chốt một lần khi lượt chạy bắt đầu và không đổi cho tới khi lượt chạy kết thúc. Chỉ khi chính sách là Người khởi chạy thì chủ thể mới đúng là người bấm nút.

Từng thao tác được xét riêng, tại đúng thời điểm nó chạy, theo quyền truy cập đang hiệu lực của Thực thể. Một quyền bị thu hồi giữa chừng sẽ chặn thao tác kế tiếp; những thao tác đã chạy xong không bị ảnh hưởng. Ngay cả trên Thực thể ở chế độ mọi người, các quyền hệ thống thô (entity.read, entity.write, …) cũng được xét theo chủ thể của lượt chạy chứ không theo người khởi chạy.

Thao tácXét theo phạm viKhi chủ thể không được phép
Get one theo IdXemBản ghi có thật nhưng nằm ngoài phạm vi: lượt chạy bị chặn với nhóm nguyên nhân scope_mismatch. Lời từ chối không bao giờ nêu tên bản ghi.
Get one theo KeyXemKhóa khớp một bản ghi mà chủ thể không được xem: lượt chạy bị chặn với scope_mismatch, y như khi đọc theo Id. found: false giờ chỉ còn dành cho một khóa chưa bản ghi nào giữ. Xem mục bên dưới.
SearchLiệt kê giao với XemKết quả thu hẹp lại đúng phần chủ thể được phép thấy; một trang rỗng là câu trả lời hợp lệ. Chỉ khi chủ thể không được liệt kê gì cả thì lượt chạy mới bị chặn.
Create, và Upsert (cả hai nhánh)TạoKhông có phạm vi tạo, hoặc đơn vị đích — dù là đơn vị mặc định hay đơn vị bước chỉ định — nằm ngoài phạm vi đó: lượt chạy bị chặn.
Update, và nhánh cập nhật của UpsertSửaBản ghi có thật nhưng nằm ngoài phạm vi: Update làm lượt chạy bị chặn với scope_mismatch; nhánh cập nhật của Upsert thì bước thất bại thay vì lượt chạy dừng lại — xem đoạn ngay dưới bảng.

Upsert còn một điều kiện riêng: vì nó cho biết khóa nghiệp vụ đã tồn tại hay chưa, nó chỉ chạy được khi chủ thể của lượt chạy có phạm vi xem Toàn tổ chức trên Thực thể đó. Với phạm vi hẹp hơn, bước thất bại ngay trước khi tra khóa — nếu không, một chủ thể có thể suy ra sự tồn tại của những bản ghi nó không được đọc.

Và vì một upsert có thể chèn mới, cả bước — chứ không riêng nhánh chèn — phải qua cửa Tạo trước: một chủ thể không có phạm vi tạo, hoặc một đơn vị đích nó không được tạo vào, làm lượt chạy dừng lại ngay cả khi lượt upsert ấy rốt cuộc chỉ cập nhật một bản ghi đã có. Ngược lại, khi khóa khớp một bản ghi chủ thể được xem — upsert luôn đòi vậy — nhưng không được sửa, thì bước thất bại chứ lượt chạy không dừng lại: bản ghi ấy nằm trong tầm nhìn của chủ thể nên lời từ chối chẳng giấu gì, và cũng không có gì để quản trị viên gỡ bằng nút Tiếp tục.

"Không tìm thấy" nghĩa là chưa có — và không còn nghĩa gì khác

Trước đây Get one theo Key gộp hai câu trả lời khác hẳn nhau vào làm một: khóa này chưa bản ghi nào giữ, và khóa này đã có bản ghi giữ, nhưng chủ thể của lượt chạy không được xem nó. Cả hai đều ra found: false.

Hai câu trả lời ấy dẫn tới hai chỗ ngược nhau ở bước sau. Nhánh "chưa có" của một quy trình gần như luôn là nhánh tạo mới — nên một bản ghi chỉ đơn giản là bị che khỏi tầm nhìn của chủ thể sẽ đẩy lượt chạy đi tạo lại chính nó. Kết cục là một trong hai, và không cái nào tốt:

  • Nếu bước tạo mới ánh xạ đủ mọi trường của khóa ấy, chỉ mục khóa từ chối: bước thất bại với lỗi trùng khóa định danh. Lỗi thì đúng, nhưng nó nổ ở sai bước và không thể lần ra — bước ngay trước vừa báo khóa còn trống, còn bản ghi đang giữ khóa thì người đọc lỗi không được phép xem.
  • Nếu bước tạo mới không ánh xạ đủ các trường của khóa — chuyện rất thường, vì đó là một bước khác với danh sách Trường riêng — thì bản ghi mới không được đưa vào chỉ mục khóa, không có gì để mà trùng, và một bản trùng thật sự ra đời. Bước chạy xong, lượt chạy xanh, và thiệt hại chỉ lộ ra về sau, dưới dạng hai bản ghi cùng mang một mã nghiệp vụ.

Nay một khóa khớp bản ghi ngoài tầm với sẽ làm lượt chạy dừng lại và chờ với nhóm nguyên nhân scope_mismatch, đúng như khi đọc theo Id. found: false chỉ còn đúng một nghĩa: chưa bản ghi nào giữ khóa đó.

  • Dòng chặn ghi lại đơn vị của bản ghi bị che, và không bao giờ ghi chính bản ghi — giống hệt nhánh đọc theo Id. Đơn vị ấy chính là thứ nút Tiếp tục đem ra kiểm tra lại. Trên Thực thể không phân loại theo đơn vị thì không có đơn vị nào để ghi, nên Tiếp tục lùi về một câu hỏi thô hơn — phạm vi Xem của chủ thể đã sống lại và không rỗng hay chưa — và chỉ dựa vào đó mà gỡ chặn. Dù thế nào, trang lượt chạy cũng không trở thành cách dò ra những bản ghi nằm ngoài phạm vi.
  • Đọc theo Id có thêm một chẩn đoán mà đọc theo Key cố ý không có: khi id trỏ vào một bản ghi có thật, chủ thể đọc được, nhưng thuộc Thực thể khác, bước thất bại và nói thẳng rằng bản ghi ấy thuộc một Thực thể khác với Thực thể bước này đang nhắm — thay vì báo "không có bản ghi nào" và để cùng một lỗi tái diễn. Một khóa không mắc được lỗi đó: nó luôn được tra trên chỉ mục khóa của chính Thực thể đang chọn, nên chẩn đoán này không áp dụng cho nó.
  • Một quy trình chạy êm nhiều tháng vẫn có thể bắt đầu dừng ở bước này. Việc từ chối vốn đã có từ trước; chỉ câu trả lời là đổi. Cách gỡ là mở rộng phạm vi Xem của chủ thể cho tới khi nó chạm được bản ghi ấy rồi nhấn Tiếp tục: trên Thực thể có phân loại theo đơn vị nghĩa là tới đơn vị của bản ghi — đúng thứ mà Tiếp tục kiểm tra lại; trên Thực thể không phân loại thì là Của mình (bằng cách để chủ thể đứng tên sở hữu bản ghi) hoặc Toàn tổ chức. Xem Chạy với tư cách (Run as).

Hai điều kiện ở trên ăn khớp với nhau. Vì Upsert đòi phạm vi Xem · Toàn tổ chức, một chủ thể có phạm vi hẹp không dùng được nó — cách chống trùng còn lại của nó chính là Get one theo Key rồi rẽ nhánh. Đó cũng đúng là chỗ mà câu trả lời cũ gây hại nhất.

Khi chủ thể bị từ chối một thao tác, lượt chạy dừng lại và chờ — nó không thất bại, không bỏ qua bước, và không tự thử lại. Lượt chạy mang chip Bị chặn do phân quyền kèm một nhóm nguyên nhân, và chỉ đi tiếp sau khi quản trị viên khôi phục quyền rồi nhấn Tiếp tục. Không có cách cấu hình nào để bước nuốt lời từ chối này. Xem Chạy với tư cách (Run as).

Trên Thực thể đã bật Phân loại theo đơn vị, mỗi bản ghi tạo mới phải rơi vào một đơn vị mà chủ thể được phép tạo vào. Rơi vào đâu là do ô Đơn vị đích (Destination unit) của bước quyết định, mặc định là vị trí chính đang hoạt động của chủ thể (xem mục Đơn vị đích bên trên). Lượt chạy bị chặn với nguyên nhân riêng destination_ineligible trong sáu trường hợp — năm ở đây, cộng một trường hợp riêng của chủ thể dịch vụ nêu ngay dưới: chủ thể không có vị trí chính đang hoạt động; đơn vị đó nằm ngoài phạm vi tạo của nó; bước chỉ đích danh một đơn vị mà chủ thể không được tạo vào; đơn vị đích đã bị lưu trữ — đơn vị đã lưu trữ không nhận hồ sơ mới; hoặc chế độ Một đơn vị không phân giải ra đơn vị nào (ô bỏ trống, hoặc biến được Tham chiếu trỏ tới đang rỗng). Ở trường hợp đầu và trường hợp cuối, lượt chạy không ghi nhận đơn vị nào, nên nút Tiếp tục chỉ kiểm tra lại quyền tạo nói chung: nó có thể gỡ chặn xong lượt chạy dừng lại y chỗ cũ (xem Khởi chạy & theo dõi). Ba trường hợp giữa thì lượt chạy ghi nhận đúng đơn vị bị từ chối để lần Tiếp tục kiểm tra lại chính nó; màn hình chỉ hiện nhóm nguyên nhân chứ không hiện tên đơn vị. Trường unit vẫn không ghi được từ bước này: thêm nó vào phần Trường sẽ khiến quy trình bị từ chối ngay khi xuất bản. Ô Đơn vị đích không phải đường vòng để ghi unit — nó chỉ quyết định chỗ lưu lần đầu; đơn vị của một bản ghi đã có chỉ đổi qua thao tác Chuyển đơn vị.

Trường hợp thứ sáu ấy là của riêng chủ thể dịch vụ: nếu quyền tạo duy nhất của nó có phạm vi Của mình mà công tắc Được phép sở hữu hồ sơ đang tắt, thì không có hồ sơ nào nó sở hữu được, nên mọi lượt tạo đều bị chặn với cùng nguyên nhân đó — xem Chủ thể dịch vụ.

Ghi trường owner là cách quy trình gán chủ sở hữu, và nó có hai cái bẫy. Trên Create (kể cả nhánh chèn mới của Upsert), đặt chủ sở hữu là ai đó khác chủ thể của lượt chạy — hoặc để trống chủ sở hữu — cần quyền entity.records.assign_owner trên chính chủ thể đó; thiếu quyền thì bước thất bại, chứ không phải lượt chạy bị chặn. Trên Update, không ánh xạ trường owner sẽ giữ nguyên chủ sở hữu hiện tại, còn ánh xạ nó tới một giá trị rỗng sẽ biến bản ghi thành không có chủ sở hữu — mà bản ghi không có chủ sở hữu thì vô hình với mọi lượt cấp quyền phạm vi Của mình.

Ví dụ

Trong quy trình Đề xuất mua sắm, sau khi người dùng phê duyệt và tài liệu hợp đồng được tạo, một bước Bản ghi thực thể cập nhật Thực thể Đơn mua hàng như sau:

  • Thực thể: Đơn mua hàng
  • Thao tác: Upsert (khóa nghiệp vụ: ma_don)
  • Trường:
Trường Thực thểNguồn giá trị
trang_thaiGiá trị cố định: "approved"
nguoi_phe_duyetnodes.approval-step.output.actor
ngay_phe_duyetnodes.approval-step.output.completed_at
so_tiennodes.start-form.output.body.so_tien
  • Lưu bản ghi vào biến: vars.purchaseOrder

Biến vars.purchaseOrder sau đó có thể được dùng trong bước Email — ví dụ {{ vars.purchaseOrder.id }} — để kèm link bản ghi vào email thông báo.

Để tránh tạo trùng nhà cung cấp, thêm một bước Bản ghi thực thể trước bước Upsert ở trên, với thao tác Search trên Thực thể Nhà cung cấp: bộ lọc ma_nha_cung_cap là {{ nodes.start-form.output.body.ma_ncc }}, giới hạn 1 bản ghi, lưu kết quả vào vars.ncc_tim_thay. Bước Quyết định (Decision) tiếp theo rẽ nhánh dựa trên nodes.buoc_tim_ncc.output.returnedCount để biết đã có bản ghi trùng khớp hay chưa.

Cách chống trùng bằng Search ở trên vẫn còn nguyên cái bẫy mà Get one theo Key vừa bỏ đi: Search thu hẹp một cách im lặng. Một bản ghi nhà cung cấp nằm ngoài phạm vi của chủ thể lượt chạy đơn giản là không có mặt trong kết quả, nên returnedCount bằng 0 và nhánh "chưa có" chạy — dẫn thẳng tới đúng hai kết cục đã kể ở mục trên. Với một chủ thể có phạm vi Xem hẹp hơn toàn tổ chức, hãy kiểm tra tồn tại bằng Get one theo Key: khóa khớp một bản ghi bị che thì lượt chạy dừng lại để người ta xử lý, thay vì lặng lẽ đếm ra số 0.

On this page