Microsoft Access 掲示板

views
4 フォロー
6,278 件中 1,281 から 1,320 までを表示しています。
4

すでにhirotonさんから的確な回答が付いていますので、蛇足ですが、
レコードソースに設定したクエリは、フォーム読み込み時にレコードセットとして開かれて読み込まれます。
その後、クエリのSQLを変更したとします。
そこで、フォームを再クエリしても、クエリからレコードセットを再読込せずに、現状のレコードセット(つまり変更前のSQLのまま)として再読込します。
よって、変更したSQLは反映されません。

hirotonさんの回答にあるように、
Where句の変更ならForm.Filterプロパティ、Order By句の変更なら、Form.OrderByプロパティで設定すればいいでしょう。

もし、それ以外の部分でSQLを変更したい場合(例えばFROM句とか...)は、いったんRecordSourceプロパティを解除してから再設定すると反映されます。

Me![サブフォーム].Form.RecordSource = ""
Me![サブフォーム].Form.RecordSource = "暫定クエリ"
3
hiroton 2023/10/20 (金) 17:54:13 45e50@f966d

フォームに設定したレコードセットに対してWHERE条件を追加したい場合、フォームのフィルター(Filter)プロパティを操作すると良いです

Form.Filter プロパティ (Access)

「レコードソースに設定したクエリ自体にWHERE条件が含まれていて、その条件を変更したい」というのはのはちょっと困難なので、そういう場合はその部分のWHERE条件を外した状態のクエリをレコードソースに設定して、やはりフィルタープロパティで操作すると良いです
デフォルトのWHERE条件を設定したい場合はフォームの読み込み時イベントで設定すればいいでしょう

2
nokonoko 2023/10/20 (金) 17:37:13 c4a93@54883

ありがとうございます。
考え方自体が違ったようですね。

サブフォームに使われているクエリをのWHERE条件を変化させたかったので、ソースのクエリごと毎回生成させようかと思ったのですが。

4
あん 2023/10/20 (金) 16:43:51 927ea@2928c

hiroton様

そのやり方もやってみます。

ありがとうございます。

1
hiroton 2023/10/20 (金) 16:41:44 45e50@f966d

ACCESSでそのような、「クエリそのものを入れ替える処理をする」のがおかしい。ですかね。そうしなければならない理由がちょっと思いつかないです

3
hiroton 2023/10/20 (金) 16:35:15 45e50@f966d

サブクエリなら問題ない速度ということであれば、操作できるコントロール(透明ボタンや非連結のテキストボックス)を用意して更新後処理などでデータの更新処理をする(更新クエリを実行する)という手もあります

2
あん 2023/10/20 (金) 14:41:57 927ea@2928c

hiroton様

お返事遅くなりすみません。

定義域集合関数を使ったら確かに更新できるようになりました。
が、帳票フォームなので動きがノッソリノッソリしてしまいます。

いろいろ考えましたが、集計した金額をテーブルのフィールドに格納することにしました。

ありがとうございました。

8
こうた 2023/10/17 (火) 14:25:03 ddfe5@c9913

hatenaさん すみませんでした。結果的に日付・サブID 並べ替え設定して 日付&サブIDを結合したカスタム順番(例:2023040100005)のフィールドを使い DSum("金額","クエリ名","カスタム順番<=" & [カスタム順番]) にしたらレコード毎にきちんと累計がだせました。
色々している内に混乱し、お手数かけてしまいました。
ここまでは出来ましたのでいずれデータが大量になる事を想定して、自動入力する関数にトライしたいと思ってます。
ありがとうございました。

7

どのような累計が欲しいのでしょうか。
最初の質問では、日付とサブIDで並べ替える。
次に、その並び順で累計を出したい。

サブIDはオートナンバー型ということなので重複はないですよね。ならば、同じ値はでないと思いますが。

もう少し正確な情報を出してください。
実際のテーブル名とフィールド構成(フィールド名、データ型、主キー設定)
どのような累計が欲しいのか。

6
こうた 2023/10/17 (火) 09:11:01 ddfe5@c9913

hatenaさん 何度もすみません、ふと思ったのですがDSum式にメインIDも記述必要でしょうか? 日付等が格納されていますメインテーブルには同じ日付のものも多数あるので(メインID:1 日付:4/1、メインID:2 日付:4/1の場合もあり)。だから今のDSum式では同じ値の累計がでてるのでしょうか?

5
こうた 2023/10/17 (火) 09:04:54 ddfe5@c9913

hatenaさん すみません、取りあえず DSum("項目の金額等","クエリ名","日付 <= #" & [日付] & "# OR (日付=#" & [日付] & "# AND サブID<=" & [サブID] & ")")をクエリに記述して試したところエラーにはなりませんが累計の値がところどころ計算されずにすぐ上のレコードと同じ値がでます。並べ替えも設定し出来ていているのですが・・・何かが間違っているのでしょうか?

4
こうた 2023/10/17 (火) 08:32:18 ddfe5@c9913

hatenaさん ありがとうございました。すごいアイデアです。因みにクエリ内での累計をせずにフォームやレポートにだけ累計の場合はどうなりますでしょうか?(日付、サブIDの並べ替え設定したクエリを基に作成)

3

2つのテーブルを結合したクエリを元にクエリを作成し、下記のような感じの式になります。

累計: DSum("項目の金額等","クエリ名","日付 <= #" & [日付] & "# OR (日付=#" & [日付] & "# AND サブID<=" & [サブID] & ")")

2つのフィールドを&で結合してそれを対象にするとインデックスが無効になるので重い処理になります。DSumはただでさえ重いので、演算フィールドを対象にするのはお勧めできません。
上記の式にようにすればインデックスが有効になるので、データ数が多くなっても重くなりづらいです。

ただ、それでも重い処理になりがちなので、なんとかしたいと思われたなら、下記のページを参考にしてください。

累計値をテーブルに自動入力する関数 - hatena chips

2
こうた 2023/10/16 (月) 17:38:17 2952d@71e4c

hatenaさん ありがとうございます。その場合、累計の式はどうすればいいでしょうか?
累計: DSum("項目の金額等","テーブル名","日付 <= #" & [日付] & "#")や日付のところをサブIDにしても、日付+IDの順番での累計がでないので、、、それで結合をしたのです。何で設定すれば分からなくて。

1

日付、サブID の昇順で並べ替えをしたいということでしょうか。
ならば、フィールドを結合する必要はなく、それぞれのフィールドで並べ替えを設定すればいいでしょう。
デザインビューのグリッドで左側のあるフィールドが優先されますので、下記のように設定すればご希望の並び順になります。

フィールド・・・日付サブID
テーブル・・・メインテーブルサブテーブル
並べ替え・・・昇順昇順
表示
1

私の場合は、マスターに普通に登録しちゃいます。
どちらにしてもどこかに登録する必要がありますので、一見さん専用テーブルを別に作成したりとかするのもかえって面倒になります。

といった場合絶対に再度使うことのないマスタレコードが増えてしまうのが気になります
ソートなどでも邪魔になりますし…

マスターに管理用のフィールドを追加して、一見さんとか手離れした取引先はチェックしておいて、クエリで表示するとき抽出しないようにしておけばいいでしょう。

一見さんが継続して取引することになることもあるかもしれません。その時はチェックを外せばいいだけです。

下記で紹介しているごみ箱の設計と同じような考え方です。

削除したレコードを復活できる「ごみ箱」の設計 - hatena chips

13
かーか 2023/10/14 (土) 18:55:29 6103a@46f38

ご検証ありがとうございます。
私の環境だけで発生しているわけではなさそうなので、変な意味で一安心しました。
私もメンバーIDを別の文字で置き換えてみたら、正常に表示されたので、バグかなと思っていましたが、
hatenaさまの環境でも発生したようなので、バグと確信しました。
メンバーIDを変えてしまうと、いろいろなところで影響が出ますので、今回はこのままにします。
動作上は問題なさそうなので。
いつもこちらのサイトを参考にさせていただき、業務アプリを作成しています。助かっています。
ありがとうございました。

5

ColorContantsで定義されているものだけなら、変換関数を自作してもいいかも。

標準モジュール

Public Function GetColorNumber(ColorName As String) As Long
    Select Case ColorName
    Case "Black":   GetColorNumber = vbBlack
    Case "Red":     GetColorNumber = vbRed
    Case "Green":   GetColorNumber = vbGreen
    Case "Yellow":  GetColorNumber = vbYellow
    Case "Blue":    GetColorNumber = vbBlue
    Case "Magenta": GetColorNumber = vbMagenta
    Case "Cyan":    GetColorNumber = vbCyan
    Case "White":   GetColorNumber = vbWhite
    Case Else:      GetColorNumber = -1
    End Select
End Function
Dim STR as String
STR = Dlookup("ForeColor","***","商品コード = '" & Me.商品コード & "'")
Me.商品名.ForeColor = GetColorNumber(STR)  
12

提示の画像とまったく同じテーブル名、フィールド名でテーブルを作成してクエリを作成したら、現象が再現できました。
フィールド名を「メンバーID」から「MemberID」に変更したテーブルで試したら、正常に表示されました。

画像1
 
特定のフィールド名だと症状がでるのかも?
バグっぽいですね。

11
かーか 2023/10/13 (金) 19:48:26 d8fb6@63c3a

クエリのデザインビューでテーブルを追加したときには、1対多で表示されるのですが、
そのクエリを保存して、再度デザインビューで開くと、右のようになってしまうのです。

10
かーか 2023/10/13 (金) 18:48:02 d8fb6@63c3a

このテストファイルは365で作っています。accdb形式です。

9
かーか 2023/10/13 (金) 18:44:05 d8fb6@63c3a

このテストファイルは、このテーブルとクエリ1しかなく、テーブルの中にデータはありません。
IDという文字がいけないのでしょうか。

8
かーか 2023/10/13 (金) 18:41:08 d8fb6@63c3a

ご対応ありがとうございます。
画像のようになってしまうのです。
リレーションシップでは1対多で表示されますが、クエリではそれが表示されません。

6

当方、2013がないので365との比較はできないですが、結合線が細いと言われたら細い気もしますが、デザインが変わっただけではないでしょうか。
1と∞が表示されているならリレーションシップは正しく機能しているのではないでしょうか。

画像1

5
かーか 2023/10/13 (金) 17:50:33 d8fb6@63c3a

早速のご返答ありがとうございます。
特に動作上問題はありませんが、リレーションシップで表示されている結合線と、クエリで表示されている結合線が違っているので、気になった次第でした。
こちらでも新しくデータベースをaccdbで作成し、テーブルを2つ用意し、片方の主キーに全角カタカナを使用し、2つのテーブルにリレーションシップを設定し、この2つのテーブルを用いたクエリを作成し、保存して再度デザインビューで開いたら、やっぱい結合線が細くなっていて、1対多の太線が表示されませんでした。

4
hiroton 2023/10/13 (金) 17:46:43 7e920@f966d

適当にできるだろうと思ってやったら痛い目を見ました
それこそデータベース化したらいいじゃないかということではありますが一応

Dim STR as String
STR = Dlookup("ForeColor","***","商品コード = '" & Me.商品コード & "'")
With CreateObject("MSScriptControl.ScriptControl")
  .Language = "VBScript"
  Me.商品名.ForeColor = .Eval(STR)
End With

※この掲示板ではEvalを半角で記述できないので、上記コードでは全角で記述しています


単にEval(str)で実行できればよかったのですがACCESS(2013)では許されないようです
無理やりどうにかする方法を見つけましたが完全に非推奨な方法です
動作原理からしても、やはりカラーコード対応テーブルで対応すべきとなります

4

全角カナが主キーのテーブルとサブテーブルを作ってリレーションシップを設定してみたけど特に問題はなかった。

現状の状態で動作に不具合とかはありますか。

3
エピ 2023/10/13 (金) 17:16:07 7d642@0163f

ありがとうございます。

番号でやってみます。

2

「ForeColor」フィールドのデータ型がテキスト型で、vbRed という文字が格納されているということですか。

VBAのコードでvbRedは定義済み定数で、中身は数値です。文字ではありませんので、そのエラーになります。

イミディエイトウィンドウで
?vbRed
と入力してEnterキーを押すと
255
と表示されます。この255がvbRedの中身です。

「ForeColor」フィールドのデータ型は数値型にして、赤にしたいなら255を入力してください。

定数の中身は上で説明したようにイミディエイトウィンドウで確認できます。

?vbRed
 255 

?vbGreen
 65280 

?vbYellow
 65535 

?vbBlue
 16711680 

RGBでは指定できるようなのですが一見何色かわからないのでColorContantsを使いたいのですが可能でしょうか

下記のようなテーブルを作成しておいて、それを参照するようにするといいでしょう。

ColorTbl

ColorNameColorNumber
Red255
vbGreen65280
vbYellow65535
vbBlue16711680
3
かーか 2023/10/13 (金) 16:50:16 d8fb6@63c3a

そして、結合プロパティを開くと、右の列見出しのところが、
[メンバーID]
というように、[]のかっこが付いています。

2
かーか 2023/10/13 (金) 16:44:11 d8fb6@63c3a

はい、「データベースツール」-「リレーションシップ」でそのテーブルを結合しています。
はい、その結合線の両端に1と∞が表示されています。

1
hiroton 2023/10/13 (金) 16:31:13 7e920@f966d

サブクエリの代わりに定義域集合関数(DSumとか)で計算させると更新できるようになったりしますね

1

「データベースツール」-「リレーションシップ」でそのテーブルを結合してますか。
また、その結合線の両端に1と∞が表示されてますか。

12
Dreamer 2023/10/12 (木) 14:17:41 1b673@46fae

自動修正をはいにすると、デザインビューでウィンドウを任意の位置とサイズに変更しても、レポートの大きさに修正されてしまいますよね?
Hatenaさんでも分からないなら諦めます。

11

テラテイルでのsk.exeさんと同じ見解です。
[サイズ自動修正]プロパティを「はい」にするという対応ではだめですか。

それがだめなら、hirotonさんの回答のフォームを使う方法ぐらいしか私も思いつきません。

10
Dreamer 2023/10/12 (木) 09:43:16 1b673@46fae

上がダブルクリックで開いた状態。
下が理想の状態です。これで現状を理解できましたか?

8
Dreamer 2023/10/12 (木) 08:48:32 1b673@46fae

位置とサイズはデザインビューでどうにでもなるんです。
ナビゲーションウィンドウからダブルクリックでレポートを開くと、レポートが左下にずれるんです。

こちらに参考画像用意してますのでご確認ください
テラテイルでの質問

7

サイズの自動調整ではなく、任意の大きさでウィンドウ枠を保存し、その大きさで開かれるようにしたい。

いまいち、質問の意図をつかみかねていますが、レポートのプレビューウィンドウを希望の位置とサイズで開きたいということでしょうか。

レポートのプレビューを開いたときの位置とサイズは、デザインビューで上書き保存したときの位置とサイズを記憶していてそれが適用されるようです。
ただし、「自動中央寄せ」「サイズ自動修正」が「はい」に設定されいるときはそちらが優先されますが。

デザインビューでご希望の位置とサイズにして、上書き保存すればどうでしょうか。