Microsoft Access 掲示板

views
4 フォロー
6,283 件中 5,761 から 5,800 までを表示しています。
6
hatena 2019/10/21 (月) 17:15:13 修正

インデントでいいのなら、通常のコンボボックスで、先頭に空白をいれればいいように思います。

例えば、リストのもとになるテーブル設計を下記のようにしておいて、

テーブル1

IDアイテム階層
1親アイテム10
2子アイテム11
3孫アイテム12
4親アイテム10
 
コンボボックスの値集合ソースを下記のように設定
SELECT ID, Space(階層) & アイテム FROM テーブル1 ORDER BY ID;

さらに下記のように設定すれば、

連結列:1

列数:2

列幅:0cm

疑似階層表示になると思います。

5
チョコ 2019/10/21 (月) 16:31:48 f6d67@dab18

あ、階層表示といっても、インデント!?というのでしょうか、
それが設定出来るので、疑似階層表示といえば良いのかも知れません。

4
チョコ 2019/10/21 (月) 16:29:47 f6d67@dab18

やはりそうですか。
コードが短く済むのでいいかなと思ったのですが、
見たところリスト行数の設定も難しそうですし、
keyの設定も、数字を文字列(全角にしても)に変換してもエラーが出ますし…

TreeViewコントロールで実装する事にします。
ありがとうございました。

3

イメージコンボボックスって階層表示に対応してるんですか?

階層表示するなら、自分なら、TreeViewコントロールをボタンのクリックで表示/非表示させる方針で行くかな?

Office TANAKA - TreeViewコントロールの使い方

2
チョコ 2019/10/21 (月) 14:37:53 f6d67@dab18

返信ありがとうございます。
階層表示にしたいのでイメージコンボボックスをと考えていました。
色々とググったのですが、詳細が記載されているところが見当たらなくて。

1

イメージコンボボックスは使ったことがないのでご質問に回答できないですが、

ちなみに、画像は使用しなで使おうと考えています。

普通のコンボボックスではダメなんですか?

3

hatenaさま、返信ありがとうございます。

日が変わり脳みそがリセットされたら、解決いたしました。

>一時テーブルへデータをエクスポートするときの抽出条件はどこでどのように設定してますか。

抽出条件に関する「W.回数=T.回数」について、
DELETEのSQLでの記載箇所“どこで”を誤っておりました。
EXSITSの中でこねくり回してしまっておりました。
下記のとおり書いたらうまく動作しました。

DELETE FROM T_受講受付 AS T
WHERE W.回数=T.回数 and NOT EXSITS (SELECT * FROM W_受講受付 AS T WHERE W.申込者=T.申込者)

どうもお騒がせいたしました。

もう不要ではありますが、うまく動作している方のSQLは下記のとおりとしておりました。
(実際のテーブルのフィールドは多いのでstrとしています。)

UPDATE T
INNER JOIN W
ON T.回数=W.回数
SET  & strフィールド &
WHERE T.回数= str抽出した回数

INSERT INTO T ( & strフィールド & )
SELECT & strフィールド &
FROM W

ありがとうございました。
今後ともよろしくお願いいたしますm(__)m

2

とりあえず画像ファイルからの想像ですが、
一時テーブル以外のレコードがすべて削除されているようですね。

データを一時テーブルへ転送するときに、元テーブルに何らかの抽出条件を設定しているはずです。
削除クエリにも、同じ抽出条件を設定しないと、そのような結果になりますね。

1
hatena 2019/10/16 (水) 12:09:44 修正

T_受講受付 の主キー設定を提示してください。

INSERT・ UPDATEは上手くいくのですが

そのうまくいっているSQLを提示してください。

あと、一時テーブルへデータをエクスポートするときの抽出条件はどこでどのように設定してますか。

3

レポートのプレビューに[印刷][閉じる]ボタンを付加する関数を下記で紹介していますので、
よろしかったらご参考に。

印刷プレビューに[印刷][閉じる]ボタンを付加する関数-改良版
以前の記事 印刷プレビューに[印刷][閉じる]ボタンを付加するOpenReport互換関数 - hatena chips の改良版です。 上記の関数は、複数のプレビューを同時に開いたとき、最後に開いたものだけしか[印刷][閉じる]ボタンが付加されません。前に開いていたものからはボタンが消えてしまいます。これを改良して、複数のプレビューにもそれぞれ[印刷][閉じる]ボタンが付加されるようにしました。 また、レポートの開くときイ...
fc2

1
Kitty 2019/10/15 (火) 13:55:26 e4054@a3086

すみません!解決しました

2
Kitty 2019/10/14 (月) 10:20:12 e4054@a3086

ありがとうございました。
ポップアップする方法参考にさせていただきます。

1
hiroton 2019/10/10 (木) 18:36:59 96775@f966d

ちょっと調べてみましたがメニューバーを表示する場合「ファイル」だけは非表示にできないような感じでした。
「ファイル」の中のメニューは好きに弄れるようです。(「閉じる」を非表示にしたりとか)
Access 2016 のリボンをカスタマイズする

「印刷」だけをさせたいなら右クリックのショートカットメニューをカスタマイズするとか、自分の場合はよく、[印刷]と[閉じる]のボタンだけを置いたフォームをポップアップに設定しておいて、レポートを「印刷プレビュー」で開くと同時にフォームを開くようなものを作ります。

2
tokinaito 2019/10/08 (火) 11:15:19 bb5c2@5f550

hatena様大変有り難うございました。
考え方としては次の通りでよろしいんでしょうか?

Public Function 月初(申請日 As Variant) As Variant
    If IsNull(申請日) Then Exit Function
'申請日がNULLなら関数は終わり
    月初 = DateSerial(Year([申請日]), Month([申請日]) + 1, 1)
'月初めが出る
    Do
        Select Case Weekday(月初)
        Case vbMonday To vbFriday
            If IsNull(DLookup("祝日名", "T_祝日", "日付=#" & 許可日 & "#")) Then
                Exit Do
            End If
        End Select
        月初 = 月初 + 1
    Loop
'  月初めが月曜から金曜の間で祝祭日がNULLならD0文が修了。土日はNULLじゃないから終了しない
  終了するまで月初に1日プラスする。
End Function

2

hatena様
閲覧してくださった皆様
有難う御座います

>レポートでなら、「分類」テキストボックスの「重複データ表示」プロパティを「はい」にしておけばいいでしょう
此方でレポートが無事に完成できました
有難う御座います

こんなに設定事項があるんですね
驚きました
時間を作って弄ってみます

重ねてアドバイス有難う御座いました

1

レポートでなら、「分類」テキストボックスの「重複データ表示」プロパティを「はい」にしておけばいいでしょう。

2

hatena 様

いつもありがとうございます。
正常に動作できるようになりました。
難しいですが理解できるように勉強致します。

1

下記でどうでしょうか。

Public Function 月初(申請日 As Variant) As Variant

    If IsNull(申請日) Then Exit Function

    月初 = DateSerial(Year([申請日]),Month([申請日])+1,1)

    Do 
        Select Case Weekday(月初)
        Case vbMonday To vbFriday
            If IsNull(DLookup("祝日名", "T_祝日", "日付=#" & 許可日 & "#")) Then
                Exit Do
            End If
        End Select
        月初 = 月初 + 1
    Loop 
End Function
1

親子関係でもできますが、集計等が複雑になるのでそこまですることはないと思います。

また、現状の割増等のフィールドを持たせる方法もあまりいい方法とはいえないと思います。
夜間割増以外にも、その他の割増とか割引とか増えてきたりするとその都度テーブル、クエリ、フォーム、レポートの修正が発生します。集計も複雑になります。

単純に「割増」というレコードを追加するのが一番シンプルだと思います。

日付 項目名 料金

○月○日 作業A 10000
○月○日 夜間割増 5000

1

DLookup の第3引数は抽出条件式を文字列として設定します。
現状は、 "文字列" AND "文字列"となってますので、文字列に対する論理演算になり常にFalseになります。
AND は""の中にいれてください。

次に、[テキスト2]が""内に入ってますので、これは単なる"[テキスト2]"という文字列になります。[テキスト2]コントロールを参照するには""の外に出す必要があります。

  Me.テキスト4 = DLookup("[金額]", "クエリ1", "[月]='" & Me.テキスト2 & "' And [学年]='" & Me.テキスト0 & "'")

これで例えばテキスト2が「4月」、テキスト0が「5~6年」なら、第3引数は下記のような条件式として正しい文字列になります。
[月]='4月' And [学年]='5~6年'

5
tokinaito 2019/10/03 (木) 13:38:21 bb5c2@5f550

hirotonさんTMGさん希望するかっこいい式です。
ありがとうございました。
また朱色さん参考にさせていただきます。
ありがとうございました。

4
朱色 2019/10/02 (水) 20:00:16 修正 db0eb@fd0af

9月に軽で再申請した市内、10月に普通で再申請した市内のパターンが抜けてる気がしまうが...ともかく。
テーブル構造を変えたくないのであれば以下でどうでしょうか。

Public Function tesuuryou(申請日, 普軽別, 再申請, 自社)
    tesuuryou = Null
    If IsNull(申請日) Then Exit Function
 
    If 再申請 = True or 自社 = 1 Then
        tesuuryou = 1000
    ElseIf 普軽別 = "普" Then
        tesuuryou = 3000
    ElseIf 普軽別 = "軽" Then
        tesuuryou = 2000
    End If

    If 申請日 <= #9/30/2019# Then
        tesuuryou = Int(tesuuryou * 1.08)
    ElseIf 申請日 >= #10/1/2019# 
        tesuuryou = Int(tesuuryou * 1.10)
    End If

End Function

※1円誤差とかその辺は全然考えてないです
※Intでいいんでしたっけ・・・

自分はプログラムの中に固定数値入れるな、と教わったので、
ほんというと手数料自体別テーブルに持って引っ張ったほうがいいんじゃないかと思うし、
消費税テーブルも作ったほうが、いいと思ってます。
手数料の変更や消費税がまた変わったなどの場合に、テーブル数値変えれば対応できますので。

3
TMG 2019/10/02 (水) 17:15:38 修正 68cd1@2b788

hirotonさんのを参考にしますと、
消費税テーブルに税率の開始日をそれぞれ用意しておくことで対応できると思いますよ。

開始日税率
1989/04/013
1997/04/015
2014/04/018
2019/10/0110

もし申請日が2019年9月30日の場合には、

開始日 = DMax("開始日", "消費税", "開始日<=#" & 起算日 & "#")

により開始日は「2014/04/01」を取得することができ、

消費税 = Nz(DLookup("税率", "消費税", "開始日=#" & 開始日 & "#"), 0) / 100

この部分で消費税8%を取得することができます。

2
tokinaito 2019/10/02 (水) 15:39:32 bb5c2@5f550

hirotonさんさっそくご教示ありがとうございます。
なるほどですね。増税分はばっちり対応するようですね。
じつは9月30日以前の8%分も同じデータとして共存しなければなりません。
その場合は8%分の関数を作ってIIFで分けて使うのでしょうか。
ご教示お願いします。

1
hiroton 2019/10/02 (水) 11:38:25 b74fc@f966d

単純にtesuuryou = 基本料金 * 消費税の形のほうが分かりやすいのでは?
後は、せっかくACCESSを使っているのでデータはテーブルへ
・手数料テーブル(普軽別、再申請、自社、手数料)
・消費税テーブル(開始日、税率)

Function 消費税(起算日 As Date)
    Dim 開始日 As Variant
    開始日 = DMax("開始日", "消費税", "開始日<=#" & 起算日 & "#")
    If IsNull(開始日) Then
        消費税 = 0
    Else
        消費税 = Nz(DLookup("税率", "消費税", "開始日=#" & 開始日 & "#"), 0) / 100
    End If
End Function

車庫証明申請代行手数料 = DLookup("手数料", "手数料", "普軽別='" & 普軽別 & "' And 再申請=" & 再申請 & " And 自社=" & 自社) * (1 + 消費税(申請日))

手数料テーブルの「手数料」は税抜き、消費税テーブルの「税率」は税率部分を整数入力想定です。(消費税10%なら整数で10)

3
tokinaito 2019/09/30 (月) 13:27:47 bb5c2@5f550

返事が遅くなり申し訳ありません。おかげさまで希望通りの
結果が得られました。TMGさんhatenさん大変有り難うございました。
hatena様の関数式いつもかっこいいですね。ただどうしてこの関数で
こうなるのかというのを今後勉強していきたいと思います。

7
hiroton 2019/09/28 (土) 16:05:49 5a376@f966d

腰を据えてパソコンの前に座る時間が取れずだいぶ遅くなってしまいましたが返答を入れます。
リストボックスについての話はありません。かなり基礎的な内容です。

今回の案件で考えるべきは

  1. 入力(複数選択が可能なリストボックスの使い方)
  2. 出力(Me.Filterに設定する値)
  3. コードの書き方

と3つあり、それぞれの影響はあまり大きくありません。色々試したということですが質問に記載のコードは前回の質問で完成したままで、試した内容がわかりません。
解決策としてはhatenaさん提示の通りという簡単なものですが、どのようなアプローチで無理な事を考えているに至ったのがわからないので「質問丸投げ、コードコピペ、次への応用ができない」という不安がでます。
この部分の確認が>> 1の質問でした。


ということで、不安になりそうなところを上げておきます。

別々な条件をすべて抽出
何となく理解しているだろうことは見えますが、Orで抽出できます。例えば1月、2月、3月を抽出したいとなると"月 = 1 Or 月 = 2 Or 月 = 3"となります。テキストボックスを使って「1 2 3」の入力があるなら

"月 = " & Replace(Me.複数月検索, " ", " Or 月 = ")

なんて形になるでしょう。
ただし、実践上は他の条件との兼ね合いがあるので(And Orの優先順位を考慮すると"And (月 = 1 Or 月 = 2 Or 月 = 3)"がほしい)

If Not IsNull(Me.複数月検索) Then
  strFilter = strFilter & " And (月 = " & Replace(Me.複数月検索, " ", " Or 月 = ") & ")"
End If

>> 2のコードはもう少しというところですね。
(BuildCriteriaを使う方法は不正解ではないですが、今回そこまで難しく考える必要はないので特に補足はしません)

最終的なリストボックスのコードはそれ用に独特の内容もありますが、全体の処理の流れは変わりませんし、出力(strfilterの値)も変わりません。(In句を使うかどうかは別問題です。後述)

最終目標はリストボックスを使ってとなりますが、問題を分割して何がわからないのかをもう少し掘り下げておけるとよかったと思います。

In句について
ここでの使い方は複数のOrをまとめたもの。
つまり「" And (月 = 1 Or 月 = 2 Or 月 = 3)"」と「" And 月 In (1,2,3)"」は全く同じ動作をするということになります。
これを表すコード部分で言うと

" AND (月 = " & Replace(Me.複数月検索, " ", " Or 月 = ") & ")"
" AND 月 In (" & Replace(Me.複数月検索, " ", ",") & ")"

はどちらを記述しても全く同じ動作をすることになります。完成形のコードのほうであれば

" AND 月 In (" & Mid(ItmList, 2) & ")"
" AND (月 = " & Replace(Mid(ItmList, 2), ",", " Or 月 = " & ")"

のどちらを書いても同じ結果になります。
In句のほうが読みやすいのが一番のメリットですね。

In句を使っているからと言ってなにも特別なことはないとわかれば>> 4の疑問も理解できると思います。


以上、「全くわからない」を「何がわからないのかわかる」ようにするために問題を切り分けましょうという話でした。

7

hatena 様

ありがとうございました。
思う通り動作できました。

Meでの記述に変更致しました。
たいへん助かりました。

6
hiroton 2019/09/26 (木) 11:58:30 4451d@5a529 >> 3

あぁすみません。そうですね
なんかボケてたみたいです

5
hatena 2019/09/26 (木) 11:25:11 修正

正常に動作しているなら、下記でいいかと。

Private Sub 月割_AfterUpdate()

    If Me.チェック460 = True Then
        Me.月割金額 = DLookup("[金額]", "Q_金額表", "[Q_金額表]![月]=[月割]")
    Else
        Me.月割金額 = DLookup("[金額]", "Q_金額表NEW", "[Q_金額表NEW]![月]=[月割]")
    End If
End Sub

ちょっと解説すると、

[フォーム1]![チェック460] ではフォーム上のコントロールを参照できないのでエラーになります。
Forms![フォーム1]![チェック460] とする必要があります。こうすればエラーになくなります。

コードが記述してあるフォーム(オブジェクト)は Me で参照できますので、Me!チェック460 と記述することもできます。

CodeContextObject はコードが実行されているオブジェクトという意味ですのでこれでもOKです。でも、長いので Me の方が楽ですよね。

4

私が疑問に思ったのは "[Q_金額表]![月]=[月割]" の部分で、この抽出条件では、コンボボックスの値を反映しないからです。ここに、この条件式を入れる意味はほとんど無意味。
質問から、コンボボックスで選択した値で抽出したいのだと読めますので。
Q_金額表 の中でフォーム上のコンボボックスを参照しているのなら正常に動く可能性はあります。

3
hiroton 2019/09/26 (木) 08:49:52 25f51@f966d >> 1

なぜCodeContextObjectを使っているのかわからないってだけでCodeContextObjectMeと同等なんじゃないですかね
どこにコードを書いているかがないんでアレですが、まぁ動いてるんだろうなとは思ってます

2

ありがとうございます。

正常に動作しております。

説明不足で申し訳ありませんでした。
フォーム上に「年齢欄」があります
クエリ"Q_金額表"でフォーム上の「年齢欄」を参照して年齢のフィルターを掛けています。

宜しくお願い致します。

1

回答の前に、

Private Sub 月割_AfterUpdate()

 With CodeContextObject
        .月割金額 = DLookup("[金額]", "Q_金額表", "[Q_金額表]![月]=[月割]")
    End With
  
End Sub

このコードで、正しい結果になってますか。
コンボボックスを参照していないので、コンボボックスとは無関係の値になると思いますが?
一度、確認してみてください。

回答はそれからです。

6
ただいま勉強中 2019/09/25 (水) 17:35:30 10d1a@96e2f >> 4

😆
ほっと安心できました。
ありがとうございました。

4
ただいま勉強中 2019/09/25 (水) 15:32:40 10d1a@96e2f >> 3

 ご回答頂きましてありがとうございます。
思うように動作させることが出来ました。
本当にありがとうございました。

テキスト型にも運用できるようにしていきたいと思い以下のようにコード
を変更してみました。
テキスト型の項目に試してみると、抽出出来たのですが、
この部分だけの変更でいいのか、よく理解できていません。😨

ItmList = ItmList & ",’" & .ItemData(Itm) & “’”
3

リストボックス
名前 月検索
複数選択 標準 または 拡張
値集合タイプ 値リスト
値集合ソース 1;2;3;4;5;6;7;8;9;10;11;12

対象フィールド
フィールド名 月 (数値型)

として、下記のようなコードになります。

    Dim Itm As Variant, ItmList As String
    With Me.月検索
        If .ItemsSelected.Count > 0 Then
            For Each Itm In .ItemsSelected
                ItmList = ItmList & "," & .ItemData(Itm)
            Next
            strfilter = strfilter & " AND 月 In (" & Mid(ItmList, 2) & ")"
        End If
    End With

簡単に解説しておきますと、

リストボックスの ItemsSelectedプロパティには、選択されたアイテムのインデックスが格納されています。
For Each でインデックス(Itm)を一つずつ取り出します。
ItemData(Itm) でインデックスに対応するデータを取り出します。
取り出したデータを カンマ区切りで連結していきます。
最後に、AND 月 In ( ) に挿入して、下記のような条件式文字列にします。

AND 月 In (2,4,6,9,11)

2,4,6,9,11 を選択した場合

2
ただいま勉強中 2019/09/25 (水) 10:19:14 10d1a@96e2f >> 1

 😄ご回答頂きまして、ありがとうございます。

チェックボックスは試していませんが、
スペースで区切って複数選択!なるものを試してみたのですが・・・・・・下記コードで当然のごとく、文字列として検索してしまい、例えば 1月と4月 を検索すると 入力は 「1 4」 で、検索結果は 1と11と12と4となります。
これを数値で検索できるようにするには・・・・・で、どこを修正すればいいのかわからず、また詰まっています。
すみません。😨

If Not IsNull(Me.複数月検索) Then
    strFilter = strFilter & " AND " & BuildCriteria("月", dbText, "*" & Replace(StrConv(Me.複数月検索, vbWide), " ", "* Or *") & "*")
    End If

テキストボックスは試してみようと思います。