2009-08-11 23 views
6

複雑なデータベース構造の中で、一連のテーブルに格納されたデータを編集する手段をユーザに提供する必要があります。すべてのデータ型は同じですが、名前に1:1が並んでいません。これを軽減するために、元の名前(外部のレポートから来たもの)を内部で使用されている名前にマップするクエリを作成しました。これらのクエリから、すべてが1つの巨大なUNIONクエリに供給されます。編集可能なUNIONクエリを作成するにはどうすればよいですか?

すべてのデータタイプとフィールドサイズが正しく整列しています。

このUNIONクエリを実行するには他に何が必要ですか?

これは、クエリの背後にある現在のSQLは次のようになります。

SELECT * FROM MappingQuery1 UNION SELECT * FROM MappingQuery2; 

EDIT:答えは以下のUNIONクエリ内のデータができないことを確実に述べKB articleへのリンクを掲載

更新しました。私はこれを回避できる方法はありますか?例:

SELECT * FROM MappingQuery1, MappingQuery2; 

これは機能しますか?すべてのフィールドのタイプ、サイズ、名前が一列に並んでいることを忘れないでください。

+0

個々のテーブルを同じ構造を持つマスターテーブルに統合する可能性はありますか?ただし、各ローの元となるテーブル名の1つの余分なフィールドはありますか? – 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を通じてあなたが現在選択されている行の値を見て、関連するテーブルを更新することができます:あなたの組合で、あなたはこのようなものがあるだろう。

EDIT 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と子テーブルを含む親テーブルを持つようにテーブルを再構成することができます。結果のクエリが更新可能である可能性があります(ただし、最初にテストする必要があります)。 SELECT * FROM IDTABLE 内側は、内側テーブル1 ON Table1.Id = IdTable.Id がTable2.Id = IdTable.Id – pjp

+0

上記唯一の問題は値が終わるということです.. LEFT外部結合を使用する必要がON表2に参加する参加します別の列に...結果は更新可能tho ..多分VBAソリューションに固執するのがベストです – pjp

8

私の好みにアクセスするVBAを使用して、マスターテーブルにそれらの個々のテーブルを統合することであろう。 1つのテーブル内のすべてのデータを使用すると、これは非常に簡単です。

ただし、にはがあり、個々のテーブルを別々にする場合は、ソーステーブル名のフィールド式を含むようにマッピングクエリを変更します。 UNIONクエリにそのテーブル名フィールドを含めます。

次に、読み取り専用UNIONクエリに基づいて連続フォームを作成します。適切なテーブルから単一の編集可能なレコードを返す別のクエリに基づいてサブフォームを追加します。現在のイベントでは、メインフォームの、サブフォームのクエリの値集合ソースを書き換えて:

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

私は提案(私が実際に提案しようとしていたもの)を2番目に挙げました。実際、私はすべての連続/データシートフォームを読み取り専用にするという標準的な慣行があります(請求書の詳細項目など、いくつかの例外があります)。 –

-1

これは非常に古いスレッドですが、私は同じことへの解決策を探して、それに出くわしました。私はいくつかのユニオンクエリーを通してプッシュされたチェックボックス値を持っていました。私がそれを更新しようとしたとき、もちろん私はできませんでした。

しかし、私は解決策を見つけて、それを分かち合うと思った。チェックボックスのOnEnterイベントでは、変更したい基になるテーブルのフィールドを更新したSQL Updateクエリを実行しました。 Trueの場合はFalseに更新し、Falseの場合はTrueに更新しました。 Voila!

関連する問題