Home > Lotus Notes & Domino > Truy xuất dữ liệu trong ứng dụng Domino!

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).

  1. 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.
  2. 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 classLotus 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:

Categories: Lotus Notes & Domino
  1. VanMinh
    30/09/2011 at 17:35

    Mình muốn khi tìm ra kết quả rồi thì nó có dạng direct link thì sao nhỉ, rồi muốn truy xuất dạng form thì http(s)://host:port/[folder…]/[database.nsf]/[view]?SearchView&query=[giatri] như thế nào ?.

    • 30/09/2011 at 18:44

      Mình chưa hiểu ý của VanMinh, bạn có thể nói rõ được ko?

  2. VanMinh
    03/10/2011 at 13:59

    ý mình là sau khi tìm kiếm thấy kết quả rồi thì kết quả đó là dạng link để khi nhấp vào kết quả thì đọc hết thông tin của tài liệu.

    • 03/10/2011 at 18:08

      Trong thuộc tính của cột trong 1 view có thuộc tính để hiển thị cột đó là link của document.

  3. VanMinh
    04/10/2011 at 10:34

    Như trong Demo thì sau khi tìm kiếm = form tìm kiếm thì kết quả đc replaceItemValue(“KetQua”, ketqua) vào field kết quả. Nhưng mình muốn làm là sau khi tìm xong thì nó xuất kết quả vào View [ketqua] và mình sẽ làm 1 text link là [xem ket qua] thì nó sẽ mở View ketqua ra.

    • 04/10/2011 at 23:47

      Bạn cứ đưa định dạng html vào field ketqua binh thuong, sau do pass-thru đoạn text có chứa field này sang html. video http://www.youtube.com/watch?v=4iQcJHOUHpo

      • VanMinh
        05/10/2011 at 11:04

        Bạn upload cái Demo Test lên đi có một số chỗ khó hiểu quá nên phải mục sở thị hiii. thank

      • 05/10/2011 at 12:45
      • VanMinh
        05/10/2011 at 16:48

        “<a href=’http://127.0.0.1/Test.nsf/AllDocs/”
        + doc.getUniversalID() + “?OpenDocument’>”
        + doc.getItemValueString(“Field1”) + “</a>”

        Mình vẫn chưa hiểu cái đoạn [AllDocs] này sử dụng nó như thế nào và nó đc lấy từ đâu ra, vì cái demo test.nsf này ko có field nào chứa nó cả ?

  4. VanMinh
    05/10/2011 at 16:50

    127.0.0.1/Test.nsf/AllDocs/?OpenDocument”>

    Mình vẫn chưa hiểu cái đoạn [AllDocs] này sử dụng nó như thế nào và nó đc lấy từ đâu ra, vì cái demo test.nsf này ko có field nào chứa nó cả ?

  5. 05/10/2011 at 18:33

    URL command để mở document là: http(s)://host:port/[folder…]/[database.nsf]/[view]/[UNID]?OpenDocument
    Vậy, AllDocs kia chính là viewname. bạn có thể tạo ra, hoặc mặc định sử dụng, domino còn có 1 view đặc biệt khác là “0” chứa toàn bộ document

  6. Dương Trọng
    24/05/2012 at 08:22

    Xin chào anh Hải Nam! Có cách nào làm để Seach ngay trên View và trả kết quả trên View luôn không anh. Ví dụ: Trên Form em add một View, một Field TimKiem và một Button Tìm. Có một List danh sách trên View. Mình điền từ tìm kiếm trên Field chọn Button Tìm, thì kết quả trả về trên View luôn không anh?
    Thanks!

    • 24/05/2012 at 08:29

      Mình ít sử dụng Embedded View lắm.
      Trong trường hợp của bạn thì nếu làm trên xpage hoàn toàn được nhưng trên form thì mình chưa làm bao giờ. Bạn có thể dùng 1 computed rich text field, bạn chạy agent tìm kiếm, trả kết quả ra rich text field, hoặc hay hơn bạn sử dụng ajax, bạn gọi ajax gọi đến 1 agent tìm kiếm, trả kết quả lại trả lại dạng xml hoặc json tùy bạn.

    • hai
      19/06/2015 at 10:41

      Mình cũng đang làm trường hợp như bạn Dương Trọng nhưng khó làm quá.bạn làm rồi có thể gửi mình xin bản demo được không bạn?

  7. Dương Trọng
    24/05/2012 at 08:55

    Thank anh Hải Nam nhiều! Đây là lần đầu tiên em đụng tới Lotus. Đọc tài liệu chủ yếu trên trang của anh và Help của IBM. Nhưng mà khó quá. Không hiểu ji hết. Hồi giờ em làm chủ yếu bên C# thôi. Nếu anh có làm phần em thắc mắc. CHo em xem demo với.
    Thank!

  8. 24/05/2012 at 09:28

    @Dương trọng: Hiện tại mình ko có demo của phần này, thời gian này mình đang bận quá nên không giúp bạn viết 1 đoạn demo được. mình có thể mô tả thế này nhé:
    bạn tạo 1 field trên form, tạo button gọi 1 agent, tạo 1 computed richtext field (nhớ pass thru HTML cho đoạn text trên field này). sau quá trình search xong, bạn chuyển giá trị (giá trị có định dạng HTML nhé) vào trong richtext field này.

  9. Dương Trọng
    24/05/2012 at 14:52

    Cho em hỏi chúc anh Hải Nam!
    Ứng dụng của em viết có một database là QLNS.nsf. Khi kiểm tra bằng Formula thì cho biết mình đang thao tác trên database này. Nhưng khi chạy trên Java Agent thì em chạy debug thấy CurrentDatabase lại là Database khác. (bookmark.nsf). Điều này là sao nhỉ?
    Mong anh giải đáp.

    • 28/05/2012 at 14:08

      @Dương Trọng: cái này thì đúng là lạ thật, mình cùng chưa gặp bao giờ :D.

  10. Dương Trọng
    23/06/2012 at 11:01

    Bác cho mình hỏi thêm cái này. Vấn đề về mail Lotus

    Mình có thể phân quyền cho mail được không? Ví dụ mình tạo 2 Group mail: Sale và Maketting. Trong từng Group này có nhiều mail thành viên khác.

    Mình muốn phân quyền cho Mail Admin gửi mail cho 2 Group mail xong nó tự Forward cho các mail thành viên. Các mail thành viên không có quyền gửi mail trưởng của Group mà ko có quyền gửi mail cho Admin, chỉ có mail trưởng của Group mới có quyền gửi mai cho Admin.

    Điều này có làm được không bác. Mong bác chỉ cho.

  1. No trackbacks yet.

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

%d bloggers like this: