dポイントプレゼントキャンペーン実施中!

ACCESSの初心者です。仕事で商品管理に関するデータベースを作ろうとしています。

フォームで入力すれば、ほかのコントロールにも自動入力されて、そのまま保存される方法を教えてください。

詳しく説明しますと、
商品名の変更点を取引先別に分けて報告書を作れるようにしたいので、報告書作成までの操作手順をできるだけ省略しようと考えています。
そこで、商品名の変更内容は変わらないので、フォームで旧商品名を入力すると、新商品名は自動入力されるようにしたいのです。
フォームの新商品名のコントロールのコントロールソースに =[旧商品名].column(2) と入れてみると表示はされましたが、テーブルの新商品名フィールドには保存されていません。

今回が初めて自分でデータベースを作成するので、よろしくお願いします。

A 回答 (5件)

仕事で使うものであれば使えるものを作るべきだと思いますので、ちょっと先のことに


なるかもしれませんが必ず直面するであろう問題についての解決策というか、
一般的なアドバイスをいくつか、、、

1.商品マスターには世代を作れるようにする。 
(商品ID、開始日、終了日などでユニークになるようにする。)
2.商品マスターはマスター管理画面のみから操作する。
3.マスターを登録するときは、登録ボタンを作りそれを押下し、ダイアログで
確認することによって登録されるようにする。
(4.連結フォームはなるべく使わない)
4.についてはそう思わない人も多いと思いますので括弧にしておきました。 

このあたりを踏まえてフォームを設計すると、マスター管理画面において、
最低必要なものは

1.マスター項目を表示させるコントロール
2.カナ名称などで対象マスターを検索できる仕組み
3.コントロールに入っている情報をマスターテーブルに登録する仕組み

であると考えます。 普通はADOのコネクションを作り、SQLを使い実現させますが、
アクセスにおいては、クエリと仮テーブルを駆使することによって同じようなことを
することもできます。

ご提示されている問題については、コントロールソースをフォームのコントロールの
データにしているのが原因だと思います。 それを、テーブルのフィールドにし、
何かのイベントで、
texthoge =[旧商品名].column(2)
などと指定して、商品名を入れることはできますが、データ登録のタイミングなどに
ついては配慮が必要です。(このあたりが私があまり連結フォームを使わない理由です。)
    • good
    • 1

>フォームでは旧商品名に入力すると新商品名に対応する商品名が表示されます。


>そのレコードをテーブルで開くと、旧商品名は保存されているのに新商品名は保存されて
>いません。

まず、今のコントロールソースの設定ではこうなってしまいます。
最初初期段階では結構こうやってしまうものです。
テーブル「新商品名」項目に直接値を入れてもフォームには出てきませんよね?。
旧商品名は出るけども。

普通のやり方では、コントロールソースに =[新商品名]としないと
画面での新商品名の値でもってテーブルの新商品名への更新はされません。
そこを=[旧商品名].column(2) としているため保存されないのです。
画面は正しく出ますが・・・。
やりたいことに対して、やっていることが中途半端で間違っているので
今のやり方を修正しなくてはなりませんね。やりたいことは処理は可能です。大丈夫です。

>フォームの新商品名のコントロールのコントロールソースに =[旧商品名].column(2) と入れてみる

これは、
フォーム「新商品名」に「[旧商品名].column(2)」を表示する、の設定であり、
テーブルの「新商品名」に「[旧商品名].column(2)」を設定する、を意味しません。
ここに??が生まれています。

・フォームに「(更新される前の)旧商品名」を表示する項目
・フォームに「(更新される前の)新商品名」を表示する項目
・フォームに「[旧商品名].column(2)」(=更新後の新商品名)を表示する項目
3つ同時にフォームで表示させるにはどうするかを考えてみましょう。
3つめの「更新後の新商品名」表示に対しては「非連結項目」を使うことになります。
ヘルプやサンプルを見て学習しておいてください。

対応としては、
1)旧商品名=テーブルの旧商品名
2)新商品名=テーブルの新商品名(画面上は非表示項目にします)
3)新商品名=[旧商品名].column(2)(非連結項目、画面上は「新商品名」というラベル表示にします)
3つの項目を用意し、
1)が更新されたら、3)の項目の値を2)へ設定する
という動きにします。この動きを理解することです。
マクロの「値の代入」を使います。
    • good
    • 0

>フォームの新商品名のコントロールのコントロールソースに


>=[旧商品名].column(2) と入れてみると表示はされましたが、
>テーブルの新商品名フィールドには保存されていません。

上記のことを参考に類推して、
他のフィールドの値を取り込む一つの案を出してみます。



(1)
テーブルを二つ。
T商品:
商品ID(主キー オートナンバー)
商品名
新商品名

T新規:
商品ID(数値型 一応主キーではないとします)
商品名

(2)
T新規でフォームの新規作成から帳票フォーム
を選択し、作成し、保存します。

(3)
出来たフォームをデザインビューで開き、
商品IDのコントロールをコンボボックスに
変更します。コンボボックスのプロパティ
シートを開き、
列数 3
列幅 2cm,2cm,2cm(幅は適当に)
リスト幅 7cm
に設定します。


(4)
コンボボックスのプロパティシートの
値集合ソースに以下のSQL文を貼り付けます。

SELECT T商品.商品ID, T商品.商品名, T商品.新商品名
FROM T商品;

クエリは作らずに変更のみで保存します。

(5)
コンボボックスのプロパティシートの
更新後処理の右側をクリックし、コードを
選択します。するとコード表が開かれ、
以下のコードが表示されます。

Private Sub tx商品ID_AfterUpdate()

End Sub

このコードの中に以下のコードをいれます。
Me![商品名] = Me![商品ID].Column(2)


このようになります。
Private Sub tx商品ID_AfterUpdate()
Me![商品名] = Me![商品ID].Column(2)
End Sub


保存して閉じます。
Column(2)は新商品を示しています。


これで準備は完了です。
フォームを開き、コンボボックスをクリックして
商品を選択して、フォームのフィールドに商品が
表示され、テーブルに保存されたか確認してください。


サブフォーム形式の場合は、
>Me![商品名] = Me![商品ID].Column(2)
の書き方が少し変わります。
サブフォームを使う場合はまた質問してみて
ください。
何か役に立つ内容であれば幸いですが。
    • good
    • 0

補足されたようですが、相変わらずさっぱり判りません。



>フォームでは旧商品名に入力すると新商品名に対応する商品名が表示されます。
>そのレコードをテーブルで開くと、旧商品名は保存されているのに新商品名は保存されていません。
????

一般的な質問する際のセオリーですが

1.ソフトのバージョンも書く
2.DB関係では、テーブル(名)、フィールド(名前とデーター型)
3.フォームに関する質問ならば、そのフォームに貼り付けたオブジェクトの型(テキストボックス、ラベルetc.)と連結されているならばテーブル(またはクエリ)のコントロールソース

その上で、実行しようとしていることを、判りやすく書いてください。「旧商品名に入力すると新商品名に対応する商品名」と書いて、質問者は判っているのでしょうが「新商品名」も「対応する商品名」も全く判りません。
    • good
    • 0

質問が良く理解できないのですが(^^;



>表示はされましたが、テーブルの新商品名フィールドには保存されていません。

ACCESSでは入力中に直ちにテーブルに保存することをしません。キャンセルできるようにするためです。フォームではレコードセレクタを表示していれば、そこに鉛筆?アイコンが表示されている状態です。レコードを移動するか、マクロで保存を実行するなどでテーブルへの書き込みがされます。ご質問はこういったこととは違うのでしょうか?

この回答への補足

まだまだ知識がなく、的確な説明ができないかもしれません。すみません。

フォームでは旧商品名に入力すると新商品名に対応する商品名が表示されます。
そのレコードをテーブルで開くと、旧商品名は保存されているのに新商品名は保存されていません。
なぜでしょうか?

補足日時:2010/05/05 11:33
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

関連するカテゴリからQ&Aを探す