2013-10-07 3 views
0

텍스트 상자에서 선택한 날짜를 사용하는 고유 한 ID #을 생성 할 수 있어야합니다. 그리고 그 달/년에 하나 이상의 기록이있을 때 그 달과 연도의 기록 수를 세고 ID가 하나씩 증가하도록 만들어야합니다.증분 ID # MS 액세스 VBA

  • CEF-1013-1
  • CEF-1013-2
  • CEF-1013-3을 : 2013 년 10 월 월 4 경우가한다면, 나는 다음과 같이이 아이디의를 만들어야합니다
  • 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 

코드를 테스트하지 않았습니다. 약간의 조정/디버깅이 필요할 수 있습니다. 기본 개념은 여전히 ​​유효합니다.

이와 같은 시나리오에서 ID 가져 오기/만들기 기능을 만드는 것이 가장 좋습니다.

또한 일반적으로 의미없는 Autonumber 필드를 기본 키로 할당하고 여기에서 수행중인 것과 비슷한 의미있는 CaseCode 필드를 사용할 수 있습니다. 숫자 키가 더 잘 수행됩니다. 많은 것을 보았지만, 의미있는 기본 키 필드를 사용하는 것은 종종 나쁜 디자인 습관으로 간주됩니다.

그것은 가치가 무엇인지에 대한
+0

큰 활약을했습니다. 오늘 날짜 대신 현장에서 날짜를 사용하기 위해 사소한 변경을했습니다. 고마워요. 나는 테이블을 더 잘 디자인 할 것입니다. 팁 고마워. – jstacy00

1

, 난 당신과 같이 별도의 숫자 필드에 뭔가를 당신이 파생 시퀀스 번호를 유지하는 것이 좋습니다 것입니다 :

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

새로운 일련 번호를 도출하는 프로세스를 간소화 할 수 있습니다 그 방법을, 구성 요소에서 "CaseID"문자열을 쉽게 작성할 수 있습니다. 즉, 문자열을 서로 떼어 놓는 것보다 함께 묶는 것이 더 쉽습니다.

다음 테스트 코드는 레코드를 테이블에 삽입 할 때 시퀀스 번호를 파생시킬 수있는 방법을 보여줍니다. 유도가 암시 트랜잭션 내에서 수행되므로 Debug.Print 문 단순히 SQL 명령을 출력

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 

다중 사용자 환경에 적합해야하고이를 INSERT 명령문 내부에서 수행되기 때문으로 실행될 다음 케이스 ...

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 
CasePK CaseDate CaseID  
------ ---------- ---------- 
    101 2013-10-01 CEF-1310-1 
    102 2013-10-03 CEF-1310-2 

를 반환

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

당신이 그때 당신은 항상이 같은 "즉시"그것을 함께 잇 수 CaseID을 표시하려면 414,... ... ...당신이 액세스 (또는 이상) 2010을 사용하고 있기 때문에, 또는 당신이이 [CaseID] 식

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

을 사용하여 계산 된 필드로 그래서 당신은 단지 [CaseID] 직접 검색 할 수 생성하기 위해 [사례] 테이블을 변경할 수 있으며, CaseID를 쿼리 또는 보고서에 사용할 때마다 어셈블리 ID를 조합하는 논리를 다시 작성하지 않아도됩니다.