2009-08-11 5 views
6

복잡한 데이터베이스 구조에서 일련의 테이블에 저장된 데이터를 편집하는 방법을 사용자에게 제공해야합니다. 모든 데이터 유형은 동일하지만 이름에 1 : 1을 사용하지 않습니다. 이를 완화하기 위해 원래 이름 (외부 보고서에서 가져온 이름)을 내부적으로 사용 된 이름으로 매핑하는 쿼리를 만들었습니다. 이러한 쿼리에서 모든 것이 하나의 거대한 UNION 쿼리로 공급됩니다.편집 가능한 UNION 쿼리는 어떻게 만듭니 까?

모든 데이터 유형과 필드 크기가 올바르게 정렬됩니다.

이 UNION 쿼리가 작동하게하려면 어떻게해야합니까?

이 쿼리 뒤에 현재의 SQL은 다음과 같습니다

SELECT * FROM MappingQuery1 UNION SELECT * FROM MappingQuery2; 

편집 : 대답은 아래 UNION 쿼리의 데이터가 될 수 없음을 확실하게 알리는 KB article에 대한 링크를 게시

업데이트되었습니다. 이 문제를 해결할 수있는 방법이 있습니까? 예 :

SELECT * FROM MappingQuery1, MappingQuery2; 

이 방법이 유용할까요? 모든 필드는 유형, 크기 및 이름이 정렬되어 있습니다.

+0

각 행의 원래 테이블 이름에 대한 하나의 추가 필드를 제외하고는 동일한 구조의 마스터 테이블에 개별 테이블을 통합 할 수 있습니까? – HansUp

+1

SELECT * FROM MappingQuery1, MappingQuery2; 은 각 행의 가능한 모든 조합을 포함하는 결과 집합 인 데카르트 쿼리를 제공 할 것이며 편집 할 수 없습니다. 나는 HansUp에 동의합니다. – Fionnuala

+1

HansUp은 데이터베이스 구조가 최적이 아니라고 제안합니다. 연습 진단을받은 사람들 (주로 제 자신의 문제를 진단하는 것, 고백합니다)은 매우 그렇다고 생각합니다. 그렇다면이 과제는 많은 사람들에게 뒤따를 것입니다. – Smandoli

답변

6

쿼리가 유니언 쿼리 인 경우 은 쿼리의 데이터를 업데이트 할 수 없습니다.

http://support.microsoft.com/kb/328828

액세스 통합 쿼리에있는 다른 테이블에서 행을 결합

은 개별 행은 기본 테이블의 정체성을 잃게됩니다. 유니온 쿼리에서 행을 변경하려고 할 때 업데이트한다는 의미의 테이블을 알 수 없으므로 모든 업데이트가 허용되지 않습니다.

다음과 같은 질문 편집 :

당신은 아마 해당 테이블을 업데이트 VBAADO를 사용하여이 문제를 해결 할 수있다. 내가 접근하는 방법은 당신의 노동 조합 테이블에 소스 테이블의 이름을 가진 다른 컬럼과 함께 소스 테이블의 id를 가진 컬럼이 포함되도록하는 것입니다.

노동 조합에서이 같은 거라고 : 데이터 입력 양식을 통해 다음

SELECT 'Table1', id, ... FROM Table1 
UNION 
SELECT 'Table2', id, ... FROM Table2 

및 VBA는 현재 선택한 행의 값을보고 관련 테이블을 업데이트 할 수 있습니다.

편집 2 :이 테이블에 값을 삽입 onedaywhen

를 들어

Option Compare Database 
Option Explicit 

Public Sub InsertDataPunk(TargetTable As String, IdVal As Long, MyVal As String) 

    Dim conn As ADODB.Connection 
    Set conn = CurrentProject.Connection 

    Dim sql As String 
    'You could build something fancier here 
    sql = "INSERT INTO " & TargetTable & " VALUES (" & IdVal & ",'" & MyVal & "')" 

    Dim cmd As ADODB.Command 
    Set cmd = New ADODB.Command 
    Set cmd.ActiveConnection = conn 
    cmd.CommandText = sql 
    cmd.CommandType = adCmdText 
    cmd.Execute 

End Sub 


InsertDataPunk "Table2", 7, "DooDar" 
+0

테이블의 레코드에는 고유 한 기본 키가 있습니다 (특히 각 테이블의 PK는 일련 번호가 아닌 데이터베이스에 고유하고 데이터 집합에 고유합니다). –

+0

ID가 겹치지 않는다면 데이터를 포함하는 ID와 하위 테이블을 포함하는 상위 테이블을 갖도록 테이블을 재구성 할 수 있습니다. 결과 쿼리를 업데이트 할 수도 있습니다 (하지만 먼저 테스트해야합니다). 이너 Table1.Id = IdTable.Id 표 1 가입이 IDTable FROM SELECT *가 이너 – pjp

+0

상기 LEFT 외부 결합 사용해야 Table2.Id = ON IdTable.Id 표 2 가입 .. 유일한 문제는 값이 끝날 것입니다 다른 열에서 ... 그 결과는 업데이트 할 수 있습니다 .. 어쩌면 VBA 솔루션을 고집하는 것이 가장 좋습니다 – pjp

8

내 기본 설정에 액세스 VBA를 사용하여 마스터 테이블에 그 각각의 테이블을 통합하는 것입니다. 모든 데이터를 한 테이블에 저장하면 훨씬 쉽게 처리 할 수 ​​있습니다.

그러나 이있는 경우 개별 테이블을 별도로 유지하려면 원본 테이블 이름에 대한 필드 식을 포함하도록 매핑 쿼리를 변경하십시오. 그리고 UNION 쿼리에 해당 테이블 이름 필드를 포함시킵니다.

그런 다음 읽기 전용 UNION 쿼리를 기반으로 연속 양식을 만듭니다. 적절한 테이블에서 편집 가능한 단일 레코드를 반환하는 다른 쿼리를 기반으로 하위 폼을 추가합니다. 기본 폼은 현재 이벤트에의에서 하위 폼의 쿼리에 대한 행 원본을 다시 작성 :

strSQL = "SELECT fields_to_edit FROM " & Me.txtTableSource & _ 
    " WHERE pkfield =" & Me.txtPKeyField & ";" 
Me.SubformName.Rowsource = strSQL 
Me.SubformName.Requery 
+4

나는 제안을 초 (사실, 내가 제안하려고했던 것이었다.). 사실, 모든 연속/데이터 시트 양식을 읽기 전용으로 만드는 표준 사례가 있습니다 (인보이스 세부 항목과 같은 몇 가지 주목할만한 예외가 있음). –

-1

이것은 아주 오래된 스레드하지만 같은 일에 대한 해결책을 찾고 그것을 건너 온되었다. 여러 유니온 쿼리를 통해 푸시 된 체크 박스 값을 가지고 있었고, 업데이트하려고 시도했을 때 물론 그럴 수 없었습니다.

그러나 해결책을 찾았고 그것을 공유 할 것이라고 생각했습니다. 확인란의 OnEnter 이벤트에서 수정하려는 기본 테이블의 필드를 업데이트 한 SQL Update 쿼리를 실행했습니다. True라면 False로 업데이트하고 False로 설정하면 True로 업데이트했습니다. 빌라!

관련 문제