2016-09-01 6 views
2

誰もがG'dayです。MS Accessクエリーカスタム関数は、フォームテキスト入力を値として受け入れます。

私は今日まで一日中この質問に対して私の頭を叩いていましたが、何か答えを見つけることができなかったので、私はあなたの助けに感謝します。

私が持っているもの:

  • テキストフィールド
  • 正規表現と呼ばれるカスタム関数をモジュール内で定義されたフォームのデータソース
  • あるクエリを含むAccessフォーム

RegExpは文字列(テーブルから取得)とパターン(フォームから取得)の2つの値を入力として受け取ります。 RegExpはブール値を返します。ブール値はクエリ結果を消します。

この関数は完全に正常に動作しますが、これはユーザーがテキストフィールドを塗りつぶす場合にのみ当てはまります。フィールドを空白のままにすると、結果は返されません(この場合、関数は呼び出されなくなります)。 (基本的には、スペースを変換し、切り取ら先頭と末尾の取得テキストフィールドに、値のユーザータイプを、それを合計する

... AND (RegExp(tblRole.Description,Trim([Forms]![frmFindRole]![txtRegExp]))<>False) AND ... 

:だからここ

は、クエリ内の特定のステートメントは次のようになります。 VBAモジュール内の正規表現に変換し、クエリ結果は、関数が返すブール値に基づいてフィルタリングされます)。

このフォームにはいくつかのコントロールがあり、それらはtxtRegExpテキストフィールドを追加する前に機能していました。今、クエリは、txtRegExpが記入されている場合にのみ結果を返し、理由はわかりません。私はより多くの小切手を追加しようとしましたが、クエリはあまりにも複雑で、成功しませんでした。

答えを作成するために追加のコードサンプルが必要な場合は、明日に提供することができます。

ありがとうございます。

P.S. Nzはお手伝いしますか?はいの場合は、どうやって使用するのですか?

+1

RegExp関数の先頭にブレークポイントを設定して、テキストボックスが空のときに関数が入力されているかどうかを確認し、関数が返す関数をステップバイステップで実行します。あなたの関数がNULLを返し、 'NULL <> false'で終わる可能性があります。これは有効な式ではありません。 NULLを何かと比較することはできません。そのため、私たちは常に、何かがNULLではなく、何かを意味するのです。 NZの場合、控除が有効であれば、実際には次のようになります。 'AND(NZ(RegExp)tblRole.Description、Trim([Forms]![frmFindRole]![txtRegExp]))、false) AND –

+0

@Thomasの場合、2番目のパラメータ(pattern = txtRegExp)がnullの場合、関数は "Exit Function"を返します。私はすでにそれを使用して試してみました(設定パターン= Trueの場合はIsNull(パターン);異なるブレークポイントの関数内に4つの異なるメッセージボックスを入れました)。 txtRegExpは空白です( "とその関数が呼び出されていない場合でも")。私はブレークポイントを使用してMsgBoxに比べて異なるかどうかはわかりませんが、これは私がやったことです。 –

+1

これを修正する方法はいくつかありますクエリがどのようにトリガされるのですか?ボタンがあるのか​​、それとも別のイベントですか?解決策は、テキストボックスが空であれば、クエリを別のものに変更することです。あなたは –

答えて

0

あなたはコメントで

を与えたいくつかの説明に基づいて、これはコードであると仮定しKeyUpイベントでトリガ:

Private Sub Form_KeyUp(KeyCode As Integer, Shift As Integer) 

    Me.Requery 

End Sub 

ストアのどこかのローカル変数にフォームのレコードソースのデフォルトのSQL。この例では、それをSQLdefault文字列に格納したと考えました。

、再クエリテキストボックスが空であるかチェックし、そうならばそれに応じて、フォームのレコードソースのSQLを変更する前:置き換え

AND (RegExp(tblRole.Description,Trim([Forms]![frmFindRole]![txtRegExp]))<>False) 

:この例では

private SQLdefault as string 

Private Sub Form_KeyUp(KeyCode As Integer, Shift As Integer) 

    Dim SQL As String 

    If Nz(txtRegExp, "") = "" Then 
     SQL = SQLdefault 
     SQL = Replace(SQL, "AND (RegExp(tblRole.Description,Trim([Forms]![frmFindRole]![txtRegExp]))<>False)", "") 
     Me.RecordSource = SQL ' Normally this is enought to requery, if not uncomment below 
     'Me.Requery 
    Else 
     Me.RecordSource = SQLdefault ' Normally this is enought to requery, if not uncomment below 
     ' Me.Requery 
    End If 

End Sub 

を私はSQLの一部のcontainningを削除それが正しいのではないならば、何か別のものによって。

これは明らかに最も洗練されたソリューションではありませんが、あなたが示したものをもっとも良いソリューションで提供することは困難です。

+0

1)[RegExp関数](http://pastebin.com/yGb9c54s)、2)[クエリ](http://pastebin.com/jR7Vq37d)(別のAccessクエリで、VBA文字列ではありません)更新後のtxtRegExp関数はシンプルな '.Requery'で、何も気にしません。同じ '.Requery'は他の入力に対してもうまく動作します。私のクエリはVBAの文字列だったので、私は 'Replace'パスも取っていたでしょう。残念ながら、そうではありません。うまくいけば、今回は十分なデータがあります。ありがとうございました。 –

+0

私はこれを別に修正しましたが、あなたの応答は答えとしてマークします。なぜなら、それはうまく機能し、あなたが私を大いに助けてくれたからです。まだその機能が空の入力フィールド値で起動しなかった理由がわかりません。 –

0

私はinitial queryinclude a checkに変更して、それをtxtRegExpの値にすることで動作させることができました。

空のtxtRegExp値でなぜ失敗したのかまだ完全にわかりません。私はRegExp関数が何らかの形でNULLを第2引数として与えられたときに起動しなかったと感じています。

彼が提供しているすべてのヘルプについては、Thomas Gに非常に感謝しています。

関連する問題