5

私は Access が初めてで、C#、SQL Server、および .Net から来ています。私のところにやってきたプロジェクトがあり、いくつかの部分を完成させなければなりません。

シナリオは次のように説明できます。

  1. サブフォームを含む Access フォーム
  2. 前述のサブフォームのデータ ソースである Access クエリ。次のように表示されますParametername1 String(255),Parametername2 String(255)
  3. VBA コード モジュール

私の計画は、VBA コード モジュールのプロシージャ内で上記のクエリ パラメータの値を設定することです。クエリはサブフォームのデータソースであるため、これによりサブフォームが更新されるはずです。

問題は、この計画を実行する方法がわからないことです。

インライン SQL で VBA コードを台無しにしたくないので、クエリを使用したいと考えています。

アクセス2010を使用しています。

4

4 に答える 4

6

私はまさにこの質問をしていました.同じ「保存された」更新クエリを使用したかったのですが、2つの異なるフォームから実行したかったので、実行時にパラメータをクエリに渡したかったのです. これは私が(別のフォーラムで)見つけたもので、まさに私が望むものです:

With CurrentDb.QueryDefs("qry_YourQuery")
   .Parameters("yourParam") = yourVBAvar
   .Execute
End With
于 2013-02-18T04:18:54.780 に答える
2

サブフォームの要点は、レコード ソースとリンクの子およびマスター フィールドによって制御されることです。フォームが Company で、サブフォームが Employees であるとします。サブフォームのレコード ソースは次のようになります。

SELECT EmployeeID, CompanyID, Position, Etc FROM Employees

リンクの子フィールドとマスター フィールドは CompanyID になります。マスター フォームを移動すると、現在の会社に関連するレコードのみが表示されます。次に、技術職の従業員のみを表示したいとします。実行時にレコード ソースを変更できます。

SELECT EmployeeID, CompanyID, Position, Etc FROM Employees
WHERE Position = "Technical"

または、これが常にフォームのフィルターである場合は、メイン フォームにコンボボックスを追加し、それを 2 番目のリンク マスター フィールドとして使用すると、次のようになります。

Link Master Fields:  CompanyID; cboPosition
Link Child Fields :  CompanyID; Position

最後に、メイン フォームからフィルター プロパティを簡単に設定できます。

Me.Employees_subform.Form.Filter = "Position=""Tecnical"""
Me.Employees_subform.Form.FilterOn = True

これがあなたの心にあるものではない場合は、質問にメモを追加してください。

編集

フォーム上のコントロールを参照することで、クエリにパラメーターを指定できます。

SELECT EmployeeID, CompanyID, Position, Etc FROM Employees
WHERE Position = Forms!MyMainForm!cboPosition

クエリの SQL を完全に変更することができ、ADO を使用することもできます。ただし、SQL を変更することは、SQL がコード内で変更されるという点でレコード ソースを設定することと似ており、ADO を使用することは通常、フォームには最適ではありません。

できないことは、パラメーターを変更して、フォームまたはサブフォームに「固定」することです。

例えば:

DoCmd.SetParameter "@SomeID", "1"
' This works
DoCmd.OpenQuery ("Queryx")

' This will give a prompt for @SomeID and then run
Me.SomeSubform.Form.RecordSource = "Queryx"
于 2012-08-04T19:49:01.623 に答える
1

関数を作成し、フォームのレコード ソース クエリで (通常のパラメーターの代わりに) その関数を使用することができます。

Public Function PositionParam(Optional ByVal P1 As Variant) As Variant
    Static varP As Variant

    If Not IsMissing(P1) Then
        If IsNull(P1) Then
            varP = Null
        Else
            varP = CStr(P1)
        End If
    ElseIf VarType(varP) = vbEmpty Then
        varP = Null
    End If
    PositionParam = varP
End Function

レコード ソース クエリ:

SELECT y.id_fld, y.another_fld, y.position_fld
FROM YourTable AS y
WHERE
       y.position_fld = PositionParam()
    OR PositionParam() Is Null
ORDER BY y.id_fld, y.another_fld;

後でサブフォームに別の行セットを表示する場合は、サブフォームに割り当てられた値を変更しPositionParam()ますRequery

PositionParam "technician"
Forms("YourForm").Requery
于 2012-08-06T15:55:46.427 に答える
0

サブフォームはクエリにバインドされており、そのクエリにはパラメーターがまったくありません。

サブフォームの SQL をクエリに格納することは確かにできます。これにより、インライン sql が削除されますが、この問題を回避するためにコードを振り返って WHACKS を記述することはまったく意味がありません。

前述のように、サブ フォーム レコードのフィルタリングと表示は自動的に行われ、サブ フロム コントロールのマスター リンクと子設定をセットアップするとコードなしで実行されます。ここではコードは必要ありません。

ただし、実際の理由でコードを記述する必要がある場合や請求可能な時間を増やしたい場合は、次のコードを使用できます。

Dim strSql     As String

strSql = Split(CurrentDb.QueryDefs("name of query").SQL, ";")(0)

strSql = strSql & "where Field1 = " & "'your p1 value'" & _
                  " and Field2 = " & "' your p2 value'"

Me.custChild.Form.RecordSource = strSql

そのため、SQL にパラメータは必要ありませんが、サブフォームが基づいている CURRENT および SAME クエリを使用するだけです。さらに、パラメーターを追加すると、クエリで 2 つの値がハードコーディングされ、2 つの同じハードコーディングされたパラメーターを提供しない限り、クエリを他のコードやタスクに使用できなくなります (したがって、そのクエリを他の場所で使用する際の柔軟性はほとんどありません)。選択肢が異なります)。

したがって、パラメーターをクエリから除外し、同じ金額と時間、および請求可能な時間を残します。

上記のようにクエリ SQL を取得し、SQL に基準を追加するのは簡単なことです。ただし、サブフォームにデータを挿入する場合は、サブフォームのデータ ソースと reocrdset を直接使用できます。例えば:

  Dim rst     As DAO.Recordset

  Set rst = Me.custChild.Form.RecordsetClone

  rst.AddNew
  rst!SomeField = "some valjue"
  rst!SomeField2 = "some value"
  rst.Update

  Me.custChild.Requery
于 2013-12-13T21:55:05.867 に答える