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

     

リストへもどる

投稿記事の一括表示

タイトル抽出条件について
記事No171971
投稿日: 2017/07/30(Sun) 03:39
投稿者トイ
解決済: ON
OS:10
Access Version:2016

よろしくお願いします。
「取引先」と「取引内容」というテーブルがあって取引先名でリンクしたクエリーを作成しています。
これの抽出条件について教えてください。

取引先テーブル→取引先名、締日
取引内容→取引先名、日付、内容

もし、締日が"月末"だったら日付が01日から31日までの内容を
もし、締日が"25日"だったら日付が26日から25日までの内容を抽出したいのですが
一つのクエリで可能ですか?
よろしくお願いします。

タイトルRe: 抽出条件について
記事No171973
投稿日: 2017/07/30(Sun) 16:21
投稿者トイ
解決済: ON
クエリで作成するやり方がわからなかったので、試行錯誤でコード作成してみました。
わからない文を教えてください!

レポート作成フォームにある「年月」と「取引先名」をキーに
「T05_取引先」テーブルの情報でレポート出力用の抽出条件を設定したいです。

このコードはレポート作成フォームの請求書作成コマンドクリック時のイベントに入力しています。


varfilter = " 取引先名 = " & "'" & Me.取引先名.Column(0) & "'"


If (DLookup("締日", "T05_取引先", varfilter)) = "月末" Then
varfilter2 = varfilter & " AND format(日付,"yyyy/mm") = " & " & Me.年月 & ""

'※この部分の演算子の使い方を教えてください。
当フォームの年月にあたるレコードを抽出したいです。


ElseIf (DLookup("締日", "T05_取引先", varfilter)) = "25日" Then

'※25日だった場合は、当フォームの年月にある前月の26日からのレコードを抽出したいです。
例えば年月が2017/07であった場合、2017/06/26〜2017/07/25のレコードが欲しいのですが
この条件式の書き方を教わりたいです。

Else
MsgBox "該当する取引がありません。"

End If

DoCmd.OpenReport "R03_請求書", acViewPreview, , varfilter2


説明下手ですが、どうぞご教授のほどよろしくお願いいたします。

タイトルRe: 抽出条件について
記事No171975
投稿日: 2017/07/31(Mon) 15:45
投稿者mayu
解決済: ON
こんにちは。

> もし、締日が"月末"だったら日付が01日から31日までの内容を
> もし、締日が"25日"だったら日付が26日から25日までの内容を抽出したいのですが
> 一つのクエリで可能ですか?

可能ですけど、目的を達成するためには
テーブル設計の見直しが必要になります。

設計のポイントは、{ 取引先 }テーブルのフィールド構成で

締日のデータ型は、文字列型ではなく 数値型にして
締日が月末の場合は 0、
それ以外の日であれば そのままの数値( 日の部分 )を入力します。
以下、サンプル。


■ テーブル定義

CREATE TABLE 取引先
(
      cli_id    INT           NOT NULL PRIMARY KEY
    , 取引先名  VARCHAR( 50 ) NOT NULL
    , 締日      SMALLINT      NOT NULL 
);


▼ { 取引先 }データ例

-------------------------------
 cli_id  取引先名   締日
-------------------------------
 1     A社     0
 2     B社     25
 3     C社     15
 4     D社     20


■ テーブル定義

CREATE TABLE 取引内容
(
      rid       AUTOINCREMENT   NOT NULL PRIMARY KEY
    , cli_id    INT             NOT NULL
    , 日付      DATETIME        NOT NULL
    , 内容      VARCHAR( 255 )
);


▼ { 取引内容 }データ例

---------------------------------------
 rid  cli_id    日付   内容
---------------------------------------
 1    1   2017/06/10   ?
 2    1   2017/06/15   〇
 3    1   2017/06/30   ▽
 4    1   2017/07/01   @
 5    1   2017/07/31   ×
---------------------------------------
 6    2   2017/06/20   *
 7    2   2017/06/25   ●
 8    2   2017/06/26   △
 9    2   2017/07/01   @
 10    2   2017/07/31   +
---------------------------------------
 11    3   2017/06/13   =
 12    3   2017/06/15   +
 13    3   2017/06/18   ?
 14    3   2017/07/11   ▲
---------------------------------------
 15    4   2017/06/19   〇
 16    4   2017/06/20   *
 17    4   2017/06/21   ?
 18    4   2017/07/20   %
 19    4   2017/07/21   #


■ SQL
-----------------------------------------------

SELECT y.rid
     , x.cli_id
     , x.取引先名
     , Format$( x.締日, '#;#;月末;' ) As 締日
     , y.日付
     , DateSerial(
             Year( y.日付 - x.締日 )
           , Month( y.日付 - x.締日 )
           , 1
       ) As 取引年月
     , y.内容
FROM       取引先   x
INNER JOIN 取引内容 y
        ON x.cli_id = y.cli_id
ORDER BY y.rid ;

-----------------------------------------------


■ 結果

----------------------------------------------------------------------------
 rid  cli_id  取引先名  締日    日付     取引年月   内容
----------------------------------------------------------------------------
 1   1     A社    月末   2017/06/10   2017/06/01   ?
 2   1     A社    月末   2017/06/15   2017/06/01   〇
 3   1     A社    月末   2017/06/30   2017/06/01   ▽
 4   1     A社    月末   2017/07/01   2017/07/01   @
 5   1     A社    月末   2017/07/31   2017/07/01   ×
----------------------------------------------------------------------------
 6   2     B社    25    2017/06/20   2017/05/01   *
 7   2     B社    25    2017/06/25   2017/05/01   ●
 8   2     B社    25    2017/06/26   2017/06/01   △
 9   2     B社    25    2017/07/01   2017/06/01   @
 10   2     B社    25    2017/07/31   2017/07/01   +
----------------------------------------------------------------------------
 11   3     C社    15    2017/06/13   2017/05/01   =
 12   3     C社    15    2017/06/15   2017/05/01   +
 13   3     C社    15    2017/06/18   2017/06/01   ?
 14   3     C社    15    2017/07/11   2017/06/01   ▲
----------------------------------------------------------------------------
 15   4     D社    20    2017/06/19   2017/05/01   〇
 16   4     D社    20    2017/06/20   2017/05/01   *
 17   4     D社    20    2017/06/21   2017/06/01   ?
 18   4     D社    20    2017/07/20   2017/06/01   %
 19   4     D社    20    2017/07/21   2017/07/01   #


ご覧のように、SQL( クエリ )内での演算フィールド「 取引年月 」が
1ヶ月単位の値になりますから、
ここに 任意の抽出条件を設定すればよろしいでしょう。

タイトルRe^2: 抽出条件について
記事No171976
投稿日: 2017/07/31(Mon) 21:19
投稿者トイ
解決済: ON
ありがとうございます!
目から鱗です(>_<)
早速やってみます!!

取引年月ですが、例えば7月分だと日付が6月26日〜7月25日だとすると
取引年月を1ヶ月足すことになりますか?

タイトルRe^3: 抽出条件について
記事No171977
投稿日: 2017/07/31(Mon) 22:33
投稿者mayu
解決済: ON
> 取引年月ですが、例えば7月分だと日付が6月26日〜7月25日だとすると
> 取引年月を1ヶ月足すことになりますか?

0 以外の締日であれば、1ヶ月後ろにずらす
ということでも実現は可能ですけど
要は、締日を境にして 年月を同一にできればいいわけですから
-----------------------------------------------------

SELECT y.rid
     , x.cli_id
     , x.取引先名
     , Format$( x.締日, '#;#;月末;' ) As 締日
     , y.日付
     , DateSerial(
             Year( y.日付 - x.締日 )
           , Month( y.日付 - x.締日 ) + 1
           , x.締日
       ) As 取引年月
     , y.内容
FROM       取引先   x
INNER JOIN 取引内容 y
        ON x.cli_id = y.cli_id
ORDER BY y.rid ;

-----------------------------------------------------


■ 結果

----------------------------------------------------------------------------
 rid  cli_id  取引先名  締日    日付     取引年月   内容
----------------------------------------------------------------------------
 1   1     A社    月末   2017/06/10   2017/06/30   ?
 2   1     A社    月末   2017/06/15   2017/06/30   〇
 3   1     A社    月末   2017/06/30   2017/06/30   ▽
 4   1     A社    月末   2017/07/01   2017/07/31   @
 5   1     A社    月末   2017/07/31   2017/07/31   ×
----------------------------------------------------------------------------
 6   2     B社    25    2017/06/20   2017/06/25   *
 7   2     B社    25    2017/06/25   2017/06/25   ●
 8   2     B社    25    2017/06/26   2017/07/25   △
 9   2     B社    25    2017/07/01   2017/07/25   @
 10   2     B社    25    2017/07/31   2017/08/25   +
----------------------------------------------------------------------------
 11   3     C社    15    2017/06/13   2017/06/15   =
 12   3     C社    15    2017/06/15   2017/06/15   +
 13   3     C社    15    2017/06/18   2017/07/15   ?
 14   3     C社    15    2017/07/11   2017/07/15   ▲
----------------------------------------------------------------------------
 15   4     D社    20    2017/06/19   2017/06/20   〇
 16   4     D社    20    2017/06/20   2017/06/20   *
 17   4     D社    20    2017/06/21   2017/07/20   ?
 18   4     D社    20    2017/07/20   2017/07/20   %
 19   4     D社    20    2017/07/21   2017/08/20   #


これでいかがでしょう。

タイトルRe^4: 抽出条件について
記事No171978
投稿日: 2017/08/01(Tue) 16:28
投稿者トイ
解決済: ON
> これでいかがでしょう。

やりたいことがばっちりできました。
大変身になりました。ありがとうございました!

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

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