Professional Documents
Culture Documents
Thiết lập giá trị mặc định cho các thuộc tính:
ParentId: Giá trị mặc định là -1 (Chưa có)
IsGroup: Giá trị mặc định là 0 (Không phải là nhóm dữ liệu)
IsActive: Giá trị mặc định là 1 (Dữ liệu không bị đình chỉ). Trạng thái dữ liệu
có hai loại gồm: Đình chỉ (0), Không đình chỉ (1). Dữ liệu vừa tạo ra mặc định
là dữ liệu không đình chỉ.
CreatedAt, ModifiedAt: Giá trị mặc định được lấy từ hàm GETUTCDATE()
Sử dụng GETUTCDATE() cho giá trị Default của CreatedAt và ModifiedAt.
Giải thích: Được sử dụng để trả về thời gian và ngày hiện tại theo múi giờ UTC.
Khi sử dụng thì thời gian lưu không phụ thuộc vào máy Local/Client mà chỉ lấy
giờ theo múi giờ UTC.
=> Đồng bộ dữ liệu khi lưu trữ nếu có nhiều máy chủ con/Client thuộc nhiều múi
giờ khác nhau
Múi giờ UTC là gì?
Giờ UTC hay còn gọi là giờ phối hợp quốc tế, được viết tắt từ một cụm từ tiếng
Anh “Coordinated Universal Time” và một cụm từ tiếng Pháp “Temps Universel
Coordonné”. Đây là tiêu chuẩn giờ để định vị thời gian chuẩn quốc tế, được cơ
quan đo lường quốc tế (BIPM) công nhận và chọn làm mốc thời gian về pháp lý
trên toàn cầu.
Nguyên tắc đặt tên Constraint: DF_Tên bảng_Tên thuộc tính
Ví dụ:
Lưu ý: Thiết lập các thuộc tính là NOT NULL nếu muốn Default giá trị cho thuộc
tính. Nếu ta để NULL hoặc không thiết lập NOT NULL thì khi INSERT dữ liệu từ
chương trình dữ liệu sẽ bị NULL.
Mẫu tạo bảng:
Lưu ý: Ở thuộc tính Id luôn thiết lập IDENTITY(1,1) để thuộc tính luôn có giá trị khi tạo
mới là tự động tăng
CreatelogNum Gắn thêm vào $ và giá trị vào CreateLogName trong Data
Log
Câu hỏi: Giá trị thường dùng là 0, có bảng có giá trị NULL.
Vậy lúc nào dùng 0 lúc nào dùng NULL
CreateLogColList Khai báo các field/thuộc tính tạo log được thể hiện ở phần
đầu phiếu khi vào nhật ký sử dụng
XmlLogColList Danh sách các cột cần lưu log. Để * nếu cần lưu log tất cả
các cột (trừ image, binary, timestamp)
SuggestCodeMethod Cái này viết riêng để tạo mã của danh mục: Sử dụng trong
usp_sys_AutoNewCode.
VerticallyPartitioned Thường có giá trị là 0 và 1. Giá trị 1 chỉ xuất hiện ở một vài
bảng B30
LastUpdated Thời điểm thay đổi giá trị cuối cùng của bảng đó, được thực
hiện qua các trigger ChangeLog. Mục đích để quyết định lấy
dữ liệu từ bảng hay cache cho các widget.
nDeplaytime Dành riêng cho Delay của bảng dữ liệu so với cache (Giây -
Second) phải có quyền VIEW SERVER STATE
DataCopy Khai báo giá trị = 1 đối với các bảng dữ liệu của CSDL Data
cần copy vào CSDL hệ thống (các bảng B10 và một số bảng
khai báo tham số B20Class...)
Lưu ý: Riêng bảng B30 sẽ bỏ qua trong thủ tục lấy dữ liệu
Mẫu SQL:
B00FieldList: Dùng cho trường hợp sửa mã, gộp mã trong danh mục sẽ đổi ở các
bảng liên quan
MasterTable Bảng chính khi thay đổi ở bảng chỉnh sẽ điều chỉnh ở các
bảng thuộc Table_Name
MasterField Các field khi thay đổi ở bảng chính cần phải thay đổi ở bảng
liên quan
Table_Name Các bảng bị tác động khi field MasterTable thay đổi
Field_Name Các field thay đổi khi tác động của Field của bảng
MasterTable
Comma_Separated Dùng tìm trong danh sách các filed và ngăn cách nhau bằng
dấu phẩy.
Mẫu SQL:
ParentId Khai báo = Id của bảng mẹ nếu truyền dữ liệu dạng dữ liệu
bảng mẹ bảng con (Cần hỏi thêm)
LayoutEditor
Survey
Backup
DataEditor
Permission
Reporter
DataExplorer
TaskMan
TaskSchedule
Bravo.Diagram
LogViewer
DataTransfer
Wizard
MainWindow
CtorArgs Các tham số truyền thêm. Với khai báo Editor thì khai báo giá
trị ngầm định của các trường khi thêm mới. (Cần hỏi thêm)
ShortKeyText Mô tả phím tắt được gọi. Thường chỉ sử dụng cho các
CommandKey liên quan đến phím tắt
AlterCommandClass Khai báo các tham số trong phần mềm sau thay đổi
Mẫu SQL:
5. Tạo Trigger
Lưu ý: Khi tạo Trigger MergeCode thì phải Insert dữ liệu của bảng cần tạo vào
B00FieldList.
6. Thiết kế Layout
Explorer
Tổng quan:
Ở trong Bravo các layout được thiết kế theo dòng (Rows) và cột (Cols). Trước khi
thiết kế một layout nào ta cần xác định trước số cột và dòng cần có để thuận tiện thiết
kế.
Ví dụ: Trong layout Explorer của Danh mục bộ phận có 1 Cột (Col) và 2 dòng
Bước 1: Thêm Danh mục đã tạo trong CommandKey vào Hệ thống Menu và Panel Cây
phân hệ
<root> Khai báo đầu tiên khi bắt đầu chương trình. Có chức năng khai
báo thủ tục chạy của chương trình
<Tables> Khai báo bảng chứa dữ liệu của chương trình. Trong Layout,
khai báo để kết nối dữ liệu với bảng trong SQL
<ParentTable> Khai báo bảng dữ liệu chính, nơi lưu dữ liệu gốc của
chương trình.
<Name>Tên bảng</Name> Khai báo bảng dữ liệu nguồn của Danh mục.
Các bảng này đã được tạo trong SQL (Với Danh mục là các bảng B20 còn
Chứng từ là B30).
<Evaluators> Thẻ khai báo các Event/Chức năng. Các Event được
khai báo trong Datasource, khi muốn sử dụng phải gọi trong layout.
<Eval_EditCar> Thẻ khai báo Eval (khai báo Event) do người
dùng tự định nghĩa để phân biệt giữa các Eval.
<ClassName>BravoCommandKey</ClassName> ClassName là loại xử
lý dữ liệu cho mỗi loại control tương ứng. Nó tương tự như kiểu dữ
liệu của thẻ được khai báo.
<CommandKey>Tên CommandKey</CommandKey> Tên CommandKey được
khai báo trong bảng B00Command.
</Eval_EditCar>
</Evaluators>
</ParentTable>
</Tables>
</root>
<root>
<panelExplorer> Khai báo toàn bộ các nhóm đối tượng trên màn hình
Eplorer
<Controls>
<Control_Explorer> Thẻ người dùng tự định nghĩa để phân biệt các
Controls với nhau
<Assembly>Bravo.DataExplorer</Assembly> Khai báo các DLL chứa
các ClassName có sẵn. Như trong Form Explorer thì DLL là DataExplorer
<ClassName>BravoExplorerControl</ClassName>
<Dock>Fill</Dock>
<Execute> Thực thi các Event (Eval)đã được khai báo ở
Datasource
<Eval_EditCar /> Event trỏ tới Form Edit có CommandKey tương
ứng đã được khai báo trong B00Command
</Execute>
<Row>
<Row_0>
<Height>80</Height>
</Row_0>
</Row>
<Cols>
<Thuộc_tính>
<Width>250</Width> Khai báo chiều dài của cột
<Style>Font:Arial;TextAlign:LeftTop;</Style> Khai báo các
định dạng của nội dung được chứa trong cột
<Rows>
<Row_0>
<Text> Khai báo nội dung của tiêu đề (Header) cột
<Vietnamese>Tên tiếng việt</Vietnamese>
<English>Tên tiếng Anh</English>
</Text>
</Row_0>
</Rows>
</ Thuộc_tính >
……
</Cols>
<DataMember>Tên bảng</DataMember> Khai báo bảng dữ liệu mà
Form sử dụng. (Đã được khai báo ở DataSource)
</Control_Explorer>
</Controls>
</panelExplorer>
</root>
Editor
<root>
<Tables>
<ParentTable>
<Name>B20Car</Name>
<ServerLoading> Khai báo các cột bổ sung vào câu lệnh query lấy
dữ liệu từ server về client. Thường sử dụng để thêm một số trường được
tính toán bằng hàm hoặc thêm bằng cách khai báo
<CodeCopied>Code</CodeCopied>
<CodeTmp>Code</CodeTmp>
</ServerLoading>
<RowAdded>
<Eval_AutoNewCode />
</RowAdded>
<RowCopied>
<Eval_CodeTmp_DefaultValueIfCopy>
<DataMember>CodeTmp</DataMember>
<Value>CodeCopied</Value>
</Eval_CodeTmp_DefaultValueIfCopy>
<Eval_AutoNewCode />
</RowCopied>
<ColumnChanged>
<Code>
<Eval_AutoNewCode>EMPTY(Code)</Eval_AutoNewCode>
</Code>
</ColumnChanged>
<Evaluators>
<Eval_AutoNewCode>
<ClassName>BravoServerConstraint</ClassName>
<Command>usp_sys_AutoNewCode</Command>
<DataMember>Code</DataMember>
<Parameters>
<Code>CodeTmp</Code>
<TableName>TableName</TableName>
<ColumnName>ColumnName</ColumnName>
</Parameters>
<Text />
</Eval_AutoNewCode>
<NewGroupCommand>
<ClassName>BravoCommandKey</ClassName>
<CommandKey>New</CommandKey>
<zCtorArgs>IsGroup=True;</zCtorArgs>
</NewGroupCommand>
<NewCommand>
<ClassName>BravoCommandKey</ClassName>
<CommandKey>New</CommandKey>
<zCtorArgs>IsGroup=False;</zCtorArgs>
</NewCommand>
</Evaluators>
<Validators> Thẻ Validators chứa toàn bộ các khai báo kiểm tra
dữ liệu hợp lệ
<NotNull> Khai báo rang buộc không cho phép NULL
<SourceColumn>Tên_thuộc_tính</SourceColumn>Khai báo thuộc
tính không cho phép NULL
<bEmptyAsNull>True</bEmptyAsNull>Khai báo
</NotNull>
<Code>
<ClassName>BravoUniqueKeyValidator</ClassName>
<SourceColumn>Code</SourceColumn>
</Code>
</Validators>
<Expressions>
<TableName>'B20Car'</TableName>
<ColumnName>'Code'</ColumnName>
</Expressions>
<DefaultValues> Khai báo giá trị mặc định của thuộc tính khi mở
Form Editor
<Thuộc_Tính>Giá_trị</Thuộc_Tính>
</DefaultValues>
</ParentTable>
Lưu ý: Nếu người dùng thêm một ChildTable thì Datamember là một view
thì không được đặt có tên ParentTable trước dấu _.
Đúng: ParentTable: vB20Car Childrenttable: vB20CarComponent_Explorer
Sai: ParentTable: vB20Car ChildrentTable: vB20Car_Component
</Tables>
</root>
<root>
<navigator>
<LinkCommand> Khai báo phần Công cụ nhập liệu
Bước 2: Khai báo cột/thuộc tính muốn thêm vào Datasource (Chứng từ cần them
thuộc tính (Tên cột muốn thêm) và Danh mục chứng từ (Using+Tên cột muốn
thêm))
Có 2 cách để thêm cột/thuộc tính vào Datasource:
Cách 1: Cập nhật View trong Datasource
Ở cách này chúng ta áp dụng cho các Datasource sử dụng View là Table
(Đa số các Danh mục và Chứng từ có ParentTable và ChildTable là dạng
View). Tuy nhiên ở Danh mục chứng từ thì là một trường hợp đặc biệt
khi mà sử dụng thẳng bảng chính mà không qua View. Vậy nên để sử lý
trường hợp này ta có 2 cách:
+ Tạo View từ B00Dmct và khai báo trong DataSource
+ Sử dụng cột CustomField có sẵn trong B00Dmct
UsingCustomFiled1, UsingCustomFiled2, UsingCustomFiled3 được tạo
ra cho người dùng khai báo các côt/trường dữ liệu cần mở rộng
Lưu ý: Để có thể chọn lookup ta cần khai báo them lookup Class
Ở phần chứng từ ta có thể dùng cách cập nhật lại View
Cách 2: Thêm cột tạm (Temp Col)
Ở cách này chỉ dùng trong các trường hợp ta cần xử lý tính toán và không lưu
vào Database. Vậy nên cách này không được sử dụng trong trường hợp này
Bước 3: Khai báo thẻ Expr để hiển thị đầu phiếu và dưới lưới
Sau khi người dùng khai báo Lookup ở Bước 1 và Bước 2, để cột/thuộc tính ở
đầu phiếu và dưới lưới hiển tị theo mong muốn ta sử dụng Thẻ Expr để lấy
điều kiện từ thuộc tính/trường dữ liệu Using+Tên cột ta đã khai báo ở Bước 2.
Hinh 9: Khai báo UsingCustomField1=1 khi muốn hiện đầu phiếu đã khai báo ở đầu phiếu
Hinh 10: Khai báo UsingCustomField1=2 khi muốn hiện ở lưới đã khai báo trong lưới