2014-07-04 5 views
-1

J'essaie de créer un système de commande de travail pour une entreprise et je suis limité à MS Access. Je veux coder dans une colonne ID de bon de travail. Cette colonne sera basée sur deux options combobox:Numéro suivant MS Access

BuildingName TargetDepartment

J'ai besoin de code VBA pour interroger la colonne woid dans la table pour récupérer le numéro suivant. Les conditions seront comme l'exemple ci-dessous:

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

Le code VBA interrogerait la colonne woid, et savoir s'il y a un ordre de travail pour le même bâtiment et le département, puis incrémenter le numéro à la fin de 1 Mais s'il n'y a pas de WOID qui corresponde au nom du bâtiment et au département target, cela créera la première entrée pour cela.

Donc, si elle trouve un buildingname correspondant et targetdepartment: nb_max_lignes_résultats +1 Si elle ne trouve pas un buildingname correspondant et targetdepartment: 1

Merci pour l'aide!

+1

-t-il vraiment travailler de cette façon? Pourquoi ne pas simplement utiliser un numéro automatique dans tous les bâtiments et départements? Au moment où vous avez 20 000 ordres de travail en profondeur, personne ne se soucie vraiment du nombre ou du caractère séquentiel. Ce genre de choses n'est pas très fiable dans les systèmes multi-utilisateurs. –

+0

C'est la demande de l'entreprise. Ils vont utiliser le WOID pour montrer les rapports et ils facturent différemment chaque ministère pour qu'ils ne puissent pas avoir de numéro d'identification universel, cela doit être unique au ministère. C'est la seule façon dont ils le veulent. :( – user3805734

+0

Vous pouvez avoir un numéro et un département, comme le suggère @ElectricLlama, n'utilisez pas le même champ/colonne Quelle différence fait BuildA-DeptB-201945? – Fionnuala

Répondre

-1

Vous pouvez le faire en utilisant 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 

Vous pouvez le faire en une ligne aussi bien, mais je pense qu'il est préférable de voir la façon de penser derrière tout cela.

Edit (avec verrouillage d'enregistrement)

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

Veuillez ne pas utiliser Max ou DMax pour obtenir une identité. Vous allez vous retrouver avec des doublons. – Fionnuala

+0

@Remou Pouvez-vous m'expliquer pourquoi? Je n'utilise pas 'dmax' par lui-même, je détermine s'il y a un enregistrement correspondant en utilisant' dlookup'. – parakmiakos

+0

Parce que vous avez une condition de concurrence. L'utilisateur reçoit un numéro et part pour le thé sans enregistrer, l'utilisateur deux obtient le même numéro. – Fionnuala