2009-08-11 12 views
6

W ramach złożonej struktury bazy danych muszę zapewnić użytkownikowi możliwość edycji danych przechowywanych w serii tabel. Mimo że wszystkie typy danych są takie same, nie zawierają linii 1: 1 w swoich nazwach. Aby to złagodzić, stworzyłem zapytanie, które odwzorowuje oryginalne nazwy (pochodzące z zewnętrznych raportów) na nazwy używane wewnętrznie; z tych zapytań wszystko jest podane do jednego gigantycznego zapytania UNION.Jak utworzyć edytowalne zapytanie UNION?

Wszystkie typy danych i rozmiary pól są ustawione prawidłowo.

Co jeszcze muszę zrobić, aby zapytanie UNION działało?

ten jest obecny w zapytaniu SQL za:

SELECT * FROM MappingQuery1 UNION SELECT * FROM MappingQuery2; 

EDIT:

Odpowiedź poniżej pisał link do KB article których stwierdza się z pewnością, że dane w UNION zapytania nie może być zaktualizowany. Czy jest jakiś sposób obejść to? Na przykład:

SELECT * FROM MappingQuery1, MappingQuery2; 

Czy to zadziała? Pamiętaj, że wszystkie pola są wyrównane pod względem typu, rozmiaru i nazwy.

+0

Czy istnieje możliwość konsolidacji poszczególnych tabel w tabeli głównej, która ma taką samą strukturę, z wyjątkiem jednego dodatkowego pola dla nazwy tabeli, z której pochodzi każdy wiersz? – HansUp

+1

SELECT * FROM MappingQuery1, MappingQuery2; dostarczy zapytanie kartezjańskie (zestaw wyników zawierający wszystkie możliwe kombinacje każdego wiersza) - nie będzie można go edytować. Zgadzam się z HansUp. – Fionnuala

+1

HansUp sugeruje, że struktura bazy danych nie jest optymalna. Jako praktykujący diagnosta (głównie diagnozując własne problemy, przyznam się), myślę, że to bardzo prawdopodobne. Jeśli tak, to po tym wyzwaniu pojawi się wiele innych. – Smandoli

Odpowiedz

6

Gdy zapytanie jest zapytaniem unijnym, użytkownik nie może zaktualizować danych w zapytaniu.

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

gdy dostęp łączy wiersze z różnych tabel w zapytaniu związkowej, poszczególne rzędy tracą swoją podstawową tożsamość stołowego. Program Access nie może wiedzieć, która tabela ma być aktualizowana podczas próby zmiany wiersza w zapytaniu zbiorczym, więc uniemożliwia wszystkie aktualizacje.

następujące pytanie edit:

Można prawdopodobnie obejść stosując VBA i ADO zaktualizować odpowiednią tabelę. Sposób, w jaki podchodzę do tego, to zapewnienie, że twoja tabela związków zawiera kolumnę, która ma identyfikator z tabeli źródłowej wraz z inną kolumną, która nazywa tablicę źródłową.

np. w unii, że masz coś takiego:

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

Następnie za pomocą formularza wprowadzania danych i VBA można spojrzeć na wartości aktualnie wybranego wiersza i zaktualizuj odpowiednią tabelę.

EDIT 2: Dla onedaywhen

wstawia to wartości w tabeli przy użyciu programu Access VBA

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

Rekordy w tabelach mają unikalne klucze podstawowe (konkretnie PK w każdej tabeli jest całkowicie unikalne dla bazy danych i nieodłącznie związane z zestawem danych, a nie tylko z automatycznym numerem). –

+0

Pod warunkiem, że identyfikatory nie zachodzą na siebie, można przebudować tabele, aby mieć tabelę nadrzędną zawierającą identyfikatory i tabele podrzędne zawierające dane. Możliwe, że wynikowa kwerenda może być aktualizowalna (ale musisz najpierw ją przetestować). SELECT * Z IdTable sprzężenia wewnętrznego Table1 NA Table1.Id = IdTable.Id sprzężenia wewnętrznego Tabela 2 ON Table2.Id = IdTable.Id – pjp

+0

Powyższe należy użyć lewa zewnętrzna sprzężenia .. Jedynym problemem jest to, że wartości skończy w różnych kolumnach ... Wynik jest aktualizowalny. Może najlepiej trzymać się rozwiązania VBA – pjp

8

Moje preferencje byłoby skonsolidować te poszczególne tabele do tabeli głównej. Przy wszystkich danych w jednej tabeli może to być o wiele łatwiejsze.

Jeśli jednak masz mieć, aby zachować oddzielne tabele, zmień swoje zapytania odwzorowania tak, aby zawierały wyrażenie pola dla nazwy tabeli źródłowej. I umieść to pole nazwy tabeli w zapytaniu UNION.

Następnie utwórz ciągły formularz na podstawie kwerendy UNION tylko do odczytu. Dodaj podformułę na podstawie innego zapytania, które zwraca pojedynczy edytowalny rekord z odpowiedniej tabeli. W główną postać w sprawie bieżących razie przepisać RowSource dla zapytania podformularzu za:

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

Po drugie proponuję (tak naprawdę chciałem to zasugerować). Rzeczywiście, mam standardową praktykę, że wszystkie formularze ciągłe/arkusze danych są tylko do odczytu (z kilkoma godnymi uwagi wyjątkami, takimi jak pozycje z fakturą). –

-1

Jest to bardzo stary wątek, ale szukałem rozwiązania tej samej rzeczy i natknąłem się na niego. Miałem wartość pola wyboru, która została przepchnięta przez kilka zapytań unijnych, a kiedy próbowałem ją zaktualizować, oczywiście nie mogłem.

Jednak znalazłem rozwiązanie i pomyślałem, że je udostępnię. W zdarzeniu OnEnter tego pola po prostu uruchomiłem kwerendę aktualizacji SQL, która zaktualizowała pole w tabeli podstawowej, którą chciałem zmodyfikować. Jeśli to było Prawdą, zaktualizowałem do Fałszywy, a jeśli Fałsz I zaktualizował się do prawdy. Voila!