次の方法で共有

Access EOFの判定について

Anonymous
2016-08-18T01:30:43+00:00

お世話になります。

Access2010

社員情報を登録するフォームがあり、そこに添付ファイルコントロール(画像)を設置してます。

当該フォームのレコードソースはTMPテーブルで、そこに添付ファイルフィールド(Pic)があり、

画像のコントロールソースがpicとなってます。

フォームの「登録」ボタンが押されると、

 1.フォームのレコードソースを解除

 2.フォームを閉じる

 3.フォーム上で画像が選択されていたら、TMPに1レコード作成され、その画像が

  Picに保存される

 4.TMPがEOF(画像の選択無し)なら何もせず、EOFでなければTMPを本チャンのテーブルにコピー

という処理を行いたいのですがうまくいきません。

画像を選択してもEOFと判定されてしまうのです。

ちなみに画像を選択して3の箇所でStopし、イミディエイトウィンドウで見てみると、TMP.EOF は

Trueで返ってきてます。

で、その後にTMP.MoveLastするとエラーとならず、次にTMP.EOFをみるとFalseとなります。

いったんMoveLastすることでレコードを認識しているようです。

(話しがそれますが)テーブルのレコード数を取得したい場合、まずEOFか否かの判定をして、

EOFでなければ、MoveLastしてレコード数を求めるかと思います。要するにEOFなのに

MoveLastするとエラーとなってしまうので、まずはEOFか否かの判定をしなければならない

・・という認識です。

なお、TMPの画像を本チャンテーブルにコピーする部分は出来ておりますので、あとは

TMPのEOF判定さえうまくできればよいのですが。。

どのようなことが考えられますでしょうか。

また、何か対処方法はございますでしょうか。

ご教示の程、宜しくお願い致します。

Microsoft 365 と Office | アクセス | 家庭向け | Windows

ロックされた質問。 この質問は、Microsoft サポート コミュニティから移行されました。 役に立つかどうかに投票することはできますが、コメントの追加、質問への返信やフォローはできません。

0 件のコメント コメントはありません

4 件の回答

並べ替え方法: 最も役に立つ
  1. Anonymous
    2016-08-18T09:21:07+00:00

    DoCmd.RunCommand acCmdSaveRecord ってものがあったんですね。。

    仰る通り、コマンドを実行した後にフォームを閉じるなりしたいと思います。

    ありがとうございました。

    で、肝心のEOFの判定がどうなるかってことですよね。

    追ってご報告させて頂きますね。

    <追記>

    早速フォームを閉じる前にコマンドを実行したところ以下のエラーとなってしまいました。

     実行時エラー:2046

     コマンドまたはアクション'レコードの保存'は無効です。

    なお、Me.Refresh とやったところフォームを閉じなくてもTMPにレコードが

    保存されることを確認しました。

    但し、その後のEOF判定は相変わらずTrueとなってしまいます。。

    <8/19追記>

    すみません。。肝心なところを誤ってました。

    テンポラリテーブルtempをTMPにSetし、そのTMPをEOFか否か判定している

    のですが・・・

    Set TMP = db.OpenRecordset("temp")

    If MsgBox("登録しますか?", vbOKCancel + VbQuestion) = vbOK Then

      Me.Refresh

      If TMP.EOF = Flase Then

        <Falseの処理>

      Else

        <Trueの処理>

      End IF

    としてました。

    ※以前はMe.Refreshの箇所で、ソース解除及びフォームを閉じてました。

    Setはその時点のtempの内容がSetされるんですね。。

    Me.Refresh後にSetしたら、ちゃんとFalseと判定されるようになりました。

    大変勉強になりました。ありがとうございました。

    この回答は役に立ちましたか?

    0 件のコメント コメントはありません
  2. Anonymous
    2016-08-18T07:27:53+00:00

    > わたしの認識では、(添付ファイルに限ったことではないですが)フォーム上で

    > 画像を追加しただけではTMPにレコードは作成されませんよね。

    > フォームを閉じた際にレコードが作成る・・と思っているのですが。。

    連結フォームのカレントレコードの編集内容が保存されるのは、

    主に以下のいずれかの操作が行われた時です。

    ・フォームのカレントレコードを

     別のレコードに移動させる。

    ・そのフォームを閉じる。

    ・[レコードの保存]コマンドを実行する。

     ( VBA の場合は以下のコードを実行する)


        DoCmd.RunCommand acCmdSaveRecord


    ・(サブフォームコントロールを含むフォームの場合)

     メインフォームからサブフォームにフォーカスを移動させる。

    ・(サブフォームとして埋め込まれたフォームの場合)

     サブフォームからメインフォームにフォーカスを移動させる。

    そのフォームを閉じるわけでもなく、

    またカレントレコードを移動させるわけでもなく、

    ただカレントレコードの編集内容を保存するだけならば、

    [レコードの保存]コマンドを実行すれば充分ですし、

    それから手順 3 ~ 4 の処理を実行なさればよいでしょう。

    その上でそのフォームを閉じたいならば、

    それら一連の処理が完了してから

    手順 2 の処理を実行して下さい。

    この回答は役に立ちましたか?

    0 件のコメント コメントはありません
  3. Anonymous
    2016-08-18T07:09:51+00:00

    度々のご回答ありがとうございます。

    >・手順 1 と 2 を実行する目的が不明。

    説明不足ですみません。登録フォームをOpenするタイミングでTMPを作成し、

    レコードソースに設定しています。登録が完了したらTMPは削除します。

    これは添付ファイルコントロールを使う為に行ってます。

    >少なくとも手順 3 及び 4 の処理が正常に完了する前に

    >手順 2 を実行する意味が分からない。

    今までレコードソースの設定を行ったことがなかったのですが、今回、添付ファイル

    コントロールを使って、画像を保存するにあたり初めて設定を行いました。

    わたしの認識では、(添付ファイルに限ったことではないですが)フォーム上で

    画像を追加しただけではTMPにレコードは作成されませんよね。

    フォームを閉じた際にレコードが作成る・・と思っているのですが。。

    実際にフォーム上で画像を追加しただけの状態でTMPを見てみるとレコード自体が

    存在しません。画面を閉じると1レコード作成され、追加した画像が保存されています。

    ・・・ってことで、あえて2の手順でフォームを閉じて、レコードが作成された

    状態で、EOFの判定をと思っているのですが。。

    この回答は役に立ちましたか?

    0 件のコメント コメントはありません
  4. Anonymous
    2016-08-18T06:00:28+00:00

    > フォームの「登録」ボタンが押されると、

    >

    >  1.フォームのレコードソースを解除

    >  2.フォームを閉じる

    >  3.フォーム上で画像が選択されていたら、TMPに1レコード作成され、その画像が

    >   Picに保存される

    >  4.TMPがEOF(画像の選択無し)なら何もせず、EOFでなければTMPを本チャンのテーブルにコピー

    >

    > という処理を行いたいのですがうまくいきません。

    > 画像を選択してもEOFと判定されてしまうのです。

    ・手順 1 と 2 を実行する目的が不明。

     少なくとも手順 3 及び 4 の処理が正常に完了する前に

     手順 2 を実行する意味が分からない。

    ・テーブル[TMP]のレコードセットを、

     どのタイミング(イベント)で

     どのようにして参照しているのかが不明瞭。

    とりあえず、実際に記述されたコードを

    明記されることをお奨めします。

    この回答は役に立ちましたか?

    0 件のコメント コメントはありません