0

このコードのチャンクでは、ライターがレコードセットオブジェクトへの参照を作成します。次に進む前に、その理由を理解していることを確認したかっただけです。

Private Sub LoadDataBound()
  Set rs = GetData
If Not rs.EOF Then
    Set dgPend.DataSource = rs '     Bind the Datagrid to the recordset
    dgPend.Refresh
    dgPend.AllowUpdate = True
Else
    MsgBox "No Records Found in DataGrid!"
End If

'Call Bind_Contols
'Call End_Time
End Sub



Private Function GetData() As ADODB.Recordset
sWhichDataType = UCase(Trim(sWhichDataType))

Select Case sWhichDataType
Case "ADS"
    sSource = "\\development\brakechecktables\speedwrench.add"
    Set GetData = OpenADS
Case "SQL"
    sSource = "development"
    Set GetData = OpenSQL
Case "FOX"
    sSource = "E:\Yes30\Data\speedwrench\"
    Set GetData = OpenFOX
Case Else
    MsgBox "Invalid DataSet Selected"
End Select
End Function

LoadDataBoundでは、set rs = GetData()と表示されます。これは以下の関数を呼び出しますが、なぜそれをrsレコードセットのオブジェクトとして設定する必要があるのですか。私はおそらく間違っているので、ここで私を訂正してください。しかし、両方(レコードセットと関数)に同じ名前を使用せずにレコードセットから関数を作成できるようにするために、これが必要ですか?または、私が気付いていない別のプロセスがここで起こっていますか?

4

1 に答える 1

1

コードを理解するのを手伝っていただければ幸いですが、あなたの質問とあなたの混乱が何であるかを理解するのに本当に苦労しています。変数、オブジェクト、およびメソッド(関数とサブルーチン)の意味、違い、および目的に混乱しているようです。コードはかなり単純で理解しやすいので、あなたの質問から、あなたはプログラミングに不慣れであると推測しています。コードは非常によく書かれているようには見えません。これは混乱の一部である可能性があります。カプセル化されているようには見えませんが、完全にひどいわけではありません。私は確かにはるかに悪いのを見てきました。

したがって、私の仮定が正しいと仮定して、変数、オブジェクト、およびメソッドを説明することから始めましょう。次に、コードが何をしているのかを簡単に説明します。それでも質問に答えられない場合は、明確にしてください。

変数

変数は最も単純な概念です。これは、メモリに格納されている値への名前付き参照です。コードでrsは、は変数です。各変数にはタイプがあるため、そのタイプと互換性のある値にのみ設定できます。変数が宣言されているコードを表示しなかったので、次のようなrsタイプとして宣言されていると想定しています。ADODB.Recordset

Private rs As ADODB.Recordset

オブジェクト

一方、オブジェクトは微妙に異なります。オブジェクトは型のインスタンスです。 RecordSetはオブジェクトの一種ですが、オブジェクト自体ではありません。同じタイプのオブジェクトが多数作成されている可能性があります。各オブジェクトは通常、同じタイプの他のすべてのオブジェクトから独立しています(ただし、場合によっては、データを共有できます)。変数が参照する値は、常に何らかのタイプのオブジェクトです。多くの変数は同じオブジェクトを参照できますが、すべてのオブジェクトは少なくとも1つの変数によって参照されます。オブジェクトが変数によって参照されなくなった場合、オブジェクトはしばらくの間メモリに存在する可能性がありますが、最終的にはガベージコレクタによって破棄されます。変数はオブジェクトを参照する必要はありません。代わりにを参照できますNothing。例えば:

rs = New ADODB.RecordSet()  'rs now references a RecordSet object
rs = Nothing  'rs now references no object at all

New演算子は、新しいオブジェクトを作成するものです。オブジェクトには名前がありません(何らかの方法でそれ自体を実装しない限り)。したがって、上記の変数が呼び出されても、rsそれはオブジェクトの名前ではありません。たとえば、私はこれを行うことができます:

rs = New ADODB.RecordSet()
temp = rs

この例ではtemprs両方が同じオブジェクトを参照し、一方に加えられた変更がもう一方に自動的に反映されます。したがって、rsとtempはオブジェクト自体の名前ではありません。それらは、それを参照する変数の名前にすぎません。

方法

メソッドは、できればカプセル化されたコードの論理グループであり、名前が割り当てられ、その名前を使用していつでも呼び出すことができます。メソッドは、オプションでパラメーターのリストを取得でき、オプションで単一の値を返すことができます。VBでは、メソッドが値を返す場合はaと呼ばれ、値を返さない場合はルーチンFunctionと呼ばれます。Sub

値型と参照型

混乱させたくないので、これについては詳しく説明しませんが、これまでに説明したことはすべて、値型ではなく参照型に当てはまります。基本的に、参照型は通常、より多くのデータを格納し、多くの場合変更可能な、より複雑なオブジェクト型です。値型は通常、より単純で、より小さく、不変です。2つの変数は同じ参照型オブジェクトを参照できますが、値型オブジェクト(整数など)では参照できません。

あなたのコードの説明

コードには、というメソッドが含まれていますGetData。これが方法として作られた理由は2つあるかもしれません。まず、作成者は、コード内の複数の場所から呼び出すことを意図していたため、メソッドとして作成した可能性があります。その場合は、同じコードを複数の場所で複製しないように、機能するメソッドを作成することをお勧めします。第二に、作者はそれをコードを読みやすくするための方法にしたかっただけかもしれません。すべてのコードをメソッドに直接入れて、LoadDataBoundコードのそのセクションがデータを取得していることを示すコメントをコードに追加する必要があるのではなく、GetDataと呼ばれる別のメソッドに分割するだけで読みやすくなります。文書化。

このGetDataメソッドはパラメーターを受け取らず、新しいADBDB.RecordSetオブジェクトを返します。メソッド内GetDataでは、OpenADS、OpenSQL、またはOpenFOXのいずれかを呼び出します。これらのメソッドが、新しいRecordSetオブジェクトを作成し、データベースからの値を入力する必要があります。

このLoadDataBoundメソッドは、データベースからデータを取得し、データバインディングを使用して、そのデータを含むフォームにコントロールをロードします。最初に行うことはGetData、新しいRecordSetオブジェクトを作成し、それをデータで埋めてから、その新しいオブジェクトをメソッドに戻すメソッドを呼び出すことLoadDataBoundです。このLoadDataBoundメソッドは、rsによって返された新しいRecordSetオブジェクトを参照するように変数を設定しますGetData

次に、LoadDataBoundメソッドは、によって返されたRecordSetオブジェクトにデータが含まれているかどうかを確認しGetDataます。含まれている場合は、そのデータをコントロールにロードします。そうでない場合は、メッセージボックスを表示します。

于 2012-06-02T10:44:45.590 に答える