システムwiki

複数のリストボックス選択に基づくフィルタサブフォーム

briefVB 受付中 最終更新日:2021-05-26 14:42

コードを作動させるためのコードを誰もが助けになることができますか?事前にありがとう!

いくつかのリストボックスの選択に基づいてフィルタリングする必要があるサブフォームsformreviewを持っています.以下のコードはリストボックスの1つにとってです.他のものは単に異なる名前のコードの複製コードです.うまくいきません.リストボックス コーティングは、サブフォーム内の像コーティングを指す.

プライベートサブListCoating_AfterUpdate()

変法として薄暗い
変種としての薄暗いストリン
strin= ""
Lstcoatingの各Iのために
strin= strin&lstcoating.Itemdata(i)&"、"
次のI
SLIN=左(SLIN、LEN(SLIN)-1)
ME.SFRMREVIEW.FORM.FILTER= "("&strin&")のコーティング
me.sfrmreview.form.filteron= true

終了SUB

返信リスト(回答:12)

8 #
Scottge

それは冒頭の引用を欠いています.それは次のように出るべきです:
( '4')のコーティング( '4')
これが構文エラーです.
リストボックスがどのようなものであるかは問題ではありませんtable内の基礎となるフィールドのデータ型が何であるかに重要です.コーティングの有効な値が4であることを示すので、コーティングは数値フィールドである可能性があります.
コードを踏み、SLINがどのように構築されているかを確認する必要があります.
また、リストボックスを使用するように教えられた場合は、データシートフィルタリングを使用するように教えられます(私の意見では簡単です).

11 #
Scottge

こんにちは簡単な
私は独立したアドバイザーです、そして助けようとします.
まず、うまくいかないものですか?それは何もしませんか?エラーメッセージが表示されますか?
コーティングはどのデータ型ですか?コーティングが文字列である場合は、文字列になる必要がある場合は、STRINをバリアントとして薄暗くします.コーティングが文字列である場合は、各項目を一重引用符で囲む必要があります.お気に入り:
strin= strin&"" "&lstcoating.Itemdata(i)&" '、 "" " もう1つのポイントは、これが1列でフィルタリングするだけです.複数の列をフィルタリングしたい場合は、すべてのリストボックスにフィルタを構築する必要があります.
しかし、より簡単な方法があるかもしれません.サブフォームのデータシートビューを使用できます.これにより、ユーザーはデータシートフィルタリングをユーザーに許可します.各列には、1つ以上の値でフィルタリングできるプルダウンがあり、フィルタ列を列で作成できます.
これでさらに明確にする必要がある場合は、お気軽にお問い合わせください.

応答11# ->にスキップ
9 #
briefVB

こんにちはスコッツェム、トンありがとう.

すべてのリストボックスはテキストです.また、データベースはダミープルーフ用に設計されているため、リストボックスを使って誤解を防ぐために使用されました.記載されているコードは私にエラーを示しています:(4 '、)'

のクエリ式の文字列の構文エラー

そしてフォームはデータシートフォーマットにあります.

任意のアイデア?

12 #
KenSher

終了引用符の文字は、最後から2番目の行の終わりに欠けています.
テキストデータ型のコーティング列ですか?もしそうなら、値リストの値をリテラル引用符で囲む必要があります.
薄暗い
薄暗い文字列として
Lstcoatingの各Iの場合は、
strin= strin&"、" "&lstcoating.Itemdata(i)&" "" "" "" 次のi
strin= mid(strin、2)
me.SFRMREVIEW.FORM.FILTER= "("&strin&")"
me.sfrmreview.form.filteron= true

応答12# ->にスキップ
10 #
briefVB

こんにちはケン、

ありがとう.すべてのリストボックスはテキストです.コードをテストしましたが、リスト内の項目を選択すると0の結果が返されます.任意のアドバイス?

応答10# ->にスキップ
7 #
KenSher

1.リストボックスのRowSourceプロパティは何ですか?クエリの名前であれば、クエリのSQL文は何ですか?
2.リストボックスの次のプロパティの値は何ですか?
バインドカラム
ColumnCount
columnwidths
3.表のデザインビューに示すように、サブフォームのtableのコーティング列のデータ型は何ですか?

応答7# ->にスキップ
6 #
briefVB

1.RowSourceはTBLcoatingonlyという別のtableです.

DISTINCT TBLCOITIONONLY.ID、TBLCOITIONONLY.COACINGTYPE

TBLCoationOnlyから
tblcoatingonly.CoatingTypeによる順序.

2.サブフォームsfrmreviewは、他のコンボボックス選択に基づいてデータソースを変更するため、すべてのリストボックスがバインドされています.

バンドカラム

ColumnCount 2
columnwidths0 "; 1 "
3.列コーティングのテキストです.カップル他のフィールドは番号です.

応答6# ->にスキップ
5 #
KenSher

BoundColumnプロパティは、コントロールがバインドされているかどうかとは関係ありません.通常、RowSource内のどの列がコントロールのValueプロパティを決定します.RowSourceを使用して、コントロールのBoundColumnプロパティを引用しました
これは、制御の値が通常ID列の値であることを意味します.これは、ColumnWidthsプロパティの最初の次元がゼロであることによって隠されます.
ただし、マルチサイトリストボックスにはそのまま値がありません.むしろ、それは分類されたコレクションを選択しています.これはバリアントのコレクションです.このコンテキストのBoundColumnプロパティは、これらのバリアントが指す列、この場合はIDを決定します.
カラム.これはおそらく自動数列であるため、コードによって構築された値リストは文字列式ではなく長い整数値の値のリストになります.その結果、値はリテラル引用符で囲む必要はありません.私が投稿したコード
そのため、以前に修正する必要があります.
薄暗い
薄暗い文字列として
Lstcoatingの各Iの場合は、
strin= strin&"、"&lstcoating.Itemdata(i)
次のi
strin= mid(strin、2)
me.SFRMREVIEW.FORM.FILTER= "("&strin&")"
me.sfrmreview.form.filteron= true
in演算子が適用される値リストの値は長い整数の数値であるため、上記のコードではコーティング列が長い整数データ型になる必要があります.これはケースですか?必ずしもそうしないという列のテキスト値が表示されたとしても
列がテキストデータ型の意味です.その実際の値は、 'Lookupフィールド'ウィザードを使用して、またはそのDisplayControlプロパティが「コンボボックス」に設定されている場合は、列がtableデザインビューで作成された場合は長い整数です.この
列の本当の値の隠蔽は、「ルックアップフィールド」ウィザードの使用に対してアドバイスする理由の1つです.このようにしてコンボボックスを使用する場所は、tableのデータシートにはありません.
コーティング列が数値データ型の場合、私がそうであると思われるように、私が上記のコードが予想どおりに機能しないのかを確認できる理由はありません.一方、テキストデータ型であれば、コードは機能しなくなり、必要になるでしょう
他の列のサブフォームをフィルタリングするには、すなわち、TBLcoatingonlyの主キーを1対多の関係で参照する数値外部キー.

応答5# ->にスキップ
4 #
briefVB

ケン、どうもありがとう.私はあなたがコメントしたものを十分に理解しているかどうかもよくまたよく述べています.the tblcoatingonlyにあるidは、サブフォームのソース形式のidフィールドではありません. sfrmreview、文字列が何であるかを示すためのテキストを追加します.

Me.txtcoating= strin

リストボックス内の選択のid数を表示します(たとえば、 "1"、 "3"、 "4")、ただし、それはサブフォーム内のIDではありません.そしてその SFRMREVIEWコーティングフィールドは、ソース形式のテキスト列から発生します.

応答4# ->にスキップ
3 #
KenSher

その点はそれがあるべきだということです.2つのtableが1対多の関係タイプに2つのtableがあり、参照tableの主キー、この場合はTBLcoatingonlyは、通常、通常は常に自動名で、その場合は常に数値列です.
参照tableの対応する外部キーは、長整数データ型の列でなければなりません.
通常、参照されている表の主キーと同じ名前がありますが、主キー列を呼び出すことの悪い慣習 明示的に説明する名前ではなく、id.塗料で、これを困難にします.

参照tableは、参照table内の非鍵列の値を複製しないでください.
これにより冗長性が導入され、表はすべての非キーカラムを必要とする3番目の通常の形式(3NF)に対して正規化されていません.

コードによって生成された値リストは正しく未解消の整数番号のリストです.
その結果、リストに基づいてレコードセットをフィルタリングするには、外部キーも整数の列になる必要があります.
通常のデータ入力の手段である数値外部キー列にバインドされているコンボボックスコントロールでは、コントロールの数値は非表示になり、参照tableで参照されている非鍵列からの対応するテキスト値があります.
コントロールに表示されます.参照tableのみに基づくフォームまたはサブフォームは、table内に存在しないため、テキスト値でフィルタ処理できません.
フォームまたはサブフォームが参照tableと参照tableを結合するクエリに基づいている場合、それは前者からテキスト列でフィルタリングされますが、それは不要で非効率的であろう.

応答3# ->にスキップ
2 #
briefVB

ケン、ありがとう!私は私の情報源を変更してID列の削除を変更しました.これで選択に基づいてフィルタリングできます.

Distinct TBLCoationOnly.CoatingType

を選択します

Tblcoatingonly

から

tblcoatingonly.CoatingTypeによる順序.

しかし、問題はそれが最初の選択でしか動作しないので、私はそれが複数選択で動作する必要があります.フィールドが数字の場合、コードを変更するにはどうすればいいですか?

応答2# ->にスキップ
1 #
KenSher

あなたは本当にここで氷山の問題に対処するのではなく、ここでデッキチェアをここで動かすだけです.テキスト列ではなく数値外部キーを含め、次にテキストを表示するように、サブフォームの後ろのtableを正規化する必要があります.
サブフォームのコンボボックスの参照table.私が投稿した最後のコードは仕事をしていますが、単一のリストボックスのみです.
複数のマルチサイトリストボックスに基づいてサブフォームをフィルタリングするには、すべてのリストボックスですべての選択が行われた後に、ボタンのクリックイベントプロシージャーの表現を作成する必要があります.あなたがセットを返したいのなら
各リストボックスの選択により、次第に制限のどちらが選択されてから、各リストボックスの式がブール値と演算子と一緒にタックされます.一方、あなたは次第に一連の行を返したいのであれば 展開各リストボックスの選択によって、各リストボックスの式はブール値または演算子と一緒にタックされます.
次第にrestrictまたはexpandを展開するもう1つの方法
各リストボックスで選択として行のセットは、サブフォームのRecordSourceクエリのパラメータとして値リストを参照することです.以下は、これを行うNorthwindtableを使用したクエリの例です.この場合は2つのマルチ選択を使用しています.
listボックス.このボックスは、Boolean and Operationを使用して最初に返された行のセットを制限します.
Customers.ID、[ファーストネーム]&「&[姓]を顧客として選択します.[商品名]、
製品内部結合からの数量として([注文の詳細].quantity)
customer.id=注文.[顧客ID])内部結合[注文詳細] [注文ID]= [注文詳細])[注文ID])
Products.ID= [注文の詳細] [商品ID]
where(inparam(customers.id、forms!frmmultiselectcatret!txtcustomerList)= true) またはフォーム!frmmultiselectcorrete!TxtCustomerListはnull)と(InParam(Production.ID、Forms!frmmultiselectcorret!txtproductlist)= true またはフォーム!FRMMultIselectCorreted!txtproductListはnullです)
Customers.ID、[ファーストネーム]&「&[姓] [苗字]、 [ファーストネーム]、 製品.[商品名]
[姓]で注文する [ファーストネーム]、 製品[商品名]
あなたが自分自身を心配する必要があるこのクエリの唯一のものは、そのWhere句です.ご覧のとおり、TXTCUSTOMERLLISTとTXTPRODUCTLISTテキストボックスコントロールをフォームに参照するInParam関数が呼び出されます.これらは隠されたコントロールになります
フォームのモジュールのコード.
InParam関数は、長年前にオンライン記事で出版され、次のとおりです.
'


'inparam()関数はこの記事の中心です.
のとき 'クエリの実行、この関数はクエリパラメータを引き起こします. '値のリストを入力できるようにするには、ダイアログボックスが表示されます.
'入力した値は、
のように解釈されます. 'in()演算子の括弧内に入力しました.
'
関数InParam(FLD、PARAM)
薄暗い文字列としてsttoken
'次の2行はオプションで、クエリを作る
'大文字と小文字が区別されます FLD= ucase(FLD)
param= ucase(param)
ISNULL(FLD)がFLD= "" "" "" "" while(len(param)>0)
sttoken= gettoken(param、 "、")
sttoken= ltrim $の場合(rtrim $(fld))
inparam=-1
終了機能


inparam= 0

の場合は終了 ループ
終了機能
関数は、次のgetToken関数を呼び出します.
関数GetToken(STLN、Stdelim)
DIM IDELIMは整数として、STTOKEN

IDELIM= INSTR(1、STLN、STDELIM)
(idelim<>0)なら
sttoken= ltrim $(RTrim $(MID $(STLN、1、IDELIM-1))
STLN= MID $(STLN、IDELIM + 1)


sttoken= LTrim $(RTrim $(MID $(STLN、1)))
stln= "" "" ""
の場合は終了 gettoken= sttoken
終了機能
両方の機能をデータベース内の標準モジュールに追加する必要があります.
2つの隠しコントロールを入力するためのコードは、2つのリストボックスのAfficeUpdateプロシージャです.元のリストボックスには、リストボックスが関連付けられているので、2番目のリストは最初の選択によって制限されていますが、それは
現在の問題明確にするために、2つのリストボックスを相関させる行を削除するコードは次のとおりです.
プライベートサブLSTCUSTOMERS_AFTERUPDATE()
VARIATT AS VARIATT
Dim StrCustomerListとして文字列として
me.lstcustomers
if.itemsSelected.count<>0から<>各varitemの.ItemSelected
strcustomerList= strCustomerList&"、"&.ItemData(varitem)
次のvaritem
「リーディングカンマを削除」 strcustomerList= mid(strcustomerList、2)
'リストを隠しコントロールに割り当てる
me.txtCustomerList= strCustomerList
ME.TXTPRODUCTLIST= NULL
私は


の場合は終了



プライベートサブLSTPRODUCTS_AFTERUPDATE()
VARIATT AS VARIATT
ムードストレートリストとしての文字列として
me.lstproducts
if.itemsSelected.count<>0から<>各varitemの.ItemSelected
strproductList= strproductList&"、"&.ItemData(varitem)
次のvaritem
「リーディングカンマを削除」 strproductList= MID(StrproductList、2)
'リストを隠しコントロールに割り当てる
me.txtproductList= strproductList
私は


の場合は終了



上記は、Public DatabasesフォルダにあるZIPファイルとして見つけることができます.
https://onedrive.live.com/?cid=44cc60d7fea42912&id=44cc60d7fea42912年169.
あなたの場合、サブフォームはリストボックスがある形式ではなく、上記のコードで参照されている形式ではキーワードで再要求されます.