1

初投稿なのでなるべく優しく!:)

電子商取引ソフトウェア (これも 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
4

2 に答える 2

0

最終的に一時テーブル(temp_prod)を使用し、3つのサプライヤすべてからのすべての製品をテーブルにダンプしました。次に、このクエリを使用しました。

SELECT a.productcode, a.buyprice, a.listprice, a.source FROM temp_prod AS a WHERE a.buyprice in (Select top 1 buyprice from temp_prod b where a.productcode = b.productcode order by buyprice)

各製品コードの最も安い価格を含むレコードセットを開きます。次に、レコードセットをループして、製品のエクスポートテーブルを新しい販売価格(購入価格から計算)と出来上がりで更新しました。助けてくれてありがとうレモウ!

于 2012-09-26T15:22:51.670 に答える
0

このクエリを検討してください。これを使用するには、クエリデザインウィンドウのSQLビューにカットアンドペーストするだけです。

SELECT c.productcode,
       c.price,
       s.supfile,
       s.calcprice
FROM   currentproducts c
       LEFT JOIN (SELECT "varlink"        AS supfile,
                         productcode,
                         ( price * 1.25 ) AS CalcPrice
                  FROM   varlink
                  UNION ALL
                  SELECT "ingram"         AS supfile,
                         productcode,
                         ( price * 1.25 ) AS CalcPrice
                  FROM   ingram
                  UNION ALL
                  SELECT "scansource"     AS supfile,
                         productcode,
                         ( price * 1.25 ) AS CalcPrice
                  FROM   scansource) AS s
              ON c.productcode = s.productcode 

クエリに関心のあるデータが表示されている場合は、ユニオンテーブルから製品コードごとの最小値を取得する必要があります。これはSQLではそれほど難しくありません。

たとえば、ユニオンクエリをクエリとして保存してから、データを操作できます。

SELECT u.supfile,
       u.productcode,
       u.calcprice
FROM   MyUnion u
WHERE  (( ( u.calcprice ) IN (SELECT TOP 1 calcprice
                                 FROM   MyUnion b
                                 WHERE  b.productcode = u.productcode
                                 ORDER  BY calcprice) )); 

このクエリは、上記のクエリと同じ方法で派生テーブルとして含めることもできるため、さまざまな低価格を現在の価格と比較できますが、2つのサプライヤが同じ価格の場合、このクエリは重複します。

決定プロセスは、価格が最も低い場所を更新するほど単純ではないかもしれませんが、他に何もないとしても、sqlとvbaを使用すると、処理時間とレコードセットの数が大幅に削減されます。

于 2012-09-04T20:22:15.040 に答える