2010-05-17 2 views

답변

3

일반 솔루션 (another is by Allen Browne)이 필요하거나 현재 용도로만 필요하면 스스로에게 문의해야합니다. 당신이 정말로 이것을 한 번만 필요로한다면, 쉬운 방법을 택하십시오.

VBA 코드의 목록을 연결할 때 오랫동안 액세스 전문가 인 Trevor Best가 가르쳐 준 트릭을 활용하면 모든 값의 시작 부분에 구분 기호를 붙인 다음 Mid ()을 떼어냅니다. 대신 자식 레코드를 통해 루프 내부 이런 :

If Len(strOutput) = 0 Then 
    strOutput = NewValue 
    Else 
    strOutput = strOutput & ", " & NewValue 
    End If 

... 루프 내부에 이것을 사용 :

strOutput = strOutput & ", " & NewValue 

... 그리고 당신은 루프를 종료 할 때, 선두 구분 기호를 벗겨 :

strOutput = Mid(strOutput, 3) 

이것은 장소 전체에 영향을 미치고 모든 호스트 컨텍스트에서 연결을 위해 코드를 단순화합니다.

1

번호 액세스에는 GROUP_CONCAT 기능이 없습니다. 그러나 SQL 문을 포함하는 문자열을 전달하고 이에 상응하는 기능을 사용할 수 있도록 VBA 함수를 만들 수 있습니다 (권장하지는 않지만 가능합니다). 내 자신의 개인 뒤로 기계를 촬영

, 여기에 공룡이 지구를 지배했을 때 다시 쓴 일부 코드는 다음과 같습니다

Public Function ListQuery(SQL As String _ 
          , Optional ColumnDelimiter As String = " " _ 
          , Optional RowDelimter As String = vbCrLf) As String 
'PURPOSE: to return a combined string from the passed query 
'ARGS: 
' 1. SQL is a valid Select statement 
' 2. ColumnDelimiter is the character(s) that separate each column 
' 3. RowDelimiter is the character(s) that separate each row 
'RETURN VAL: 
'DESIGN NOTES: 

Const PROCNAME = "ListQuery" 
Const MAXROWS = 100 
Const MAXCOLS = 10 
Dim oConn As ADODB.Connection 
Dim oRS As ADODB.Recordset 
Dim oField As ADODB.Field 
Dim sRow As cString 
Dim sResult As cString 

On Error GoTo ProcErr 

Set sResult = New cString 
Set sRow = New cString 
Set oConn = GetADOConn() 

sResult.Clear 
Do Until oRS.EOF 
    sRow.Clear 

    For Each oField In oRS.Fields 
     With sRow 
      If .Length > 0 Then 
       .Append ColumnDelimiter 
      End If 

      .Append Nz(oField.Value) 
     End With 
    Next oField 

    sRow.Trim 
    If sRow.Length > 0 Then 
     With sResult 
      .Append sRow 
      .Append RowDelimter 
     End With 
    End If 

    oRS.MoveNext 
Loop 
oRS.Close 
oConn.Close 

With sResult 
    If .Right(Len(RowDelimter)).Value = RowDelimter Then 
     .Length = .Length - Len(RowDelimter) 
    End If 
End With 

FunctionResult: 
    ListQuery = sResult.Value 

CleanUp: 
    Set sResult = Nothing 
    Set sRow = Nothing 
    Set oField = Nothing 
    Set oRS = Nothing 
    Set oConn = Nothing 

Exit Function 
ProcErr: 
    ' logging code... 
    Resume CleanUp 

End Function 

GetADOConn 함수는 현재 데이터베이스 연결을 검색하는 중앙 집중화 된 기능입니다. cString은 .NET의 StringBuilder 클래스의 동작을 모방 한 클래스이지만 .NET이 TLD 및 마케팅 과대 광고 이외의 것이기 오래 전에 작성되었습니다. VBA의 내장 문자열 연결은 느려질 것이므로 StringBuilder 클래스가 필요합니다. 부분적으로 수정 한 원래 코드는 상수가 모두 사용되는 행과 열 수에 대한 제한을가집니다.

+0

Access 용 코드를 작성할 때 ADO는 SQL Server와의 상호 작용을 제외하고는 거의 죽기 때문에 DAO에서 작성하는 것이 더 합리적입니다. –

+0

@ David-W-Fenton - 글쎄요, DAO도 꽤 죽어 있다고 주장 할 수 있지만 요점을 이해합니다. 이 코드는 DAO에서 쉽게 변경할 수 있습니다. IIRC, 그 코드의 날짜는 97 년에 언젠가 였으므로, 당시 ASP 클래식을 계속해서 사용하고 있었기 때문에 Access에서 ADO를 도청하고있을 수도있었습니다. – Thomas

+1

DAO는 A2007과 A2010에서 ACE에 대한 변경과 함께 변경 및 개선 사항을 얻는 Access의 적극적으로 개발 된 구성 요소이므로 죽은 것이라고 주장 할 방법이 없습니다. Access에서 사용할 수없는 ADO.NET에 의해 완전히 대체 된 ADO classic입니다 (적어도 현재 시점이 아님). –

2

Duane Hookum (Microsoft MVP)이 원하는 것을 수행 할 수 있다고 주장하는 this post을 발견했습니다. 나는 그것을 시험하지 않았다. 그런데


, 당신이 관심이 경우, 이것은 내가 그것을 발견하는 방법입니다

먼저 검색 : group_concat accessthis answer하지만 the link was broken으로 this post에 저를지도한다.

그런 다음 답변을 연결하려고 시도한 내용을 검색 한 후 다시 찾았습니다 : site:http://www.rogersaccesslibrary.com/ concatenate.