1

これは非常に簡単な質問ですが、グーグルを使用して解決策を見つけることができませんでした。おそらく私は間違った用語を使用しています。私の問題に対処したり、正しい方向に私を向けたりするのに助けていただければ幸いです。私の会社では社内の要件があるため、ユーザー定義のテーブルを維持するために、SQLServerへのODBC接続を使用してAccessデータベースを作成しています。VBAでプログラミングしてからしばらく経ちました。

アクセスフォームを使用して、編集するデータを取得しています。ボタンを押すと、クエリが実行され、条件に基づいて1つの行が返されます。クエリから引き戻された情報を保持するためにレコードセットを使用しています。私の目標は、クエリのデータを編集可能なテキストボックスに入れ、変更を加えて更新ステートメントを実行することです。ただし、レコードセットデータをさまざまなテキストボックスに配置するために作成したコードは失敗し、その理由を理解できません。

これが私のコードです:

Dim rst As Recordset
    'add rows to record set
Set rst = CurrentDb.OpenRecordset("Select Parent_Name, Child_Name, Address, City, State, Zip, CustomerID, Facility, SystemID, " & _
            "from Table where CustomerID = '" & Forms!Frm_Edit_Child!cbx_Cust_ID & "' and  Facility = '" & Forms!Frm_Edit_Child!cbx_Facility & "' and SystemID = '" & _
            Forms!Frm_Edit_Child!cmb_SystemID & "';")

rst.MoveLast

Me.txt_Edit_IDN_Name.Text = rst.Fields("Parent_Name").Value
Me.txt_Edit_Customer_ID.Text = rst.Fields("CustomerID").Value
Me.txt_Edit_Facility.Text = rst.Fields("Child_Name").Value
Me.txt_Edit_Facility_Num.Text = rst.Fields("Facility").Value
Me.txt_Edit_Address.Text = rst.Fields("Address").Value
Me.txt_Edit_City.Text = rst.Fields("City").Value
Me.cmb_Edit_State.Text = rst.Fields("State").Value
Me.txt_Edit_Zip.Text = rst.Fields("Zip").Value
Me.cmb_Edit_SystemID.Text = rst.Fields("SystemID").Value

レコードセット内のデータを参照しようとしている方法が間違っていると思いますが、どこが間違っているのかを特定したり、適切な用語を使用してGoogle経由で解決策を見つけたりすることはできません。お時間をいただきありがとうございます!

4

2 に答える 2

2

そのコードには複数の問題があると思います。それらについて議論する前に、私はあなたにこのアドバイスを提供します. コードが失敗したことを伝えることは、「エラー #3141 をトリガーする」、「SELECT ステートメントにスペルミスまたは欠落している予約語または引数名が含まれているか、句読点が正しくない」と伝えることほど役に立ちませんCurrentDb.OpenRecordset

ステートメント フィールド リストの後のコンマを破棄しますSystemIDSELECT最後のフィールド式の後にコンマを続けることはできません。そうしないと、エラー #3141 が発生します。

SELECTステートメントを文字列変数に格納し、Debug.Printそれを使用してレコードセットを開く前に格納します。

Dim strSelect As String
strSelect = "Select Parent_Name, Child_Name, Address, City, " & _
    "State, Zip, CustomerID, Facility, SystemID " & _
    "from [Table] where CustomerID = '" & _
    Forms!Frm_Edit_Child!cbx_Cust_ID & "' and  Facility = '" & _
    Forms!Frm_Edit_Child!cbx_Facility & "' and SystemID = '" & _
    Forms!Frm_Edit_Child!cmb_SystemID & "';"
Debug.Print strSelect
Set rst = CurrentDb.OpenRecordset(strSelect)

それでも でエラーが発生する場合CurrentDb.OpenRecordsetは、イミディエイト ウィンドウ (CTRL+G) に移動して、db エンジンに使用するように要求しているステートメントを表示できます。実際に完成したステートメントを見るとすぐに、問題を見つけることができます。そうでない場合は、ステートメントをコピーして、新しいクエリの SQL ビューに貼り付けることができます。エラーを回避するために必要な変更を把握し、同じ正しい SQL ステートメントが生成されるように VBA コードを修正します。それでも問題が解決しない場合は、SQL を質問に貼り付けて、そのSQL から得られるエラー メッセージをお知らせください。

Tableは予約語です。Access の問題名と予約語を参照してください。それをテーブル名として保持する必要がある場合は、Access のデータベース エンジンの混乱を避けるために角括弧で囲みます。

アプリケーションに Microsoft ActiveX Data Objects の参照が含まれていて、DAO よりも優先順位が高い場合、この次の行に問題がある可能性があります。

Dim rst As Recordset

必要なレコードセットの種類を明示的に宣言する方が安全です。

Dim rst As DAO.Recordset

.Text@ user247245 が提案したように、これらの行からドロップします。この.Textプロパティは、現在フォーカスがあるコントロールでのみ使用できます。

Me.txt_Edit_IDN_Name.Text

.Value代わりに欲しい。.Value追加できますが、デフォルトのプロパティであるため、追加する必要はありません。したがって、これら 2 つは機能的に同等です。

Me.txt_Edit_IDN_Name.Value
Me.txt_Edit_IDN_Name

SELECT最後に、ステートメントにバインドされたフォームを使用すると、この状況ははるかに単純になると思います。テキスト ボックスの値を入力する必要はありません。これは、Access がバインドされたコントロールを使用して自動的に行うためです。これらのコントロールの更新後のイベント、またはコマンド ボタンのクリック イベントに基づいて、フォームのレコード ソースを修正できcbx_Cust_IDます。表示されたコードが別の形式 ( ではない) のものである場合は、コマンド ボタン アプローチを使用する必要があります。cbx_Facilitycmb_SystemIDFrm_Edit_Child

于 2012-05-09T22:50:00.417 に答える
1

長くなりましたが:

  • .Text は進むべき道ですか? 省略してみてください。

  • ソース テーブルを (リンクされた MS-Acess テーブルに) リンクし、フォームにフィルターを適用してみませんか? コードはまったく必要ありません。このクエリは、JET が非常に少ない帯域幅で簡単に解析できます。それとも整合性/セキュリティの問題ですか?

于 2012-05-09T22:07:53.180 に答える