dポイントプレゼントキャンペーン実施中!

Ac2000です。

T_マスタというテーブルに
名前や所属の課、年度などが入っています。

このTマスタから検索する検索フォームがあります。
検索ボタンがいくつかあり、
年度を検索するようにテキストボックスがあります。

年度テキストボックスにいれた年度で検索しつつ、
押した検索ボタンによって検索する方法はどのようにしたらよいでしょうか?

Ex.検索ボタンには所属の課などがかいてあり、「総務」「営業」などどかいてあります。



ソースはこんな感じです。
------------------------------
Dim SQL As String
Dim WhereCond As String
Dim condNendo As String

'年度
If Me!年度.Value <> "" Then
condNendo = "(T_マスタテーブル.年度 = " & CLng(Me!年度.Value) & ")"
WhereCond = WhereCond & " AND " & condNendo
End If

WhereCond = Mid(WhereCond, 6)

DoCmd.OpenReport "R_マスタ_一覧", acPreview, , WhereCond


End Sub

A 回答 (5件)

こんにちは。

maruru01です。

[Tマスタ]テーブルが人を管理するためのテーブルである以上、同じ人を2重に登録するのは都合が悪いと思います。
手としては、所属フィールドを複数にする(1つ目の所属が営業部、2つ目が総務部という風に入力する)
あとは、所属欄に、"営業部・総務部"と入力して、検索では、"*総務部*"という風に前後にワイルドカードを置くという方法です。
どちらにせよ面倒ですが。

この回答への補足

すいません。

印刷用のテーブルを作成することにしました。
長々とありがとうございました。

関数のつくり方覚えてまたひとつAccessが便利になりました♪

補足日時:2002/08/06 17:19
    • good
    • 0
この回答へのお礼

回答ありがとうございます。

フィールドを増やして
「所属グループ」「所属グループ2」「所属グループ3」・・・「所属グループまとめ」([所属グループ]&[所属グループ2]・・・となってます。)
としました。

ここで新たな問題なのですが、

今までは「T_マスタ」に「ID」「氏名」「所属」「所属グループ」などを入力していたのですが、
これからは「T_マスタ」には「ID」だけを入力し、
他は「T_社員一覧」にまとめて管理することになりました。
「T_社員一覧」は「ID」「氏名」「所属」「所属グループ」「所属グループ1」「所属グループ2」・・・「所属グループまとめ」
となっています。

教えていただいた関数の
If Me!年度.Value <> "" Then
cond = "(T_社員一覧.所属グループまとめ = '" & Syozoku & "') AND " & _
"(T_マスタテーブル.年度 = " & CLng(Me!年度.Value) & ")"
DoCmd.OpenReport "R_マスタ_一覧", acPreview, , cond

の部分を変えてみたのですが、
(「T_マスタテーブル.所属課」>「T_社員一覧.所属グループまとめ」)
これではうまく作動しませんでした。

これを回避する方法というのはあるのでしょうか?

いきなり方向転換してしまって申し訳ありませんが、よろしくお願いいたします。

お礼日時:2002/08/06 16:37

コマンドボタン名は、"部"ですか。



もちろん、"*"を使用したあいまい検索は出来ます。
例)
cond = "(T_マスタテーブル.所属課 LIKE '" & Shozoku & "*') AND " & _
    "(T_マスタテーブル.年度 = " & CLng(Me!年度.Value) & ")"

でもこれだと、総務部の庶務課や経理課は拾えません(あたり前ですが)。
なので、レコード数がいくつあるか分かりませんが、[T_マスタ]テーブルに、[所属部]フィールドを作った方がいいと思います。
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
やはりこんなふうにグループ分け用の所属をつくらなくちゃだめですよね。
今それをつくっているのですが、問題が出てきました。

たとえば、「営業部」の中に「営業1課」「営業2課」の人たちが入るとします。
そして「総務部」の中に「庶務課」「経理課」「営業1課」の人たちが入るとします。
「営業1課」の人たちが「営業部」と「総務部」の両方に入ることになるんです。
こうなると、教えていただいた

myOpenReport "**課"

という方法だと1つしかダメですよね?

営業2課 → 営業部
庶務課 → 総務部
経理課 → 総務部
とすればそれぞれはわけられますが、この場合「営業1課」は
どのようにグループ分けすればいいのかわかりません。
同じひとたちを2回入力するわけにいかないし。。。

何かいいアイディアないでしょうか?

申し訳ありませんが、よろしくお願いします。

お礼日時:2002/08/05 14:46

>「検索フォームのコードモジュール」ってどこでしょうか?



コマンドボタンのクリックイベントなどが書かれてある"白い紙"です。
これをモジュール、またはコードモジュールといいます。
モジュールは、フォーム(またはレポート)ごとに1枚ずつあります。
このモジュールに記述された関数は、このフォームが開いている間、このフォーム上でのみ使用出来ます。
また、どのフォームとも関係ない"標準モジュール"というのがあります。
ここにPublic(Privateのかわりに)で関数を書けば、どのフォーム上でも使用出来ます。
ちなみに、各イベントのコードは、そのコントロール(コマンドボタン)が配置されているフォームのモジュールにしか記述出来ません。

回答の補足がよくわかりません。
質問の文意から、ユーザーが入力する年度と、ある特定の所属の両方に当てはまるレコードを抽出してレポートに出すと思ったんですが。
"ひとつのボタンで複数の所属を出す"とは?
    • good
    • 0
この回答へのお礼

回答ありがとうございます。

>回答の補足がよくわかりません。
>質問の文意から、ユーザーが入力する年度と、ある特定の所属の両方に当てはまるレコードを抽出してレポートに出すと思ったんですが。

はい、その通りです。

>"ひとつのボタンで複数の所属を出す"とは?

たとえば「総務」というボタンを押したときには、
「総務課」「庶務課」「経理課」などが抽出される。
「営業」というボタンを押した時には、
「営業1課」「営業2課」などが抽出される、という意味です。
おわかりいただけたでしょうか?




教えていただいたコードで試したら条件がひとつだけ、でしたら無事できました。
上記にかいたように、複数検索、そしてあいまい検索(総務部・総務課を「総務*」で検索できる、みたいな
感じで)ができれば教えてください。よろしくお願いします。

お礼日時:2002/08/02 18:22

再びmaruru01です。



myOpenReport関数を次のように書き換えます。

Private Sub myOpenReport(Shozoku As String)

  Dim cond As String

  If Me!年度.Value <> "" Then
    If Shozoku = "なし" Then
      cond = "T_マスタテーブル.年度 = " & CLng(Me!年度.Value)
    Else
      cond = "(T_マスタテーブル.所属課 = '" & Shozoku & "') AND " & _
         "(T_マスタテーブル.年度 = " & CLng(Me!年度.Value) & ")"
    End If
    DoCmd.OpenReport "R_マスタ_一覧", acPreview, , cond
  Else
    MsgBox "年度を入力して下さい。"
  End If

End Sub

(ただの)[検索]ボタンのクリックイベントには

  myOpenReport "なし"

それ以外の所属(例えば営業)の付いたボタンのクリックイベントには

  myOpenReport "営業"

これでいけると思いますが。

この回答への補足

クエリで出す際のSQLです。
(ひとつのボタンで複数の所属を出すことがあるので。。。)

SELECT T_マスタテーブル.年度, T_マスタテーブル.時期, T_マスタテーブル.社員番号, T_マスタテーブル.社員氏名,・・・
FROM T_マスタテーブル
WHERE (((T_マスタテーブル.所属) Like "購買*" Or (T_マスタテーブル.所属) Like "生産管理*" Or (T_マスタテーブル.所属) Like "業務*"));

補足日時:2002/08/02 17:37
    • good
    • 0
この回答へのお礼

何度もありがとうございます。

すいませんがわからないことがあるのでよろしくお願いします。

>検索フォームのコードモジュールの適当な場所・・・

「検索フォームのコードモジュール」ってどこでしょうか?

よろしくお願いします。

お礼日時:2002/08/02 17:35

こんにちは。

maruru01です。

検索フォームのコードモジュールの適当な場所(一番下とか)に次の関数を自作します。

Private Sub myOpenReport(Shozoku As String)

  Dim cond As String

  If Me!年度.Value <> "" Then
    cond = "(T_マスタテーブル.所属課 = '" & Shozoku & "') AND " & _
       "(T_マスタテーブル.年度 = " & CLng(Me!年度.Value) & ")"
    DoCmd.OpenReport "R_マスタ_一覧", acPreview, , cond
  Else
    MsgBox "年度を入力して下さい。"
  End If

End Sub

各コマンドボタンのクリックイベントに以下のコードを記述します。
([cmd営業]ボタンの場合)

Private Sub cmd営業_Click()

  myOpenReport "営業"

End Sub
    • good
    • 0
この回答へのお礼

いつもいつもお世話になります。

ちょっと描き方が悪かったようですね(--;

検索ボタンは「(ただの)検索」(←通常使う検索ボタンです。)「営業」「経理」・・・
とあり、「営業」を押した時は、検索フォームに入力された年度を検索しつつ、マスタの
「営業」を検索して、レポートに表示させたいのです。
ただ、所属の箇所に「営業」と入力しなくても、ボタンを押したら「営業」を検索したことと
同じ結果が出せるようにしたいのです。

また、レポートはどの所属を検索しても同じレポートを使おうと思っています。
(検索ごとに条件は変わるけど、レポートは変わらないということです。)

説明が下手ですいません。
よろしくお願いします。

# もし勘違いをしていたらすいません。

お礼日時:2002/08/02 16:52

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!