BravoServerConstraint

Phạm vi áp dụng

✅ Bravo 8 · ✅ Bravo 10

Ý nghĩa

Thực thi việc đẩy dữ liệu được trả về sau một thủ tục vào bảng hoặc cột.

Đây là Evaluator mạnh và phức tạp nhất — dùng cho hầu hết các chức năng “lấy dữ liệu từ màn hình khác về Grid”.

Hai dạng sử dụng

Dạng 1 — mở một Command, sau đó có thể merge dữ liệu vào bảng

<Eval_X>
  <ClassName>BravoServerConstraint</ClassName>
  <CommandKey>Ten_Commandkey</CommandKey>
  <zCtorArgs>Tham_so</zCtorArgs>
  <Command>Ten_thu_tuc</Command>
  <zTargetValueMember>Ten_Cot</zTargetValueMember>
  <zSourceValueMember>Ten_Cot</zSourceValueMember>
  <zSourceReturnMember>Danh_sach_cot</zSourceReturnMember>
</Eval_X>

Dạng 2 — chạy thủ tục và merge dữ liệu vào bảng

<Ten_Eval>
  <ClassName>BravoServerConstraint</ClassName>
  <Command>Ten_thu_tuc</Command>
  <Parameters>
    <Ten_Tham_so>Ten_cot</Ten_Tham_so>
  </Parameters>
  <DataMember>Danh_sach_bang/ten_cot</DataMember>
  <mergingData>Gia_tri</mergingData>
  <checkUnique>Gia_tri</checkUnique>
</Ten_Eval>

Thuộc tính

Nhóm nguồn & đích

ThẻNội dung
DataMemberDanh sách cột hoặc bảng đích nhận dữ liệu trả về từ thủ tục (có thể dùng Alias)
CommandThủ tục nào được thực hiện để lấy kết quả vào DataMember
CommandKeyThực thi việc gọi màn hình của chức năng tương ứng
ParametersCác tham số được truyền vào thủ tục
zCtorArgsTham số truyền vào thủ tục / Command được thực thi
ExprĐiều kiện các dòng để thực thi Evaluator

Nhóm điều khiển merge

ThẻNội dung
mergingDataCách thức đẩy dữ liệu vào bảng — xem bảng bên dưới
checkUniqueTùy chọn kiểm tra giá trị trùng khi merge
selectAddedRowDòng được chọn sau khi merge: None / First / Last (mặc định Last)
zSourceReturnMemberDanh sách các cột truyền vào thủ tục trong Dataset. Không khai báo → mặc định cột Id. Hỗ trợ * từ v4.1.1.0

mergingData

Giá trịNội dung
ResetXóa tất cả các dòng của bảng đích rồi merge các dòng của bảng nguồn
Overwrite(mặc định) So sánh Primary Key (thường là Id) — trùng thì ghi đè, không trùng thì thêm mới
RelatedDeleteChỉ xóa các dòng trong bảng đích theo relation với bảng mẹ (bổ sung từ v5.2.0.1)

Nhóm chống chọn trùng

ThẻNội dung
zTargetValueMemberChỉ định cột trong bảng đích để kiểm tra tính duy nhất
zSourceValueMemberChỉ định cột trong màn hình mở ra để tích chọn — so sánh với zTargetValueMember

Tác dụng thực tế

Chức năng “Lấy chi tiết đơn hàng”: khi đã chọn một đơn hàng rồi, click chọn lại thì dòng của đơn hàng đó bị mờ đi và không chọn được tiếp.

<zTargetValueMember>BizDocId_SO</zTargetValueMember>
<zSourceValueMember>BizDocId</zSourceValueMember>

Phải dùng đồng thời cả 2 thẻ, trừ khi cột ở cả 2 thẻ trùng nhau thì chỉ cần zTargetValueMember.

Nhóm biến Output

ThẻNội dung
autoOutputMemberChỉ định việc sử dụng tham số là biến trả về từ thủ tục
zUpdateScopeExprĐiều kiện kiểm tra các dòng sẽ được update giá trị. Chỉ áp dụng khi thủ tục trả về 1 hay nhiều giá trị, không áp dụng khi trả về bảng
updateScopeTypeXác định phạm vi update giá trị — xem scopeType

autoOutputMember

Giá trịNội dung
Ignore(ngầm định) Không lấy các biến Output
UpdateScopeRowUpdate giá trị biến Output vào cột tương ứng của bảng khai báo Eval
UpdateParentRowUpdate vào cột tương ứng ở bảng mẹ của bảng khai báo Eval
UpdateRootRowNhư UpdateParentRow nhưng là bảng mẹ đầu tiên

Warning

Phải khai báo các tham số trả về từ thủ tục kiểu Output trong phần Parameters:

<Direction>Output</Direction>

Nhóm thông báo & khác

ThẻNội dung
showMessageTrạng thái hiển thị hộp thoại thông báo sau khi hoàn thành eval
TextCâu thông báo khi thực thi xong Eval. Hỗ trợ biểu thức nhúng
customFlagsConfirmation / VerifyPassword / VerifyUser
nCommandTimeoutSố giây tối đa chờ câu lệnh query trước khi báo lỗi timeout
transactionLockKiểu transaction của Eval — dùng khi lấy dữ liệu từ kết nối với ứng dụng khác
zCustomConnectionNameKết nối đến Server khác

showMessage

Giá trịNội dung
NeverKhông bao giờ hiển thị
Always(mặc định) Luôn luôn hiển thị
UpdatedOnlyChỉ hiển thị khi có sự thay đổi
TableChỉ hiển thị khi update dạng bảng
TableUpdateChỉ hiển thị khi update dạng bảng và có thay đổi
ValueChỉ hiển thị khi update dạng biến
ValueUpdateChỉ hiển thị khi update dạng biến và có thay đổi

Thông báo mặc định

Nếu không khai báo thẻ Text, giá trị ngầm định là số lượng bản ghi được chèn vào bảng.

Ví dụ

Trường hợp 1 — lấy chi tiết hóa đơn, merge cả bảng con và bảng cháu

<Eval_ConvertFromAccDocSales_GetData>
  <ClassName>BravoServerConstraint</ClassName>
  <CommandKey>Sales</CommandKey>
  <Command>usp_B30AccDocInventory_ConvertFromB30AccDocSales</Command>
  <Parameters>
    <IdList />
    <ConvertType>1</ConvertType>
    <DocCode>DocCode</DocCode>
    <FiscalYear>FISCALYEAR()</FiscalYear>
    <BranchCode>BranchCode</BranchCode>
    <AccDocDetailXML>
      <Name>vB30AccDocItemIssue_Edit.Id.ItemCode.WarehouseCode</Name>
    </AccDocDetailXML>
  </Parameters>
  <DataMember>Ct0,phys</DataMember>
  <zCtorArgs>AutoSearch=True;FilterKey=DocCode IN ('HD','H2','XK') AND
    DocDate&lt;='{=DocDate}'</zCtorArgs>
  <Expr>!Empty(CurrencyCode)</Expr>
</Eval_ConvertFromAccDocSales_GetData>

Trường hợp 2 — chạy thủ tục và reset bảng đích

<Eval_ProcessDiscount>
  <ClassName>BravoServerConstraint</ClassName>
  <Command>usp_B30AccDocApplyDiscount_AddingData</Command>
  <Parameters>
    <Stt>Stt</Stt>
    <BranchCode>BranchCode</BranchCode>
    <DocDate>DocDate</DocDate>
    <CustomerCode>CustomerCode</CustomerCode>
    <CurrencyCode>CurrencyCode</CurrencyCode>
    <vB30AccDocApplyDiscount>Ct0</vB30AccDocApplyDiscount>
  </Parameters>
  <DataMember>vB30AccDocApplyDiscount</DataMember>
  <mergingData>Reset</mergingData>
</Eval_ProcessDiscount>

Trường hợp 3 — lấy dữ liệu từ báo cáo vào Grid

<Eval_Report_CurrentStock>
  <ClassName>BravoServerConstraint</ClassName>
  <CommandKey>REP04_BC_TONKHO</CommandKey>
  <DataMember>Ct0</DataMember>
  <zSourceReturnMember>*</zSourceReturnMember>
  <mergingData>Reset</mergingData>
  <zCtorArgs>DocDate2='{=DocDate}';StartupCommandKey=Refresh;</zCtorArgs>
  <Text />
</Eval_Report_CurrentStock>
ThẻVai trò trong ví dụ
CommandKeyCommand của Reporter
DataMemberBảng đích nhận kết quả
zSourceReturnMemberDanh sách cột được đẩy vào bảng đích từ kết quả báo cáo
zCtorArgsTham số truyền vào khi thực thi CommandKey của báo cáo

Cú pháp Parameters

Dạng đầy đủ

<Parameters>
  <ParamName1>
    <ParameterName>tên tham số (hỗ trợ biểu thức nhúng)</ParameterName>
    <Direction>Output</Direction>
    <Name>@post data name | * | NewDataSet | tên bảng.cột1.cột2 | tên bảng | tên cột</Name>
    <Value>biểu thức</Value>
    <Text>giá trị kiểu chuỗi</Text>
  </ParamName1>
</Parameters>

Dạng rút gọn

<Parameters>
  <ParamName1>@post data name | * | tên bảng.cột1.cột2 | biểu thức</ParamName1>
</Parameters>

Dạng giản đơn kiểu Bravo 7

<Parameters>@post data name | NewDataSet | tên bảng | tên cột,...</Parameters>

Khác Bravo 7

Bravo 8 không tự động lấy tên tham số thủ tục lưu — nếu dùng cách giản đơn thì các giá trị bắt buộc phải trùng với tên tham số.

Ghi chú quan trọng

  • Nếu không khai báo Parameters, giá trị mặc định là IdList (danh sách Id các dòng được chọn)
  • zSourceReturnMember không áp dụng cho trường hợp DataMember là danh sách các bảng
  • Khi Evaluator vừa trả về bảng vừa trả về biến → DataMember khai báo các bảng, dùng autoOutputMember để lấy giá trị biến Output
  • Nếu thủ tục trả về 1 bảng mà DataMember có 2 bảng → insert vào cả 2 bảng. Nếu cả hai đều là bảng → merge lần lượt
  • Khi DataMember là 1 bảng, chương trình tự xác định Key liên kết với bảng mẹ. Trả về nhiều hơn 1 bảng → phải chỉ định cột liên kết bằng _ParentIdentityKey
  • BravoServerConstraint khi thực hiện command sẽ bỏ qua các tham số GetData, GetDataSet, GetSelectedData (luôn truyền DataSet)
  • Nếu bSuppressChangeEvents = True thì các Eval trong RowDeleted, RowAdded sẽ không được thực hiện
  • Khi truyền tham số XML dataset / bảng dữ liệu, nếu dùng alias thì chuỗi XML sẽ dùng alias thay cho tên bảng

Về zCustomConnectionName

  • Không khai báo trong Template và layout → dùng giá trị của form
  • Khi mở command từ BravoLookupBox hoặc BravoServerConstraint → không truyền zCustomConnectionName cho các form được mở

Gọi DataEditor từ LinkCommand

Hỗ trợ gọi DataEditor từ link command để merge dữ liệu vào form nhập liệu. DataEditor mở bằng BravoServerConstraint không có chọn dòng như DataExplorer hay Reporter — tất cả các bảng/dòng sẽ được truyền vào tham số IdList theo nguyên tắc không tính bảng mẹ ảo: nếu chỉ có 1 bảng thì tên bảng là Table, nhiều hơn thì được đánh số từ 0.

Liên quan

BravoCommandKey · checkUnique · Parameters · zCtorArgs · mergingData · TableSummed · BravoServerConstraintValidator · ServerCommand