<output id="os3gq"><ruby id="os3gq"></ruby></output>

    1. <mark id="os3gq"></mark>
    2. 我的變速箱作業三完成后的總結筆記-七夜
      Access軟件網QQ交流學習群(群號碼198465573),歡迎您的加入!
      首頁 >技術文章> 程序人生


      我的變速箱作業三完成后的總結筆記

      發表時間:2012/8/5 0:44:12 評論(2) 瀏覽(4279)  評論 | 加入收藏 | 復制
         
      摘 要:我的變速箱作業三完成后的總結筆記
      正 文:

      今天學習到了作業三,為了加深對帶有子窗體的窗體的制作的了解,同時對所學知識點做一個回顧,寫了一個今后開發類似功能模塊的筆記。供自己開發類似模塊使用。

      與報銷教程相比,含有子窗體的窗體,在建設過程中多了以下功能 ,

      1、使用到了復選框的更新后事件功能,以達到確定某些權限的目的,和在行記錄中的執行某個二選一的操作。

      2、在修改功能中加入了對操作員的判定,以達到維護數據安全的目的,即誰錄入誰修改,他人無權修改自己的相關錄入的記錄。

      3、子窗體中的數據,在新增是用的是臨時表,在修改是用的是表本身。

      4、使用了帶有日期的序號自增函數。并了解到了其原理。

      新增加的功能并不多,但整個程序的前后協調性何緊密性比之前的報銷教程以及變速箱作業一、二的內容都要嚴謹得多,代碼看似復雜,其實就多了以上的這部分功能。

      以下是筆記的內容,大家見笑了。

      首先是建立表:tblCgdd ;表tblcgmx;表tblcgmx_temp;建立查詢qryCgdd;建基礎窗體:frmCgdd_child,基礎窗體的制作是基于查詢qrycgdd來的?此聘樵儗男略龌蛐薷,其實操作的都不是查詢,而是跟查詢差不多的有對應字段的表,這里就是tblcgdd;

      一、子窗體建立的時候要做的工作有:

      通過窗體制作向導以查詢為依據做的窗體,控件的名稱一定要改為和標tblcgdd相同的字段名。

      基礎窗體的相關屬性要設置好,默認視圖是 數據表; 記錄集類型是快照。

      建立計時器事件,目的是有修改操作的時候,好返回到修改前的那行記錄

      Private Sub Form_Timer()

      Acchelp_FindstrRecord (g_CurrentSelectStrID)

      '計時器執行一次后不再執行

      Me.TimerInterval = 0

      End Sub

      建立以主鍵為“采購訂單號“的獲得焦點事件

      目的:給全局變量selectstr賦值,好讓程序明白你選擇的是哪條記錄,后面多個功能模塊需要用到這個

      Private Sub 采購訂單號_GotFocus()

      On Error GoTo Err_采購訂單號_GotFocus:

      selectstr = Me.采購訂單號

      Forms!usysfrmMain!labFind.Tag = 1

      Forms!usysfrmMain!btnEdit.Tag = 999

      Exit_采購訂單號_GotFocus:

      Exit Sub

      Err_采購訂單號_GotFocus:

      Resume Exit_采購訂單號_GotFocus

      End Sub

      窗體成為當前  事件的屬性中輸入=selectrecord()  ,目的是貌似是為了讀取整個記錄集

      添加刪除功能代碼  刪除選中的那條記錄,并且刪除相應的子窗體中的記錄,確定記錄就是通過變量selectstr 來傳遞的。這里就體現了之前采購訂單號的 成為當前事件的預定義的必要性了。

      Public Sub btnDel()

          If MsgBox("您確認要刪除嗎?", vbYesNo + vbInformation, Forms!usysfrmLogin.Caption) = vbYes Then

              '防止屏幕閃動

              DoCmd.Echo False

              'AccHelp_DeleteFldStrRow函數的詳細說明請看平臺幫助第十二章

              Call acchelp_deletefldstrrow("tblcgdd", "xsddID", selectstr)

              Call acchelp_deletefldstrrow("tblcgmx", "xsddid", selectstr)

              '重新加載子窗體,以刷新數據

              Forms!usysfrmMain!frmChild.SourceObject = "frmcgdd_child"

              DoCmd.Echo True

          End If

      End Sub

      后面如果需要使用到查詢功能,代碼也是在這個基礎窗體中添加

      Public Sub btnFind()

      DoCmd.OpenForm "usysfrmFind"

          '文本型對應 3 ,日期型對應 1 ,數值型對于 2

      Forms!usysfrmFind!cobfldName.RowSource = "供應商名稱;3;采購訂單日期;1;最早交貨日期;1;最遲交貨日期;1;聯系人1;3;"

          '指定查詢數據來源

      Forms!usysfrmFind!labDataSource.Caption = "qryCgdd"

      End Sub

      平臺按鈕“查找“的功能實現代碼    

      ‘如果有報表需要輸出,這里也一并將報表所需的全局變量strRptReSource賦值

      Public Sub FindEnd()

      Forms!usysfrmMain!frmChild.Form.RecordSource = Acchelp_ChildFormRecordSource("qryCgdd", "采購訂單號", True)

          '記錄下來報表的數據來源

      strRptReSource = Forms!usysfrmMain!frmChild.Form.RecordSource

      End Sub

       

      二、新增窗體的制作:

      新增窗體不需要記錄源,如果想節省開發新增窗體的事件的時候可以以查詢qryCgdd為依據來建立窗體,調整好窗體的布局,但要記得刪除掉記錄源信息,并將各個控件調整其名稱屬性,以查詢為基礎建立的窗體默認控件的名稱都是查詢中的字段名稱,這里要記得修改?丶䜩碓匆獎h除,使得其狀態是未綁定;需要將文本框更改為列表框的,在這里就進行更改和對其相應的屬性進行初始定義,文本框修改為列表框,其值的來源肯定是某個表,而不是某個查詢,在這里。增加需要使用到但初始建立又沒有的控件,例如復選框控件。添加采購明細的子窗體。在添加子窗體之前呢,先建立采購明細的子窗體,該子窗體是基于tblcgmx_temp表來建立的,記錄集為動態級;確定鏈接子字段和鏈接主字段為同一個可唯一確定訂單記錄的cgddid;

      通過 復選框 fxcgmx 的更新后事件,來確定子窗體是否可接受新增數據。

      Private Sub fxcgmx_AfterUpdate()

      '如果有零件明細,則子窗體可新增數據,否則不可新增數據

          If Me.fxcgmx = -1 Then

              Me.frmChild.Form.AllowAdditions = True

          Else

              Me.frmChild.Form.AllowAdditions = False

          End If

       

      End Sub

      新增窗體中直接對應的是一個tblcgmx_temp,所以其中有可能有值錢遺留的未清空的數據,所以我們在新增窗體加載的時候做一個臨時表類數據清空操作:

      新增窗體加載事件

      Private Sub Form_Load()

      '主窗體加載事件

      '清空零件明細臨時表 tblCgmx_temp

          DoCmd.SetWarnings False

          DoCmd.RunSQL "Delete tblCgmx_temp.* FROM tblCgmx_temp;"

          '生成新的編號

          AutoMxID

          '讓子窗體不能新增數據

          Me.frmChild.Form.AllowAdditions = False

      End Sub

       

      這里有一個比較拗口的語句,因為選中一個供應商后,該供應商默認有兩個聯系人,而我們的訂單表里只接受一個聯系人,在這種二選一的界面操作中,

      我們可以用,gysid文本框的更新后事件來確定,聯系人文本框將獲得什么樣的默認值,

      代碼如下:

      Private Sub gysid_AfterUpdate()

          Me.Lxr1 = Me.gysid.Column(2) '第三列值賦值給lxr1

          Me.Lxr1.SetFocus

          '展開組合框

       

      End Sub

      而再通過設置lxr2復選框,來確定是否需要改變lxr1里的值。

      Private Sub fxlxr2_AfterUpdate()

       If Me.fxlxr2 = -1 Then    '被選中

              Me.Lxr1 = Me.gysid.Column(3) '賦值第四列

              Me.Lxr1.SetFocus

          Else

              Me.Lxr1 = Me.gysid.Column(2) '賦值第三列

          End If

       

      End Sub

       

      定義一個含有日期的編號新增函數 AutoMxID

      Private Sub AutoMxID()

      '功能:生成采購明細編號

          Dim YM As String

          Dim YMold As String

          '使mxID文本框有效,寫入數據

          Me.cgddid.Enabled = True

          Me.cgddid.SetFocus

          '生成編號前綴,格式為CG200701,即年四位,月兩位

       

          YM = "CG" & Year(Date) & Format(Month(Date), "00")

       

          If CheckRecords("tblCgdd") = True Then    'checkRecords函數說明見平臺幫助第十二章

              '如果表中存在記錄,則去取得表最后一條記錄的年月

              YMold = Left(DLast("[cgddid]", "tblcgdd"), 8)    'tblcgdd表中最后一條記錄的cgddid字段的值的前8

              If YM = YMold Then    '如果系統月份與最后一條記錄月份相同,則增加1

                  Me.cgddid = acchelp_autoid(YM, 4, "tblcgdd", "cgddid")    'acchelp_autoid函數說明見平臺幫助第十二章

              Else    '如果不相同,則按新月份從1開始編號

                  Me.cgddid = YM & "0001"

              End If

          Else

              '如果表中不存在記錄,則生成第一條編號

              Me.cgddid = acchelp_autoid(YM, 4, "tblcgdd", "cgddid")

          End If

       

          'gysid文本框獲得焦點

          Me.gysid.SetFocus

          '使用cgddid文本框無效,以防止操作員誤修改數據

          Me.cgddid.Enabled = False

      End Sub

       

       

       

      設置保存按鈕和關閉按鈕的相關事件代碼

      這里要注意的是,看你使用的是自己定義的按鈕還是系統給 的按鈕,代碼的名稱會不一樣,功能完全一樣。

      Private Sub cmdOK_click()  '保存按鈕事件

          cmd_save

      End Sub

       

      Private Sub cmdCancel_Click()  '關閉按鈕事件

          Me.Undo

          DoCmd.Close acForm, Me.Name

      End Sub

       

       

      定義保存數據函數Save的代碼

      Private Sub cmd_save()

          Dim rst As DAO.Recordset

          '如果保存時,別的操作員新增了此編號,則生成新的編號

          If Acchelp_StrDataIsExist("tblCgdd", "cgddid", Me.cgddid) = True Then

              '生成新的編號

              AutoMxID

          End If

         

              If IsNull(Me.gysid) Then

              MsgBox "請輸入供應商名稱", vbCritical, "提示"

              Me.gysid.SetFocus

              Exit Sub

          End If

         

              If IsNull(Me.Lxr1) Then

              MsgBox "請輸入聯系人1", vbCritical, "提示"

              Me.Lxr1.SetFocus

              Exit Sub

          End If

                If IsNull(Me.cgddrq) Then

              MsgBox "請輸入采購訂單日期", vbCritical, "提示"

              Me.cgddrq.SetFocus

              Exit Sub

          End If

                If IsNull(Me.zzrq) Then

              MsgBox "請輸入最早交貨日期", vbCritical, "提示"

              Me.zzrq.SetFocus

              Exit Sub

          End If

       

               If IsNull(Me.zcrq) Then

              MsgBox "請輸入最晚交貨日期", vbCritical, "提示"

              Me.zcrq.SetFocus

              Exit Sub

          End If

         

        

          If MsgBox("您確認要保存嗎?", vbOKCancel + vbInformation, "提示") = vbOK Then

      Me.Refresh

      Set rst = CurrentDb.OpenRecordset("tblCgdd", dbOpenDynaset)

              rst.AddNew

              rst("cgddid") = Me.cgddid

             

              rst("gysid") = Me.gysid

             

              rst("Lxr1") = Me.Lxr1

             

              rst("cgddrq") = Me.cgddrq

             

       

             

              rst("zzrq") = Me.zzrq

              rst("zcrq") = Me.zcrq

             

              '操作員,czyid的字段大小務必為6,請檢查

              rst("czyid") = Forms!usysfrmLogin!txtUserName

          

             

              rst.Update

              rst.Close

              Set rst = Nothing

              '如果有零件明細

              If Me.fxcgmx = -1 Then

                  'tblCgmx_temp表中的數據追加到tblCgmx表中

                  DoCmd.SetWarnings False

                  DoCmd.RunSQL "Insert INTO tblCgmx Select tblCgmx_temp.* FROM tblCgmx_temp;"

              End If

              '刷新數據,通過重新加載子窗體實現

              If IsLoaded("usysfrmMain") Then

                  DoCmd.Echo False

                  Forms!usysfrmMain!frmChild.SourceObject = "frmCgdd_child"

                  DoCmd.Echo True

              End If

              MsgBox "保存成功!", vbInformation, "提示"

              Me.gysid = Null

              Me.Lxr1 = Null

            

             

              Me.zzrq = Null

              Me.zcrq = Null

              'gysid獲得焦點,不然如果焦點停留在frmChild上,會出錯

              Me.gysid.SetFocus

              '生成新的編號

              AutoMxID

              If Me.fxcgmx = -1 Then

                  '清空零件明細臨時表 tblCgmx_temp

                  DoCmd.SetWarnings False

                  DoCmd.RunSQL "Delete tblCgmx_temp.* FROM tblCgmx_temp;"

              End If

              Me.fxcgmx = 0

              '子窗體不可新增數據

              Me.frmChild.Form.AllowAdditions = False

       

              Me.gysid.SetFocus

          End If

      End Sub

      三、修改窗體的制作:

      以表tblcgdd為數據來源,建立一個新的窗體,也可以在原來的新增窗體直接復制過來,以減少控件的制作,但無論是以復制還是以向導來建立的窗體,各個控件的命名均以和表的字段名相同的名稱命名;且控件來源,也同樣和表的字段名一一對應;

      需要將文本框改為列表框的控件,在這里就可以先修改并定義屬性了;

      有需要用到復選框來控制值的內容的這一步也可以進行類似新增窗體的操作了,是通過gysid控件的更新后事件,來確定lxr1的值,同時通過復選框lxr2的更新后事件來確定lxr1的值,

      該步的子窗體直接對應的是tblcgmx表操作,不在是對應臨時表操作了,這里 要注意;

      設置窗體的加載事件:

      通過之前的基礎窗體采購訂單號獲得焦點事件的變量,selectstr確定選中的記錄,給各個控件初始化,即提取對應的值;

      Private Sub Form_Load()

          Me.RecordSource = "Select * FROM tblcgdd Where tblcgdd.cgddid='" & selectstr & "'"

          Me.frmChild.Form.AllowAdditions = False

          g_CurrentSelectStrID = selectstr

      End Sub

      通過窗體的成為當前事件來對比操作員是否和建立的人是同一人,達到控制是否賦予其修改權限的目的。

      Private Sub Form_Current()

          '判斷修改的用戶和建立數據的用戶是否是同一個人,為否的話則無法對該窗體進行修改。

          If Me.czyid = Forms!usysfrmLogin!txtUserName Then

              Me.AllowEdits = True

          Else

              Me.AllowEdits = False

          End If

      End Sub

      通過復選框fxcgmx的更新后事件

      來實現是否打開子窗體,讓用戶獲得修改子窗體數據權限的目的。

      Private Sub fxcgmx_AfterUpdate()

      '如果有三包零件,則子窗體可新增數據,否則不可新增數據

          If Me.fxcgmx = -1 Then

              Me.frmChild.Form.AllowAdditions = True

          Else

              Me.frmChild.Form.AllowAdditions = False

          End If

      End Sub

       

      確定保存按鈕cmd_ok的單擊事件,達到保存修改后的數據的目的

      Private Sub cmdOK_click()   '單擊確定按鈕事件

      '刷新當前窗體內容     任何在窗體中的操作實際上已經直接在表里操作了,刷新是為了使得整個界面看到的是實時的內容而已

          Me.Refresh

         

          DoCmd.Echo False

          Forms!usysfrmMain!frmChild.SourceObject = "frmcgdd_child"

          DoCmd.Echo True

       

          Forms!usysfrmMain!frmChild.Form.TimerInterval = 300

       

          DoCmd.Close acForm, Me.Name

      End Sub

      設置取消或者是關閉按鈕,達到退出修改窗體的目的

      Private Sub cmdCancel_Click()  '關閉按鈕事件

          Me.Undo

          DoCmd.Close acForm, Me.Name

      End Sub

       


      Access軟件網交流QQ群(群號:198465573)
       
       相關文章
      變速箱學習筆記_新建窗體的一點體會  【天行健客  2009/5/29】
      我做變速箱的每一天,今天做完作業三。  【小王  2010/2/3】
      變速箱作業四學習體會  【常萬兔  2010/7/21】
      變速箱三個作業的學習體會  【lfw07  2010/9/28】
      變速箱開發筆記概要  【七夜  2012/9/8】
       
       訪客評論
      2012/8/5七夜
      示例就是作業三里的采購訂單模塊啊。

      2012/8/5nowtoo
      看起來不錯,請把示例放上來學習一下,謝謝!

      總記錄:2篇  頁次:1/1 9 1 :
       
       發表評論
      評論內容 (必填)

      常見問答
      技術分類
      相關資源
      文章搜索
      關于作者

      七夜

      文章分類

      文章存檔

      友情鏈接
       
         
      湖北11选5