Microsoft Access Club Access超初心者対象Forum Access初級者対象Forum Access VBA Tips Forum DAO、ADO、SQL Forum

     

リストへもどる

投稿記事の一括表示

タイトルフォームを閉じると、データーが勝手に変更されてしまう。
記事No42861
投稿日: 2017/11/30(Thu) 23:46
投稿者ままちゃん
解決済: ON
OS:Win10
Access Version:2016
Win7で2010を使ってたときは問題なくできてたのが、Win10、2016で同じように作り直したら
思った通りに抽出されないし、データーが勝手に変更されてしまいます。
何が原因が思いつかないので、教えていただきたくおじゃましました。

現在の状態
「源泉徴収簿」(テーブル)を元に「Q源泉徴収詳細」(選択クエリ)を作り
それを元に「源泉徴収詳細」(帳票フォーム)を作成しました。
「源泉徴収簿」(単票フォーム)を作り非連結のコンボボックス(年度)
非連結のテキストボックス(前1と後1)、連結コンボボックス(社員名)をおきました。
サブフォームとして「源泉徴収詳細」(帳票フォーム)をおいて、年度と社員名でリンクしました。

・その年の1月から12月まで支払われた給与を社員ごとに表示。
・支払いには二通りあるので日付のテキストボックスに入力しても抽出される。
・現段階ではフォームを開くと日付は2017/01/20〜2017/11/30と表示されるようになってる。
やりたいことは3つです。
【1】本当はいつもその年の1/20〜12/31まで表示させたい。

【2】
「年度」で『2017』を選んで「社員名」で社員を選ぶと
支払い回数、月分、支払日、氏名、給与額などが表示されます。
社員ID1のAさんを選んで終了すると何事もなく次も普通に開くのですが
Aさん以外を選んだままフォーム終了すると次にフォームを開いたとき、社員ID2のBさんの支払い回数『1』のデーターがなくなって
終了するときに選んでた人に『1』が増えてるんです。
テーブルをみても変更された状態になってます。
変更というか、Bさんの『1』のデーターの名前が終了直前に選んだ社員名に入れ替わってるって感じです。
直す方法はBさんを選んで終了すると直るのですが、うっかり他の人を選んだままだとまたBさんの『1』がなくなります。
変更されるデーターはいつもBさんのデーターです。
何が原因なんでしょうか?どうすれば入れ替わらなくなりますか。

【3】
■さん(1月分の給与を月末に支払う)
支払日:2017/1/31
回数 :1
年度 :2017年度
月分 :1月分

●さん(前年12月分の給与を翌年の1月に支払う)
支払日:2017/01/20
回数 :1(2017年での支払いが1回目だから)
年度 :2016年度
月分 :12月分

「年度」で『2017』を選んで「社員名」で社員を選ぶと
■さんの場合1回〜12回までのデーターが表示されて問題ありません。
●さんの場合2回〜12回までしか表示されません。
日付の「前1」に2016/12/20と入力しますが抽出されません。
今までは日付を入力すると目的の日付から抽出されてたのですが・・・。

■さんも●さんも、その年の支払いを抽出させたいのですが
どんな方法が一番いいのかわからなくなってしまいました。

長くなりますが、必要だと思われるデーターを書き出しましたので
よろしくお願いします。

-------------------------
源泉徴収簿(テーブル)
回数  :数値型(長整数)
支払日:短いテキスト
年度  :短いテキスト
月分  :短いテキスト
社員ID :数値型(長整数)
社員名 :短いテキスト
総支給額:数値型(長整数)
社会保険合計:数値型(長整数)
算出税額:数値型(長整数)
-------------------------
Q源泉徴収簿詳細(選択クエリ)

フィールド:回数
テーブル :源泉徴収簿
並べ替え :昇順

フィールド:支払日
テーブル :源泉徴収簿
抽出条件 :Between [Forms]![源泉徴収簿]![前1] And [Forms]![源泉徴収簿]![後1]

フィールド:年度
テーブル :源泉徴収簿
抽出条件 :Like [Forms]![源泉徴収簿]![年度] & "*"

フィールド:月分
テーブル :源泉徴収簿
抽出条件 :

フィールド:社員ID  :社員名
テーブル :源泉徴収簿:源泉徴収簿
抽出条件 :     :Like [Forms]![源泉徴収簿]![社員名] & '*'

フィールド:総支給額 :社会保険合計:算出税額:
テーブル :源泉徴収簿:源泉徴収簿 :源泉徴収簿
抽出条件 :     :      :
-------------------------

源泉徴収簿(フォーム)のコード
-----------
Private Sub Form_Load()
前1.Value = Format(DateSerial(Year(Date), Month(2) + 0, 20), "yyyy/mm/dd")
後1.Value = Format(DateSerial(Year(Date), Month(Date) + 1, 0), "yyyy/mm/dd")
DoCmd.Requery

End Sub

Private Sub 年度_Enter()
Me![年度].Requery
End Sub

Private Sub 源泉徴収詳細_Enter()
Me!源泉徴収詳細.Requery
End Sub
-----------

源泉徴収簿(単票フォーム)・・・レコードソース源泉徴収簿(テーブル)
※フォームヘッダー
・「年度」(コンボボックス)
値集合ソース
SELECT 源泉徴収簿.年度 FROM 源泉徴収簿 GROUP BY 源泉徴収簿.年度;

・「社員名」(コンボボックス)コントロールソース・・・『社員名』
値集合ソース
SELECT 社員名簿.氏名, 社員名簿.社員ID FROM 社員名簿;

・非連結のテキストボックス
「前1」と「後1」

※詳細
源泉徴収詳細(サブフォーム)←帳票フォーム:レコードソース・・・Q源泉徴収詳細
リンク親フィールド:社員名;年度
リンク子フィールド:社員名;年度
------------
源泉徴収簿(テーブル)のデーターは給与明細(テーブル)を元にした
追加クエリで追加したものです。

回数: (SELECT COUNT(*) FROM 給与明細 AS T WHERE T.社員名 = 給与明細.社員名 AND YEAR( T.支払日 ) = YEAR( 給与明細.支払日 ) AND T.年月分 <= 給与明細.年月分 )

タイトルフォームとテーブルを作り直しましょう
記事No42862
投稿日: 2017/12/02(Sat) 22:30
投稿者mayu
解決済: ON
> 源泉徴収簿(テーブル)
> 回数  :数値型(長整数)
> 支払日:短いテキスト      → 日付/時刻型
> 年度  :短いテキスト     → 数値型
> 月分  :短いテキスト     → 数値型
> 社員ID :数値型(長整数)
> 社員名 :短いテキスト
> 総支給額:数値型(長整数)   → 通貨型
> 社会保険合計:数値型(長整数) → 通貨型
> 算出税額:数値型(長整数)   → 通貨型

何よりも、Accessの基本であるテーブル設計に間違いが多いという印象を受けます。
このテーブルに主キーフィールドはあるのでしょうか。
正規化とまでは申しませんけど
データ型くらいは、演算や抽出に適した型へ修正しましょう。

データの見た目は、書式・関数・ラベル 等で表現できれば十分ですので
テーブル上に「 見た目 」という価値観を持ち込む必要は無いのです。

> 今までは日付を入力すると目的の日付から抽出されてたのですが・・・。

支払日フィールドは、{ 見た目が日付書式になっている }だけで
Access内部で保持されている値は、あくまでも「 文字列 」です。
支払日フィールドを「 日付 」と見なして 特定範囲内での大小比較をご希望の場合は
CDate関数 か DateValue関数で 日付/時刻型 に変換してから抽出条件を指定して下さい。

> 【1】本当はいつもその年の1/20〜12/31まで表示させたい。

【 その年 】というのは 
会計処理上の「 年度 」を指すのか
実際に口座のやりとりがあった「 年 」のことを指すのかが不明です。
単純に「 年 」として区分けするのでしたら
支払日フィールドから「 年 」を抜き出せばいいでしょう。

>【2】
> 何が原因なんでしょうか?どうすれば入れ替わらなくなりますか。

・ 非連結の単票フォームをメインとし、連結の帳票フォームをサブとする
・ ヘッダーに抽出用のコントロールを配置した 単体の連結帳票フォーム

上記どちらかの構成にして下さい。
リンク親フィールドや子フィールドの設定は必要ありません。

メイン・サブが { 多 対 多 } という関係も不適切です。
特殊なケースを除き、フォームが適切に設計されていれば
連結フォームの メイン・サブ 両者の関係は { 1 対 多 } になります。

>「源泉徴収簿」(単票フォーム)
このフォームにレコードソースの設定は不要です。
> ・「社員名」(コンボボックス)コントロールソース・・・『社員名』
検索・抽出用のコントロールはテーブルに連結してはいけません。
> 年度と社員名でリンクしました。
リンクする必要はありませんので解除して下さい。

> 【3】
> ■さんも●さんも、その年の支払いを抽出させたいのですが
> どんな方法が一番いいのかわからなくなってしまいました。

> ●さん(前年12月分の給与を翌年の1月に支払う)
> 回数 :1(2017年での支払いが1回目だから)
> 年度 :2016年度
> 月分 :12月分

結論から申し上げると、設計で考慮すべき点が実装されておりません。

方法がわからなくなるのは
社員ごとの{ 締日 }及び{ 締日から支払日までの猶予期間 }の情報が
源泉徴収簿テーブルに無いから、とお答えしておきます。
また、{ 締日( 20, 末日等 ) }及び{ 締日から支払日までの猶予期間 }は
本来は、社員マスタに持たせるべき情報になります。

なお、クエリの抽出条件に
フォームのコントロールを指定してデータを絞り込む方法は
コントロールの数が増えたり、コントロールの値が空だった場合の処置を記述すると
複雑な SQL を目測で把握できるくらいの経験とスキルが必要になります。

クエリが苦手だと仰っている現状では、いずれ行き詰ると思いますので
Q源泉徴収簿詳細クエリに設定している抽出条件は全て削除し
フォームの Filter プロパティを利用して
VBAで抽出を実施する手法に切り替えることをお薦めします。

タイトルRe: フォームとテーブルを作り直しましょう
記事No42863
投稿日: 2017/12/03(Sun) 17:38
投稿者ままちゃん
解決済: ON
> データ型くらいは、演算や抽出に適した型へ修正しましょう。
> 結論から申し上げると、設計で考慮すべき点が実装されておりません。

テーブル設計を見直してそれに合わせて作り直してみます。
一つずつ確認しながら進めてたいと思うので、ここはcloseにしたいと思います。
ありがとうございました。

- 以下のフォームから自分の投稿記事を修正・削除することができます -
処理 記事No パスワード

ページの先頭へ 前ページへ戻る