0
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Accessのクエリがオーバーフローしたので対処した

Last updated at Posted at 2020-10-06

Microsoft Access で作った業務アプリケーションが、
実行時エラー '6': オーバーフロー
と表示され処理が止まるというので調べてみた。
overflow
オーバーフローがVBAコード中の代入文で停止している場合は、対処は難しくない。
数値はデータ型ごとに扱える値の範囲が決まっていて、その範囲を超えて代入しようとすると、このエラーになる。
業務アプリでありがちなのは、Integerで宣言した変数に32767を超える値を代入しようとした … など。

厄介なのはクエリの実行中にオーバーフローした場合。
大抵はサブクエリを含むと思うが、どのクエリの?どの式で?オーバーフローが発生したかまではVBE(VBAの統合開発環境)で教えてくれないからだ。

こんなとき、貴方がSQLを読めるなら、クエリをSQLビューに切り替えて覗くことを勧める。
sqlview.png
とはいえ、AccessはSQLフォーマッタを用意しないので、そのままでは見づらい。
SQLを整形してくれるオンラインサイトを活用しよう。

例えば SQLフォーマッターFor WEB にかけると、こんな感じで整形してくれる。

SQL
SELECT
    T03_住民税.市区町村コード,
    T03_住民税.指定番号,
    Q16_当月人事.社員番号,
    Q11_当月異動届参照.氏名,
    Q11_当月異動届参照.入社年月日,
    Q11_当月異動届参照.退職発令日,
    Q11_当月異動届参照.異動後会社コード AS 当月会社コード,
    Q11_当月異動届参照.市区町村コード AS 当月市区町村,
    Q11_当月異動届参照.会社コード AS 前月会社コード,
    Q12_前月異動届参照.市区町村コード AS 前月市区町村,
    T03_住民税.[9] AS 前月住民税,
    T03_住民税.[10] AS 当月住民税,
    IIf(
        [当月住民税] <> [当月徴収税額],
        '税額相違',
        ''
    ) AS 税額相違,
    IIf(
        [当月住民税] <> [前月住民税],
        '税額変更',
        ''
    ) AS 税額変更,
    IIf(
        [当月住民税] = 0,
        '当月抹消',
        ''
    ) AS 当月抹消,
    IIf(
        [当月会社コード] = '',
        '',
        IIf(
            [当月会社コード] <> [前月会社コード],
            '会社変更',
            ''
        )
    ) AS 会社変更,
    T03_住民税.年税額,
    T03_住民税.[6],
    T03_住民税.[7],
    T03_住民税.[8],
    T03_住民税.[9],
    T03_住民税.[10],
    T03_住民税.[11],
    T03_住民税.[12],
    T03_住民税.[1],
    T03_住民税.[2],
    T03_住民税.[3],
    T03_住民税.[4],
    T03_住民税.[5],
    Q18_当月徴収税額.住民税 AS 当月徴収税額
FROM
    (
        (
            (
                Q16_当月人事
                LEFT JOIN
                    Q11_当月異動届参照
                ON  Q16_当月人事.社員番号 = Q11_当月異動届参照.社員番号
            )
            LEFT JOIN
                Q12_前月異動届参照
            ON  Q16_当月人事.社員番号 = Q12_前月異動届参照.社員番号
        )
        LEFT JOIN
            T03_住民税
        ON  Q16_当月人事.社員番号 = T03_住民税.社員番号
    )
    LEFT JOIN
        Q18_当月徴収税額
    ON  Q16_当月人事.社員番号 = Q18_当月徴収税額.社員コード
WHERE
    (
        T03_住民税.[9] <> 0
    )
OR  (
        T03_住民税.[10] <> 0
    )
ORDER BY
    T03_住民税.市区町村コード,
    T03_住民税.指定番号,
    Q16_当月人事.社員番号

これで怪しそうな箇所が、ひと目で分かる。
今回は入力データに不備があり、ゼロで除算したことによるオーバーフローであった。
クエリで発生するオーバーフローは、このパターンが多い。

0
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?