2014-07-04 66 views
-1

我正在嘗試爲公司創建工作訂單系統,但我僅限於使用MS Access。我想要在工作訂單ID列中編碼。此列將基於2組合框選項:獲取下一個號碼MS Access

BuildingName TargetDepartment

我需要一些VBA代碼來查詢WOID列的表檢索下一個號碼。該條件將如下面的例子:

WOID    BuildingName  TargetDepartment 
BUILDA-DEPTA-1  BUILDA   DEPTA 
BUILDA-DEPTB-1  BUILDA   DEPTB 
BUILDA-DEPTA-2  BUILDA   DEPTA 

VBA代碼將查詢WOID列,並找出是否有針對同一建築物和部門工作秩序,然後在1月底增加數量但如果沒有與建築物名稱和目標部門匹配的WOID,它將爲此創建第一個條目。

所以,如果找到一個匹配的buildingname和targetdepartment:MAXNUMBER +1 如果沒有找到匹配的buildingname和targetdepartment:1個

感謝您的幫助!

+1

是否真的要工作呀?爲什麼不在所有建築物和部門中使用自動編號?當你工作訂單深度達到2萬時,沒有人真正在意數字是什麼,或者它是否是順序的。這些類型的東西在多用戶系統中不是很可靠。 –

+0

這是公司的要求。他們將使用WOID來顯示報告,並以不同的方式爲每個部門開出賬單,因此他們表示他們不能擁有通用的ID號碼,而必須是該部門唯一的ID號碼。這是他們想要的唯一方法。 :( – user3805734

+0

你可以有一個自動編號和一個部門,就像@ElectricLlama建議的那樣,不要使用相同的字段/列。BuildA-DeptB-201945有什麼不同? – Fionnuala

回答

-1

可以使用DLookUp做到這一點:

where_condition = "[WOID] Like '" & Me.[BuildingNameCombo] & "-" & Me.[TargetDepartmentCombo] & "-*'" 
existing_woid = Nz(DLookUp("[WOID]","[TableName]", where_condition),"") 
If(existing_woid = "") Then 
    next_id = 1 
Else 
    next_id = DMax("Mid([WOID], InStrRev([WOID],""-"")+1)","[TableName]", where_condition) + 1 
End If 
woid = Me.[BuildingNameCombo] & "-" & Me.[TargetDepartmentCombo] & "-" & next_id 

你可以做到這一點的一條線爲好,但我認爲這是更好地看到思考這背後的方式。

編輯(與記錄鎖)

Dim s as String, rs as Recordset 
s = " Select [WOID] From [TableName] " & _ 
    " Where [WOID] Like '" & Me.[BuildingNameCombo] & "-" & Me.[TargetDepartmentCombo] & "-*'" & _ 
    " Order By 1 Desc" 

'This will restrict table access 
Set rs = CurrentDb.OpenRecordset(s, dbOpenDynaset, dbDenyRead + dbDenyWrite) 
If rs.RecordCount > 0 Then 
    next_ind = Mid(rs(0), InStrRev(rs(0), "-") + 1) + 1 
Else 
    next_ind = 1 
End If 

rs.AddNew 
rs.Fields("WOID") = Me.[BuildingNameCombo] & "-" & Me.[TargetDepartmentCombo] & "-" & next_ind 
rs.Update 
rs.Close 

Set rs = Nothing 
+0

請不要使用Max或DMax來獲取身份。你將會得到重複的結果。 – Fionnuala

+0

@Remou你能向我解釋爲什麼嗎?我不是自己使用'dmax',我首先使用'dlookup'確定是否有匹配的記錄。 – parakmiakos

+0

因爲你有比賽條件。用戶得到一個號碼並且不用保存就關閉茶,用戶2得到相同的號碼。 – Fionnuala