<HOME  <お願い事項   <Access2002 TOP   <Access97 TOP   <サイト内検索
 MS-Access2000超入門部屋--「今月のデータ」だけ取り出したい



■「今月のデータ」だけ取り出したい 2/2

前のページの続きです。
んじゃもうひとつ・・・。

必ずしも「今月」ってわけじゃなくて、「先月の16日から今月の15日までのデータを取りたい」とかいう場合、どうしたらいいんでしょう。
ここからが、いろいろ考えなくちゃいけないとこなんですけど・・・。これって、結構難しいんです。だから、ってわけじゃないんですが・・・。
選択肢は3つあると考えてください。

ひとつは、毎月自分でクエリを書き換える、ってことです。
まあ、月のところを変えてやればいいと思うんで、手間といってもホンのヒト手間。マンスリーの報告書とかなら、これくらいはいいかな、っていう場合もあると思います。

いちいちクエリのデザインを開いて値を書き換えるのが面倒、あるいはそういう技術を持ち合わせていない人たちも使うから・・・という場合なら・・・。
ふたつめの方法として、「パラメータクエリ」という機能を利用するといいかもしれません。わたしはコレ、あんまり好きじゃなくてほとんど使わないんですけど(別に理由はないんですがなんとなく)・・・コレ使ってみてもいいですね。

たとえば、日付のとこに、半角のカギカッコで適当な言葉を入れておきます。
実在するフィールド名とかテーブル名とかは避けて、まあ、なんかセリフっぽいのがいいかもしれないですね。

で、クエリを実行すると・・・。こんなダイアログボックスが出てきます。

これはまあ、一種の「クエリを正しく実行できないよ〜というエラー」みたいなもんなんですけど、[開始日は?]なんていうフィールド名とかテーブル名が見当たらないので、これはなあに?とAccessが聞き返してくるんです。それを利用しちゃってるって感じですね。

で、日付を、日付の書式にのっとって入力して、OKすると・・・。これがそのままこのクエリの「抽出条件」として使われるんです。

今はこれは「イコールのもの」って条件の書き方になるんで、同じ日付のものだけ表示されました。

不等号などを組み合わせてやれば、

パラメータの入力のボックスに入力した「開始日」より後のデータだけ取り出すことができますね。

これをうまく活用して

と、してやると・・・。二回、パラメータの入力画面が出てきます。

これで、範囲を指定してやることができますよね。




でもこれを、「今月の」と固定するとなると・・・。3つめの方法です。常に「先月の16日から今月の15日までのレコードを抽出する」ように、クエリを手直ししたり、その都度範囲指定するための値の入力をしたりしなくても、なーんにもしなくても自動的に範囲指定されるようなクエリにするためには・・・???
いろいろやってみましょうか。まずは・・・よく使われるFormat関数をうまく使って工夫してみましょう。

Format(Date(),"yyyy/mm") & "/1"

こんなふうに抽出条件に入力すると、どうなるでしょう。Format関数を使って、年と月の部分だけ作って、うしろに/1って文字をくっつけてみました。

今日がもし、8月24日なら、 2000/08/1
っていう値が出来上がることになります。小技ですけど、/1っていうのをダブルコーテーションで囲んで、&でつなげてます。

2000/08/01のデータだけ、うまいこととってきてくれますよね。ふーう。なんだか綱渡りみたいな作業が続きますけど、さらに応用して、

こーんな長いのを書いてやります。
じっくり観察してみてください。長いですけど、単に、Between andを使って、ふたつの日付の範囲を指定しているんですよ。

Between Format(Date(),"yyyy/mm") & "/1" And Format(Date(),"yyyy/mm") & "/15"

これで、「今月の1日から15日までのデータ」という出し方が可能なんです。




でも、これって、「今月」の1日と15日のことですよね。
「先月の16日から」「今月の15日まで」って・・・。どうすればいいんでしょう。ポイントは「先月の」ってとこですね。

イメージとしては「今月の月の部分-1」が、先月になると思うんですね。
普通の処理ならなんとかなると思うんですけど、問題は年末ですかねぇ・・・。
多分、1月にこの処理やったとしたら・・・1から1引いて、0月16日から1月15日までのデータ、とか探しちゃうんじゃないでしょうか。
んじゃあ・・・。どうすれば???
んではこうしてはどうでしょう。

Between Format(Date()-30,"yyyy/mm") & "/15" And Format(Date(),"yyyy/mm") & "/15"

そう、Date関数でとってきた今日の日付からだいたい30引けば先月のことになるんじゃないでしょうか・・・という大雑把な考え方で、「先月」を表現してみました。

わかりにくいので、データシートビューの「並べ替え」ボタンを使って一時的に並べ替えて確認してみますと、まあ、なんとか引っかかってきてるようです。
しかし・・・。1ヶ月は必ずしも「30日」とは限らないですよね.

たとえば、8月31日にこのクエリを開いたとしたら、開始日はFormat(2000/8/31-30),yyyy/mm”) & “/15”・・・。
8月31日から30引いたら・・・8月1日ですよね。
「先月」になってないんです。
じゃあ、31引くか?というと・・・。今度、7月1日にこのクエリを開いたとき、「先月」にあたる6月は30日までだから、7月1日から31日引いたら5月31日になっちゃいますよね。引きすぎ。。。

とすると、まず今日が「何月なのか」によって、引く数を変えたりしないとならないの???げ。。。って思いません?
やりようはあると思いますが、なんかとっても難しいような気がしますけど・・・。

要するに、ここまで時間と労力をかけて作りこむ必要があるのかどうか、ってことを、いろいろ考えなくちゃならないと思うんです。
皆さんはどんなふうにお考えになりますか?
先月、先月・・・。うーん、どうしたらいいんでしょう・・・。




マイクロソフトのサイトに、88657 - [AC97]日付/時刻の値を計算し、表示する関数 っていうのが載ってました。これ、使えないですかねぇ。

前月の・・・っていうトコ、ありましたよね。DateSerial関数っていうのをうまく使えばなんかできそうな気がします。
この関数は、とある日付を、「年」と「月」と「日」の3つのパーツに分けて指定する関数です。

DateSerial(year, month, day)

ってなります。つまり・・・。
DateSerial(1999, 12, 31)
で、この関数が返してくる値は1999/12/31なんですね。だからなんやねーんって感じの関数ですけど、これを使えば何とかできるかもしれませんぞ。



YearとMonthのとこに、Date関数を使ってやれば。。。
年、月の部分を取り出すには、Format関数というのをご紹介しましたよね。

でも、「年」とはっきり目的がわかってるのであれば、Year関数Month関数Day関数ってのが便利ですよ。

指定した日付から、指定した個所(日付時刻型のフィールドは、スラッシュなどの記号で区切られていくつかのパートに分かれてますからね)だけ取り出してくるときによく使います。

いちおう、DateSerial関数、Year関数、Month関数、Day関数、それぞれ後でヘルプを見て構文の書き方とか確認しておいてくださいね。

DateSerial(Year(Date()),Month(Date())-1,16)

とすることで、今年の先月の16日、という意味になりはしませんか???ね。なるでしょう?

そしたら・・・。

Between DateSerial(Year(Date()),Month(Date())-1,15) And DateSerial(Year(Date()),Month(Date()),15)

ナイル川のように長い抽出条件になっちゃいましたけど、多分これでなんとかいけると思いますよ。



(オシマイ)