2015-06-23 73 views
1

上下文: 我在我的數據庫中創建了度假跟蹤模塊。員工可以要求本年度的高級時段起飛,並且將從下一年度起扣除。循環訪問MSAccess中的連續記錄

案例: 我試圖做一個連續的循環,通過員工的記錄,看看他們是否已被授予先進小時,如果是把它添加到他們的休假時間。

問題: 我有邏輯,但我不能讓它通過我的連續形式每個員工循環。

With Me.RecordsetClone 
    While Not .EOF 
     adv = DLookup("advhours", "dbo_employees", "[empid] = txtempid") 
     vac = DLookup("vhrs", "dbo_employees", "[empid] = txtempid") 
     adate = DLookup("advdate", "dbo_employees", "[empid] = txtempid") 
     andatestart = DLookup("anndate", "dbo_employees", "[empid] = txtempid") 
     andateend = DateAdd("yyyy", AgeSimple([andatestart]), [andatestart]) 
     anddateend = DateAdd("yyyy", 1, andateend) 
     morehours = DLookup("totalvachrs", "dbo_employees", "[empid] = txtempid") 

     sum = adv + vac 


     If adv > 0 And adate > DateAdd("yyyy", AgeSimple([andatestart]), [andatestart]) And adate < anddateend And morehours = 0 Then 
      morehours = 1 

      ' sets the flag to 1 if true. 
      DoCmd.RunSQL "UPDATE dbo_employees " & "SET dbo_employees.totalvachrs='" & morehours & "' " & "WHERE dbo_employees.empid=" & txtempid & ";" 

      'increment vacation hours 
      DoCmd.RunSQL "UPDATE dbo_employees " & "SET dbo_employees.vhrs='" & sum & "' " & "WHERE dbo_employees.empid=" & txtempid & ";" 

     End If 

     'after Vac hours have been updated.. 

     If morehours = 1 And adate < andateend Then 
      ' puts vacation hours back down to where they were. 
      vac = vac - adv 
      DoCmd.RunSQL "UPDATE dbo_employees " & _ 
           "SET dbo_employees.vhrs='" & _ 
           vac & "' " & _ 
           "WHERE dbo_employees.empid=" & txtempid & ";" 
      adv = 0 
      DoCmd.RunSQL "UPDATE dbo_employees " & _ 
           "SET dbo_employees.advhours='" & _ 
           adv & "' " & _ 
           "WHERE dbo_employees.empid=" & txtempid & ";" 
      morehours = 0 
      DoCmd.RunSQL "UPDATE dbo_employees " & _ 
           "SET dbo_employees.totalvachrs='" & _ 
           morehours & "' " & _ 
           "WHERE dbo_employees.empid=" & txtempid & ";" 

     End If 
     Debug.Print txtempid ' CTRL G to see 

     If Not .EOF Then .MoveNext 
    Wend 
End With 
MsgBox "after loop: " & txtempid 

我也試過這個爲好,但我得到下降接入改變對話

Set rs = Me.RecordsetClone 

rs.MoveFirst 


Do While Not rs.EOF 
    Me.Bookmark = rs.Bookmark 
    adv = DLookup("advhours", "dbo_employees", "[empid] = txtempid") 
    vac = DLookup("vhrs", "dbo_employees", "[empid] = txtempid") 
    adate = DLookup("advdate", "dbo_employees", "[empid] = txtempid") 
    andatestart = DLookup("anndate", "dbo_employees", "[empid] = txtempid") 
    andateend = DateAdd("yyyy", AgeSimple([andatestart]), [andatestart]) 
    anddateend = DateAdd("yyyy", 1, andateend) 
    morehours = DLookup("totalvachrs", "dbo_employees", "[empid] = txtempid") 

    sum = adv + vac 


    If adv > 0 And adate > DateAdd("yyyy", AgeSimple([andatestart]), [andatestart]) And adate < anddateend And morehours = 0 Then 
     morehours = 1 

     DoCmd.RunSQL "UPDATE dbo_employees " & "SET dbo_employees.totalvachrs='" & morehours & "' " & "WHERE dbo_employees.empid=" & txtempid & ";" 

     DoCmd.RunSQL "UPDATE dbo_employees " & "SET dbo_employees.vhrs='" & sum & "' " & "WHERE dbo_employees.empid=" & txtempid & ";"  

    End If 

    If morehours = 1 And adate < andateend Then 
     vac = vac - adv 
     DoCmd.RunSQL "UPDATE dbo_employees " & _ 
          "SET dbo_employees.vhrs='" & _ 
          vac & "' " & _ 
          "WHERE dbo_employees.empid=" & txtempid & ";" 
     adv = 0 
     DoCmd.RunSQL "UPDATE dbo_employees " & _ 
          "SET dbo_employees.advhours='" & _ 
          adv & "' " & _ 
          "WHERE dbo_employees.empid=" & txtempid & ";" 
     morehours = 0 
     DoCmd.RunSQL "UPDATE dbo_employees " & _ 
          "SET dbo_employees.totalvachrs='" & _ 
          morehours & "' " & _ 
          "WHERE dbo_employees.empid=" & txtempid & ";" 

    End If 

    Me.Bookmark = rs.Bookmark 
    rs.MoveNext 
Loop 
rs.Close 
Set rs = Nothing 
+0

你嘗試過'做while循環嗎? –

+0

是的,我剛剛編輯我的帖子,以顯示我的循環做一次雖然但仍然沒有運氣 – DotyDot

+0

顯示查詢...以及確保記錄集包含行? – Sachu

回答

1

DotyDot,

我覺得你的問題是一個基本的誤解是如何記錄集和形式(和連續形式)的工作。無論表單是常規表單(一次顯示一條記錄)還是連續表單(一次顯示多條記錄),表單上引用值(字段)的能力和限制和/或使用記錄集不會更改。

您不能在代碼中「循環」通過連續表單並引用表單上的控件(txtempid)並從每條記錄中獲取值,就像您正在嘗試的那樣。

只要您在窗體上引用控件,您只會獲得與當前記錄關聯的控件的值。

即使您從表單recordsetclone實例化記錄集,也不會更改表單上的當前記錄指針。

您的第二個代碼示例最接近可以工作的東西,但仍需要一些工作。首先,在代碼中使用記錄集時,您很可能不會引用表單控件,您將直接從記錄集引用字段值。我不知道你的表格結構,但這裏有一個例子可以讓你走上正軌。

我認爲這段代碼將運行在一個按鈕點擊或其他一些你想要評估所有員工的事件上。

Dim rst as DAO.Recordset 
Set rst = Me.RecordsetClone 
Do While Not rst.EOF 
    adv = DLookup("advhours", "dbo_employees", "[empid] = " & rst("empid")) 
    vac = DLookup("vhrs", "dbo_employees", "[empid] = " & rst("empid")) 
    adate = DLookup("advdate", "dbo_employees", "[empid] = " & rst("empid")) 
    andatestart = DLookup("anndate", "dbo_employees", "[empid] = " & rst("empid")) 
    andateend = DateAdd("yyyy", AgeSimple(rst("andatestart")), rst("andatestart")) 
    anddateend = DateAdd("yyyy", 1, rst("andateend")) 
    morehours = DLookup("totalvachrs", "dbo_employees", "[empid] = " & rst("empid")) 

    sum = adv + vac 

    If adv > 0 And adate > DateAdd("yyyy", AgeSimple(rst("andatestart")), rst("andatestart")) And adate < anddateend And morehours = 0 Then  
    morehours = 1 
    rst.Edit 
    rst("totalvachrs") = morehours 
    rst("vhrs") = sum 
    rst.Update 
    End If 

    If morehours = 1 And adate < andateend Then 
    vac = vac - adv 
    rst.Edit 
    rst("vhrs") = vac 
    adv = 0 
    rst("advhours") = adv 
    morehours = 0 
    rst("totalvachrs") = morehours 
    rst.Update 
    End If 

    rst.MoveNext 
Loop 
Set rst = Nothing 
'Refresh the screen 
Me.Requery 

您不需要使用DoCmd.RunSQL,您可以通過代碼直接在Recordset中編輯數據。

請注意,在你的示例代碼,任何地方,在那裏你出現的形式

[andatestart]

上被引用控制我改變了它在記錄引用該字段名稱

RST( 「andatestart」)

此代碼將遍歷表單上的每條記錄並執行您正在執行的計算和更新。

僅供參考,您的原代碼,通過設置形式書籤(Me.Bookmark) 到記錄書籤,你被強迫的形式通過每條記錄移動 當前記錄指針,但是這是真的不 最好的方法來完成你正在嘗試做的,國際海事組織

我希望這可以幫助。