• 締切済み

ACCESSで計算結果を格納する方法

いつもおせわになっております。同じ案件名で質問したのですが、説明がつたなすぎたので質問しなおします。 メインのテーブルの構造は、受注先、作業項目、受注名(主キー)、担当者(これはなくそうと思っています)、受注名、注文日、完了日、(見積金額、請求金額、入金金額、外注支払い、粗利益)とあります。 サブのテーブルは、ひとつの案件の中に小分けの案件があるので、 ナンバー(オートナンバー/主キー)受注名、サブタイトル、ページ数、希望金額、取り掛かり日、作成終了日、提出日、締め切り日、支払先1、支払金額1(支払先1への支払い金額です)、支払先2、支払金額2、支払先3、支払い金額3、請求日、請求金額、入金日、入金日、見積もり、調査、報告書(最後の三つは、やったかどうかのチェック用のチェックボックスです) メインテーブルとサブテーブルはたしか受注名で繋がっています。 メインテーブルの単票フォーム内のサブフォームに、サブテーブルを帳票形式で表示して、個別案件を入力するようにしました。サブフォーム内のレコードの各案件の希望金額の合計や支払金額、粗利などを計算して(Sumや足し算引き算)、サブフォーム内のテキストボックスに表示させています。これが、メインテーブルの()の中身にあたります。 これをなんとかして(サブフォーム内のコマンドボタンを押すなど?して)計算結果をメインフォームのフィールドに転送したいのですが、方法はないでしょうか? できれば、いまアクセスのサイトや本を見過ぎていっぱいいっぱいなのでわかりやすく説明していただければ幸いです。 。

みんなの回答

noname#140971
noname#140971
回答No.5

なんか、質問と回答がすれ違っている感じがします。 1、テーブルの列を更新したいのか? 2、フォーム間参照をしたいのか? 3、一つのテーブル列を異なるフォームでそれぞれに参照したいのか? 1なら<3>。 2なら<1>。 3なら<別解>。 と、念を押しておきます。

redmoon13
質問者

補足

いろいろと丁寧にご回答いただきましてありがとうございます。3でチャレンジしていますが、どうしてもうまくいきません。 >3、テーブルをVBAで更新します。 連結で更新されるフィールドを参照。 Private Sub Form_AfterUpdate()   CnnExecute "UPDATE tab1 SET fld1_Sum=" & DSum("fld1", "tab2", "tab1_ID=" & Me.tab1_ID) End Sub 僅かに1行のVBAコードですが、以下のような関数をモジュールに登録するのは必須。 で、これも点滅はしません。 ですが、先に述べたようにテーブルの設計としては必ずしも推奨されるもんではありません。 このfld1とかtab2とかって自分でつけたフィールド名とかテーブル名をいれるんですよね? >連結で更新されるフィールドを参照。 というのは一体どういう意味でしょう?更新させたいフィールドの枠のことじゃないんですか?モジュールに登録というのはモジュールとして新規作成してしまえばいいということですよね? これは見積金額、請求金額、入金金額、外注支払い、粗利益の四つ分登録しなければならないのでしょうか? それから、 >Public Sub ErrMessage(ByVal CnnErrors As ADODB.Error, ByVal strSQL As String)    MsgBox "ADOエラーが発生しましたので処理をキャンセルします。" & Chr$(13) & Chr$(13) & _       "・Err.Description=" & CnnErrors.Description & Chr$(13) & _       "・Err.Number=" & CnnErrors.Number & Chr$(13) & _       "・SQL State=" & CnnErrors.SQLState & Chr$(13) & _       "・SQL Text=" & strSQL, _       vbExclamation, " ADO関数エラーメッセージ" End Sub Public Function CnnExecute(ByVal strSQL As String) As Boolean On Error GoTo Err_CnnExecute   Dim isOK As Boolean   Dim cnn As ADODB.Connection      isOK = True   Set cnn = CurrentProject.Connection   With cnn     .Errors.Clear     .BeginTrans     .Execute strSQL     .CommitTrans   End With Exit_CnnExecute: On Error Resume Next   cnn.Close   Set cnn = Nothing   CnnExecute = isOK   Exit Function Err_CnnExecute:   isOK = False   If cnn.Errors.Count > 0 Then     ErrMessage cnn.Errors(0), strSQL     cnn.RollbackTrans   Else     MsgBox "プログラムエラーが発生しました。システム管理者に報告して下さい。(CnnExecute)", _         vbExclamation, " 関数エラーメッセージ"   End If   Resume Exit_CnnExecute End Function このVBAのコードもモジュールに登録するのでいいのですか?本当に質問ばかりで申し訳ありません。 とりあえず計算結果がどこかに格納できるようにしたいんです。表示させてみるだけなら今のままでもいいのですが、この後レポートやクエリとして集めてくるためにはどこかに格納させないとできませんよね?(素人なのでできないと思っているだけかもしれませんが、、、)

noname#140971
noname#140971
回答No.4

2の式を用いると、一旦、空値になります。 20=>空=>30 ですから、表示、非表示、表示となります。 3は非推奨とは言っても、これしかないのでは? でなきゃー、[粗利益]という列をどうやって更新しますか? 非推奨とは、そもそも[粗利益]という計算結果を格納する列そのもの要・不要を示唆してのことです。 でも、[粗利益]がデータ検索を簡易に行うために意識して設けたものならば、それはそれで良いと思います。 設計原則よりも使い勝手です。 そういうことで<3>で UPDATE文を実行するのが現実的でしょう。

noname#140971
noname#140971
回答No.3

5時になりましたので具体的な回答を! 1、直接のフォームの値を参照する方式。 =[tab2 サブフォーム].Form!fld1_sum_II 非連結にして、[コントロールソース]をビルドしてフォームを選びます。 *点滅せず! 2、関数等でテーブルを集計・計算する方式。 非連結にして、[コントロールソース]に式を指定。 =DSum("fld1","tab2","tab1_id=" & [id]) *点滅します! 3、テーブルをVBAで更新します。 連結で更新されるフィールドを参照。 Private Sub Form_AfterUpdate()   CnnExecute "UPDATE tab1 SET fld1_Sum=" & DSum("fld1", "tab2", "tab1_ID=" & Me.tab1_ID) End Sub 僅かに1行のVBAコードですが、以下のような関数をモジュールに登録するのは必須。 で、これも点滅はしません。 ですが、先に述べたようにテーブルの設計としては必ずしも推奨されるもんではありません。 Public Sub ErrMessage(ByVal CnnErrors As ADODB.Error, ByVal strSQL As String)    MsgBox "ADOエラーが発生しましたので処理をキャンセルします。" & Chr$(13) & Chr$(13) & _       "・Err.Description=" & CnnErrors.Description & Chr$(13) & _       "・Err.Number=" & CnnErrors.Number & Chr$(13) & _       "・SQL State=" & CnnErrors.SQLState & Chr$(13) & _       "・SQL Text=" & strSQL, _       vbExclamation, " ADO関数エラーメッセージ" End Sub Public Function CnnExecute(ByVal strSQL As String) As Boolean On Error GoTo Err_CnnExecute   Dim isOK As Boolean   Dim cnn As ADODB.Connection      isOK = True   Set cnn = CurrentProject.Connection   With cnn     .Errors.Clear     .BeginTrans     .Execute strSQL     .CommitTrans   End With Exit_CnnExecute: On Error Resume Next   cnn.Close   Set cnn = Nothing   CnnExecute = isOK   Exit Function Err_CnnExecute:   isOK = False   If cnn.Errors.Count > 0 Then     ErrMessage cnn.Errors(0), strSQL     cnn.RollbackTrans   Else     MsgBox "プログラムエラーが発生しました。システム管理者に報告して下さい。(CnnExecute)", _         vbExclamation, " 関数エラーメッセージ"   End If   Resume Exit_CnnExecute End Function

redmoon13
質問者

補足

具体的なご回答ありがとうございます。 このうちのどれかを実行すれば、できるということでしょうか? 点滅する、しないというのはどのような違いがあるのでしょう?(というか何が点滅するのでしょう…) 3は推奨なされないということですよね? 質問ばかりでもうしわけありません。

noname#140971
noname#140971
回答No.2

Aフォーム内に配置したBフォームの値をAフォーム上のコントロールに表示。 そういう意味では、同じこと。 で、Aフォーム上のコントロールを非連結コントロールにする場合。 で、Aフォーム上のコントロールを連結コントロールにする場合。 の二通りが考えられます。 (一応、レポートの問題はさておき) 前者ですと、やりようによっては一旦消えて更新されるでしょう。 後者ですと、即座に更新されるでしょう。 ですが、後者のやり方は元データと計算結果の双方を異なるテーブルに格納することを意味します。 ということは、DBのテーブル設計の原則を逸脱する手法。 もちろん、原則は原則であって何らかの高速処理に不可欠とか後処理の簡略化のためであれば。 それは、まましてやることだと思います。 で、前者でしょうか後者でしょうか?

redmoon13
質問者

補足

ご回答ありがとうございます。 前者でいったん消えて更新されるというのはどういういみでしょう? 後者は推奨しないやりかたという意味ですか?

noname#140971
noname#140971
回答No.1

tab1: [ID]_[fld1_Sum] __1__________0 tab2: [tab1_ID]_[RowNumbwr]_[fld1] _______1___________1_____10 _______1___________2_____20 このようなテーブル構造なようですね。 で、[tab1]がメインで[tab2]がサブフォーム。 で、[tab2]![fld1]が更新されると自動的にメインの[tab1]![fld1_Sum]も更新したい。 [tab1_ID]_[RowNumbwr]_[fld1] _______1___________1_____10->15 _______1___________2_____20 という変更した場合にカーソルは2行目の先頭に移動すればよいということかな。 これは、 Private Sub Form_AfterUpdate()   XXXXXXXXXXXXXX End Sub で、可能です。 が、質問文を詳細に読んでいないで憶測で「こんな疑問かな?」と。 一応、こういうことかどうかお返事をください。

redmoon13
質問者

補足

ご回答ありがとうございました。 ちょっと説明していただいている構造がよくわからないのですが、私の説明にちょっと間違いがありました。メインフォームもサブフォームも単票形式でひとつひとつ表示させています。 メインのフォームにつっこんだサブフォームのフッターのに希望金額等の計算結果が表示される様になっています。この計算結果はサブフォームのページを次に繰っていっても数値さえ代えなければかわりません。見た目だけでいえばこのままでもいいのですが、最終的にレポートとしてメインテーブルの並びで並ばせたいので、格納させたいのです。

関連するQ&A

  • Access2003 合計値の求め方について

    Acdess超初心者です。ご存知の方がいらっしゃいましたらお教え下さい。 Access2003で請求書を作成しております。 メインテーブル 宛名、敬称、発行日、請求番号、件名、課税区分、小計、消費税、合計 サブテーブル  請求番号、項番、工事名、数量、単価 サブテーブルを基に作成したクエリ 請求番号、項番、工事名、数量、単価、金額 メインテーブルの請求番号とサブテーブルの請求番号は1対多のリレーションを組んでいます。 メインテーブルとクエリを基にフォームを作成して、メインフォーム(レコードソースはメインテーブル) 上にサブフォーム(レコードソースはクエリ)を配置しています。 サブテーブルの金額の合計をメインフォーム上の「小計」で求めたいのですが、方法が分かりません。 どのように作成するとメインフォーム上の「小計」でサブフォームの金額合計を求めることができるか お教え下さい。 初歩的な質問で申し訳ありませんが何卒よろしくお願い致します。

  • アクセスのサブフォーム

    よろしく、お願いします。 アクセスのサブフォームをVBAでテーブルに登録する方法を教えてください。 フォームからメインテーブルとサブテーブルへ、ボタン一つで同時に登録したいのです。 よろしく、お願いします。

  • access2010のフォーム上で計算したいです

    access2010 初心者です。 メインフォーム上に総合計を計算したいのですがどうしたらいいのか困ってます。 ***サブフォーム(テーブル1から表示しました)*** ・商品名(テーブル1から表示) ・金額(dlookupを使って「商品一覧表」から金額を表示しました) ・数量(テーブル1から表示) ・合計金額(コントロールリボンでテキストボックスを作り「金額」*「数量」で表示してあります) *********************** メインフォームに、サブフォームの「合計金額」の様にテキストボックスで、サブフォームの「合計金額」の『総合計』を表示したいです。 総合計がある一定の金額になるように、サブフォームの「数量」を決めて行きたいのです。だから、一定金額から『総合計』を引いて残金も表示したいのですが、『総合計』の求め方がわからなくて困っています。 総合計や合計金額はデータとしてテーブルには残らなくてもOKです。 初心者なので、できればわかりやすく簡単な方法がうれしいです うまく伝えれなくて不明な点があるかと思いますが、なにとぞお願いします

  • アクセス2010 サブフォーム集計結果を表示させる

    テーブルに連結したメインフォーム取引台帳があります。 メインフォームに、入金台帳と仕入金額予定表のサブフォームが2つあります。 それぞれのサブフォームにテキストボックスで合計を表示しています。 入金台帳が取引合計 仕入金額予定表が支払合計 この2つのそれぞれの合計をメインフォームの詳細にテキストボックスを追加して表示させ さらに集計するためのテキストボックス作って、下記の式を入れたら エラーが出てしまいます。 レポートではうまくできたのですが、計算結果を表示させる方法を教えてください。 原価率を表示したいのです。 =Sum([取引台帳レポートのサブ出金予定入力表].[Form]![支払合計]/[入金台帳入力用].[Form]![取引合計])

  • Access2003 サブフォームについて

    サブフォームを持つ画面で 親子テーブルを共に更新しようとしていて挫折しかかっています。 そこで皆様の知恵を借りれれば幸いです。 <<画面表示>> メインフォーム…受注  ┗サブフォーム…受注明細 <<更新条件>> ・メインフォームは変更可能 ・サブフォームは追加、変更、削除可能 ・サブフォームのデータ変更時  →受注明細テーブルを更新しない ・メインフォームのデータ更新時  →受注テーブルを更新しない ・メインフォームの更新ボタン押下時  →受注テーブル、受注明細テーブルを更新 <<質問>> 1.サブフォームの値をテーブルへ  自動更新(項目変更時に付随更新)せずに  任意更新(ボタン押下時など)出来ますか?  [サブフォームに主キー項目を設置せず行追加すると Not Null制約で怒られます。] 2.VBで言うところのFlexGridの様にサブフォームを  制御出来ますか?  RecordSourceを使うのではなく、  VBA内で持っている値を各セルに設定する 3.そもそも同一画面内で親子テーブル共に更新することは  有り得ないことなんでしょうか?

  • アクセス★非課税、課税の合計金額計算の仕方

    見積書の入力をしています。 メインフォームとサブフォームがあり、サブフォームでは受注明細を入力できるようになっています。 サブフォームの合計金額計算で、単純に【小計】【消費税】【総計】は計算できるのですが、非課税の受注が混ざっている場合、うまくいきません。 非課税項目にチェックを入れて区別などをし、そのチェックが入っていないものだけの消費税を計算できるようにしたいのですが、具体的にどのようにしたら良いのでしょうか? サブフォームのフィールドは、品名・数量・単価・金額です。 過去の質問は探しましたが見つけられませんでした。 過去にあったら申し訳ないのですが、どうか宜しくお願いします。

  • accessの操作ついて

    初めて質問します。access2000を使用しています。メインテーブルを一つとサブテーブルを一つそれに関連する(親子関係)テーブルを4から5個をリレーション(一対多)しクエリを経由しフォームにて入力したいのですがうまくいきません。 希望作業手順としては、メインフォームを入力しボタンなどでサブフォームに移りサブフォームを入力 次にサブフォームにあるボタンなどで4から5個の関連フォームに移り入力とゆう具合に作業を行いたい 単純な方法が良いのですが その他色々な方法があれば今後の勉強の為にぜひ教えて頂ければ幸いです。宜しくお願い致します。

  • ACCESS2000のサブフォームのデータをイベントプロージャで格納する方法

    前にも同様のご質問をさせていただきましたが、解決しませんでしたので、もう一度質問させていただきます。 データ入力をACCESSで入力をしたいと考えております。 今回の場合にはサブフォームを使用するのですが、メインのフォーム側のボタンをクリックしただけで、メインのフォームに書かれたデータはメインのテーブルへ、サブフォームに書かれたデータはサブのテーブルへそれぞれデータを格納するには、[イベント プロシージャ]ではどのように記述すればよろしいのでしょうか。 よろしくお願いいたします。

  • Access サブフォームからデータ抽出

    ・メインフォーム:[F営業管理]  -フィールド:[見積提出日]、[見積金額] ・サブフォーム:[F見積サブ]  -フィールド:[提出日]、[金額]  ※見積は何度か提出されるので、ここには数件レコードがあります。 ここで、サブフォームの[提出日]が最新日付の[提出日]及び[金額]を、 メインフォームの[見積提出日]・[見積金額]に表示(値入力)させたい のですが、どうやって抽出したら良いかわかりません。 関数・構文などが思いつきません。 どうぞよろしくお願いします。

  • ★Access★2つのサブフォームの計算

    受注管理として、注文書の作成入力をしています。 『メインフォーム』で、顧客先などを入力し、『サブフォームA』で受注明細を入力しています。そして受注種類が2つあるので、フィールドの違う受注明細の『サブフォームB』もあるんです。各サブフォームには数量・単価・金額が入っています。 『サブフォームA』『サブフォームB』の両方に注文がある場合は、各サブフォームの合計(=[Form]!サブフォームA!金額合計)を出し、その合計同士を足して総合計金額(A+B)が『メインフォーム』にちゃんと表示されます。しかし、『サブフォームA』にだけ注文がある場合、『A』合計は表示されますが、『B』合計が空欄になってしまって、A+Bの合計が計算されないのです。さらにレポート印刷もできないのです。 どうすればいいのでしょうか?合計プロパティの既定値を0にしてもだめなんです。誰か教えて下さい。

専門家に質問してみよう