初投稿なのでなるべく優しく!:)
電子商取引ソフトウェア (これも Access ベース) を更新するために、Access で新しいデータベースを作成しています。
サプライヤーから 3 つのフィードを受け取ります。すべての CSV ファイルの形式はわずかに異なります。リンクされたテーブルを使用してフィードを正常にインポートし、必要に応じてプログラムでファイルからデータを更新できると思います。
現在サイトに掲載されているすべての製品を含む「CurrentProducts」テーブルを作成しました。
CurrentProducts テーブルから各製品コードを順番に取得し、各サプライヤー フィードで検索し、購入価格に基づいて販売価格を計算し、どのサプライヤーが最も安い価格を提示しているかを調べ、それに応じて CurrentProducts テーブルを更新します。
以前はマクロ目的で Excel で VBA をよく使用していましたが、Access で DAO レコードセットに実際に触れたことがないので、自分が何をしているのかよくわかりません。
これまでのコードを以下に示します。CurrentProducts テーブルには約 17,900 のレコード、「Ingram」テーブルには約 51,000 のレコード、ScanSource テーブルには約 15,000 のレコード、Varlink テーブルには約 3,000 のレコードがあります。
コードを 5 ~ 10 分間実行したままにしました。コードは動作しているように見えますが、非常にゆっくりと進んでいます。私が現在行っている方法よりも、レコードセット内のデータにアクセスするためのより迅速で簡単な方法が必要であるとしか思えません。
それでは皆さん、これをすべて破棄して最初からやり直しましょうか、それともここから微調整できますか?
ありがとうございました。
Private Sub Command0_Click()
Dim var As DAO.Recordset
Dim ing As DAO.Recordset
Dim scan As DAO.Recordset
Dim curr As DAO.Recordset
Dim filtvar As DAO.Recordset
Dim filtscan As DAO.Recordset
Dim filting As DAO.Recordset
Dim db As Database
Dim varSQL As String, ingSQL As String, scanSQL As String, currSQL As String
Dim prodcode As String
Dim varPrice As Double, ingPrice As Double, scanPrice As Double, currPrice As Double
DoCmd.Hourglass True
Set db = CurrentDb
currSQL = "select ProductCode, Price from CurrentProducts"
varSQL = "select ProductCode, (Price*1.25) as CalcPrice from Varlink"
ingSQL = "select ProductCode, (Price*1.25) as CalcPrice from Ingram"
scanSQL = "select ProductCode, (Price*1.25) as CalcPrice from ScanSource"
Set curr = db.OpenRecordset(currSQL)
Set var = db.OpenRecordset(varSQL)
Set ing = db.OpenRecordset(ingSQL)
Set scan = db.OpenRecordset(scanSQL)
curr.MoveLast 'Needed to get the accurate number of records
'Show the progress bar
SysCmd acSysCmdInitMeter, "Working...", curr.RecordCount
curr.MoveFirst
Do While Not curr.EOF
prodcode = curr!ProductCode
var.Filter = "[ProductCode] = " & "'" & prodcode & "'"
Set filtvar = var.OpenRecordset
ing.Filter = "[ProductCode] = " & "'" & prodcode & "'"
Set filting = ing.OpenRecordset
scan.Filter = "[ProductCode] = " & "'" & prodcode & "'"
Set filtscan = scan.OpenRecordset
usevarprice = 0
useingprice = 0
usescanprice = 0
If filtvar.EOF And filtvar.BOF Then
Else
varPrice = filtvar!CalcPrice
varPrice = Round(varPrice, 0)
usevarprice = 1
End If
If filting.EOF And filting.BOF Then
Else
ingPrice = filting!CalcPrice
ingPrice = Round(ingPrice, 0)
useingprice = 1
End If
If filtscan.EOF And filtscan.BOF Then
Else
scanPrice = filtscan!CalcPrice
scanPrice = Round(scanPrice, 0)
usescanprice = 1
End If
If usevarprice = 1 And useingprice = 1 And usescanprice = 1 Then
If varPrice < ingPrice And varPrice < scanPrice Then
newPrice = varPrice
ElseIf ingPrice < varPrice And ingPrice < scanPrice Then
newPrice = ingPrice
Else
newPrice = scanPrice
End If
ElseIf usevarprice = 1 And useingprice = 1 And usescanprice = 0 Then
If varPrice < ingPrice Then
newPrice = varPrice
Else
newPrice = ingPrice
End If
ElseIf usevarprice = 1 And useingprice = 0 And usescanprice = 1 Then
If varPrice < scanPrice Then
newPrice = varPrice
Else
newPrice = scanPrice
End If
ElseIf usevarprice = 0 And useingprice = 1 And usescanprice = 1 Then
If scanPrice < ingPrice Then
newPrice = scanPrice
Else
newPrice = ingPrice
End If
Else
If usevarprice = 1 Then
newPrice = varPrice
ElseIf useingprice = 1 Then
newPrice = ingPrice
ElseIf usescanprice = 1 Then
newPrice = scanPrice
End If
End If
curr.Edit
curr!Price = newPrice
curr.Update
curr.MoveNext
n = n + 1
'Update the progress bar
SysCmd acSysCmdUpdateMeter, n
'Keep the application responding (optional)
DoEvents
Loop
curr.Close: Set curr = Nothing
var.Close: Set var = Nothing
ing.Close: Set ing = Nothing
scann.Close: Set scan = Nothing
'Remove the progress bar
SysCmd acSysCmdRemoveMeter
'Show the normal cursor again
DoCmd.Hourglass False
End Sub