2016-10-18 2 views
2

私は、各レコードに「カスタム」データで埋める必要のあるフィールドが多数あるフィールド(40+)を持つテーブルを扱っていますプログラムの結果に)、残りの部分に同じ "デフォルト"の値を繰り返し入力する必要があります。私はMSアクセスを通してVBAにこのプログラムを書いています。SQL/VBAで効率的に大量のフィールドを塗りつぶし

フィールドエントリを含む新しいレコードを作成する実際の構文は問題ありませんが、これらのデフォルトエントリすべてに対して最も効率的な/読み取り可能なコードを入力する最良の方法はわかりません。列の位置だけを使用してSQLフィールドを参照する方法はないので、各フィールドを人間が読める名前で参照するとコードがすぐに醜くなると思っています。

私の現在のコードは、だから、これは35+以上の値を持つ醜い取得する予定です

DoCmd.RunSQL "INSERT INTO Table1 ([PartNumber],[Description],[Alternate],[Supplier],[Location],[Rev]) values('" & PartNumber & "','" & Description & "'," _ 
           & " '" & Alt & "', '" & Supplier & "', '" & Location & "','" & Rev & "')" 

です。

+0

最初の各フィールドに適切な値を持つ変数を作成します。これらの変数は、挿入クエリで使用します。クエリパラメータを使用します。 –

+0

「クエリパラメータ」とはどういう意味ですか?上記のコードを実行する前にすでに設定されているinsertクエリの変数は、醜いと思われるフィールドに変数を挿入するだけです。 – user2059972

答えて

1

私は同じような問題の答えを探していました。あなたの例のように挿入するのは本当にクレイジーな(そして醜い)アイデアです。私が思いついたことは、このようなものだった:GenerateDataIntoTableを(実行し、それを実行するために

Option Explicit 

Public Sub GenerateDataIntoTable() 

    Dim str_table_name  As String: str_table_name = "Main" 
    Dim arr_column_names As Variant 
    Dim arr_values   As Variant 

    ReDim arr_column_names(6) 
    ReDim arr_values(6) 

    arr_column_names(0) = "UserName" 
    arr_column_names(1) = "CurrentDate" 
    arr_column_names(2) = "CurrentTime" 
    arr_column_names(3) = "CurrentLocation" 
    arr_column_names(4) = "Status1" 
    arr_column_names(5) = "Status2" 
    arr_column_names(6) = "Status3" 

    arr_values(0) = Environ("username") 
    arr_values(1) = Date 
    arr_values(2) = Time 
    arr_values(3) = Application.ActiveWorkbook.FullName 
    arr_values(4) = 2 
    arr_values(5) = arr_values(4) + 4 
    arr_values(6) = arr_values(5) - 4 

    Debug.Print b_insert_into_table(str_table_name, arr_column_names, arr_values) 

End Sub 

Function b_insert_into_table(str_table_name As String, arr_column_names As Variant, arr_values As Variant) As Boolean 

    Dim conn   As Object 
    Dim str_order  As String 

    Set conn = CreateObject("ADODB.Connection") 
    'conn.Open str_connection_string 

    str_order = "insert into dbo." & str_table_name 
    str_order = str_order & str_generate_order(arr_column_names, arr_values) 
    Debug.Print str_order 
    'conn.Execute str_order 
    'conn.Close 
    Set conn = Nothing 

    b_insert_into_table = True 

End Function 

Public Function str_generate_order(arr_column_names As Variant, arr_values As Variant) As String 

    Dim l_counter  As Long 
    Dim str_result  As String 

    Dim str_left  As String: str_left = "('" 
    Dim str_midd  As String: str_midd = "','" 
    Dim str_right  As String: str_right = "')" 

    str_result = "(" 
    For l_counter = LBound(arr_column_names) To UBound(arr_column_names) 
     str_result = str_result & arr_column_names(l_counter) & "," 
    Next l_counter 

    str_result = Left(str_result, Len(str_result) - 1) 
    str_result = str_result & ")" 
    str_result = str_result & "values" 

    str_result = str_result & str_left 
    For l_counter = LBound(arr_values) To UBound(arr_values) 
     str_result = str_result & arr_values(l_counter) 

     If l_counter < UBound(arr_values) Then 
      str_result = str_result & str_midd 
     Else 
      str_result = str_result & str_right 
     End If 

    Next l_counter 

    str_generate_order = str_result 

End Function 

)。アプリケーションでそれを実行する場合は、b_insert_into_tableのコメントをコメント解除し、str_connection_stringに意味のあるものを設定します。

私は(それが広告やなどのいくつかの種類と見なすことができる)、私のgithubのレポへのリンクを与えることは良い考えであるかどうか、わかりませんが、ここではいくつかの類似プロジェクトです:

https://github.com/Vitosh/VBA_personal/tree/master/SQL%20VBA

何か改善できると思うなら(例えば、2つの配列をGenerateDataIntoTableのパラメータとして追加することができます)、私に教えてください。

0

プログラミング業界のベストプラクティスであり、最初のSQL文を準備し、そのデータ型に従って宣言されたパラメータに値をバインドするすべてのRDMSでパラメータ化されたクエリを検討してください。このようにして、各値を必要な引用符で囲むことを回避し、クエリ文を再割り当てせずに反復することもできます。さらに重要なことは、悪意のあるユーザーがユーザー入力によってSQLクエリを実行し、データやスキーマに深刻な被害を及ぼす可能性があるため、sql injectionを克服することです。

MS Access SQLでは、PARAMETERS句を使用して名前付きパラメータを定義できます。 VBAでは、それぞれに値を割り当てることができます。また、保存されたクエリでは、実行時に新しいクエリとして処理されるVBA文字列クエリに対して、エンジンによってクエリが最適化されるため、処理が効率的になります。

SQL(格納されたクエリとして以下の保存;全40個のフィールドを追加)

PARAMETERS partparam INTEGER, descparam TEXT(255), altparam TEXT(255), 
      supplierparam TEXT(255), locationparam TEXT(255), revparam TEXT(255); 
INSERT INTO Table1 ([PartNumber],[Description],[Alternate], [Supplier],[Location],[Rev]) 
VALUES(partparam, descparam, altparam, supplierparam, locationparam, revparam); 

VBA(参照、名前付きparamsは、対応するクエリ定義とバインド値を格納)

Dim db as Database 
Dim qdef as Querydef 

Set db = CurrentDb  
Set qdef = db.QueryDefs("SavedQueryName") 

qdef!partparam = 9999 
qdef!descparam = "Some description" 
qdef!altparam = "Some alternate" 
qdef!supplierparam = "Some supplier" 
qdef!locationparam = "Some location" 
qdef!revparam = "Some rev" 

qdef.Execute dbFailOnError 

Set qdef = Nothing 
Set db = Nothing 
0

パフェがお勧めしますか?これは、メンテナンスやデバッグなどが非常に簡単です。また、以下のサンプルを参照してください。

Sub ADOFromExcelToAccess() 
' exports data from the active worksheet to a table in an Access database 
' this procedure must be edited before use 
Dim cn As ADODB.Connection, rs As ADODB.Recordset, r As Long 
    ' connect to the Access database 
    Set cn = New ADODB.Connection 
    cn.Open "Provider=Microsoft.Jet.OLEDB.4.0; " & _ 
     "Data Source=C:\FolderName\DataBaseName.mdb;" 
    ' open a recordset 
    Set rs = New ADODB.Recordset 
    rs.Open "TableName", cn, adOpenKeyset, adLockOptimistic, adCmdTable 
    ' all records in a table 
    r = 3 ' the start row in the worksheet 
    Do While Len(Range("A" & r).Formula) > 0 
    ' repeat until first empty cell in column A 
     With rs 
      .AddNew ' create a new record 
      ' add values to each field in the record 
      .Fields("FieldName1") = Range("A" & r).Value 
      .Fields("FieldName2") = Range("B" & r).Value 
      .Fields("FieldNameN") = Range("C" & r).Value 
      ' add more fields if necessary... 
      .Update ' stores the new record 
     End With 
     r = r + 1 ' next row 
    Loop 
    rs.Close 
    Set rs = Nothing 
    cn.Close 
    Set cn = Nothing 
End Sub 

http://www.erlandsendata.no/english/index.php?d=envbadacexportado

OR。 。 。

Sub DAOFromExcelToAccess() 
' exports data from the active worksheet to a table in an Access database 
' this procedure must be edited before use 
Dim db As Database, rs As Recordset, r As Long 
    Set db = OpenDatabase("C:\FolderName\DataBaseName.mdb") 
    ' open the database 
    Set rs = db.OpenRecordset("TableName", dbOpenTable) 
    ' get all records in a table 
    r = 3 ' the start row in the worksheet 
    Do While Len(Range("A" & r).Formula) > 0 
    ' repeat until first empty cell in column A 
     With rs 
      .AddNew ' create a new record 
      ' add values to each field in the record 
      .Fields("FieldName1") = Range("A" & r).Value 
      .Fields("FieldName2") = Range("B" & r).Value 
      .Fields("FieldNameN") = Range("C" & r).Value 
      ' add more fields if necessary... 
      .Update ' stores the new record 
     End With 
     r = r + 1 ' next row 
    Loop 
    rs.Close 
    Set rs = Nothing 
    db.Close 
    Set db = Nothing 
End Sub 

http://www.erlandsendata.no/english/index.php?d=envbadacexportdao

関連する問題