Access VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


26 / 500 ページ ←次へ | 前へ→

【12804】Re:帳票で階段状に塗り潰し
発言  せいさん  - 15/4/11(土) 15:22 -

引用なし
パスワード
   追加ですがやりたいことはチャートみたいにする目的です
・ツリー全体表示

【12803】帳票で階段状に塗り潰し
質問  せいさん  - 15/4/11(土) 13:05 -

引用なし
パスワード
   帳票フォームで指定した文字数を表示したいです。頭からではなく最初が2文字指定したら決まった文字が頭から2文字表示され次のレコードに3文字指定したら2文字開けて3文字を表示するといった感じです順番はnoフィールドで入れ替えています
・ツリー全体表示

【12802】Re:クエリ:クロス集計について
発言  木葉  - 15/4/11(土) 11:08 -

引用なし
パスワード
   ▼かるびの様、hatena様


お返事ありがとうございます!
ご丁寧に教えていただき…大変助かります。


本題のお返事はまた分からない箇所ができ次第させていただきます。
おそらく理解しながら作っていくのに時間がかかるので…

取り急ぎ、ありがとうございました^^
・ツリー全体表示

【12801】Re:クエリ:クロス集計について
回答  hatena  - 15/4/11(土) 5:19 -

引用なし
パスワード
   かるびのさん提案の方法と考え方は同じですが、元テーブルに枝番フィールドを追加すればどうでしょうか。

社員毎連番は下記の関数を使えば1行コードを書くだけです。

グループ毎連番を自動入力する関数 - hatena chips
ht tp://hatenachips.blog34.fc2.com/blog-entry-428.html


SetSequenceNumber "枝番", "作業内容", "日付,社員番号"

クロス集計クエリの列見出しは、

式1: [社員] & IIf([枝番]=1,"",[枝番])
・ツリー全体表示

【12800】Re:クエリ:クロス集計について
回答  かるびの  - 15/4/11(土) 2:18 -

引用なし
パスワード
    クロス集計クエリ自体をいじくって、
>(日付)  佐藤   佐藤2  本田   川村
>2015/4/10 ○○○ ●●● ×××
というようなクロス集計クエリを作ることは、できないと思います。
 社員フィールドには、「佐藤2」なんていう値がないからです。


 もっと違った形でデータを表示した方がいいとは思います。
 例えば、サブフォームを使うとか、サブデータシートを使うなどの方法です。
 でも、一覧性に欠けてしまいますね。
 結局、良い方法は思いつきませんでした。


 なお、上記のような形のクロス集計クエリを作る方法がないわけではありません。
 クロス集計クエリの元になるクエリの段階で、例えば、「佐藤」を「佐藤2」に書き替えればいいのです。
 もうちょっと具体的に言うと、クロス集計クエリの元になるクエリ(Q集計元1)が

日付    作業内容 社員  
2015/4/10 ○○○  佐藤 
2015/4/10 ●●●  佐藤 
2015/4/10 ×××  本田
2015/4/11 ▽▽▽  本田
2015/4/11 ◇◇◇  川村
2015/4/13 ▲▲▲  佐藤
2015/4/13 ΘΘΘ  川村

となっているとすると、このクエリをいじって、

日付    作業内容 社員枝番付き  
2015/4/10 ○○○  佐藤 
2015/4/10 ●●●  佐藤2 
2015/4/10 ×××  本田
2015/4/11 ▽▽▽  本田
2015/4/11 ◇◇◇  川村
2015/4/13 ▲▲▲  佐藤
2015/4/13 ΘΘΘ  川村

となるようなクエリ(Q集計元2)を作るということです。


 問題は、同じ日付で2番目に出てくる「佐藤」を「佐藤2」に変える方法です。

 基本的にアクセスは、他のレコードの値によって自レコードの値を決める
ということができません。
 DLookup関数やDCount関数などのいわゆるD系関数を駆使すれば可能なのですが、
クエリでD系関数を使うと、クエリを開くのに時間がかかってしまいます。
 下手をすると、クエリを開くのに数分かかります。


 しかし、ワークテーブルを使えば、スピードアップできます。
 なお、ワークテーブルとは、一時的にデータを格納しておくテーブルのことです。

 ワークテーブルに「作業内容番号」と「社員枝番付き」を書き込んでいき、
このワークテーブルと作業内容テーブルを結合させたクエリを作ります。
 このクエリがQ集計元2です。


 ワークテーブルに「作業内容番号」と「社員枝番付き」を書き込む方法ですが、
まずは作業内容番号を書き込みます。
 具体的には、追加クエリを使って、Q集計元1から作業内容番号フィールドだけを
ワークテーブルに追加します。

 次いで、Q集計元1とワークテーブルとを
各「作業内容番号」フィールドで結合させ、
かつ、然るべく並び順を指定したレコードセットを作ります。

 そして、このレコードセットを先頭からループさせ、
「社員」フィールドの値に枝番を付けるかどうか、
付けるとしたら何番を付けるかを判断し、
「社員」フィールドの値に枝番を付けていきます。


 なお、この方法は、

   Recordset_連続番号の振り方:SampleFile071
ht tp://www.accessclub.jp/samplefile/samplefile_71.htm

を応用したものです。
・ツリー全体表示

【12799】クエリ:クロス集計について
質問  木葉  - 15/4/10(金) 17:05 -

引用なし
パスワード
   こんにちは。先日は大変お世話になりました。
まだ日も経っておりませんがまたお世話になります。よろしくお願いします。


もしかするとVBAの質問ではないかもしれませんが…お付き合いいただけると嬉しいです。


●クロス集計の元になるもの:「作業内容管理」(クエリ)

「作業内容管理」の元になるテーブルは、以下の通りです。
・「作業内容」(*作業内容番号【O】、日付【D】、作業内容【T】、料金【T】、社員番号【T】)
・「社員」(*社員番号【O】、社員)

※()内はフィールド名、*は主キーです。
※データ型は〈【O】=オートナンバー型、【D】=日付型、【T】=短いテキスト、【N】=数値型〉です。
※「作業内容」の社員番号と「社員」の社員番号は結合させています。

●クロス集計で使うフィールド
・日付
・社員
・作業内容

一番左に日付、列見出しに社員を配置して、
1日の社員ごとの作業内容を見ることができるようにしたいのです。
雰囲気としては以下のような感じです。

(日付)    佐藤   本田   川村
2015/4/10 ○○○ ×××
2015/4/11      ▽▽▽ ◇◇◇
2015/4/13 ▲▲▲      ΘΘΘ

上のような形にすることはできました。
ただ、このままの状態だと、1日に1人の社員が1つの作業内容というデータならいいのですが、
1日に1人の社員が2回、3回と作業することもありますので、作業内容が入りきらないのです。

私の考えとしては、列見出しをふやしていきたいのですが…。
例えば佐藤さんが4/10に作業を2回したとしたら、

(日付)    佐藤   佐藤2  本田   川村
2015/4/10 ○○○ ●●● ×××

という感じです。

調べてもあまり出てこないのでどうしたものか…
そもそもこういう場合はクロス集計を使わないほうがいいのか…(クロス「集計」ですし)
でももしかするとVBAでできるのかも…?と思い質問させていただきました。

なんだか地に足がついていないような内容の質問で申し訳ありませんが、
ご提案などありましたら教えていただけたらと思います。
・ツリー全体表示

【12798】Re:次のレコードを参照
お礼  bbk  - 15/4/6(月) 7:45 -

引用なし
パスワード
   hatenaさん

解決できました。
ありがとうございます。
・ツリー全体表示

【12797】Re:次のレコードを参照
回答  hatena  - 15/4/5(日) 1:04 -

引用なし
パスワード
   「並べ替え/グループ化の設定」で「品名」でグループ化してグループヘッダーを表示させます。

グループヘッダーに下記のテキストボックスを配置します。

コントロールソース =Count(*)
名前 グループ内件数
可視 いいえ

詳細セクションに下記の3つのテキストボックスを配置します。

コントロールソース =1
集計実行 グループ全体
可視 いいえ
名前 グループ内連番


コントロールソース =[出荷数]
集計実行 グループ全体
可視 いいえ
名前 グループ内累計


コントロールソース =IIf([グループ内件数]>1 And [グループ内件数]=[グループ内連番],[グループ内累計] , Null)
可視 はい


以上です。
・ツリー全体表示

【12796】Re:次のレコードを参照
質問  bbk  - 15/4/3(金) 7:31 -

引用なし
パスワード
   hatenaさま

品名フィールドと出荷数フィールドがあり
品名    出荷数   出荷合計
 A      2
 B      2
 B      1      3
 C      3
 D      4
 D      1      5

このような感じで同じ品名が2件以上の場合の最後のレコードの時に
出荷合計として同じ品名の出荷数を合計して表示したいです。
連番はありません。

よろしくお願いします。 
・ツリー全体表示

【12795】Re:次のレコードを参照
回答  hatena  - 15/4/2(木) 18:48 -

引用なし
パスワード
   ▼bbk さん:
>レポートの詳細セクションで次のレコードの
>フィールド内容を取得したいのですが
>どういった方法があるでしょうか?

連番フィールドとかはありますか。あればそれを元に取得できます。

なければ、
前のレコードなら比較的に簡単に取得できますが、次のレコードとなるとちょっと面倒です。
先頭のレコードを非表示にして、データを格納しておいて、次のレコードで、
それと比較すれば、結局同じことになりますが、それではダメですか。

どのようなフィールドがあって、次のレコードとデータでどのようなことをしたいのか、具体的に説明してもらえるともう少しまともな回答ができると思います。
・ツリー全体表示

【12794】次のレコードを参照
質問  bbk  - 15/4/2(木) 17:28 -

引用なし
パスワード
   Access2003を使っています。

いろいろと調べてみたのですが
自分では解決出来ずに質問いたします。

レポートの詳細セクションで次のレコードの
フィールド内容を取得したいのですが
どういった方法があるでしょうか?

知っている方おられましたらよろしくお願いします。
・ツリー全体表示

【12793】Re:複数抽出
お礼  ゆか  - 15/3/31(火) 22:23 -

引用なし
パスワード
   かるびの様

無事に全て抽出することが出来る様になりました!
ありがとうございます!

まだまだ、完璧に理解しているわけではありませんが、
こうすれば抽出表示が出来、解除がされるということがわかりました。

そして、最初にかるびのさんが
何故説明時にデータ型など書いたほうが親切なのか
身を以て学ぶことが出来ました!
本当にありがとうございます。

まだまだわからないことばかりで尋ねることもあると思いますが、
その時はまたどうぞ宜しくお願いいたします。

本当に本当にありがとうございました!
・ツリー全体表示

【12792】Re:所得税の算出
回答  かるびの  - 15/3/31(火) 13:46 -

引用なし
パスワード
   >FnIjogaku関数のを仕込むには、具体的にどうすればよいですか?

 つまづいているのは、やはりそこでしたか。

 次のページが参考になると思います。

Accessむかむか
クエリで自作関数を使用する
ht tp://sanryu.net/acc/tips/tips132.htm


T's Ware 
オリジナル関数をクエリーで使う方法 
ht tp://www.tsware.jp/tips/tips_202.htm  


 FnIjogaku関数を使う場合、関数の引数と、引数として使うフィールドのデータ型を
合わせるようにしてください。
 そうでないと、データ型が違う旨のエラーになります。 
・ツリー全体表示

【12791】Re:所得税の算出
質問  pp3  - 15/3/31(火) 8:15 -

引用なし
パスワード
   > 12781のレスの繰り返しでしかありませんが、
>クエリは2つ作ります。1つがQ一次クエリで、もう1つがQ二次クエリです。
>
> Q一次クエリは、従事者テーブルに演算フィールドを設けるだけです。
> 演算フィールドには、12784のレスで紹介したFnIjogaku関数を仕込みます。
> なお、FnIjogaku関数は、頭の中で考えただけであり、試してはいないので、
>修正をする必要があるかもしれません。
> この演算フィールドの名前は、何でもいいのですが、
>「基準額」という名前だとして説明を続けます。
おはようございます
FnIjogaku関数のを仕込むには、具体的にどうすればよいですか?
しつこくてすみません
・ツリー全体表示

【12790】Re:複数抽出
回答  かるびの  - 15/3/31(火) 2:43 -

引用なし
パスワード
   >ただ、自分自身がいまVBAを使っているのかSQLを使っているのかも
>混乱してきたので、
 今自分が書いているのが、VBAなのかSQLなのかは、あまり神経質になる必要はない
と思います。
 ただ、Filterプロパティに設定する文字列中に書いていけないVBA用語があるということを
頭の片隅に置いておけば十分だと思います。


>ただ、利用者IDや口座番号は
>抽出条件でデータ型が一致しません。
とのことですが、
>strFilter = " AND " & BuildCriteria("利用者ID", _
>      dbLong, Me.txt利用者ID)
のコードを見る限り、利用者IDは、「dbLong」つまり長整数型ですね。

 他方、テーブル構成を見てみると、利用者IDはテキスト型だと書いてありました。
 
 だから、データ型が一致しないというエラーになります。


>利用終了者にチェックを入れると実行時エラー3075
>不要な')'があると指摘されます。
 strFilter変数に何が格納されているか確認してみましょう。
 「strFilter = "(" & strFilter & ") or 利用終了者"」のコードで付与した
「(」は、Mid関数を通すことで消されてしまっているはずです。
 だから、このコードで付与した「)」が余計な括弧になってしまっています。

 これへの対策は、ちょっと面倒ですね。
 strFilterへ格納する順番を変えるというのが1つの方法です。
 もっとも、ただ順番を変えるだけではだめです。
strFilter変数の冒頭5文字は、Mid関数により消してしまうわけですから、
「(」が冒頭の「 AND 」よりも後になるようにして、strFilter変数へ格納しなければいけません。

 他の方法として、先頭の「 AND 」の前に「(」を付加するのではなく、
Replace関数を使って、先頭の「 AND 」が「 AND (」となるように文字列を変える
という方法もありですね。


>開始日、終了日においては検索機能を果たさず、
>Mid関数前: AND 開始日 >= ##
>となります。

 これについては、何度も指摘しているんですが。
 「If Not IsDate(Me.txt開始日) Then」を日本語で言えば、どんな意味になるのか、
そして、そういう条件でいいのかを考え直してみてください。


 余談になりますが、「If Not IsDate(Me.txt開始日) Then」というコードの書き方は、
私は良くないと思っています。
 1つは、「= True」を省略している点です。
 ネット上でコード例を見てみると、
「= True」を省略しているコード例の方がはるかに多いのですが、
数か月後にコードを読み直したときに、
「= True」が省略されていると、意味が取りにくいんですよね。
 慣れの問題だとは思うのですが、私は、「= True」は省略しないようにしています。

 もう1つは、「Not」です。
 「Not」があるために意味が取りにくくなっています。
 ここは、「Not」と使わずにコードを書いた方が、
後でコードを見たときに意味を取りやすいと思います。
 なお、「Not」と使わずにコードを書くためには、
「If Not IsDate(Me.txt開始日) Then」というコードの日本語訳がしっかりできていないと、
「Not」を使わないコードは書けませんよ。
・ツリー全体表示

【12789】Re:所得税の算出
回答  かるびの  - 15/3/31(火) 1:50 -

引用なし
パスワード
   >誘導頂いたUNIONクエリまで出来ました!

 ユニオンクエリで行こうということですか。
 間違った方向に進もうとしているような気がします。

 間違った方向に進んでも、例えば、給料明細クエリを表示させるだけにとどまっている限りは、
そう大きな影響はないでしょうが、
さらなる機能を付加したいと思ったときに、正しい方向に進んだ場合に比べて、
膨大な手間を要することになります。
 つまり、正しい方向に進んでいれば、クエリを1つ作るだけで済むところを、
間違った方向に進んでしまうと、それを全てVBAで処理するということになってしまいます。
 そして、そうなったときに、掲示板で質問しても、
「テーブルをちゃんと作れ」というアドヴァイスしか返ってこず、
独力でVBAのコードを完成させることになってしまいます。


>でもそこから先が何度読み返しても分かりません!

 12781のレスの繰り返しでしかありませんが、
クエリは2つ作ります。1つがQ一次クエリで、もう1つがQ二次クエリです。

 Q一次クエリは、従事者テーブルに演算フィールドを設けるだけです。
 演算フィールドには、12784のレスで紹介したFnIjogaku関数を仕込みます。
 なお、FnIjogaku関数は、頭の中で考えただけであり、試してはいないので、
修正をする必要があるかもしれません。
 この演算フィールドの名前は、何でもいいのですが、
「基準額」という名前だとして説明を続けます。


 Q二次クエリでは、Q一次クエリとユニオンクエリとを結合させます。

 この結合フィールドをどうするかちょっと考えどころです。
 12781のレスでは、結合フィールドは2つ、つまり、
1つが「基準額」フィールドと「以上」フィールド、
もう1つが「扶養人数」フィールドと「扶養人数フィールド」
とすることを提案したのですが、
結合フィールドは1つだけにして、他方の結合条件は、抽出条件とした方が
クエリが速いのではないだろうかとも思っています。
 結合フィールドを2フィールドにした方が速いのか、1フィールドだけにした方が速いのかは、
実際に両方のクエリを作って、実験してみるよりないですね。


 それから大事なことですが、
Q二次クエリは、ユニオンクエリをベースにしたクエリなので、
更新不可のクエリです。
 つまり、Q二次クエリ上で新規レコードを入力することはできませんし、
既存レコードの修正をすることもできません。
 レコードを表示するだけです。
・ツリー全体表示

【12788】Re:所得税の算出
質問  ppp3  - 15/3/30(月) 22:55 -

引用なし
パスワード
   お返事有難うございます
誘導頂いたUNIONクエリまで出来ました!
でもそこから先が何度読み返しても分かりません!

> その上で、従事者テーブルにプラスして
>この関数を使った演算フィールド(フィールド名「基準額」)
>を持つクエリを作り(クエリ名「Q一次」)、
>Q一次と税額表とを、「基準額」フィールドと「以上」フィールド、
>及び「扶養人数」フィールドで結合させたクエリを作ります
>(クエリ名「Q二次」)。
>
> このようにすれば、結合条件に不等号を使わずに済むので、
>いくらかはクエリが速くなるのではないかと思います。
> ただし、試したわけではないので、本当に速くなるかどうかは未知数です。
>
>
> これでもまだ遅いようであれば、
>Q一次と税額表との結合は1フィールドだけにして、
>もう片方の結合条件は、抽出条件とするという方法を試すことになりそうです。
・ツリー全体表示

【12787】Re:複数抽出
質問  ゆか  - 15/3/30(月) 20:51 -

引用なし
パスワード
   かるびの様

クエリの公式がよくわからなかったら、VBAで違う言語にしてくれると
思っていたら、激しく勘違いをしていることはわかりました!
ただ、自分自身がいまVBAを使っているのかSQLを使っているのかも
混乱してきたので、まずはtxt○○を当てはめてみることにしました!


Private Sub cmdFilter_Click()
  Dim strFilter As String, strExp As String, aryOpe As Variant


  If Not IsNull(Me.txt利用者ID) Then
    strFilter = " AND " & BuildCriteria("利用者ID", _
      dbLong, Me.txt利用者ID)
  End If
  
  
   If Not IsNull(Me.txt口座番号) Then
    strFilter = " AND " & BuildCriteria("Me.txt口座番号", _
      dbLong, 口座番号)
  End If
  
 
  If Not IsNull(Me.txt口座名義人) Then
    strFilter = strFilter & " AND 口座名義人 Like '*" & Me.txt口座名義人 & "*'"
  End If
  
 
  If Not IsNull(Me.txt利用者名) Then
     strFilter = strFilter & " AND 利用者名 Like '*" & Me.txt利用者名 & "*'"
  End If
  
 
   If Not IsNull(Me.txt利用施設) Then
     strFilter = strFilter & " AND 利用施設 Like '*" & Me.txt利用施設 & "*'"
  End If
  
   
  If Not IsDate(Me.txt開始日) Then
    strFilter = strFilter & " AND 開始日 >= #" & Nz(Me.txt開始日) & "#"
  End If
  
  
  If Not IsDate(Me.txt終了日) Then
    strFilter = strFilter & " AND 終了日 =< #" & Nz(Me.txt終了日) & "#"
  End If
  
  
If Not IsNull(Me.利用終了者) Then
    strFilter = "(" & strFilter & ") or 利用終了者"
End If

 Debug.Print "Mid関数前:" & strFilter
  strFilter = Mid(strFilter, 6)
   Me.Filter = strFilter
Debug.Print "Mid関数後:" & strFilter
  If strFilter = "" Then
    Me.FilterOn = False
   Else
    Me.FilterOn = True
  End If
 
End Sub

Private Sub cmdFilterOff_Click()
  Me.Filter = ""
  Me.FilterOn = False
  Me.txt利用者ID = Null
  Me.txt口座名義人 = Null
  Me.txt利用者名 = Null
  Me.txt利用施設 = Null
  Me.txt開始日 = Null
  Me.txt終了日 = Null
  Me.txt口座番号 = Null
  Me.txt利用終了者 = Null
End Sub

結果は、お蔭様で利用者名と口座名義人名はばっちり検索できるようになりました!
ありがとうございます!

利用施設も、施設名での検索は不可能ですが、
ルックアップ時の数字であれば検索ができるようになりました!

ただ、利用者IDや口座番号は
抽出条件でデータ型が一致しません。
Mid関数前: AND 利用者ID=1となり、
利用終了者にチェックを入れると実行時エラー3075
不要な')'があると指摘されます。
開始日、終了日においては検索機能を果たさず、
Mid関数前: AND 開始日 >= ##
となります。

ちょっとずつ理解できはじめましたが、
理解力が乏しく、かるびの様に多大なる負担をお掛けいまして
大変申し訳ありません。本当にいつも感謝しております。ありがとうございます。
・ツリー全体表示

【12786】Re:所得税の算出
回答  かるびの  - 15/3/30(月) 2:18 -

引用なし
パスワード
   >やはり基本ベースは所得率表テーブルだと思っております
>
>年1度の更新時期に所得率表テーブルを使用者が変更した時に
>対応できるようにしたい為です。
>
>どうにかなりませんか?

 私が12481のレスで提示した

以上   扶養人数 所得税額
380,000     0  15,040
380,000     1  11,800
380,000     2   8,570
        ・・・・・・
383,000     0  15,280
383,000     1  12,050
383,000     2   8,810

というテーブルを使うことは、リレーショナルベータベースを使う限り、
避けられないと思います。

 上例のようなテーブルを用意することは、それほど手間がかかることでは
ありません。
 所得率表テーブルから追加クエリでレコードを追加するだけです。

 その追加クエリですが、
所得率表テーブルの「以上」フィールドと「0人」ないし「7人」フィールドが
ともに長整数型だとし、
かつ、上例のようなテーブルのテーブル名が「T税額表」だとし、
そのテーブル構成が
   ID    オートナンバー(主キー)
   以上   長整数型
   扶養人数 バイト型
   所得税額 長整数型
だとして、次のようなものになります。

INSERT INTO T税額表
(以上,扶養人数,税額)
SELECT 以上,0 AS 扶養人数,[0人] AS 税額
FROM 所得率表テーブル
UNION ALL 
SELECT 以上,1 AS 扶養人数,[1人] AS 税額
FROM 所得率表テーブル
UNION ALL 
SELECT 以上,2 AS 扶養人数,[2人] AS 税額
FROM 所得率表テーブル
   ・・・・・
UNION ALL 
SELECT 以上,7 AS 扶養人数,[7人] AS 税額
FROM 所得率表テーブル


 一つ気になるのは、所得率表テーブルの「0人」ないし「7人」フィールドの
フィールド名です。
 フィールドの命名規則として、数字で始まるフィールド名はNGですから、
これが原因で何らかのエラーが生じ、追加クエリが実行できないかもしれません。
 このエラーは、追加クエリだから出るというのではなく、
単なる選択クエリでも生じる可能性があります。
 所得率表テーブルの「0人」ないし「7人」フィールドは、
フィールド名を変えておいた方が無難だと思います。


 どうしても、上例のようなテーブルを作りたくないならば、
ユニオンクエリを使うという方法が考えられます。
 所得率表テーブルから上例のようなレコードを返すクエリを
ユニオンクエリで作るという方法です。

 もっとも、上例のようなテーブルを使う場合に比べて、
ユニオンクエリの処理が必要になる分、遅くなるのがデメリットです。

 ユニオンクエリの作り方ですが、クエリデザイナでは作れないので、
SQLビューで作ります。
 SQLビューに次のように入力してください。

SELECT 以上,0 AS 扶養人数,[0人] AS 税額
FROM 所得率表テーブル
UNION ALL 
SELECT 以上,1 AS 扶養人数,[1人] AS 税額
FROM 所得率表テーブル
   ・・・・・
UNION ALL 
SELECT 以上,7 AS 扶養人数,[7人] AS 税額
FROM 所得率表テーブル

 なお、上記の「・・・・・」の部分は、
私がSQL文を逐一書くのが面倒なため、省略したものですので、
実際にSQLビューに書くときは、省略せずに書いてください。


 T税額表を新規に作るにせよ、それをユニオンクエリで代用するにせよ、
あとの手順は、私の12781のレスの
>> その上で、従事者テーブルにプラスして
>>この関数を使った演算フィールド(フィールド名「基準額」)
>>を持つクエリを作り(クエリ名「Q一次」)、
>>Q一次と税額表とを、「基準額」フィールドと「以上」フィールド、
>>及び「扶養人数」フィールドで結合させたクエリを作ります
>>(クエリ名「Q二次」)。
のとおりです。
・ツリー全体表示

【12785】Re:所得税の算出
質問  ppp3  - 15/3/29(日) 22:39 -

引用なし
パスワード
   ▼かるびの さん:
>> 次に、社会保険料等控除後金額から税額表の「以上」フィールドの値を求める
>>ユーザー定義関数を作ります。
>
> 興味が湧いたので、このユーザー定義関数を考えてみました。
>
>Function FnIjogaku(lngKojogo As Long) As Long
>  Dim lngHasu As Long
>  Dim lngRslt As Long
>  
>  If lngKojogo < 1010000 Then
>    Select Case lngKojogo
>      Case Is < 99000
>        lngHasu = lngKojogo Mod 1000
>    
>      Case Is < 221000
>        lngHasu = (lngKojogo - 99000) Mod 2000
>  
>      Case Is < 1010000
>        lngHasu = (lngKojogo - 221000) Mod 3000
>    End Select
>
>    lngRslt = lngKojogo - lngHasu
>  Else
>  
>  End If
>End Function
>
> 補足すると、引数のlngKojogoは、社会保険料等控除後の給料額です。
>
> 以上と未満の幅は、
>控除後給料額が   0〜  99,000のとき、1000円幅、
>        99,000〜 221,000のとき、2000円幅、
>       221,000〜1,010,000のとき、3000円幅
>ですが、変数lngHasuは、この幅に満たない端数のことです。
>
> 社会保険料等控除後の給料額からこの端数を引けば、
>所得率表テーブルの「以上」フィールドの値になるはずです。
>
> 返り値は、所得率表テーブルの「以上」フィールドの数値です。
>
> Else以下、つまり、社会保険料控除後の給料額が101万円以上の場合も
>書こうかと思ったのですが、力尽きました。

お返事有難うございます
貴重なソース有難う御座います
やはり基本ベースは所得率表テーブルだと思っております

年1度の更新時期に所得率表テーブルを使用者が変更した時に
対応できるようにしたい為です。

どうにかなりませんか?
・ツリー全体表示

26 / 500 ページ ←次へ | 前へ→
ページ:  ┃  記事番号:
1078222
(SS)C-BOARD v3.8 is Free