3

アプリケーションの一部の機能に問題があります。管理者が確認できるように、フォームに「保留中のクラス」のインスタンスがある特定のインスタンスがあります。フォームには、この保留中のクラスに関連付けられている学生が入力されます。成績が終了したら、フッターにボタンがあり、このクラスを「保留中」のテーブルから削除して、すべての生徒に成績を追加します。これは機能します。ただし、基本的に、この保留中のクラスをコピーしたいと思います。このクラスには、クラス名、日付、教師が含まれているだけで、保留中から削除される前に、完成したクラステーブルにコピーされます。主キー(クラス番号)以外のこのクラスに関するデータはこのフォーム全体に保持されないため、行の他のフィールド(クラス名、日付)を完成したクラステーブルに入力できません。

これらの値を取得するために、VBAで「SELECTINTO」操作を試みています。次のようになります。

   dim cname as String
   dim classdate as Date
   dim pid as integer
   dim teacher as String
   dim qry as String

    pid = [Forms]![frmClasses]![txtID]

   qry = "Select className INTO cname FROM tblPending WHERE tblPending.id = " & " ' " & pid & " ' " & ";"

   db.execute qry
   debug.print qry
   debug.print cname   

ここから、他の変数に対して同じ操作を行い、INSERTクエリを作成して、それを実行します。問題は-私のselectintoが機能していないことです。Debug.printは、ローカル変数がSELECTINTOステートメントから初期化されなかったことを示しています。何かご意見は?

4

2 に答える 2

3

まず、すべてのクラスを1つのテーブルに配置し、「NotPending」または「Completed」列を設定する方がよいでしょう。
クラスに2つの同一のテーブルがあり、ステータスの変更を示すために一方から他方に値を移動することは、データベースの設計に問題があります。


2つのテーブルを使用して行をコピーすることでこれを行う必要がある場合は、コメントでRemouがすでに述べたように、新しいテーブルを作成する(または同じ名前の既存のテーブルを上書きする)ためINSERT INTOクエリが必要です(ではありませんSELECT INTOSELECT INTO)。すでにそこにある場合)。

の構文はINSERT INTO次のようになります。

INSERT INTO CompletedClassTable (ClassName, Teacher)
SELECT ClassName, Teacher FROM tblPending WHERE id = 123

そして最後に、あなたはコメントでこれを尋ねました:

では、SELECT INTOはAccessとOracleで完全に異なりますか?OracleおよびPL/SQLでは、行を変数または表に選択できます。アクセスでは、変数を選択できませんか?

行を変数にロードするには、 Recordsetを使用する必要があります。

クエリをRecordsetにロードし、ClassNameフィールドを出力するサンプルコード:

Dim RS As DAO.Recordset

Set RS = CurrentDb.OpenRecordset("SELECT * FROM tblPending WHERE id = 123")
If Not RS.EOF Then
    Debug.Print RS("classname")
End If
RS.Close
Set RS = Nothing
于 2012-07-06T16:12:21.997 に答える
1

テキストボックスにある値と一致する場所classNameからテキスト値、を取得し、そのテキスト値を。という名前の文字列変数に格納する必要があるようです。tblPendingtblPending.idtxtIDcname

その解釈が正しければ、クエリやレコードセットを気にする必要はありません。このテストされていないコードサンプルと同様に、DLookup関数を使用して値を取得するだけです。

Dim cname As String
Dim pid As Integer
Dim strCriteria As String
pid = [Forms]![frmClasses]![txtID]
strCriteria = "id = " & pid
cname = Nz(DLookup("className", "tblPending", strCriteria), vbNullString)
Debug.Print "cname: '" & cname & "'"

ノート:

  1. idのフィールドのデータ型tblPendingは数値であると想定しました。実際にテキストデータ型の場合は、strCriteria次のように変更します。

    strCriteria = "id ='"&pid& "'"

  2. DLookup()一致するものが見つからない場合はNullを返します。関数の戻り値を文字列変数に割り当てているので、私はNz()Nullを空の文字列に変換するために使用しました。または、cnameをVariantとして宣言して(Null値を受け入れることができるように)、を削除することもできますNz()

于 2012-07-06T16:51:33.137 に答える