Microsoft Access 掲示板

views
4 フォロー
6,283 件中 681 から 720 までを表示しています。
4
驚天動地!前任者失踪丸 2024/02/28 (水) 17:04:57 23e8e@44ebd

確かに、出荷数クエリは同じテーブルの都道府県フィールドに抽出条件を加えて集計したもので、出荷数合計クエリは出荷数クエリをさらに集計したものです。

出荷数クエリの都道府県フィールドの抽出条件を外したクエリを作成してレポートを作成したところ、思い通りのレポートを作ることができました。また、サンプルでレコード数を増やしてみたところ、きちんと2列で表示させることも出来ました。
ありがとうございます!!

サブレポートを用いる方法でも同じようなレポートを作れましたが、こちらの方がクエリ・レポートのオブジェクト数が1つずつで済むので大変良いですね、助かりました。

3

現状のクエリの Q_東京出荷数、Q_北海道出荷数 というのは同じテーブルから作成したもので、抽出条件(東京、北海道など)がそれぞれ異なるものだと思います。
このクエリの抽出条件を削除したクエリを作成して、それを元にレポートウィザードで作成してください。

そちらの詳細な状況が不明なので一例で説明します。

必要なフィールド(例 都道府県コード、都道府県名、出荷日、出荷数)を選択する
 ↓
グループレベルの指定、都道府県コード(都道府県名)を選択する
 ↓
並べ替え、集計方法、出荷日(昇順)
 集計のオプション 合計 
 ↓
レイアウト ブロック
 ↓
レポート名を入力して完了

上記のような感じで希望のレイアウトに近いものができると思いますので、
デザインビューで微調整してください。

2
驚天動地!前任者失踪丸 2024/02/28 (水) 11:18:54 23e8e@44ebd

ウィザードからやってみましたがうまく作成できませんでした。
各クエリのフィールドを全て項目に追加しようとするとエラーが出ます。

3
Anonymous 2024/02/28 (水) 09:31:31 23e8e@44ebd

替えたところ入力出来るようになりました。
㉗が文字として認識されず、IDと同一とみなされてしまったのですかね?

1
hiroton 2024/02/28 (水) 08:59:54 0a8a1@f966d

いくつか方法はありますが、「都道府県」が単一の都道府県の文字データであるならば、今やっている、「『都道府県』フィールドに『テキストボックス向け先』の文字が入っているか?」の逆をやればいいです

フィールド|式1: [Forms]![顧客情報]![テキストボックス向け先]
抽出条件 |Like "*" & [都道府県] & "*"
1
hatena 2024/02/28 (水) 01:29:39 修正

提示のレイアウトなら、サブレポートを使わずとも、レポートのグループ化の機能で実現できます。

ウィザードで作成する方法
グループ化レポートまたはサマリー レポートを作成する - Microsoft サポート

表形式のレポートに見出しや合計を追加する方法
Accessのレポートでフィールドごとにグループ化して印刷する方法 | できるネット


レポートサイズの横幅を10cm程度に設定し、レコード数が増えてきたら2列になるようにしたいです。

上記の方法でレポートを作成すれば下記の方法が使えます。

Accessのレポートで表を2列に印刷する方法 | できるネット

5

サブフォームの合計をメインフォームに表示したいのなら、

サブフォームのフォームヘッダーかフォームフッターにテキストボックスを配置して、下記のように設定して、

名前 合計
コントロールソース  =Sum([受注金額])

メインフォーム上のテキストボックスのコントロールソースに下記の式を設定すればいいでしょう。

=[サブフォームコントロール名]![合計]
4
苦節1年 2024/02/27 (火) 16:39:11 ca7cf@20718

hatenaさんに頂いた式、無事できました!
また一つ勉強になりました。ありがとうございます。

2
ssassakki 2024/02/27 (火) 16:15:35 27741@c61b7

すずやんさん、ありがとうございます。
保持されるのはおっしゃる通りなのですが、NativeClient接続では日付として扱えていたものが
テキストとして認識されることで、”-”で区切られた日付風の文字列は書式設定の通り表示さない様で困っています。

1
すずやん 2024/02/27 (火) 13:38:05

ちょっと良くわからないですが、どういう状態になったら解決なのでしょうか。

”yyyy-mm-dd”を”yyyy/mm/dd”にしたら解決だとした場合、SQL ServerのDate型は「2024-02-27」で保持されるので、そういうものです。

Accessで表示する際に変換する、などの対処方法で良いと思います。
※的外れだとすみません

3
苦節1年 2024/02/27 (火) 09:42:19 ca7cf@20718

ご丁寧にありがとうございます。
hatenaさんにご教授頂いたこともやってみましたがパラメータが出てしまい断念しました。
そうですよね、なにがしたいかを言葉足らずでした。
社内の受注管理システムを構築しようとしています。
社員数名で操作するのでフォームはできるだけ分かりやすくしようと思っており2歩進んでは3歩下がっている状況です。
1つの受注案件(メインフォーム)に対し、2つの工事(サブフォーム)がある事あるので今回の相談と成りました。
受注金額=工事金額+工事金額
本当は受注メインフォーム上で工事サブフォームの工事金額の合計を参照したいのですが工事が2つある場合レコードでマウスでクリックしなければ次ページが見れないので次ページを見なくとも、メイン上で合計が見れればと思いました。
やっていて、クエリではなくメインフォーム上でテキストボックスも作成してみましたが上手く行きませんでした。

20
rinrin 2024/02/26 (月) 19:28:57 b4dc9@c7f00

hatenaさん。。。。。。。。。^^
会社でメインフォームのチェックボックスから
サブフォームのチェックボックスへのデータのやりとり   うまくいきました。。。。^^

ホントにホントにありがとうございます^^

2
hatena 2024/02/26 (月) 15:30:04 修正

エラーメッセージ=指定されたフィールド'[工事番号]'がSQLステートメントのFROM句にある複数のテーブルを参照しました。

メッセージ通り、クエリ内に[工事番号]が複数あるのでどちらのテーブルを参照したらいいか分からないということです。
どちらのテーブルのものかを指定してあげればいいです。

受注番号が数値型の場合

総合計: DSum("受注金額","T_受注種別","受注番号=" & [T_受注番号].[受注番号])

工事番号がテキスト型の場合

総合計: DSum("受注金額","T_受注種別","工事番号='" & [T_受注番号].[受注番号] & "'")

※テーブルの説明とメッセージのフィールド名が異なりますが、テーブルの方(受注番号)が正しいと仮定してます。

ただし、DSum関数は重い処理になりますので、集計クエリと連結した方が処理速度は速くなります。
クエリが増えるのがいやならサブクエリを使うという方法もあります。調べてみてください。

ただ、クエリで集計値と個別の値を同時表示するという要件はあまりないように思いますが、どういう状況でしょうか。
もし、レポート内で集計値を表示したいのなら、レポートのグループフッターのテキストボックスに =Sum([受注金額]) と設定することでグループ別の集計を表示させることはできます。

1
苦節1年 2024/02/26 (月) 14:20:45 ca7cf@20718

新しく総合計のみのクエリを作り、集計で合計金額は出せるようになりました。
クエリが増えて行くのがややこやしいですが、とりあえずこれでやってみます。

19
hatena 2024/02/25 (日) 11:37:17 修正

私の質問に明確に回答していただけないようなので、
こちらで勝手に推測して回答します。

メインフォームは非連結(「レコードソース」プロパティが空欄)
メインフォーム上のチェックボックスの名前
Chk北海道、Chk秋田、・・・Chk沖縄 (48個)

サブフォームコントロールの名前
SubMST実査実績一覧

サブフォームのレコードソースの設定値 MST実査実績一覧
サブフォーム上のチェックボックス
名前とコントロールソースの設定値は同じでそれぞれ下記のように設定されている。
北海道、秋田、・・・沖縄 (48個)

やりたいことは、
メインフォーム上のコマンドボタン「新規登録」のクリックで、
メインフォームの各チェックボックスの値を、
サブフォームの新規レコードのYes/No型のフィールドに転記する。

以上の推測での回答です。

Private Sub 新規登録_Click()
    With Me.SubMST実査実績一覧.Form.Recordset
        .AddNew
        !年月日 = Me.Txt実査実施日
        !担当者 = Me.Cmb実査担当者
        !北海道.Value = Me.Chk北海道
        !北海道.Value = Me.Chk秋田
        '中略
        !北海道.Value = Me.Chk沖縄
        .Update
        Me.Cmb実査ID.Value = !ID
    End With
    Msgbox("登録完了しました。")
End Sub

解説
サブフォームのレコードセットは、フォームが開いたときにすでに生成されているので
ADOでRs.Openする必要はない。
Me.埋め込み1.Form.Recordset でレコードセットを取得できるのでそれに対して転記処理を実施すればよい。

以上です。
これでこの件に関しては私からのアドバイスは終わりとさせていだきます。

18
rinrin 2024/02/25 (日) 07:56:47 b4dc9@c7f00

これのことです。。。。。。。。。;;

ID 数値型 主キー
年月日 日付時刻型
担当者 テキスト型(短いテキスト)
都道府県 整数型
北海道 Yes/No型
秋田 Yes/No型



沖縄 Yes/No型

17
rinrin 2024/02/24 (土) 13:32:29 b4dc9@c7f00

もちろんhatenaさんの指示通りにせっていました。。。

16
rinrin 2024/02/24 (土) 12:55:36 b4dc9@c7f00

メインフォームのチェックボックスのレコードが
サブフォームに、、、レコード移行できないのって。。。

15
rinrin 2024/02/24 (土) 12:54:14 b4dc9@c7f00

いろいろバタバタしちゃって。。。遅くなっちゃいました。。。;;
ごめんなさい

あたしいろいろ考えてたんですけど
Me.SugMST実査実績一覧.Form.Filter=""
Me.SubMST実査実績一覧.Form.FilterOn=False
があるとこが、、、おかしいのかな???って思いました。。。;;

メインフォームとサブフォーム それぞれに設定するのかな???

9
Anonymous 2024/02/21 (水) 09:31:28 23e8e@44ebd >> 2

お二人ともありがとうございます!

8
すずやん 2024/02/21 (水) 08:33:35 >> 2

そういう引当ての方法は知りませんでした。参考になります!

7

ですので抽出条件のみ書き方が分かればOKかなと思います。

 
Access-SQLの構文で抽出条件を記述するなら

SELECT * FROM テーブル名
WHERE フィールド名 Like '*[a-z]ー[a-z]*'
;

になります

ただし、Access-SQLには以下のような問題があるようなので

長音「ー」を含むデータをクエリであいまい抽出すると
クエリでLike演算子を使用してあいまい抽出すると合致しないデータが抽出されてしまうというバグがあります。それを知らないと想定外の結果になりあわせるということになりますので注意が必要です。 また、それに対する対応策も紹介します。 難易度:...
Fc2

参照先のコンテンツに掲載されているラッパー関数を用いて
以下のように記述すればいいでしょう

SELECT * FROM テーブル名
WHERE ILike(フィールド名, '*[a-z]ー[a-z]*')
;
2

typoでした。㉗IDをです。

1

機種依存文字を変えてみるとどうでしょうか?
例えば ㉗UD を No27ID とか。

14
rinrin 2024/02/20 (火) 21:19:49 b4dc9@c7f00

hatenaさん。。。。。。。。;;ありがとうございます。。。^^
明日またがんばります。。。。^^
ホントにありがとうございます

6
Anonymous 2024/02/20 (火) 17:57:48 23e8e@44ebd >> 2

アルファベットに囲まれた"ー"を含むレコードを抽出するだけであれば可能でしょうか?という意味です!
抽出したレコードのどの"ー"を置換するかは、フォームか選択クエリ上で目視・手動で行おうと思います。

ですので抽出条件のみ書き方が分かればOKかなと思います。

5
Anonymous 2024/02/20 (火) 17:52:17 23e8e@44ebd >> 3

コード提示ありがとうございます。
確認してみます。

4
すずやん 2024/02/20 (火) 13:56:40 >> 2

その場合も「前後がアルファベットに挟まれた「ー」の場合は置換する」という判断をクエリで行うのがとても難しいと思います。
不可能では無いかもしれませんが、クエリにこだわらないほうが良いかと。

mayuさんが下記に例を記載されていますが、このようなVBAを使用する方法が良いのではないかと思います。

24
ぽん 2024/02/20 (火) 12:49:13 53dda@1925b

上記の様に変更して、
引数を省略したは全レコードをチェック、引数が指定してあればその引数間のレコードを対象に...
()の中で使い分けができるなんて!!とても助かります。
これで細かいチェックもできます!ありがとうございました

3

■正規表現版

Public Function SampleA(ByVal argStr As String _
                      , ByVal argSrc As String _
                      , ByVal argDst As String) As String
    If Len(argStr) < 2 Then
        SampleA = argStr
        Exit Function
    End If
    
    With CreateObject("VBScript.RegExp")
        .Global = True
        .IgnoreCase = True
        .Pattern = "([a-z])(" & argSrc & ")([a-z])"
        If .Test(argStr) Then
            SampleA = .Replace(argStr, "$1" & argDst & "$3")
        Else
            SampleA = argStr
        End If
    End With
End Function

 
■InStr関数+ループ版

Public Function SampleB(ByVal argStr As String _
                      , ByVal argSrc As String _
                      , ByVal argDst As String) As String
    If Len(argStr) < 2 Then
        SampleB = argStr
        Exit Function
    End If
    
    Dim pos    As Long
    Dim front  As String
    Dim back   As String
    Dim target As String
    
    pos = 1
    target = argStr
    
    While pos > 0
        pos = InStr(pos + 1, target, argSrc, vbBinaryCompare)
        If pos > 0 And pos < Len(argStr) Then
            back = Mid$(target, pos - 1, 1)
            front = Mid$(target, pos + 1, 1)
            If StrConv(front & back, vbLowerCase) Like "[a-z][a-z]" Then
                Mid(target, pos, 1) = argDst
            End If
        End If
    Wend
    
    SampleB = target
End Function

 
■SQL

SELECT
    SampleA(
        '株式会社zawaーZawa worldーrescue株式会社トーキョー'
      , 'ー'
      , '▼'
    ) as a
    , SampleB(
        '株式会社zawaーZawa worldーrescue株式会社トーキョー'
      , 'ー'
      , '▲'
    ) as b
;

■結果

AB
株式会社zawa▼Zawa world▼rescue株式会社トーキョー株式会社zawa▲Zawa world▲rescue株式会社トーキョー
2
Anonymous 2024/02/20 (火) 11:29:07 23e8e@44ebd >> 1

なるほどです。
であれば、前後がアルファベット(大文字・小文字問わず)だけであれば抽出は可能でしょうか?

1
すずやん 2024/02/20 (火) 11:15:57

以前も同じような質問がありましたが、プログラムでは「zawaーzawa」→変換対象、「トーキョー」→問題ないので変換しない、という判断が難しいと思います。

「半角文字に囲まれている場合は変換対象」等では判断できるかもしれませんが、そういった複雑な判断はクエリにあまり向きません。

13

私が提示した書式で、
すべて実際のフォームのデザインビューで設定値を確認したものを提示したください。

下記の書式でお願いします。


メインフォームのデザインビューで確認
フォーム名 実際の設定値
レコードソース 実際の設定値

メインフォーム上の1番目のチェックボックス
コントロールソース 実際の設定値
名前 実際の設定値

メインフォーム上の2番目のチェックボックス
コントロールソース 実際の設定値
名前 実際の設定値

メインフォーム上の最後のチェックボックス
コントロールソース 実際の設定値
名前 実際の設定値

メインフォーム上のサブフォームコントロール
名前 実際の設定値


サブフォームのデザインビューで確認
レコードソース 実際の設定値
既定のビュー 実際の設定値

サブフォーム上の1番目のチェックボックス
コントロールソース 実際の設定値
名前 実際の設定値

サブフォーム上の2番目のチェックボックス
コントロールソース 実際の設定値
名前 実際の設定値

サブフォーム上の最後のチェックボックス
コントロールソース 実際の設定値
名前 実際の設定値


テーブル MST実査実績一覧
フィールド名とデータ型を列挙してください。

下記のような書式でお願いします。

ID 数値型 主キー
年月日 日付時刻型
担当者 テキスト型(短いテキスト)
都道府県 整数型
北海道 Yes/No型
秋田 Yes/No型



沖縄 Yes/No型

12

サブフォームのソースコード空欄じゃなかったです。。。。。。。。。。;;

サブフォームのソースコードとはなんでしょうか。

サブフォームのレコードソースのこと?
それともサブフォームのチェックボックスのコントロールソースのこと?
????

もし、コントロールソースのことなら、空欄にしないでください。
現状のままにしておいてください。

正確な用語を使ってください。不正確な用語を使っていては状況が伝わりません。
用語の意味を理解するようにしてください。
分からない用語があったら検索して調べてください。
分からない場合は、質問してもらっていいです。
勝手に解釈しないでください。

まだ、解決策を提示していません。というかできません。
まずは、そちらの状況を正確に確認する作業が必要です。

11
rinrin 2024/02/19 (月) 19:36:29 b4dc9@c7f00

hatenaさん。。。。。。。。ごめんなさい。。。。。;;
サブフォームのソースコード空欄じゃなかったです。。。。。。。。。。;;
設定したつもりないのに それぞれに値がはいってました。。。
すべて空欄にして挑戦してます。。。^^

むずかしいよぉぉぉ。。。。。。;;

15
COCO 2024/02/19 (月) 16:29:01 ddfe5@71072

色々とありがとうございます。だからMe.FilterOn = (strFilter <> "")もいけたのですね。
厳密にしようとすると細かい事が一杯ありますね。全然知らないのと少しでも知っているのでは意図しない動作の時に違うなと思いました。これも奥の深いことですね。さらっと出来る方々がすごいです。

14
hiroton 2024/02/19 (月) 16:05:18 bec36@f966d

NULL比較演算子による演算ができません

詳しいことはかなり複雑なので、一通り情報に目を通してみてください
https://www.google.com/search?q=VBA NULL 比較

本来、Nullの可能性がある場合の比較は、特別な処理・特別な判定をする必要がありますが、「VBAにおいてはNullを比較演算に使うと全てFalseとして扱われる」という特徴があります。(コードの実装としてこれを活かすのは本来よろしくありません)

つまり、

Me.[cb1].Value <> Null

とすると、コンボボックスの値に関わらず常にFalseの処理が為されるため、意図しない動作をします

逆に、<>""の判定においてコンボボックスの値がNullの場合は

Null <> "" '//本来やってはいけない演算

Falseを返して欲しいときにはFalseだった場合の処理がされるので表面上は問題なく動作しているというわけです


今回のような場合であれば、コンボボックスの値をチェックしてNull比較をしないようにするのが正解で、事前にコンボボックスの値をチェックしてコンボボックスの値がNullだったら""とみなすようにします。たとえばNz関数を使って

Nz 関数

Nz(Me.[cb1].Value, "") <> ""

蛇足
Nullなら空文字とみなしたいなら「"" & Me!cb1 <> ""」くらいの手抜きで済ませちゃうんですけどね

13
COCO 2024/02/19 (月) 15:13:27 ddfe5@71072

何度もすみません、最後に一つだけ質問があります。hatenaさんから最初に頂いた回答の下記を使いプロシージャを作成しました(setFilter1として)。
If Me.[cb1].Value <> "" Then
    strFilter = strFilter & " AND フィールド1=" & Me.[cb1].Value
End If
***
****
strFilter = Mid(strFilter, 6) '先頭の" AND "を削除
Me.Filter = strFilter
***
そしてコンボ更新後イベントにCall setFilter1で実行しました⇒上手くいきました。(これはすごく便利です!)
質問はIf Me.[cb1].Value <> "" Thenの右辺です。ここを<>Nullにすると条件に引っかかりません。もう少し様子みるとこのフォームにはフィルター解除ボタンがあり Me.[cb1] = Null *** Me.FilterOn = False
で解除しており、その実行直後なら<>Nullでもいけますが、コンボ値を他の値に選択では<> ""でないと駄目です。
これで機能しているので問題ないのですが、それが不思議で。””とNullの違いはネットで確認しました。
この場合は<>””が妥当なのでしょうか?

23
hatena 2024/02/19 (月) 13:49:42 修正

最小値や最大値だけでなく、IDが34まで増えたときに19から22の間だけ、27から34の間だけで数値を並び替えて同じようにIDの連番をチェックするときは、どうすればいいんだろうと疑問に思ったからです。

チェックしたい範囲を引数で渡すようにすればいいでしょう。
ただし、指定した範囲だけチェックしたいのなら、その範囲のレコードを抽出して並び替える必要があります。

同じ処理をするのなら、きっともっと良い方法があるんだろうと邪推しました。お願いできますか?

引数を省略できる設定があります。引数の前に Optional をつけます。

VBA 省略可能な引数 Optional と名前付き引数

引数を省略したは全レコードをチェック、引数が指定してあればその引数間のレコードを対象にするというふうにすればいいでしょう。

上記を考慮すると下記のようなコードになります。

Public Sub SequenceCheck4(Optional MinId As Long = 0, Optional MaxID As Long = 0)
    If MinId = 0 Then MinId = DMin("ID", "T1")
    If MaxID = 0 Then MinId = DMax("ID", "T1")
    
    Dim StepNum As Long, SeqNum As Long, stOrder As String
    If DLookup("数値", "T1", "ID=" & MinId) < DLookup("数値", "T1", "ID=" & MaxID) Then
        StepNum = 1   '昇順
        SeqNum = MinId
        stOrder = "昇順"
    Else
        StepNum = -1  '降順
        SeqNum = MaxID
        stOrder = "降順"
    End If

'    CurrentDb.Execute "UPDATE T1 SET 連番チェック = Null WHERE Not 連番チェック Is Null;"
    
    Dim sSQL As String
    sSQL = "SELECT * FROM T1 Where ID>=" & MinId & " And ID<=" & MaxID & " ORDER BY 数値, ID"
    If stOrder = "降順" Then sSQL = sSQL & " DESC"
    
    Dim rs As DAO.Recordset
    Set rs = CurrentDb.OpenRecordset(sSQL)
    Do Until rs.EOF
        rs.Edit
        If rs!ID <> SeqNum Then
            rs!連番チェック = stOrder & "×"
        Else
            rs!連番チェック = Null
        End If
        rs.Update
        SeqNum = SeqNum + StepNum
        rs.MoveNext
    Loop

    rs.Close
    Set rs = Nothing
End Sub

使用例


'27から34の間だけ連番チェック
Call SequenceCheck4(27, 34)

'全レコードを連番チェック
Call SequenceCheck4()

22
ぽん 2024/02/19 (月) 12:52:22 53dda@1925b

DMin関数とDmax関数を使用して、テーブルに保存されているIDの最小値から最大値の中でチェックできました。本当にありがとうございます。うまくいかなかったというよりは
最小値や最大値だけでなく、IDが34まで増えたときに19から22の間だけ、27から34の間だけで数値を並び替えて同じようにIDの連番をチェックするときは、どうすればいいんだろうと疑問に思ったからです。
MinId = DMin("ID", "T1"): MaxID = DMax("ID", "T1")の部分を、MinId =19 や MinId =27 MaxID =22 や MaxID=34と書き換えてSub を2つ作れば、私でもできるけど...
同じ処理をするのなら、きっともっと良い方法があるんだろうと邪推しました。お願いできますか?