FS社のAccessで発生した「指定されたデータ量がフィールドサイズを超えています」に対応した


 FS社からの 6/1 のメール

 月末処理の為、[勤怠報告書]ボタンをクリックしたところ、「指定されたデータ量がフィールドサイズを超えています」と表示されました。


「OK」ボタンを押して続行しました。
表示されたデータに問題はありませんでした。


 考察

  • 添付ファイルの画像をよく見ると、対象日を 5/1〜5/31 の一ヶ月分としたようだ。
  • エラーが出たのは、モジュール「M_作業日報」の関数「makeTable勤怠日報」となっている。
  • Microsoft サポート「Access でクエリを実行するとエラー メッセージ "指定されたデータ量がフィールド サイズを超えています" が表示される」には、次のように載っていた。
    原因

     この問題は、"固有の値" クエリ プロパティが [はい] に設定されると、作成される SQL ステートメントに DISTINCT キーワードが追加されることが原因で発生します。
     DISTINCT キーワードが指定されると、Access でレコード間の比較が実行されます。Access で 2 つのメモ型フィールドの比較が実行されるときには、フィールドは最大 255 文字のテキスト型フィールドとして扱われます。
    メモ型フィールドに 255 文字を超えるデータが含まれている場合、「現象」に記載されているエラー メッセージが表示されることがあります。場合によっては、メモ型フィールドから 255 文字だけが返されることがあります。
    • どうも、テキスト型フィールドに 255文字を超える値を代入した‥‥ と思われる。
  • コードを目で追ったが、複雑すぎて原因を特定するまでに至らなかった...


 原因と対応策
FS社で再現出来たので、エラートラップをコメントアウト。再度、実行したら、原因が直ぐ判った。

≪原因箇所≫
Dim old非稼動事由 As String

    RS2!非稼動事由 = old非稼動事由
≪原因≫
  • RS2!非稼動事由 はテキスト型フィールドで、サイズは 255。
  • old非稼動事由 の文字数は 311 であった。
≪対応策≫

「非稼動事由」は参考情報であるので、文字数が 255 を超えていたら、次のようにすることとした。

  1. メッセージを出す。
  2. 250字で切り捨て、
  3. “ ???”を付けて出力する。
    If Len(old非稼動事由) > 255 Then
        MsgBox "非稼動事由の文字数が制限を超えたので、250字に切り捨てました。" & vbCrLf & vbCrLf _
            & " ■作業者コード=" & old作業者コード & vbCrLf _
            & " ■文字数=" & Len(old非稼動事由) & vbCrLf _
            & " ■非稼動事由=" & old非稼動事由 & vbCrLf _
            , vbExclamation, mbTitle
        old非稼動事由 = Left(old非稼動事由, 250) & " ???"
    End If
    RS2!非稼動事由 = old非稼動事由