Microsoft Access Club Access超初心者対象Forum Access初級者対象Forum Access初・中級者対象Forum Access VBA Tips Forum DAO、ADO、SQL Forum

     

リストへもどる

投稿記事の一括表示

タイトル重複の可能性があるリストを直接編集
記事No10797
投稿日: 2011/05/23(Mon) 15:15
投稿者shin
解決済: ON
OS:Windows XP
Access Version:2003

お世話になります。
どこまで正確に状況を伝えられるかによりますが、ご教授願います。

現在、不具合連絡書類を
文書番号(主キー)・製品番号・製品名・登録者名・検索用キーワードの5つのフィールドで
不具合テーブルを作ってDB化しています。

製品番号でリンクさせて、もう一つ各不具合で使用した検討書類を登録しています。
検討書類テーブル 整理番号(オートナンバーで主キー)・製品番号・文書名

です。

不具合テーブルの内容登録時に、検索時に利用するキーワードを登録する(複数登録可)のですが、
半角もしくは全角のスペースを区切りとして入力し、保存コマンドボタンを押すと当時に
キーワードはスペース区切りでマトリックス化され、
「キーワードリストテーブル」に格納されるという仕組みにしています。
この時、キーワードリストテーブルにすでに登録のあるものに関しては重複して登録できないような
仕組みを作っています。このキーワードリストテーブルはクエリで読み順に並べ替えて、
登録時のキーワード候補としてリストボックスに表示し、ダブルクリックでキーワードテキストボックス
に書き込めるように作っているものです。

'入力されたキーワードをスペース区切りで配列に並べ替えてキーワードテーブルに登録
Private Sub Keyword_AfterUpdate()
Dim db As DAO.Database
Dim rs As DAO.Recordset
Dim Dic As Object
Dim Var As Variant

Set db = CurrentDb
Set rs = db.OpenRecordset("キーワードリストテーブル", dbOpenDynaset)
Set Dic = CreateObject("Scripting.Dictionary")
Do Until rs.EOF
Dic.Add rs!Keyword_txt.Value, Null
rs.MoveNext
Loop

For Each Var In Split(Me!Keyword, " ")
If Dic.Exists(Var) Then
Else
rs.AddNew
rs!Keyword_txt = Var
rs.Update
End If
Next Var
rs.Close: db.Close
End Sub

登録後、見たいレコードを検索し、詳細を表示させるフォームに、そのレコードで登録されたキーワードも
表示されます。その閲覧フォームで「キーワードを気軽に編集したい」という
要求が出され、苦慮しています。

私としては、キーワードを付け足したり、削除したりするとキーワードリストテーブルの内容を
そのつど書き換える必要があると思うのですが、その方法がまるでわかりません。
(重複を許していないので、例えば消したいキーワードがあっても他で登録があれば残して
おかないといけないということになります)
編集するたびに、キーワードリストテーブルを作りなおすしかないのか?と思いましたが
何か他にいい方法がないかと質問させていただきました。

よろしくお願い致します。

タイトルRe: 重複の可能性があるリストを直接編集
記事No10798
投稿日: 2011/05/23(Mon) 15:54
投稿者スナフキン
解決済: ON
不具合テーブルとキーワードテーブルの関係はどのようになっていますか?

タイトルRe^2: 重複の可能性があるリストを直接編集
記事No10800
投稿日: 2011/05/24(Tue) 09:34
投稿者shin
解決済: ON
スナフキンさん よろずやさん

ありがとうございます。
お返事が遅くなり申し訳ありません。

> 不具合テーブルとキーワードテーブルの関係はどのようになっていますか?
リンクはしていません。まったく独立の関係になっています。
キーワードテーブルはあくまで登録時と検索時にキーワード候補としてリストボックスに表示
させるためのものです。
リストボックスに表示させるには、並び替える必要があるためクエリを介しています。

テーブルに登録時は重複を許し、クエリでリスト表示させるときに
重複するものは表示させない、ということですね。
やってみます。

そうすれば、文書番号とキーワードで削除したり付け足したりできるということでしょうか?

タイトルRe^3: 重複の可能性があるリストを直接編集
記事No10802
投稿日: 2011/05/24(Tue) 12:25
投稿者スナフキン
解決済: ON
不具合文書1 キーワード A,B,C
不具合文書2 キーワード A

の時
不具合文書1 キーワード A,B,C
のキーワードAを削除した場合
キーワードテーブルは
不具合文書2 にAが存在するため A,B,Cとなるのでしょうか?
それとも BC となるのでしょうか?

また
不具合文書1 キーワード A,B,C
のキーワードAをDと修正した場合
キーワードテーブルは
不具合文書2 にAが存在するため A,B,C,Dとなるのでしょうか?
それとも DBC となるのでしょうか?

タイトルRe^4: 重複の可能性があるリストを直接編集
記事No10803
投稿日: 2011/05/24(Tue) 13:15
投稿者shin
解決済: ON
スナフキンさん

お返事ありがとうございます。
回答させていただきます。

今現在は、不具合文書テーブルのキーワード登録時のみスペースで
マトリックス化してキーワードテーブルに格納していて、
登録時以外はユーザーレベルでキーワードは編集できない状態になっています。

ですので、下記のような操作をしてもキーワードテーブルは何一つ動きがありません。

> 不具合文書1 キーワード A,B,C
> 不具合文書2 キーワード A
>
> の時
> 不具合文書1 キーワード A,B,C
> のキーワードAを削除した場合
> キーワードテーブルは
> 不具合文書2 にAが存在するため A,B,Cとなるのでしょうか?
> それとも BC となるのでしょうか?

現在はA,B,Cのまま、ということになります。
ただ、何もしていないのでA,B,Cのままなだけです。
希望としては、なんらかの方法で、Aというキーワードを不具合テーブルの
キーワードフィールド(キーワードがスペース区切りで登録されている)
内の不具合文書1以外にあるかどうかを検討して、その結果他に登録があれば、
キーワードテーブルから削除しない、なければ削除するという形をとりたいのです。

> また
> 不具合文書1 キーワード A,B,C
> のキーワードAをDと修正した場合
> キーワードテーブルは
> 不具合文書2 にAが存在するため A,B,C,Dとなるのでしょうか?
> それとも DBC となるのでしょうか?

現在はA,B,Cのままです。
ですが、希望としてはA,B,C,Dとしたいわけです。
この場合は逆で不具合テーブル内には存在しないキーワードとなりますので
キーワードDを新たにキーワードテーブルに登録したい、ということです。

ここでややこしいので不具合テーブルのキーワードフィールドと
キーワードテーブルについて記載させていただきます。

入力画面(コントロールソース:不具合テーブル)
ここのキーワードフィールドに
キーワードA□キーワードB□キーワードC
と入力して登録ボタンを押すと、□ごとに区切られて

キーワードテーブル
ID-1 キーワードA
ID-2 キーワードB
ID-3 キーワードC

と格納されます。

次の登録で
キーワードA□キーワードC□キーワードD
と登録すれば

キーワードテーブルは
ID-1 キーワードA
ID-2 キーワードB
ID-3 キーワードC
ID-4 キーワードD

となるのです。
一度登録されたキーワードテーブル内は今現在は手動で追加削除しない限り
変更されません。

タイトルRe^5: 重複の可能性があるリストを直接編集
記事No10804
投稿日: 2011/05/24(Tue) 13:28
投稿者スナフキン
解決済: ON
ADO参照ということで、

キーワードリストテーブルは

Keyword_txt   テキスト(主キー)
Keyword_Count 数値型

とし


Public Sub EditKeyWord(OldKeyWord As String, NewKeyWord As String)

    Dim spOldKeyWord() As String, spNewKeyWord() As String
    Dim cn As ADODB.Connection
    Dim i As Integer
    Dim strQuery As String
    
    spOldKeyWord = Split(Replace(OldKeyWord, " ", " "), " ")
    spNewKeyWord = Split(Replace(NewKeyWord, " ", " "), " ")
    
    Set cn = CurrentProject.Connection
    If OldKeyWord <> "" Then
        For i = 0 To UBound(spOldKeyWord)
            strQuery = "UPDATE キーワードリストテーブル SET Keyword_Count=Keyword_Count-1 WHERE Keyword_txt='" & spOldKeyWord(i) & "'"
            cn.Execute strQuery
        Next i
    End If
    
    If NewKeyWord <> "" Then
        For i = 0 To UBound(spNewKeyWord)
            If Nz(DLookup("Keyword_txt", "キーワードリストテーブル", "Keyword_txt='" & spNewKeyWord(i) & "'"), "") <> "" Then
                strQuery = "UPDATE キーワードリストテーブル SET Keyword_Count=Keyword_Count+1 WHERE Keyword_txt='" & spNewKeyWord(i) & "'"
            Else
                strQuery = "INSERT INTO キーワードリストテーブル(Keyword_txt,Keyword_Count)VALUES('" & spNewKeyWord(i) & "',1)"
            End If
            cn.Execute strQuery
        Next i
    End If

    cn.Execute "DELETE FROM キーワードリストテーブル WHERE Keyword_Count=0"
    cn.Close: Set cn = Nothing

End Sub

を用意して

Private Sub Keyword_AfterUpdate()
    Call EditKeyWord(Nz(Me.Keyword.OldValue, ""), Nz(Me.Keyword, ""))
End Sub

とすれば
そこそこ期待どおりの動作になると思います。

タイトルRe^6: 重複の可能性があるリストを直接編集
記事No10805
投稿日: 2011/05/24(Tue) 13:32
投稿者shin
解決済: ON
スナフキンさん

早速のご回答ありがとうございます。

一度教えていただいた内容でトライしてみます。
結果はまたご報告させていただきますね!

タイトルRe^7: 重複の可能性があるリストを直接編集
記事No10806
投稿日: 2011/05/24(Tue) 13:36
投稿者スナフキン
解決済: ON
そうそう。
登録した履歴をのこしたいなら
最後のDELETE文をやめて
キーワードの候補をKeyword_Count<>0を表示させればよいかもしれません。

まあすきなように^^
では!

タイトルRe^8: 重複の可能性があるリストを直接編集
記事No10809
投稿日: 2011/05/24(Tue) 15:43
投稿者shin
解決済: ON
スナフキンさん

遅くなりました。
全て思い描いていた通りの動きとなりました。

今まで登録したキーワードをカウントしてテーブルに入力するのに
手間取りました…。

本当にありがとうございました。
カウントをテーブルに記載して、そのカウント数を判断指標にするという
今回の仕組みは大変勉強になりました。

また、お世話になるかもしれません。
よろしくお願いします。

ありがとうございました!

タイトルRe: 重複の可能性があるリストを直接編集
記事No10799
投稿日: 2011/05/24(Tue) 00:16
投稿者よろずや
解決済: ON
> この時、キーワードリストテーブルにすでに登録のあるものに関しては重複して登録できないような
> 仕組みを作っています。このキーワードリストテーブルはクエリで読み順に並べ替えて、
> 登録時のキーワード候補としてリストボックスに表示し、ダブルクリックでキーワードテキストボックス
> に書き込めるように作っているものです。

「重複を許さない」という仕様が問題です。
「重複を許し、文書番号も併記」にすべきです。
重複が具合が悪ければ、表示するときに重複を排除しましょう。

- 以下のフォームから自分の投稿記事を修正・削除することができます -
処理 記事No パスワード

ページの先頭へ 前ページへ戻る