1

トランザクションのリストを含むMSAccessデータベースがあります。両方のレコードの「一致」フィールドを更新しようとしています。フィールド(ドキュメント番号、バウチャー番号、小見出し)の値は同じですが、金額が反対です。また、重複を避ける必要があります。

    Document Number     Amount   ABS     Match
    N6809561990112      438.48   438.48
    N6809561990112      438.48   438.48
    N6809561990112     -438.48   438.48

SQL後の最終結果は次のようになります。

    Document Number     Amount   ABS     Match
    N6809561990112      438.48   438.48   Y
    N6809561990112      438.48   438.48
    N6809561990112     -438.48   438.48   Y

テーブル名は「tblUnmatched」です

次のことを試しましたが、テーブル内のすべてのレコードが「Y」に更新されました

strSql = "Update tblUnmatched SET match = 'Y' WHERE EXISTS(select * " & _
        "from tblUnmatched t1 " & _
        "inner join tblUnmatched t2 on " & _
        "t1.[DOCUMENT NUMBER] = t2.[DOCUMENT NUMBER]" & _
        "where t1.ABS = t2.ABS AND t1.AMOUNT <> t2.AMOUNT AND t1.SUBH = t2.SUBH)"
DoCmd.RunSQL strSql

私もこれを試しましたが、重複の問題を処理できませんでした。

strSql = "Update tblUnmatched SET match = 'Y' WHERE [DOCUMENT NUMBER] IN(select t1.[DOCUMENT NUMBER] " & _
        "from tblUnmatched t1 " & _
        "inner join tblUnmatched t2 on " & _
        "t1.[DOCUMENT NUMBER] = t2.[DOCUMENT NUMBER]" & _
        "where t1.ABS = t2.ABS AND t1.AMOUNT <> t2.AMOUNT AND t1.SUBH = t2.SUBH)"
    DoCmd.RunSQL strSql
4

1 に答える 1

1

主キーフィールドのないAccessSQLでは、タスクは実用的ではありません。インポートするデータソースにはそのようなキーはありませんが、Accessに追加することを禁止するものではありません。

自動番号の主キー、、をに追加idtblUnmatchedます。次に、受信データの新しいバッチごとに、次のようにします。

  1. スクラッチテーブルにインポートし、tblScratch
  2. DELETE FROM tblUnmatched
  3. からの行を追加しtblScratchますtblUnmatched

(最初ににインポートする代わりに、にSELECT FROM <your data source>直接追加するために使用できる場合、プロセスはよりクリーンになる可能性があります。)tblUnmatchedtblScratch

SELECT次のステートメントを次のように保存しますqryFindMatches

SELECT
    sub.[Document Number],
    sub.Amount,
    sub.MinOfid,
    DCount(
        "*",
        "tblUnmatched",
        "[Document Number]='" & [Document Number]
            & "' AND Amount = -1 * " & [Amount]
        ) AS match_count
FROM
    (
        SELECT [Document Number], Amount, Min(id) AS MinOfid
        FROM tblUnmatched
        GROUP BY [Document Number], Amount
    ) AS sub;

そうすれば、UPDATE必要なものをかなり簡単に作成できます。パフォーマンスが速くない可能性があることに注意してください。うまくいけば、あなたはそれを月に一度収容することができます。

UPDATE tblUnmatched
SET [Match] = True
WHERE id In
    (
        SELECT MinOfId
        FROM qryFindMatches
        WHERE match_count > 0
    );

サンプルデータに行を追加し、Access2007でテストしました。これが必要なものだと思います...

id Document Number Amount   Match
 1 N6809561990112   $438.48 True
 2 N6809561990112   $438.48 False
 3 N6809561990112 ($438.48) True
 4 N6809561990112     $5.00 False
于 2013-01-30T18:38:10.767 に答える