- ベストアンサー
ACCESSのフォームについて
ACCESS初心者です。 まず、テーブルは各社毎に作成されており、仕入金額や数量等が入力されています。 商品名は同じで、仕入金額が違います。 例えば、いちごを、A社から50%の割合で購入し、B社からは25%で購入、C社も25%で購入したい場合、フォームを使って、入力BOXを作り、そこに各社割合を入力すると、仕入金額が各社毎に計算されるようにしたいのですが、どのようにしたらいいのでしょうか? 言葉足らずかと思いますが、ご回答の程、どうぞろよしくお願いいたします。
- みんなの回答 (6)
- 専門家の回答
質問者が選んだベストアンサー
訂正です。 9 各社の社名を入れたテーブルをT仕入先 とし、フィールドはID(オートナンバー、 主キー)、仕入先名(テキスト)とし、 仕入先名を入れておく。 としていましたが、 >フィールドはID(オートナンバー、 主キー) を フィールドは仕入先ID(オートナンバー、 主キー) です。訂正をお願いします。
その他の回答 (5)
- piroin654
- ベストアンサー率75% (692/917)
仕様についてですが。 このフォームでは最初に商品名 をtx商品名に入力し、計算ボタン をクリックするとインプット ボックスが表示され、各社の tx商品に入力した商品の割合を 求めてきます。それに順次 入力していくと各社の金額 が表示されます。わからない ことがあれば書き込んで ください。
- piroin654
- ベストアンサー率75% (692/917)
一応、動作の確認をしました。 検索フォームの名前をF仕入確認とします。 1 デザインビューでフォームを作成するを 選択。 2 デザインビューの中で右クリックから フォームフッターヘッダーを選択。 3 詳細部分にテキストボックスを7つ 設置。ラベルは除去。 4 各テキストボックスの名前を、仕入先ID、 商品名、仕入金額、数量、割合、仕入小計 とする。 5 フォームのプロパティのサイズ自動修正 を、いいえ に設定。 6 フォームのヘッダーと詳細の間にテキスト ボックスを一つ置き、名前をtx商品名と する。 7 同じくボタンを三つ設置、名前をcmd計算、 cmdリセット、cmd商品一覧とする。 各コントロールの標題はcmdを除いた 名称にしておく。 フォームをデザインビューの状態から ツールバー→コードを選択。 以下のコードをコード表に貼り付け、 保存する。 8 コード表のツール→参照設定からDAOにチェック。 9 各社の社名を入れたテーブルをT仕入先 とし、フィールドはID(オートナンバー、 主キー)、仕入先名(テキスト)とし、 仕入先名を入れておく。 10 各社の仕入データを一つにしたテーブルを T仕入データとする。 フィールドはID(オートナンバー、主キー)、 仕入先ID(数値型)、商品名(テキスト型), 仕入金額(通貨型)、数量(数値型) とする。 11 作業用のテーブルをWTデータとする。 フィールドは仕入先ID(数値型)、 仕入先名(テキスト型)、商品名(テキスト型9, 仕入金額(通貨型)、数量(数値型)、 割合(数値型)、仕入小計(通貨型) とする。このテーブルには主キーはない。 12 クエリを一つ作成。名前はQ商品一覧 とする。商品名確認のため。 SQL文は以下。 SELECT T仕入データ.商品名 FROM T仕入データ GROUP BY T仕入データ.商品名; '###これよりフォームに貼り付けるコード Private Sub cmdリセット_Click() Dim db As Database Dim rs As Recordset Set db = CurrentDb Set rs = db.OpenRecordset("WTデータ") 'ワークテーブルWTデータの初期化 Do Until rs.EOF rs.Delete rs.MoveNext Loop 'レコードソースと各テキストボックスのコントロールソースの初期化 Me.RecordSource = "" Me.仕入先ID.ControlSource = "" Me.仕入先名.ControlSource = "" Me.商品名.ControlSource = "" Me.仕入金額.ControlSource = "" Me.数量.ControlSource = "" Me.割合.ControlSource = "" Me.仕入小計.ControlSource = "" 'フォームの初期化 Requery rs.Close Set rs = Nothing db.Close Set db = Nothing End Sub Private Sub cmd計算_Click() 'ワークテーブルと各フィールドの初期化 Call cmdリセット_Click Dim db As Database Dim rs As Recordset Dim rsw As Recordset Dim rswQ As Recordset Dim strSQL As String Dim strWSQL As String Dim int割合 As Integer '割合は整数型に設定 Dim cur仕入小計 As Currency strSQL = "SELECT T仕入データ.仕入先ID, T仕入先.仕入先名, T仕入データ.商品名, T仕入データ.仕入金額, T仕入データ.数量 " & _ "FROM T仕入データ INNER JOIN T仕入先 ON T仕入データ.仕入先ID = T仕入先.仕入先ID " & _ "WHERE (((T仕入データ.商品名)='" & [Forms]![F仕入確認]![tx商品名] & "'));" strWSQL = "SELECT WTデータ.仕入先ID, WTデータ.仕入先名, WTデータ.商品名, WTデータ.仕入金額, WTデータ.数量, WTデータ.割合, WTデータ.仕入小計 " & _ "FROM WTデータ;" Set db = CurrentDb Set rs = db.OpenRecordset(strSQL, dbOpenSnapshot) Set rsw = db.OpenRecordset("WTデータ", dbOpenDynaset) Set rswQ = db.OpenRecordset(strWSQL, dbOpenSnapshot) On Error Resume Next rs.MoveFirst Do Until rs.EOF rsw.AddNew rsw!仕入先ID = rs!仕入先ID rsw!仕入先名 = rs!仕入先名 rsw!商品名 = rs!商品名 rsw!仕入金額 = rs!仕入金額 rsw!数量 = rs!数量 '割合を設定するInputBoxの設定 int割合 = InputBox(rs!仕入先名 & "の割合入力") rsw!割合 = int割合 '割合計算により出る可能性のある小数点以下の丸めはしていない rsw!仕入小計 = rs!仕入金額 * rs!数量 * int割合 / 100 rsw.Update rs.MoveNext Loop 'レコードソースと各フィールドのコントロールソースの設定 Me.RecordSource = strWSQL Me.仕入先ID.ControlSource = Nz("[WTデータ].[仕入先ID]") Me.仕入先名.ControlSource = Nz("[WTデータ].[仕入先名]") Me.商品名.ControlSource = Nz("[WTデータ].[商品名]") Me.仕入金額.ControlSource = Nz("[WTデータ].[仕入金額]") Me.数量.ControlSource = Nz("[WTデータ].[数量]") Me.割合.ControlSource = Nz("[WTデータ].[割合]") Me.仕入小計.ControlSource = Nz("[WTデータ].[仕入小計]") rs.Close Set rs = Nothing rsw.Close Set rsw = Nothing rswQ.Close Set rswQ = Nothing db.Close Set db = Nothing End Sub Private Sub cmd商品一覧_Click() DoCmd.OpenQuery "Q商品一覧" End Sub 長くなりましたが、確実に判りやすく するためにはこのようなものになります。 作成が大変かもしれませんが、手順は すべて書いてあると思います。 作成上、あるいは動作について何か あれば書き込んでください。 なお、T仕入データのデータの並び 特に指定しません。送り込んだ順で 結構です。T仕入データとT仕入先は 前もって作成するデータです。
NO 1です。遅くなりましたが、アクセスでのやり方を考えました。 1.仕入れ方針の各項目をテーブルにして、4つのテーブルを商品名(ここではいちご)で1対1のリレーションを組んでおいて、 2.クエリーをつくり4つのテーブルをいれ、各テーブルの全フィールドをいれ、さらに新しいフィールドに、次の計算式をいれ、フィールドのタイトルを金額にします。 購入数量*(A社割合*A社単価+B社割合*B社単価+C社割合*C社単価)/100 そしてこのクエリーを実行すると、金額のカラムに仕入れ金額が出てきます。
お礼
ご回答いただき、どうもありがとうございました。 回答NO.4の方を参考に作成させていただきました。 ご協力いただき、本当にありがとうございました。
- piroin654
- ベストアンサー率75% (692/917)
解決できましたか。 Accessでの回答がつかない最大の原因は テーブルが各社ごとにデータが分散して いることです。 Accessで解決するには分散している 各社のデータを一つのテーブルに 格納することが必要となります。理由は 各社ごとにそれぞれデータを取り出し さらに一つにしなければならず、もし 品目により仕入先が変化するならば その都度プログラムを変更する必要が あるからです。 データを一つのテーブルにするのは 追加クエリで対応できます。面倒 ですがこの前処理をしないと希望の データは得られません。 いかがでしょうか。
補足
助言をいただき、ありがとうございます。 追加クエリでテーブルを1つに纏めることはできます。 ではその後、どのようにすればよろしいでしょうか? 是非、ご回答の程、よろしくお願いいたします。
この問題はエクセルでは容易な問題です。問題の野菜名を下の図のようにA1に、各社別の仕入れ割合をB2からB4の間に、A社の価格を10行から下に、B社の価格を20行から下にC社の価格を30行から下に入れるとすると、最終の仕入れ価格はC6に計算されて出てきます。このマクロを一番下に示しました。 いちご 10 A 50 200 B 30 250 C 20 300 235 a いちご 200 みかん 100 バナナ 150 b みかん 150 いちご 250 バナナ 160 c バナナ 170 みかん 200 いちご 300 Sub Macro1() ' ' Macro1 Macro ' マクロ記録日 : 2010/2/15 ユーザー名 : ' Dim i As Integer 'A Range("A11:B19").Select For i = 11 To 19 If Cells(i, 1) = Cells(1, 1) Then Cells(3, 3) = Cells(i, 2) Exit For Else End If Next 'B Range("A21:B29").Select For i = 21 To 29 If Cells(i, 1) = Cells(1, 1) Then Cells(4, 3) = Cells(i, 2) Exit For Else End If Next 'C Range("A31:B39").Select For i = 31 To 39 If Cells(i, 1) = Cells(1, 1) Then Cells(5, 3) = Cells(i, 2) Exit For Else End If Next Cells(6, 3) = Cells(3, 2) * Cells(3, 3) / 100 + Cells(4, 2) * Cells(4, 3) / 100 + Cells(5, 2) * Cells(5, 3) / 100 ' End Sub
お礼
早々にご回答いただき、どうもありがとうございました。 回答NO.4の方を参考に作成させていただきました。 ご協力いただき、本当にありがとうございました。
お礼
とても丁寧にご回答いただき、本当にありがとうございます!! 参考にさせていただき、作成することができました。 今後もどうぞよろしくお願いいたします。