• Hướng dẫn chi tiết thiết kế Ribbon ứng dụng Access II
  • Hướng dẫn chi tiết thiết kế Ribbon ứng dụng Access II

    tranthanhan1962 > 25-11-19, 06:43 PM

    Hướng dẫn thiết kế Ribbon ứng dụng Access (phần 2)
         Như đã dự định, phần này tôi sẽ trình bày về cách đưa lệnh vào các button của ribbon. Nhưng do một số anh em hỏi về cách ảnh tab file tôi sẽ nói về việc này trước.
        Trong đoạn khai báo mã XML có đoạn:
          <customUI xmlns="http://schemas.microsoft.com/office/2009/07/customui">
        Có nghĩa là đoạn XML này dành cho office 2010 trở đi.
        Nếu bạn nào sử dụng access 2007 nó sẽ là:
          <customUI xmlns="http://schemas.microsoft.com/office/2006/01/customui">
        Trong bài viết này tôi chỉ thực hiện cho access 2010 trở đi. Riêng access 2007, nếu có dịp tôi sẽ thực hiện một bài khác vì cả hai có nhiều khác biệt. Vã lại, giờ mấy ai còn sử dụng access 2007, thà access 2003 còn hơn.
        Hôm trước tôi có một bài viết về cách ẩn nút option để khóa người sử dụng có thể vào sử option của access để thâm nhập và chỉnh sửa.
        Xin nhắc lại Tab File không dấu được. Cho đến hiện nay dù tìm kiếm khá lâu nhưng tôi cũng chưa tìm thấy đoan mã nào xử lý điều này.
        Về phần cách dấu các idmso lệnh trên Tab File (tôi sử dụng  thuật ngữ idmso để xử dụng chung cho các điều khiển này vì đôi khi nó là button đôi khi nó là tab)
        Các idmso vẫn thể hiện các nhãn tương tự nhưng trong từng vesion của access các idmso cũng khác nhau nên các đoạn mã XML có thể không đúng khi chạy trên các version và xuất hiện việc 1 idmso ẩn trên version này và không ẩn trên version khác và đôi khi gặp lỗi. Một điều may mắn là tên của idmso “Option” không thay đổi trên các version, nó luôn luôn là “ApplicationOptionsDialog”, vì vậy để dấu chỉ mình “Option”, ta có thể sử dụng chung đoạn mã cho tất cả các version (2010-->2019).
      <backstage>
            <button idMso="ApplicationOptionsDialog" visible="false"/>
        </backstage>
        Thực hiện điều này bằng cách đưa đoạn mã backstage này vào phần cuối của đoạn mã XML (trên từ khóa </customUI>):
        <?xml version="1.0" encoding="utf-8"?>
        <customUI xmlns="http://schemas.microsoft.com/office/2009/07/customui">
          <ribbon startFromScratch="true">
            <tabs>
              <tab id="TabSo1" label="Tab số 1" visible="true">
                <group id="GroupSo1" label="Group Số 1">
                  <button id="BT01" imageMso="HappyFace" size="large" label="Nút số 1" onAction="mcr01" />
                </group>
              </tab>
            </tabs>
          </ribbon>
       <backstage>
            <button idMso="ApplicationOptionsDialog" visible="false"/>
        </backstage>
        </customUI>
        Cách bố trí các idmso trên các version của access (từ 2010 đến 2019)
    [Hình: u9bug6E.png]
    Tên các idmso của từng version access (Do không thể tạo được table trên bài viết các bạn chịu khó nhìn vậy)
    Nhãn             |    idMso 2010    |    idMso 2013    |    idMso 2016+2019        
    Account          |    Không có          |    TabHelp           |    TabHelp        
    Close              |    FileClose    (không thay đổi)   
    Exit                |    FileExit             |    Không có          |    Không có        
    Export            |    Không có         |    TabPublish         |    TabPublish        
    Help               |    TabHelp          |    Không có            |    Không có       
    History           |    Không có         |    Không có            |    HistoryTab        
    Home             |    Không có        |    Không có            |    PlaceTabHome        
    Info                |    TabInfo    (không thay đổi)   
    New               |    TabNew          |    TabOfficeStart    |    TabOfficeStart        
    Open              |    FileOpen         |    TabRecent         |    TabRecent       
    Options           |    ApplicationOptionsDialog    (không thay đổi)   
    Print               |    TabPrint    (không thay đổi)   
    Recent            |    TabRecent      |    Không có           |    Không có        
    Save               |    FileSave    (không thay đổi)   
    Save & Send    |    TabShare       |    Không có           |    Không có        
    Save As           |    FileSaveAs     |    Không có           |    TabSave        
    Share              |    Không có       |    TabShare           |    TabShare        
    Export             |    Không có      |    TabPublish          |    TabPublish        
    Publish            |    Không có      |    Không có            |    Publish2Tab        
    Close              |    FileClose    (không thay đổi)   
    Account          |    Không có       |    TabHelp              |    TabHelp        
    Feedback        |    Không có       |    Không có            |    TabOfficeFeedback  |   
    Do máy mình không cài đầy đủ các version nên mình test trên access 2019 thì rất OK. Bạn nào có cài đầy đủ test thử xem nếu đưa vào tất cả các lệnh idmso thì có thể sử dụng chung một bản mã xml cho tất cả các version được không.
    Ví dụ khi đưa đoạn mã XML này vào field RibbonXML của record Ribbon1 của table UsysRibbons của tập tin Demo (access 2019):
    <?xml version="1.0" encoding="utf-8"?>
    <customUI xmlns="http://schemas.microsoft.com/office/2009/07/customui">
      <ribbon startFromScratch="true">
        <tabs>
          <tab id="TabSo1" label="Quản lý Giao diện" visible="true">
            <group id="GroupSo1" label="Form">
              <button id="BT01" imageMso="PictureInsertMenu" size="large" label="Nút số 1" onAction="mcr01" />
            </group>
          </tab>
        </tabs>
      </ribbon>
    <backstage>
            <button idMso="FileSave" visible="false"/>
            <button idMso="FileSaveAs" visible="false"/>
            <button idMso="FileOpen" visible="false"/>
            <button idMso="FileClose" visible="false"/>
            <button idMso="ApplicationOptionsDialog" visible="false"/>
            <button idMso="FileExit" visible="false"/>
            <button idMso="HistoryTab" visible="false"/>
            <button idMso="OfficeFeedback" visible="false"/>
            <button idMso="ShareDocument" visible="false"/>
            <button idMso="FileCloseDatabase" visible="false"/>
            <tab idMso="TabInfo" visible="false"/>
            <tab idMso="TabRecent" visible="false"/>
            <tab idMso="TabNew" visible="false"/>
            <tab idMso="TabPrint" visible="false"/>
            <tab idMso="TabShare" visible="false"/>
            <tab idMso="TabHelp" visible="false"/>
            <tab idMso="TabPublish" visible="false"/>
            <tab idMso="TabSave" visible="false"/>
            <tab idMso="TabOfficeStart" visible="false"/>
    <tab idMso="Publish2Tab" visible="false"/>
    <tab idMso="TabOfficeFeedback" visible="false"/>
    <tab idMso="PlaceTabHome" visible="false"/>
        </backstage>
    </customUI>
        Nó sẽ hiển thị như thế này (ẩn tất cả các control idmso).
    [Hình: SpRFK0B.png]
    Giờ đến phần chính: đưa lệnh vào các button của ribbon.
        Có 2 cách đưa lệnh vào button XLM: 1/ Dùng macro. 2/Dùng VBA:
        Để hợp lý hơn tôi sẽ chỉnh sửa một chút field RibbonXML của record Ribbon1:
    <?xml version="1.0" encoding="utf-8"?>
    <customUI xmlns="http://schemas.microsoft.com/office/2009/07/customui">
      <ribbon startFromScratch="true">
        <tabs>
          <tab id="TabSo1" label="Quản lý Giao diện" visible="true">
            <group id="GroupSo1" label="Form">
              <button id="BT01" imageMso="PictureInsertMenu" size="large" label=" Mở Form " onAction="mcr01" />
            </group>
          </tab>
        </tabs>
      </ribbon>
    <backstage>
            <button idMso="FileSave" visible="false"/>
            <button idMso="FileSaveAs" visible="false"/>
            <button idMso="FileOpen" visible="false"/>
            <button idMso="FileClose" visible="false"/>
            <button idMso="ApplicationOptionsDialog" visible="false"/>
            <button idMso="FileExit" visible="false"/>
            <button idMso="HistoryTab" visible="false"/>
            <button idMso="OfficeFeedback" visible="false"/>
            <button idMso="ShareDocument" visible="false"/>
    <button idMso="FileCloseDatabase" visible="false"/>
            <tab idMso="TabInfo" visible="false"/>
            <tab idMso="TabRecent" visible="false"/>
            <tab idMso="TabNew" visible="false"/>
            <tab idMso="TabPrint" visible="false"/>
            <tab idMso="TabShare" visible="false"/>
            <tab idMso="TabHelp" visible="false"/>
            <tab idMso="TabPublish" visible="false"/>
            <tab idMso="TabSave" visible="false"/>
            <tab idMso="TabOfficeStart" visible="false"/>
    <tab idMso="Publish2Tab" visible="false"/>
    <tab idMso="TabOfficeFeedback" visible="false"/>
    <tab idMso="PlaceTabHome" visible="false"/>
        </backstage>
    </customUI>
        Lúc này hình ảnh của Ribbon khi mở CSDL như sau:
    [Hình: yf5XsG5.png]
    Lúc này nếu ấn vào nút [Mở Form] chắc chắn nó sẽ báo lỗi, Vì không tìm ra cái lệnh mcr01 (onAction="mcr01")
        Để tạo lệnh cho onAction có thể sử dụng macro hoặc VBA. Trước hết tạo thêm một cái form để test lệnh này ( lệnh mở form). Tạo một form, để tên mặc định là Form1 hoặc đặt tên gì cũng được.
        1/Dùng macro: Tạo một macro có tên là mcrOpenForm
    [Hình: NNjGxaq.png]
    Thay đoạn mã:
              <button id="BT01" imageMso="PictureInsertMenu" size="large" label=" Mở Form " onAction="mcr01" />
        Thành:
              <button id="BT01" imageMso="PictureInsertMenu" size="large" label=" Mở Form " onAction="mcrOpenForm" />
        Khi đóng và mở lại CSDL, khi bấm vào button [Mở Form], lệnh mở form sẽ được thực hiện.
        1/Dùng VBA:
        Trước khi tạo module phải kiểm tra references. Mở một module, mở tool, reference. Kiểm tra [Microsoft Ofice 16.0 Object Library]. Nếu nó chưa được set thì chọn nó. Không set cái này nó sẽ không chạy VBA cho lệnh ribbon.
    [Hình: qb9hC6F.png]
    Tạo một module toàn cục (ở đây tôi sẽ đặt tên nó là Global).
        Tạo một đoạn mã VBA mở Form1:

    Mã:
    Sub OpenForm()
        DoCmd.OpenForm "Form1"
    End Sub

    Đây là mã VBA mở form quen thuộc mà khi bạn đặt nó ở bất kỳ nút lệnh nào nó cũng sẽ thực hiện công việc mở Form1 giống như macro mcrOpenForm mới vừa thực hiện.
        Thay tên macro ở onAction="mcrOpenForm" bằng tên sub onAction=" OpenForm "
        Ta có
              <button id="BT01" imageMso="PictureInsertMenu" size="large" label=" Mở Form " onAction=" OpenForm " />
        Khi khởi động lại CSDL bấm vào Button [Mở form]. Một bảng báo lỗi hiện ra
    [Hình: w2NsIHw.png]
    Vấn đề là nó còn thiếu một số mã VBA để thực hiện lệnh.
        Giờ ta thêm vào đoạn mã như sau:
    Option Compare Database
    Option Explicit
    Public IRibbonControl As IribbonUI
    ----------------
    Public Sub OnRibbonLoad(objRibbon As IRibbonUI)
    On Error GoTo Err_OnRibbonLoad
    Set IRibbonControl = objRibbon
    Exit_OnRibbonLoad:
        Exit Sub
    Err_OnRibbonLoad:
        MsgBox Err.Description
        Resume Exit_OnRibbonLoad
    End Sub
    ---------------------
    Sub OpenForm(control As IRibbonControl)
        DoCmd.OpenForm "Form1"
    End Sub
        Đoạn mã màu đỏ là đoạn mã gốc để thực hiện các lệnh VBA của các sub và function cho các button trên ribbon thực hiện lệnh VBA.
        Giờ ta khởi động lại. Khi bấm vào Button [Mở form], thì form 1 được mở theo lệnh mà không báo lỗi.
        Thay đổi Sub OpenForm thành Function OpenForm.

    Mã:
    Function OpenForm(control As IRibbonControl)
        DoCmd.OpenForm "Form1"
    Function Sub

        Mã VBA vẫn được thực hiện.
    Demo
        Thực ra ở các tập tin accdb khi khóa Display Navigation Pan, Option, và Shift thì không có cách nào vào được các đối tượng nguồn trong CSDL, Nên việc giữ bí mật cho macro cũng giống như module việc thực hiện các lệnh do sở thích tác giả (đối vời những lệnh tương tự) chứ không bị bắt buột vì lý do kỹ thuật nào cả.
        Trên đây gần như tất cả kỹ thuật cơ bản tạo ribbon đã được trình bày một cách tương đối. Các bạn nếu có gì hỗ trợ thêm thì xin mời tham gia để chủ đề này phong phú hơn
  • RE: Hướng dẫn chi tiết thiết kế Ribbon ứng dụng Access II

    toidjtjmtoi > 06-03-20, 11:39 AM

    001  Hay quá .
    Mà trên thanh Robin này mình có thể thể hiện kết quả của Query hay hàm không Anh?
  • RE: Hướng dẫn chi tiết thiết kế Ribbon ứng dụng Access II

    toidjtjmtoi > 06-03-20, 11:40 AM

    001  Hay quá .
    Mà trên thanh Robin này mình có thể thể hiện kết quả của Query hay hàm không ?
    Tiện anh có code robin mặc định của Access không cho em xin với
  • RE: Hướng dẫn chi tiết thiết kế Ribbon ứng dụng Access II

    tranthanhan1962 > 06-03-20, 12:06 PM

    (06-03-20, 11:40 AM)toidjtjmtoi Đã viết: 001  Hay quá .
    Mà trên thanh Robin này mình có thể thể hiện kết quả của Query hay hàm không ?
    Tiện anh có code robin mặc định của Access không cho em xin với
    Hì hì mình đính chính lại la Ribbon bar (ribbon có nghĩa là ruy-băng, giống như sợi ruy-băng của phụ nữ buột trên đầu) chứ không phải là Robin (như Robin Hut). Chưa hiểu rõ ý của bạn lắm nhưng bạn có thể viết lệnh (hoặc macro) hiện bảng query hay xử lý function đều được cả (cái gì của Menu mbd làm được thì ribbon của accbd đều làm được). Code mặc định thì không có nhưng cơ bản xử lý ribbon tự tạo thì mình đã giới thiệu qua. Ribbon mặc định của access là cái mình thấy được khi mở access. Code hệ thống của nó do microsoft viết, mình cũng không cần quan tâm để làm gì (có sẳn cứ xài)
  • RE: Hướng dẫn chi tiết thiết kế Ribbon ứng dụng Access II

    toidjtjmtoi > 06-03-20, 12:27 PM

    (06-03-20, 12:06 PM)tranthanhan1962 Đã viết:
    (06-03-20, 11:40 AM)toidjtjmtoi Đã viết: 001  Hay quá .
    Mà trên thanh Robin này mình có thể thể hiện kết quả của Query hay hàm không ?
    Tiện anh có code robin mặc định của Access không cho em xin với
    Hì hì mình đính chính lại la Ribbon bar (ribbon có nghĩa là ruy-băng, giống như sợi ruy-băng của phụ nữ buột trên đầu) chứ không phải là Robin (như Robin Hut). Chưa hiểu rõ ý của bạn lắm nhưng bạn có thể viết lệnh (hoặc macro) hiện bảng query hay xử lý function đều được cả (cái gì của Menu mbd làm được thì ribbon của accbd đều làm được). Code mặc định thì không có nhưng cơ bản xử lý ribbon tự tạo thì mình đã giới thiệu qua. Ribbon mặc định của access là cái mình thấy được khi mở access. Code hệ thống của nó do microsoft viết, mình cũng không cần quan tâm để làm gì (có sẳn cứ xài)
    Cảm ơn pro 
    Mà mình muốn hỏi ví dụ mình muốn hiển thị số lượng tồn kho trên Ribbon bar này được không nhỉ
  • RE: Hướng dẫn chi tiết thiết kế Ribbon ứng dụng Access II

    tranthanhan1962 > 06-03-20, 12:36 PM

    Được! Nếu viết code. Tất nhiên bạn phải có số đó ở đâu rồi lấy đưa vào.
  • RE: Hướng dẫn chi tiết thiết kế Ribbon ứng dụng Access II

    toidjtjmtoi > 06-03-20, 12:42 PM

    (06-03-20, 12:36 PM)tranthanhan1962 Đã viết: Được! Nếu viết code. Tất nhiên bạn phải có số đó ở đâu rồi lấy đưa vào.

    Anh có thể viết mẫu cho em 1 cái không    018
  • RE: Hướng dẫn chi tiết thiết kế Ribbon ứng dụng Access II

    tranthanhan1962 > 06-03-20, 03:02 PM

    Bạn đưa CSDL lên đi
  • RE: Hướng dẫn chi tiết thiết kế Ribbon ứng dụng Access II

    tranthanhan1962 > 06-03-20, 03:46 PM

    (06-03-20, 12:42 PM)toidjtjmtoi Đã viết:
    (06-03-20, 12:36 PM)tranthanhan1962 Đã viết: Được! Nếu viết code. Tất nhiên bạn phải có số đó ở đâu rồi lấy đưa vào.

    Anh có thể viết mẫu cho em 1 cái không    018
     Trước hết Bạn chỉ hỏi cho vui hoặc bạn đang đánh đố tôi và mọi người trên forum. Bạn phải hiểu Ribbon là cái gì. Nó cũng giống menu dùng để xử lý lệnh gì đó của chương trình. Với việc hiển thị số lượng tồn kho bạn có thể để nó trên form hoặc report đi theo bảng chi tiết của nó. Đưa các số đó lên ribbon hay menu làm gì ở một chỗ không liên quan. Nhưng có lẽ bạn cũng tức gì tôi vì tôi sửa chính tả về việc bạn đọc sai ribbon thành robin. Thực ra tôi không chê bay gì bạn cả. Tôi chỉ thuần tuý muốn giúp bạn đọc đúng tên object của access thôi. Nhưng thưa với bạn tôi nói được là làm được (trừ khi ai xúi tôi làm tào lao, tôi sẽ không làm). Cũng có thể bạn nghĩ rằng trên ribbon không chứa textbox thì làm gì đưa được một giá trị lên trên đó. Bạn đã nhầm, Ribbon không chứa textbox nhưng có chứa label, Bạn có thể dùng label để đưa giá trị vào. Ribbon được điều khiển bằng field RibbonXML của table USysRibbons. Chỉ cần bạn dùng một query thay đổi đoạn mã <labelControl id="lbl0" label="Label 0" getVisible="GetVisible" getEnabled="GetEnabled"/> bằng một query và cắt bỏ đoạn Label 0 thay thế bằng giá trị tồn kho là xong. Cứ mỗi lần open form hay report tồn kho thì gọi Ribbon Name này lên nó sẽ hiển thị giá trị tồn kho trên thanh ribbon. Bạn cứ thử làm thì sẽ biết là tôi nói đúng
  • RE: Hướng dẫn chi tiết thiết kế Ribbon ứng dụng Access II

    toidjtjmtoi > 06-03-20, 04:27 PM

    (06-03-20, 03:46 PM)tranthanhan1962 Đã viết:
    (06-03-20, 12:42 PM)toidjtjmtoi Đã viết:
    (06-03-20, 12:36 PM)tranthanhan1962 Đã viết: Được! Nếu viết code. Tất nhiên bạn phải có số đó ở đâu rồi lấy đưa vào.

    Anh có thể viết mẫu cho em 1 cái không    018
     Trước hết Bạn chỉ hỏi cho vui hoặc bạn đang đánh đố tôi và mọi người trên forum. Bạn phải hiểu Ribbon là cái gì. Nó cũng giống menu dùng để xử lý lệnh gì đó của chương trình. Với việc hiển thị số lượng tồn kho bạn có thể để nó trên form hoặc report đi theo bảng chi tiết của nó. Đưa các số đó lên ribbon hay menu làm gì ở một chỗ không liên quan. Nhưng có lẽ bạn cũng tức gì tôi vì tôi sửa chính tả về việc bạn đọc sai ribbon thành robin. Thực ra tôi không chê bay gì bạn cả. Tôi chỉ thuần tuý muốn giúp bạn đọc đúng tên object của access thôi. Nhưng thưa với bạn tôi nói được là làm được (trừ khi ai xúi tôi làm tào lao, tôi sẽ không làm). Cũng có thể bạn nghĩ rằng trên ribbon không chứa textbox thì làm gì đưa được một giá trị lên trên đó. Bạn đã nhầm, Ribbon không chứa textbox nhưng có chứa label, Bạn có thể dùng label để đưa giá trị vào. Ribbon được điều khiển bằng field RibbonXML của table USysRibbons. Chỉ cần bạn dùng một query thay đổi đoạn mã <labelControl id="lbl0" label="Label 0" getVisible="GetVisible" getEnabled="GetEnabled"/> bằng một query và cắt bỏ đoạn Label 0 thay thế bằng giá trị tồn kho là xong. Cứ mỗi lần open form hay report tồn kho thì gọi Ribbon Name này lên nó sẽ hiển thị giá trị tồn kho trên thanh ribbon. Bạn cứ thử làm thì sẽ biết là tôi nói đúng

    Trời anh hiểu nhầm ý em rồi . Em đang hỏi thật mà , em muốn để lên cho nó trực quan thôi 021 . Em ko biết thật chứ có nghĩ gì đâu . Em ko có học bài bản toàn mò google thôi . Nói thật đoạn bên trên anh viết xong em đọc cũng ko hiểu nên mới cần xin anh file mẫu sad

    Ví dụ như code của anh thì sửa như này ạ 

    <?xml version="1.0" encoding="utf-8"?>
    <customUI xmlns="http://schemas.microsoft.com/office/2009/07/customui">
      <ribbon startFromScratch="true">
        <tabs>
          <tab id="TabSo1" label="Quản lý Giao diện" visible="true">
            <group id="GroupSo1" label="Form">
              <button id="BT01" imageMso="PictureInsertMenu" <labelControl id="lbl0" label="txttonkho" getVisible="GetVisible" getEnabled="GetEnabled"/> onAction="OpenForm" />
            </group>
          </tab>
        </tabs>
      </ribbon>