2013-10-07 22 views
0

Мне нужно создать уникальный идентификатор #, который использует дату, выбранную в текстовом поле. И когда в этом месяце/году есть более одной записи, мне нужно, чтобы она подсчитывала количество записей с этим месяцем и годом и создавала идентификатор, увеличиваемый на один. Так что, если есть 4 случая в течение месяца октября 2013 года, мне нужно, чтобы создать идентификаторы следующим образом:Increment ID # MS Access VBA

  • CEF-1013-1
  • CEF-1013-2
  • CEF-1013-3
  • CEF-1013-4

Если есть следующий код:

Private Sub Text0_AfterUpdate() 
    'Creates a custom case number based on date and how many have been entered in that month/year 
    Dim caseNum As String 
    Dim caseCount As Integer 
    caseNum = Format(Forms!frmEnterCase!Text0, "mmyy") 
    caseCount = DCount("CaseID", "case", Format(Table!Case!CaseID, "mmyy") = caseNum) 
    caseNum = "CEF-" & caseNum & "-" & (caseCount + 1) 
    Forms!frmEnterCase!Text31 = caseNum 

End Sub 

ответ

2

Вы шо uld сможет сделать что-то вроде этого:

Private Sub Text0_AfterUpdate() 
    Forms!frmEnterCase!Text31 = GetNextCaseNum() 
End Sub 

Public Function GetNextCaseNum() As String 
    Dim rs as DAO.Recordset, sSQL as String 
    sSQL = "SELECT TOP 1 CaseID FROM case WHERE CaseID LIKE 'CEF-" & Format(Date, "mmyy") & "-*' ORDER BY CaseID DESC" 
    Set rs = CurrentDb.OpenRecordset(sSQL, dbOpenSnapshot) 
    If Not (rs.EOF and rs.BOF) Then 
     GetNextCaseNum = "CEF-" & Format(Date, "mmyy") & Format(Cstr(Clng(Right(rs("CaseID"), 2))+1), "00") 
    Else 
     GetNextCaseNum = "CEF-" & Format(Date, "mmyy") & "-01" 
    End If 
    rs.close 
    Set rs = Nothing 
End Function 

Обратите внимание, что я не тестировал код. Это может потребовать некоторой настройки/отладки. Базовая концепция все еще стоит.

Лучше всего выполнять функции для извлечения/создания идентификаторов в сценариях, подобных этому.

Кроме того, я мог бы упомянуть, что я обычно назначал бессмысленное поле Autonumber в качестве основного ключа для таблицы, подобной этой, а затем по-прежнему может использовать осмысленное поле CaseCode, подобное тому, что вы здесь делаете. Цифровые первичные ключи работают лучше. Хотя вы его очень много видите, часто считают плохую дизайнерскую практику использовать значащие поля первичного ключа.

+0

Это отлично работает. Я сделал небольшое изменение, чтобы использовать дату из поля вместо сегодняшней даты. Большое спасибо, и я определенно разработаю свои таблицы лучше. Спасибо за совет. – jstacy00

1

Для чего это стоит, я бы порекомендовал вам сохранить номер последовательности вы выводите в отдельном числовом поле, что-то вроде этого:

CasePK CaseDate CaseMonthSeq 
------ ---------- ------------ 
    101 2013-10-01    1 

Таким образом, вы можете упростить процесс, чтобы получить новые порядковые номера, и вы можете легко построить строку «CaseID» из своих составных частей. (То есть, всегда проще склеивать строки, а не разделять их.)

Следующий тестовый код иллюстрирует, как вы можете получить порядковый номер при вставке записи в таблицу. Поскольку вывод делается в заявлении INSERT это должно быть сделано в неявной транзакции и, следовательно, быть пригодны для работы в среде многопользовательской

Sub CaseSeqTest() 
Dim cdb As DAO.Database, SQL As String 
Dim dtCaseDate As Date 
dtCaseDate = DateSerial(2013, 10, 3) ' sample date for testing 
Set cdb = CurrentDb 
SQL = _ 
     "INSERT INTO Cases (" & _ 
       "CaseDate, " & _ 
       "CaseMonthSeq " & _ 
      ") VALUES (" & _ 
       "#" & Format(dtCaseDate, "yyyy-mm-dd") & "#, " & _ 
       "Nz(DMax(""CaseMonthSeq"", ""Cases"", ""Format(CaseDate, """"yymm"""") = """"" & Format(dtCaseDate, "yymm") & """""""), 0) + 1 " & _ 
      ")" 
Debug.Print SQL 
cdb.Execute SQL, dbFailOnError 
Set cdb = Nothing 
End Sub 

Debug.Print оператор просто выводит команду SQL для выполнения, в этом случай ...

INSERT INTO Cases (CaseDate, CaseMonthSeq) VALUES (#2013-10-03#, Nz(DMax("CaseMonthSeq", "Cases", "Format(CaseDate, ""yymm"") = ""1310"""), 0) + 1) 

... и запись вставляется в таблицу следующим образом:

CasePK CaseDate CaseMonthSeq 
------ ---------- ------------ 
    101 2013-10-01    1 
    102 2013-10-03    2 

Если вы хотите, чтобы отобразить CaseID, то вы всегда можете собрать их вместе "на лету", как это ...

SELECT 
    CasePK, 
    CaseDate, 
    "CEF-" & Format(CaseDate, "yymm") & "-" & CaseMonthSeq AS CaseID 
FROM Cases 

... возвращение

CasePK CaseDate CaseID  
------ ---------- ---------- 
    101 2013-10-01 CEF-1310-1 
    102 2013-10-03 CEF-1310-2 

...или, так как вы используете Access 2010 (или более поздней версии) можно изменить таблицу [случаи] для создания [CaseID] как вычисляемое поле, используя выражение

"CEF-" & Right(Year([CaseDate]),2) & IIf(Month([CaseDate])>9,"","0") & Month([CaseDate]) & "-" & [CaseMonthSeq] 

так что вы можете просто получить [CaseID] прямо и не будет необходимости повторно создавать логику для сборки CaseID каждый раз, когда вы хотите использовать ее в запросе или отчете.