2009-08-11 13 views
6

Karmaşık bir veritabanı yapısı sırasında, kullanıcıya bir dizi tablo içinde saklanan verileri düzenleme aracı sağlamanız gerekir. Tüm veri türleri aynı olsa da, adlarına 1: 1 uymuyorlar. Bunu hafifletmek için, orijinal isimleri (dış raporlardan gelen) dahili olarak kullanılan isimlere eşleyen bir sorgu oluşturdum; Bu sorgulardan, her şey bir dev UNION sorgusuna beslenir.Düzenlenebilir bir UNION sorgusunu nasıl yapabilirim?

Tüm veri türleri ve alan boyutları düzgün bir şekilde hizalanır.

Bu UNION sorgusu yapmak için başka ne yapmam gerekiyor?

Bu sorgusunun ardındaki geçerli SQL geçerli:

SELECT * FROM MappingQuery1 UNION SELECT * FROM MappingQuery2; 

DÜZENLEME: bir cevap aşağıda bir UNION sorguda veri olamayacağını kesin olarak bildiren bir KB article bir bağlantı yayınlanmıştır

güncellenmiş. Bu konuda çalışabileceğim bir yol var mı? Örneğin,

Bu işe yarar mı? Unutmayın, tüm alanlar tür, boyut ve ad ile hizalanır.

+0

her satır kaynaklandığı tablonun adı için bir ekstra alanın dışında aynı yapıya sahip bir ana tabloya tek tek masaları birleştirebilecek ihtimali var mı? – HansUp

+1

SELECT * FROM MappingQuery1, MappingQuery2; size bir kartezyen sorgu (her satırın olası tüm kombinasyonlarını içeren bir sonuç kümesi) verecektir - düzenlenebilir olmayacaktır. HansUp ile aynı fikirdeyim. – Fionnuala

+1

HansUp veritabanı yapısının optimal olmadığını öne sürüyor. Uygulamalı bir tanılayıcı olarak (çoğunlukla kendi sorunlarımın teşhisi, itiraf ediyorum), bence bu çok doğrudur. Öyleyse, bu meydan okuma başkaları tarafından takip edilecektir. – Smandoli

cevap

6

Sorgu, Birleşim sorgusu olduğunda, sorgusundaki verileri güncelleştiremezsiniz.

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

Erişim Sendika sorguda farklı tablolardan satırları birleştirir

, bireysel satırlar altta yatan masa kimliğini kaybeder. Erişim, bir sendika sorgusundaki bir satırı değiştirmeye çalıştığınızda hangi tabloyu güncellemek istediğinizi bilmiyor, dolayısıyla tüm güncellemelere izin vermiyor.

ardından soru düzenlemek:

Muhtemelen gelen tabloyu güncellemek için VBA ve ADO kullanarak bu geçici bir çözüm olabilir. Buna yaklaşımım, sendika tablonuzun, kaynak tablodan kimliğe sahip bir sütun ve kaynak tabloyu adlandıran başka bir sütun içermesidir.

örn. Sendikanızdaki böyle bir şey olurdu: Bir veri giriş formu ile Ardından

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

ve VBA şu anda seçili satırın değerlere bakmak ve ilgili tablo güncelleyebilirsiniz.

DÜZENLEME 2: Bu tabloya değerleri ekler onedaywhen

için

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

Tablolardaki kayıtların benzersiz birincil anahtarları vardır (özellikle, her tablodaki PK, yalnızca bir OtomatikSayı yerine, veri kümesine tamamen özgüdür ve veri kümesine özgüdür). –

+0

Kimliklerin örtüşmediğinden, tablolarınızı, kimlikleri ve verileri içeren alt tabloları içeren bir üst tabloya sahip olacak şekilde yeniden yapılandırabilirsiniz. Ortaya çıkan sorguların güncellenebilir olması olasıdır (ancak önce bunu test etmeniz gerekir). İç Table1.Id = IdTable.Id AÇIK Table1 katılmak IDTable GELEN SEÇ * iç – pjp

+0

Yukarıdaki SOL dış birleşimler kullanmalıdır Table2.Id = IdTable.Id AÇIK Table2 katılmak .. Tek sorun değerleri sona erecek olmasıdır farklı sütunlarda ... Sonuç yükseltilebilir .. Belki de VBA çözümüne bağlı kalmak en iyisidir – pjp

8

Benim tercihini Erişim VBA kullanarak bir ana tabloya olanlar tek tek masaları pekiştirmek olacaktır. Tüm veriler bir tabloda, bu çok daha kolay olabilir.

Bununla birlikte, , bağımsız tabloları ayrı tutmak için numaralı varsaydı, eşleme sorgularınızı, kaynak tablo adı için bir alan ifadesi içerecek şekilde değiştirin. Ve UNION sorgusundaki tablo adı alanını da ekleyin.

sonra salt okunur UNION sorgusu göre sürekli bir form oluşturmak. Uygun tablodan tek bir düzenlenebilir kayıt döndüren başka bir sorguyu temel alan bir alt form ekleyin. ana form Güncel olayda var ise, alt formun sorgu için RowSource yeniden yazın:

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

Öneriyi öneririm (aslında önereceğim şey buydu). Gerçekten de, tüm sürekli/veri sayfası formlarını salt okunur hale getirdiğim standart bir uygulamam var (fatura ayrıntısı gibi birkaç önemli istisna dışında). –

-1

Bu çok eski bir iplik ama aynı şey bir çözüm arayan ve karşıya geldi. Birkaç Union sorgusuyla itilmiş bir onay kutusu değeri vardı ve güncellemeye çalıştığımda, tabii ki yapamadım.

Ancak, ben bir çözüm buldum ve bunu paylaşmak istedim. Onay kutusunun OnEnter olayında, değiştirmek istediğim temel tablodaki alanı güncelleyen bir SQL Update sorgusu çalıştırdım. Doğru olsaydı False olarak güncelledim ve False true olarak güncelledim. İşte bu kadar!

İlgili konular