Accessを使った給与台帳の天引きについて

このQ&Aのポイント
  • Accessを使って給与集計をしている初心者ですが、特定の社員だけ給与天引きが発生する金額を表示する賃金台帳フォームの作成方法を教えてください。
  • 天引のクエリには社員ID、購入月、天引金額の情報があり、賃金台帳の社員IDを見て、天引のクエリの中から同じIDを検索し、その月の金額を賃金台帳のフィールドに返す方法を知りたいです。
  • ごめんなさい、分かりづらい質問ですが、ご回答いただけると助かります。
回答を見る
  • ベストアンサー

Access

初心者なので質問の内容がわかり辛いかも知れませんが教えて下さい。 Accessを使って給与集計をしています。 社員ごとに支払額や交通費などを表示する賃金台帳フォームに、特定の社員だけ給与天引が発生するのでその金額を載せたいのですが、うまくできません。 天引のクエリには 社員ID、購入月、天引金額があります。 EXCELのLOOKUPのように、賃金台帳の社員IDを見て、天引のクエリの中から同じIDを検索し、その月の金額を、賃金台帳のあるフィールドの中に返す・・・ということをしたいのですが、方法はありますか? 分かりづらい質問ですがご回答いただければ助かります。 宜しくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • CHRONOS_0
  • ベストアンサー率54% (457/838)
回答No.7

>天引テーブルに載っているIDだけに絞られてしまいました。 賃金台帳クエリには天引きテーブルにないレコードもあるということですね だったら結合の種類を[賃金台帳クエリの全レコードを・・・]にしてください 天引きテーブルにレコードがないものについては天引き額はNullになりますから 計算に使用するときにはNz関数で0にしてやるといいでしょう

meatoffice
質問者

お礼

できました!!!! 経験者の方にはこんな簡単な事で・・・と思われる内容で恥ずかしかったのですが、聞いてよかったです。何度も回答していただいて本当にありがとうございます!!

その他の回答 (6)

noname#140971
noname#140971
回答No.6

102 は[社員ID]の値そのものです。 2000とか5000は、天引金額です。

meatoffice
質問者

お礼

何度も回答いただき本当にありがとうございます。

  • CHRONOS_0
  • ベストアンサー率54% (457/838)
回答No.5

>賃金台帳クエリと天引のテーブルを一緒にして >月フィールドと社員IDフィールドを結合してクエリは作ってみたのですが、これ >だと思うようにならなかった どううまく行かなかったのかを説明していただいたほうがいいですね その際 >賃金台帳は社員マスタテーブルや労働時間を入力したテーブルをクエリにして 元のテーブルの情報、クエリの情報もアップしてください

meatoffice
質問者

お礼

何度も回答頂き本当にありがとうございます。 >賃金台帳クエリと天引のテーブルを一緒にして >月フィールドと社員IDフィールドを結合してクエリは作ってみたのですが、これ >だと思うようにならなかった 賃金台帳クエリと天引のテーブルをくっつけて 社員ID・労働月・購入月・天引金額を出すクエリを作ったら天引テーブルに載っているIDだけに絞られてしまいました。 天引のテーブルを使ってクエリを作り天引金額が各ID・月ごとに集計されるクエリを作りました。(1人の社員が1ヶ月に1つ以上購入する場合もあるので) 賃金台帳クエリには 社員ID/社員名/労働月/労働時間/労働日数/支払金額/交通費/保険控除後金額 があり 天引クエリは 社員ID/購入月/購入金額/購入内容 があります。 賃金台帳クエリの保険控除後金額の横に天引クエリの購入金額を表示するようにしたいのです。 情報不足な質問ばかりで申し訳ございません。

noname#140971
noname#140971
回答No.4

イミディエイトウインドウでチェックしてから・・・ [イミディエイト] ? DBSum("天引金額","給与天引","社員ID=102") 5000 ? DBSum("天引金額","給与天引","社員ID=102 AND 労働月='2007/06'") 2000 これが、第一関門。 次に、条件文をフォーム参照方式にするのが第二関門。 その次は、フォームに組み込むという最終関門。 それぞれのステップのテスト内容を回答者によく判るように書くこと。 そして、テストの要領と結果を示し問題点を指摘してもらうこと。 こういう質問を2、3回繰り返せば、自ずと解決します。 なお、Access の DSum関数、DLookup関数でテストし最後に関数名を変えても一向に構いません。

meatoffice
質問者

お礼

再度ご返答頂き本当にありがとうございます。 イミディエイトウインドウに上記式を貼り付けしました。 この時点で分からないことだらけなのですが、社員ID=の後ろは検索したい社員IDなのでしょうか?それともそのまま102で良いのでしょうか? またそれぞれの閉じ括弧の後の5000や2000は何を意味しているのでしょうか・・・? その後また下で教えていただいた条件分をフォームのテキストのコントロールソースに打ち込んだのですが、やはりダメでした・・・ 行き詰ってしまいました。。。

noname#140971
noname#140971
回答No.3

標準モジュールを開いて下記の関数をコピペして[データベース関数]などの名前で保存して下さい。 実は、Access も DLookup関数、DSum関数を提供しています。 しかし、実行速度が業務アプリで使うには余りにも遅すぎます。 なお、以下の関数の要領で DBCount関数、DBAve関数、DBMax関数、DBMin関数もポンポンと。 頑張って下さい。 Option Compare Database Option Explicit Public Function DBLookup(ByVal strField As String, _              ByVal strTable As String, _              Optional ByVal strWhere As String = "", _              Optional ByVal ReturnValue = Null) As Variant On Error GoTo Err_DBLookup    Dim DataValue    Dim strQuerySQL As String    Dim rst     As ADODB.Recordset    Set rst = New ADODB.Recordset    strQuerySQL = "SELECT " & strField & " FROM " & strTable    If Len(strWhere) > 0 Then      strQuerySQL = strQuerySQL & " WHERE " & strWhere    End If    With rst      .Open strQuerySQL, _         CurrentProject.Connection, _         adOpenStatic, _         adLockReadOnly      If Not .BOF Then        .MoveFirst        DataValue = .Fields(0)      End If    End With Exit_DBLookup: On Error Resume Next    rst.Close    Set rst = Nothing    DBLookup = Nz(DataValue, ReturnValue)    Exit Function Err_DBLookup:    MsgBox "SELECT 文の実行時にエラーが発生しました。(DBLookup)" & Chr$(13) & Chr$(13) & _       "・Err.Description=" & Err.Description & Chr$(13) & _       "・SQL Text=" & strQuerySQL, _       vbExclamation, " 関数エラーメッセージ"    Resume Exit_DBLookup End Function Public Function DBSum(ByVal strField As String, _            ByVal strTable As String, _            Optional strWhere As String = "") As Variant On Error GoTo Err_DBSum   Dim N   Dim strQuerySQL As String   Dim rst     As ADODB.Recordset      Set rst = New ADODB.Recordset   strQuerySQL = "SELECT SUM(" & strField & ") FROM " & strTable   If Len(strWhere) > 0 Then     strQuerySQL = strQuerySQL & " WHERE " & strWhere   End If   With rst      .Open strQuerySQL, _         CurrentProject.Connection, _         adOpenStatic, _         adLockReadOnly      If Not .BOF Then        .MoveFirst        N = Nz(.Fields(0), 0)      End If   End With Exit_DBSum: On Error Resume Next    rst.Close    Set rst = Nothing    DBSum = N    Exit Function Err_DBSum:    MsgBox "SELECT 文の実行時にエラーが発生しました。(DBSum)" & Chr$(13) & Chr$(13) & _       "・Err.Description=" & Err.Description & Chr$(13) & _       "・SQL Text=" & strQuerySQL, _       vbExclamation, " 関数エラーメッセージ"   Resume Exit_DBSum End Function

noname#140971
noname#140971
回答No.2

<社員購入履歴> ID___社員ID______購入年月日__天引金額 1___101____________2007/05/02__\1,000 2___102____________2007/06/01__\2,000 3___103____________2007/06/03__\3,000 このようなテーブルがあるとします。 Access のフォームのVBエディタを開きイミディエイトウインドウで[天引記録]を参照・表示してみます。 [イミディエイト] ? DBLookup("天引金額", "社員購入履歴", "社員ID=102 AND FORMAT(購入年月日, 'yyyy/mm')='2007/06'") 2000 ? DBSum("天引金額", "社員購入履歴", "社員ID=102 AND FORMAT(購入年月日, 'yyyy/mm')='2007/06'") 5000 この場合、<社員ID=102>と<FORMAT(購入年月日, 'yyyy/mm')='2007/06'>という2条件で参照しています。 さて、[天引きクエリ]とは、テーブルから各月の天引き合計額を求めたものでしょう。 その場合は、DBLookup関数を使うことになるでしょう。 ? DBLookup("天引金額", "天引きクエリ", "社員ID=102 AND 購入月='2007/06'") 5000 が、DBSum関数を使えば、そういうややこしい仕掛けは不要かと思います。 <[データベース関数] 作成のすすめ> さて、ここで使用している DBLookup関数、DBSum関数は Access では提供されていません。 ですから、これらは[標準モジュール]に記述し[データベース関数]などのモジュール名で保存することになります。 こういう関数を一度だけ用意するならば、Excel のLookup 関数もビックリの検索が可能になります。 さて、いずれにしろ、今回の案件は DBLookup関数またはDBSum関数を利用することで解決です。 例えば、フォーム[賃金台帳]に[社員ID]と[管理月]というテキストボックスがあるとします。 そして、[天引金額総計] というテキストボックスも配置しているとします。 表示するだけならば、[天引金額総計].[コントロールソース] に次のように書けば事足ります。 =DBSum("天引金額","社員購入履歴","社員ID=" & [社員ID] & " AND " & FORMAT(購入年月日, 'yyyy/mm')='" & [管理月] & "'") DBSum関数は、合計する列名、対象となるテーブルまたはクエリ名、条件文の3つを引数とするものです。 問題は、条件文でフォームに配置されている[社員ID]と[管理月]とを参照させればいい訳です。 と、まあ、こんな感じでいかがでしょうか? なお、えらく長くなるので、DBLookup関数、DBSum関数は、別の回答とします。

meatoffice
質問者

お礼

上の回答と2回に分けてご丁寧に教えていただいて本当にありがとうございます。 教えていただいた式をそのままコピーし =DBSum("天引金額","社員購入履歴","社員ID=" & [社員ID] & " AND " & FORMAT(購入年月日, 'yyyy/mm')='" & [管理月] & "'") 社員購入履歴を給与天引 とテーブル名に変え 管理月 を 労働月 と変えたのですが「指定できる文字列が2048文字までです」と出てしまいます・・たぶん私が何か間違えてしまっているのだと分かっていますが間違いも分からず・・ヘルプを見てもわからず・・ほんとACCESSは難しいです。。。 上で頂いた回答はほんと難しすぎてそのままコピーしていいのかも分からず・・・こんな素人ですがこうして回答いただけて嬉しかったです。

  • CHRONOS_0
  • ベストアンサー率54% (457/838)
回答No.1

分かりづらい質問というよりも、データベースの基本が全く分かっていない質問ですね データベースでは複数のテーブルで物事を表現するのが基本ですから 他のテーブルを参照するのにExcelのように関数を使う必要などありません もっと強力な機能が提供されています それがクエリです >天引のクエリには これはクエリじゃなくテーブルですよね 賃金台帳テーブルの情報がありませんが 社員IDや月のフィールドがあるはずですよね 賃金台帳テーブルの社員IDフィールドと天引きテーブルの社員IDフィールド 賃金台帳の月フィールドと天引きテーブルの月フィールドを結合したクエリを作れば >天引のクエリの中から同じIDを検索し、その月の金額を、 >賃金台帳のあるフィールドの中に返す これができます 詳しくはリレーションシップ、参照性合成、クエリなどを入門書で勉強してください

meatoffice
質問者

お礼

回答ありがとうございます。 おっしゃるとおりよく分かっていない初心者なので基本的な質問ですみませんでした。 賃金台帳は社員マスタテーブルや労働時間を入力したテーブルをクエリにして作成したものなのでテーブルはなく賃金台帳クエリしかありません。 賃金台帳クエリと天引のテーブルを一緒にして 月フィールドと社員IDフィールドを結合してクエリは作ってみたのですが、これだと思うようにならなかったので他に方法があるか質問していました。 分かりづらい質問に回答頂きありがとうございました。

関連するQ&A

  • access フィールドの数値を使って計算したい

    あるテーブル内に様々な数値をフィールドに入力して、それらの数値をフォームでルックアップを使用して計算したいのですが、accessはどうやら主キー(id)の数値(1、2、3…)を使って計算してしまいます。どのように設定すればよいのでしょうか。 テーブル1 id  フィールド1 1    5 2    10 3    15 4    20 フィールド1の数値をフォームにてルックアップで選んで計算したい(クエリ内の計算式に組み込みたい)。 よろしくお願いいたします。 access2010使用

  • AccessのSELECTでこんなことできますか?

    月額表データの中に ID/フィールド1/フィールド2  1 88000    89000 2 89000    90000 3 90000    91000  ・・・とあり、 (データは300件以上あります) 賃金クエリの中の金額フィールドを見て 88000以上89000未満 なら1を返し 89000以上90000未満 なら2を返す・・・ということをしたく 式1: (Select ID FROM 月額表 WHERE フィールド1=[金額]) としたのですがそれだと金額がフィールド1と一致するものしか返さないので = を <= に変えてみたのですが、できませんでした。 89500なら2 88770なら1 と返すためにはどうすれば良いか、そういうことが出来るのかご存知の方教えて下さい。 宜しくお願いします。

  • アクセスのフォームで入力ができない

    Accessの操作が出来る程度なのに、頑張って「社員台帳」たるものを作成し始めました。 テーブルに ・社員基本データ ・公的資格・学歴データ ・略歴・賃金データ を作成し、社員IDをキーにその3つのデータでクエリーとフォームを作成しました。 テーブルの各データではデータの編集及び追加が可能なのですが、フォーム画面で入力が出来ません。 説明不足かもしれませんが、どなたか教えてください。 宜しくお願いいたします。

  • Microsoft Access 2003について

    複数のテーブルまたはクエリを使いレポートを作成したいのですが 「選択したフィールドのレコードソースにアクセスできません。テーブルとそのテーブルを基にしたクエリのフィールドを選択した可能性があります。もしそうであれば、テーブルかクエリのどちらかのフィールドだけを選択してください。」と出て作れません。 詳細は以下のとおりです。 支出テーブル ID   月   科目  金額   1    1   交際費  10     2    1   雑 費  20  3    2   交際費  30          (以下12月まで) 収入テーブル ID   月   科目   金額   1    1   仮払    10     2    1   雑収    20  3    2   仮払    20          (以下12月まで) 支出クエリ(クロス集計) 科目 1  2  3  4  5  6  7(以右12月まで) 交際 10 20  30  40  50  60  70 雑費 20  30  40  50  60  70  80 合計 30  50 70  90  110  130  150 収入クエリ(クロス集計) 科目 1  2  3  4  5  6  7(以右12月まで) 仮払 10 20  30  40  50  60  70 雑収 20  30  40  50  60  70  80 合計 30  50  70  90  110  130  150 収支レポート(作成したいレポート) 科目 1  2  3  4  5  6  7(以右12月まで) 仮払 10 20  30  40  50  60  70 雑収 20  30  40  50  60  70  80 合計 30  50  70  90  110  130  150 -------------------------------------- 交際 10 20  30  40  50  60  70 雑費 20  30  40  50  60  70  80 合計 30  50  70  90  110  130  150 ------------------------------------- 残高  0  0   0   0   0   0   0

  • Access2000で複数の検索項目を作りたいのですが・・・

    こんにちわ。 今、Accessで社員録を作成しているんですが、複数の検索について教えて下さい。 ■テーブル テーブル名:社員録 フィールド名:ID・検索名・氏名・所属ID・所属 ■クエリ クエリ名:社員録クエリ フィールド名:ID・検索名・氏名・所属ID・所属 検索名抽出条件:検索名フィールド: Like [Forms]![社員録 縦]![けんさく]         所属フィールド: Like [Forms]![社員録 縦]![抽出検索名] ■フォーム フォーム名:社員録フォーム:テキスト1・テキスト2・ボタン1       社員録サブフォーム:データソース:社員録クエリ テキスト1:所属を入力 テキスト2:検索名を入力 ボタン1:マクロの再クエリを実行する ■ここからが質問です■ (1)テキスト1又は、2が空白のとき社員録全体から検索かフィルタ。 (2)テキスト1・2が、入力されてる時、両条件から検索かフィルタ。 をしたいのですが、何かいい方法がありましたら教えて下さい。 説明が、長くなってしまってスミマセン。。。

  • アクセスで月ごとの集計

    いつも大変お世話になっております。 似たような質問が他にもあるかもしれませんが、見当たりませんでしたので、新しく質問させてください。 アクセスで、集計をしたいと思っています。 あるフィールドには、日付/時刻型が設定されていて、そこには日付の情報が入っています。 その他のフィールドに、金額が入っています。 日付が入っているフィールドの日付をもとに、「月ごと」に金額を集計したいのですが、クエリの集計でどのように指定すればいいのでしょうか? 他の機能で見た、「グループ間隔の設定」というような感じです。 また、さらに分かれば教えてほしいのですが、その日付のフィールドには空白もあります。 空白は無視をして、日付が入っているところだけ集計をしたい場合はどうすればいいでしょうか? 大至急!よろしくお願いします。m(_ _)m

  • ACCESS 一番最新の日付の金額を出したいのですが・・

    社員ID/交通費/登録日 のフィールドがあるテーブルがあります。 社員ID/交通費/登録日 0001  800  2007/4/1 0002  400  2007/4/2 ・ ・ 0001 700  2007/5/2 となった場合、0001の人は700円と言う風に登録日が最新のものを抽出したいのですが クエリをつくり登録日の集計を「最大」にしてみたら、日付は5/2がちゃんと出ますが、金額がその登録日以外の金額になるのです。 どうすればよいでしょうか? 分かる方教えて下さい。宜しくお願いします。  

  • Accessのリレーションのことについて

    すいません、お世話になります。 次のようなテーブルがあります。 テーブル 【営業所データ】 フィールド  営業所ID(キー)        営業所名        住所 デーブル 【社員データ】 フィールド  社員ID(キー)        営業所ID        社員名 デーブル 【社員写真】 フィールド  社員写真ID        社員ID        店舗ID        社員写真 【営業所データ】の営業所IDと【社員データ】の営業所IDがリレーションで、同じく 【社員データ】の社員IDと【社員写真】の社員IDがリレーションで結んであります。 【社員データ】を基にしたクエリがあり   社員ID   営業所ID   営業所名   社員名 となっているので、営業所名は営業所IDを入力することによって、フォームにおいては自動表示されます。 さて、次が質問になるのですが、 【社員写真】を基にしたクエリがあります。   社員写真ID   社員ID   社員名   営業所ID   営業所名   社員写真 社員IDを入力することで、フォームにおいては社員名・営業所IDが自動表示されるのですが、営業所名を表示することができないで困っています。 基本的な事項だとは思いますが、わからなくなってしまいました。よろしくお願いいたします。        

  • アクセス フィールド・テーブルの結合について

    始めましてアクセス・データベース初心者です。 簡単な質問でしたら申し訳ございませんが 出来る限り分かり易く解答して頂けますと嬉しく思います。 テーブルの中に同じ値のフィールドを持つレコードがあり、 その同一フィールドでまとめて表示したいと思いますが どのようにすればよいか分かりません。 下記に例を表示致しますのでご参考にして頂ければと思います。 ID 品番 金額 111 AAA 1000円 111 BBB 150円 222 ZZZ 300円 このようなデータを下のようなデータに直したいです。 ID 品番1 金額1 品番2 金額2 品番3 ・・・ 111 AAA 1000円 BBBB 150円 ・・・ 222 ZZZ 300円 見にくいと思いますので例の画像も添付させて頂きます。 整理後のフィールドは品番1~品番6・金額1~金額6まで作る予定です。 品番や金額の種類は多数あります。 クロス集計クエリでするのかユニオンクエリというのを使うのかといところまでは調べたのですが、両方イマイチよく分かりません。 かなり困っていますのでどうかお助け下さいませ(泣)。

  • Access2000 / 「レコードを追加できません」

    こんにちは Access2000で困っております。 簡単にいいますと、フォーム上から日付/時刻型のデータを入力しようとしても 「レコードを追加できません、テーブル’T外部集計警備’の結合キーがレコードセットにありません。」と表示されうまく入りません。 テーブルの構成ですが、 ★が主キー (1)T現場台帳 ★NO(オートナンバー型) 現場記号(テキスト型) ・ ・ 省略 (2)T外部集計警備 ★NO(オートナンバー型) 現場記号(テキスト型) 警備依頼日付(日付/時刻型) 警備会社ID(数値型) 集計人数(数値型) (3)T警備会社 ★警備会社ID 警備会社名(テキスト型) ・ ・ 省略 上記テーブルはリレーションがかかっており、 (1)T現場台帳.現場記号(テキスト型)----(2)T外部集計警備.現場記号(テキスト型) (2)T外部集計警備.警備会社ID(数値型)---(3)T警備会社.★警備会社ID それぞれ、参照整合性のついたリレーションです。 更にこれらをまとめるために、Q警備会社集計クエリ(選択クエリ)をつくりフォームに利用しています。 Q警備会社集計クエリの構成 T現場台帳.担当者ID T外部集計警備.警備依頼日付 T外部集計経緯日.警備会社ID T警備会社.警備会社名 T外部集計警備.集計人数 (並べ替えや絞込みは、なし) この「Q警備会社集計クエリ」を使って フォームからウイザードを使用してフォームを作成し、警備依頼日付を入力しようとすると「レコードを追加できません、テーブル’T外部集計警備’の結合キーがレコードセットにありません。」と表示されます。 どなたか、Accessの痒いところまで手の届く方、お助けください。