New Email.
Từ ngày 1/1/2012 do không tiếp tục làm việc tại Cty CP tin học Tân Dân nên email dhnam@tandan.com.vn sẽ không còn tồn tại nữa. Mọi người có thể liên hệ theo địa chỉ dhnam@vsd.com.vn hoặc dang_hainam@yahoo.com
Sách XPage!
Có 1 cuốn sách mình đánh giá là tốt về XPAGE: mastering xpage, các bạn có thể download từ:
https://skydrive.live.com/?cid=db91393bcfc7ab62&sc=documents&id=DB91393BCFC7AB62!138.
Với ý định viết một loại bài về Domino cho các bạn mới tiếp cận với, xong đợt này bận quá nên không thể tiếp tục được, các bạn có thể đọc cuỗn sách trên để tìm hiểu về Lotus Domino cũng như XPage, nó viết khá là chi tiết.
Download Lotus Notes & Domino 8.5.3
Không rầm rộ như Microsoft, không hào nhoáng như Apple.
Sau một thời gian dài chờ đợi, cuối cùng IBM đã đưa ra phiên bản Lotus Notes & Domino 8.5.3. sau đây là link download bản trial
Lotus Domino: http://www14.software.ibm.com/webapp/download/search.jsp?pn=Lotus+Domino
Lotus Notes & Domino Administrator: http://www.ibm.com/developerworks/downloads/ls/lsndad/
Domino Designer: http://www.ibm.com/developerworks/downloads/ls/dominodesigner/index.html
Truy xuất dữ liệu trong ứng dụng Domino!
Trong các bài viết trước mình đã giới thiệu về các thành phần (component) cơ bản và thường xuyên để tạo ra một ứng dụng domino. Bài này mình sẽ đưa ra các phương pháp để truy xuất dữ liệu trong một ứng dụng Domino.
Như các bạn đã biết, Một ứng dụng domino khi được tạo ra thì cả phần design và database được lưu trong cùng 1 file .nsf. Các đơn vị dữ liệu được lưu ở đây là các document, nó tương ứng với các record trong MS SQL. Ứng dụng Domino quản lý tài nguyên của nó thông qua các ID. với 1 document sẽ có tương ứng 2 loại ID là Notes ID và Universal ID (UNID).
- Truy xuất Document
- Thông qua URL: bạn có thể sử dụng URL command để truy xuất và một document, cấu trúc của URL Command là
Mở document: http(s)://host:port/[folder…]/[database.nsf]/[view]/[UNID]?OpenDocument
Hiệu chỉnh: http(s)://host:port/[folder…]/[database.nsf]/[view]/[UNID]?EditDocument
Xóa: http(s)://host:port/[folder…]/[database.nsf]/[view]/[UNID]?DeleteDocument
@chat: Delete document thông qua 1 url, nếu vậy bạn ở 1 document ra, chỉ cần thay command opendocument bằng command deletedocument là xóa được rồi, thật là nguy hiểm. Cài này trong thực tế là mình đã gặp, nhiều người làm nhiều rồi, làn ứng dụng lớn rồi vẫn bị, cho người khác truy cập vào document, người ta thay command trên URL nó xóa béng mất :D. thực ra Domino quản lý tài nguyên rất chặt chẽ thông qua quyền truy cập và tài nguyên của người dùng, bạn chỉ được xóa document khi bạn được cấp quyền xóa trong Access Control List (ACL), và bạn có quyền hiệu chỉnh document. bạn chỉ được đọc , hiệu chỉnh các document khi bạn được cấp quyền truy cập. Cấp độ (Access level của bạn đến đâu, là author, là reader, là designer hay chỉ là depositor, bạn là người dùng trong ACL hay chỉ là default user v.v….). Khi đã bắt tay và viết 1 ứng dụng thương mại thật sự trên nền Domino, hãy chắc rằng bạn biết phải phân phát tài nguyên cho người dùng thế nào.???? - Thông qua database: Từ database hiện tại, bạn có thể truy xuất Document khi có UNID hoặc Notes ID của document
Ví dụ: Bạn có document có UNID là 858859600f579bd2472579140065033dSession session = getSession();
AgentContext agentContext = session.getAgentContext();
Database db = agentContext.getCurrentDatabase();
Document doc = db.getDocumentByUNID(“858859600f579bd2472579140065033d”); - Thông qua view: Bạn có thể sử dụng cột đầu tiên của 1 view (cột này được sắp xếp) như 1 tập các key, sau đó truy xuất document thông qua các key này. ví dụ, mình có 1 view chứa danh sách người dùng tên là “dsnguoidung” và cột dầu tiên là tên đầy đủ (được sắp xếp tăng dần). mình muốn lấy tập các document những người có tên đây đủ là “Nguyễn Văn A”.Session session = getSession();
AgentContext agentContext = session.getAgentContext();
Database db = agentContext.getCurrentDatabase();
View nguoiDung = db.getView(“dsnguoidung”);
DocumentCollection dc = nguoiDung.getAllDocumentsByKey(“Nguyễn Văn A”);Và từ DocumentCollection này, ban có thể truy xuất và các document của người dùng có tên là “Nguyễn Văn A”, Nếu bạn chắc chắn rằng giá trị Nguyễn Văn A là duy nhất bạn có thể truy xuất và thẳng document đầu tiên đó bằng hàm Document ns = nguoiDung.getDocumentByKey(“Nguyễn Văn A”);. Mình có xem qua các tài liệu tối ưu thì thấy rằng đây là cách tốt để tìm kiếm document (tốt hơn nữa là sử dụng UNID hoặc Notes ID) - Thông qua hàm formula: Formula cung cấp một số hàm để lấy truy xuất vào Document, thương dùng nhất là DBColumn, hàm này sẽ lấy giá trị một cột của 1 view.
- Thông qua URL: bạn có thể sử dụng URL command để truy xuất và một document, cấu trúc của URL Command là
- Tìm kiếm dữ liệu:
- Thông qua view: như trên
- FTSearch command từ view: cấu trúc http(s)://host:port/[folder…]/[database.nsf]/[view]?SearchView&query=[giatri]. cấu trúc này sẽ tìm kiếm full-text một giá trị có trong view hiện tại. các bạn đọc kỹ hơn trong tài liệu help của Domino Designer nhé (Lotus Domino Designer Basic User Guide and Reference > Application Design > URL commands for Web applications)
- FTSearch từ database/view/DocumentCollection trong code: Trong code bạn có thể Full-Text search từ một collection các document thông qua câu query (gần như SQL)- [Database/View/DocumentCollection].FTSearch(String query, int max, int sortopt, int otheropt). Bạn tham khảo thêm trong tài liệu Help của Domino Designer (Lotus Domino Designer Basic User Guide and Reference > Java/CORBA Classes > Java Classes A-Z > Database class và Lotus Notes > Search > Doing searches). Ở đây các bạn có thể thấy rằng FTSearch từ view thông qua URL command chỉ có thể search 1 giá trị, còn FTSearch từ 1 collection document có thể mở rộng ra tìm ở trường nào, kiểu dữ liệu là gì v.v…
- Simple search: Cách search này chỉ áp dụng được với database. cầu query giống câu query được sử dụng khi bạn tạo view, query của nó là giá trị của một hàm formula, ví dụ:String query = “Select Form = \”NhanSu\” & Name=\”Dung\” & QueQuan=\”HaNoi\””;
DocumentCollection dc = db.search(query);
Chú ý: khi tìm kiếm dữ liệu trong ứng dụng Domino thì ta không thể sặp xếp theo một trường nào đó, hay group dữ liệu theo một trường nào đó như trong các DBMS như MS SQL được, tìm kiếm của Domino chỉ đưa ra được 1 tập các document, có thể được sắp xếp theo 1 điều kiện có trước nào đó là theo thời gian tạo, hoặc theo “điểm số truy cập” mà thôi. để sắp sếp lại dữ liệu ta phải viết các hàm sắp sếp, hoặc một cách đơn giản hơn là tạo 1 view, có các trường được sắp xếp, sau đó lấy dữ liệu theo từng entry của view.
Trên đây là các cách thường dùng để truy xuất 1 hoặc 1 collection các document trong 1 ứng dụng domino. Các bạn nên đọc kỹ các bài viết trong help của Domino Designer mình đã đưa ra ở trên để biết chi tiết hơn.
Ví dụ cho bài viết: http://www.mediafire.com/file/d86oau3mcg13gkm/CollectDocument.rar
Video:
Form trong một ứng dụng domino (tiếp)!
Trong bài viết trước mình đã giới thiệu với các bạn về một thành phần rất quan trọng trong một ứng dụng Lotus Notes/Domino đó là Form. Bài này mình sẽ nói kỹ hơn về các thành phần (Control) quan trọng hay được sử dụng trên form.
- Button (Hotspot button): khác với các button html bình thường (<button, <input type=’Button’), hotspot button cho phép bạn giao tiếp với server. để tạo một hotspot button, bạn vào menu: create -> hotspot ->button.
Sau khi bạn create một button, designer sẽ mở thuộc tính của button, bạn đặt label cho button. Khi bạn phát triển một ứng dụng domino chạy trên nền web thì các thuộc tính khác bạn sẽ đặt lại trong tab “<HTML>” ở cuối cùng, tab “Paragraph hide when”cho phép bạn ẩn hiện button trong một điều kiện nào đó.
Bạn có thể chỉ định viết code Hotspot button trên Client hoặc trên Web. Tùy thuộc vào ngôn ngữ bạn viết cho button mà phần Object sẽ hiển thị thêm các event (OnClick, OnDblClick….), và bạn không thể viết cho 2 môi trường cùng với 1 button. Điều này theo mình thấy là khá dỡ, ví dụ: bạn có nút xóa văn bản, trước khi bạn xóa bạn cần hiển thị một dialog xác nhận với người dùng xem có chắc chắn muốn xóa văn bản không, sau đó mới chạy đoạn code xóa văn bản (Formula hoặc gọi Agent), thì với 1 button bạn không làm được điều này. Và thường thì để viết code chạy trên browser bạn sẽ chọn là code javascript, còn chạy trên Client bạn sẽ chọn là Formula hoặc Simple action, LotusScript chỉ chạy được trên môi trường LotusNotes.
- Field: ngoài chức năng làm nhiệm vụ hiển thị thông tin ra, field nó còn xác định kiểu dữ liệu được lưu trữ trong document khi bạn save form chứa field đó. vì thế, field có nhiều kiểu và kiểu của field xác định kiểu dữ liệu được lưu.
Một số kiểu dữ liệu cần lưu ý:
- Authors: Dữ liệu lưu trong một trường authors là tên của người dùng/nhóm xác định người dùng/nhóm này được phép hiệu chỉnh document.
- Readers:Dữ liệu lưu trong một trường readers là tên của người dùng/nhóm xác định người dùng/nhóm này được phép đọc document.
- Rich Text: Ngoài text ra, bạn có thể lưu cả một file attachment vào trường này, bạn cũng có thể lưu một document kế thừa vào trường richtext, bạn có thể chỉ định content-type cho một trường rich text được. số lương ký tự trong một trường text binh thường khoảng gần 20.000 ký tự, còn trường richtext thì không có giới hạn.
Trường authors, readers, names các bạn nên tick chọn “allow multiple values” để có thể lưu được nhiều giá trị, và tab thứ 3 (Advances) cho phép bạn chọn ký tự ngăn cách giứa các giá trị khi hiển thị trên browser. Ở cạnh phần Type có một ô combobox cho phép bạn chọn loại field (Editable, Computed, Computed for display và computed when compose). Nếu kiểu của trường không phải là edittable thì giá trị của trường sẽ được xác định bởi 1 hàm formula, hàm này sẽ được thực hiện khi: đối với trường computed, khi document được tạo và khi được lưu; đối với trường kiểu Computed for display, hàm được thực hiện khi document được mở; đối với trường kiểu Computed when when composed, chỉ khi document được tạo, và giá trị này không thể thay đổi. còn lại các thuộc tính khác tương tự như button.
@chat: trong thực tế các hàm tính toán, hay các giá trị thường xuyên sử dụng trong một form, và được dùng đi dùng lại như tính toán DBPath mình hay lưu vào một trường computed for display dể hiển thị, và dùng lai, tránh viêc tính toán cho một giá trị nhiều lần, và trong 4 kiểu trường thì kiểu computed for display giá trị sẽ không lưu lại vào DB - Computed value: rất đơn giản, đây là một control hiển thị 1 giá trị được tính toán bởi 1 hàm formula, nếu đặt tên trường trong đó, tất nhiên nó sẽ hiển thị giá trị của trường đó.
- Embedded Elements (View): bạn có thể nhúng 1 view vào 1 form
- Embedded Elements (File upload control): Upload control
- Resources: các tài nguyên dùng chung như: CSS, javascript, images….
- Subform: là một control có thể nhúng vào trong form. 1 subform cho phép bạn chia nhỏ form ra để dễ quản lý. Tuy nhiên, mình có đọc một tài liệu khuyến cáo rằng không nên dùng quá nhiều subform, và khi dùng subform các bạn nên cẩn thận khả năng bị trùng (tên) các control cùng loại.
- Các thành phần khác như link, images, table, ….. bạn có thể sử dụng thẻ chuản của HTML
- Cascading Style Sheets (CSS): bạn có thể viết trong phần Resource -> Style Sheets, hoặc upload file css lên trên Resource -> Files, hoặc viết vào trong page.
- Javascript: bạn có thể viết trong phần Code -> Script library, hoặc upload file js lên trên Resource -> Files, hoặc viết vào trong page.
Trên đây là các thành phần hay dùng nhất để bạn tạo một form của ứng dụng Lotus Notes/Domino.
Ví dụ của bài viết: http://www.mediafire.com/file/ro30ruo7ro49r9a/qlnhansu.rar
Video: