有難うございます。フィールド名は出荷日、顧客名、品名、売上数量、売上単価、消費税率です。レイアウトはまず、顧客名と出荷日の下に品名A、B、Cとそれぞれの売上数量と単価を表示、そして売上高は[売上数量]*[売上単価]。消費税は8%適用の売上高と10%適用の売上高の合計に税率を乗じて計算。ここまでは、デザインビューでできるのですが、8%と10%税金の合計が出来ないのです。
レコードのレコードソースのフィールド名とデータ例を提示して、どのようなレイアウトでレポートに表示したいかも提示してください。 商品A と 商品B の2種類しかないというわけではないですよね。 消費税が8%と10%を区別するフィールドがあるはずですよね。
それらを含めてもう少し詳細に説明してください。
実現できました。ありがとうございます。 当方では勘違いして SELECT TOP 3 DISTINCT Table1.Fld1, Table1.Fld2 などとしておりました。
下記のように DISTINCT TOP の順で記述できます。
SELECT DISTINCT TOP 3 Table1.Fld1, Table1.Fld2 FROM Table1 ORDER BY Table1.Fld1;
hatenaさん、ありがとうございました! とってもよくわかりました! コントロールソースに記述したら希望通りになりました。ありがとうございます。
フォームにて、社員と数値というテキストボックスがあります。 社員はコンボボックスです。
数値というテキストボックスは連結フォームですか。 テキストボックスに表示するだけではなく連結したフィールドに値を入力したいということでしょうか。
社員の更新後イベントプロパティに、=IIf([社員]="A",[数値]=1)としたら間違いですか?
はい、間違いです。 IIfの第3引数に [数値]=1 と設定しても[数値]に値が代入されるわけではありません。 引数に設定できるのは式でありステートメントは設定できません。
表示だけでいいなら、数値テキストボックスのコントロールソースに =IIf([社員]="A",1) と設定します。 数値フィールドに入力したいのなら、イベントプロシージャにコードを記述するかマクロを設定する必要があります。
=IIf([社員]="A",1)
Private Sub 社員_AfterUpdate() If Me.社員 = "A" Then Me.数値 = 1 End If End Sub
「データベースツール」>「データベース構造の解析」でレポートとして出力できます。
それをExcelに変換もできるのでそちらで解析したり、見やすく体裁を整えたりもできます。
有料のツールとしては下記のようなものがあります。 私自身は使ったことはないので、現バージョンでは使えるかどうかは分かりません。
Access2016 仕様書 作成 ツール【A HotDocument】(Access2016対応 仕様書)
Access2010/2007仕様書作成ツール『T'sDoc 6』の詳細情報 : Vector ソフトを探す!
単純に改行を入れて入力すればいいかと思いますが、それではだめなんでしょうか。
Ctrl+Enterで改行を入力できます。
あるいは、テキストボックスの「Enterキー入力時動作」プロパティを「フィールドに行を追加」にすればEnterキーだけで改行されます。
(部署名を登録する際、改行したいところで★などを入れて、表示する際場合分けするとかでしょうか…?)
もし、この方法をとるなら、テキストボックスのコントロールソースを下記のように設定すればいいでしょう。
=Replace([部署名],"★",chr(13) & Chr(10))
chr(13) & Chr(10) は改行です。
できました!ありがとうございます。助かりました!
リッチテキスト形式を使うとテキストボックス内の文字に装飾を加えることができます テキストボックスを背面に設置し、空白スペースで埋め尽くして、その文字の背景色としてカラーコードを指定すればイメージしたものができるかもしれません
背面に設置するテキストボックスの設定
コントロールソース|='<div><font style="BACKGROUND-COLOR:#' & Hex([カラーコード]) & '"> </font></div>' 文字書式 |リッチ テキスト形式 背景スタイル |透明 境界線スタイル |透明
表示したいラベルのサイズに合わせてフォントサイズや空白スペースの数を調整してみてください
クエリCの抽出条件 [Forms]|[フォームAの名前]![TXT_Aの名前] If条件 IsNull(Me.テキストボックスの名前) フォームを開く DoCmd.OpenForm(“フォームB”) どうですか?
レポートを3つ作り、フィールドの区分によってそれぞれのレポートを抽出したいです。 抽出条件は区分かつ商品番号で1つのレポートを出力したいです。
区分によってレポートのデザインやレイアウトが大幅に異なるというのですか。
レポートのレコードソースのフィールド構成を提示してもらえますか。クエリなら、SQLビューで表示されるSQL文をコピーして貼り付けてください。 また、レコードソースに含まれるテーブルの主キーフィールドも提示してください。
そうです! その通りになります。 説明不足で申し訳ありません。
最初の質問に戻りますが、私が考えたのはラジオボタンで区分を選択し、テキストボックスなどで商品番号を入力、そして出力ボタンを押すと印刷プレビューが表示されるという形にしたいです。 これは知識不足の私が考えたものなので他にこっちのほうが良いという案がありましたら是非教えて頂きたいです。
なるほど、勉強になります。
ご回答ありがとうございます。 IDの値を取得したかったので、非表示では意味がありません。
ご回答いただいく直前に、自己解決しました。(報告遅れてすいません。)
「備忘録」 元データの名前をクエリ0とします。
クエリ1として、フィールド商品IDをグループ化、フィールド見積日を最大値とし、 ついでに、グループ化できないIDも、最大値としておく。
クエリ2として、クエリ0とクエリ1の商品IDと見積日をつなげ、 クエリ0のIDとクエリ1の商品IDと見積日を取得する。 これでクエリ1で取得した商品IDと(最新)見積日を持つ、クエリ0のIDが正確に取得できました。
IDフィールドを非表示でどうですか?
レポートが複数あり、区分によって異なるレポートで印刷したいということですか。
区分がお菓子のときは、レポートA 区分がお酒のときは、レポートB とか。
その辺をもし少し具体的に説明してください。
テーブルAには商品番号というフィールドはなくテーブルAとお菓子を登録しているマスタのクエリを作りそれをレポートのレコードソースとしています。 そしてレポートに商品番号のテキストボックスを配置しております。 商品番号だけを指定してレポートを表示させても区分によって出力するレポートが違うので絞り込めないのです・・・ 分かりにくい設定で大変申し訳ないです。
商品番号かつ区分がお菓子のときのレポート 商品番号かつ区分がお酒のときのレポート・・・という風に条件付きでレポートを印刷したいのでお力を貸して頂けると嬉しいです。
なるほど、そういうことですね。。わからずお恥ずかしい限りです。 優しく教えていただき、ありがとうございました!
それなら読み取り側のシステム次第でしょう たいていのデータベースソフトならSQLでクエリを発行すればいいでしょうし、ACCESSならDLookup関数でもいいでしょう。データベース的な能力がないのならCSVでマスタをデータ化しておいてテキスト検索的な手法になるかもしれません 名刺の発行側で考えることではないですね
また、氏名という項目は同姓同名問題が発生するので画面の表示上日本語でも、システム内部ではかならずユニークな識別子をもってやり取りするものです 本当にQRコードに日本語データが必要なのかよく考えてみてください
hatena様 ご回答ありがとうございます。 説明不足で申し訳ございません。 >わさわざQRコードにする意味はなんですか。
弊社では名刺を名札がわりに首からぶら下げています。 ある作業をする際に名刺に記載されているQRコードを読み取って 作業を行います。(コンビニなどでされていますよね) 読み取った名前は作業記録に表示されます。
これで理解いただけましたでしょうか?
考え方は同じですよ 論理演算(基礎知識)や演算子の優先順位(システムによりけり)に気を付ける必要はありますが
例えばクエリにフィールドを追加するなら
フィールド|式1: IsNull([条件1テキスト]) And Not [条件1] Or IsNull([条件2テキスト]) And Not [条件2] Or IsNull([条件3テキスト]) And Not [条件3] Or IsNull([条件4テキスト]) And Not [条件4] 抽出条件 |True
すばらしい!そのようなアイデアがありましたね。ありがとうございます。
条件が追加されました・・ 条件1~4はチェックボックスなのですが、それぞれ関連するテキストボックスがあり それぞれ「「条件1テキストボックス」が空かつ「条件1チェックボックス」がfalse」という条件になりました。 こうなってくると、やはり4行(12行)ですよね。
各メールアドレスの最初にかならず「,」をつけて、最後に1文字目を取り除くとか
Mid(Format([Cc1], "\,&") & Format([Cc2], "\,&") & Format([Cc3], "\,&") & "," & testMail, 2)
In演算子のことを勉強したことがありましたが、すっかり忘れていました。 このような使い方ができるのですね。ありがとうございます!
混雑時を避ければ表示は、早いのでformatによる整形とMe.Visible = Falseを入れてみたりして改善してみます。非常に助かりました。有難う御座いました。
定義域集計関数をループで繰り返し呼び出したり、クエリ内の演算フィールドで使う場合は重くなる可能性がありますが、 一回だけ呼び出すのなら、定義域集計関数の第2引数に設定するテーブル、クエリの設計、第3引数の抽出条件の設定次第です。 他の方法(DAO, ADOなど)を使ってもテーブル、クエリの設計、抽出条件の設定が悪ければ同様に時間がかかります。
T'sWareさんの定義域集計関数とSQLの比較でも10000回呼び出して差が10秒ですので1回あたりでは0.001秒ですので体感できる差ではないです。一回だけ呼び出すのなら、代替関数と比較すべきですのて、むしろ遅くなってます。
定義域集計関数で時間がかかっているのなら(それも本当にそうなかの検証も必要です。別の部分で時間がかかっているのかも知れません。)、テーブル、クエリの設計、抽出条件の設定から検討する必要があります。
高速化について参考になれば Q.Access って1万件超えると遅くて使い物にならないって本当ですか?(Fly me to the Access Heaven (クラウド対応版)さん) 定義域集計関数とSQLの比較(T'sWareさん)
ネットワーク越しで何度も読み込みたくないならフォームを作って閉じる代わりにMe.Visible = Falseするような仕掛けが簡単かな
Me.Visible = False
私も、そこまで詳しくないので、VBAで探すか、クエリで集計しておくか、フォームのテキストボックスに計算式入れておくかで、軽くなるのかよくわかりません。分かる人に、回答を任せますね。
ご回答有難う御座いました。恐らくなんとかなりそうです。 一般的に、合計を求めてダイアログボックスに表示する方法は、集計関数を使う方法しかないのでしょうか?レコード数であればadoという手もあるのですが。ローカルな環境では無い為、混雑してる時間ですと8個の計算結果を1つのダイアログボックスに表示している為、パソコンが固まり、タスクマネージャーで消すというリスクがある為、一般的にもこの様な事象が起こっているのか気になりまして。そこの所を教えて頂けないでしょうか?
VBA TextBoxに入力された8桁の数値を日付に変換する、をググるといけるかも?
ご回答有難う御座います。テキストボックスには、8桁日付けしか入れれない為Format関数をどのタイミングで入れれば良いか分かりません。msgboxの前に変数の構文を作りそれに対して使えば良いのでしょうか?set 変数=format(value)見たいな感じでしょうか?
Format関数、“mm月dd日“でどうですか?
有難うございます。上手く行きました。テキストボックスの日付もmsgboxに表示する為に、me.日付入力.valueも入れています。ただ、8桁日付けで本日でしたら20201116と表示され見た目が良くない為、11月16日と置き換える事は、できますでしょうか?宜しくお願い致します。
エラーの状況がよくわからないけれど、 フォームに名前プロパティ:日付け入力のテキストボックスを作って クエリの抽出条件に [Forms]![作成したフォームの名前]![日付け入力] でどうですか?
「商品番号」という名前から主キーのような感じですが、主キーですか。 主キーなら、「商品番号」を指定してたらレコードは1件になるので、ラジオボタンの意味がないと思いますが。
あるいは、商品番号とオプショングルーブで指定した区別の2つはAND条件ではなく、OR条件ということでしょうか。
社員情報テーブルに目標IDフィールドを追加、社員情報履歴テーブルの作成でも行けるかも? 例えば、 ①朝の出勤ラッシュが終わったら、出勤した社員情報データを社員情報履歴テーブルに追加クエリ。 (とりあえず、社員IDと目標IDと日付) ②1日の業務が終わったら、出勤した社員情報テーブルの目標IDを更新クエリ。
hiroton さんの回答でいいと思いますが、別案を。 In演算子を使うと下記のように記述できます。
よく理解できました。場合分けが面倒で、妥協しようかと思ってたところもあったので、かなり助かりました。ありがとうございます!
Accessのテーブルやクエリのデータを貼り付ける場合は下記で、Markdown書式のテーブルに変換して貼り付けてください。
Markdown Tables generator
有難うございます。フィールド名は出荷日、顧客名、品名、売上数量、売上単価、消費税率です。レイアウトはまず、顧客名と出荷日の下に品名A、B、Cとそれぞれの売上数量と単価を表示、そして売上高は[売上数量]*[売上単価]。消費税は8%適用の売上高と10%適用の売上高の合計に税率を乗じて計算。ここまでは、デザインビューでできるのですが、8%と10%税金の合計が出来ないのです。
レコードのレコードソースのフィールド名とデータ例を提示して、どのようなレイアウトでレポートに表示したいかも提示してください。
商品A と 商品B の2種類しかないというわけではないですよね。
消費税が8%と10%を区別するフィールドがあるはずですよね。
それらを含めてもう少し詳細に説明してください。
実現できました。ありがとうございます。
当方では勘違いして SELECT TOP 3 DISTINCT Table1.Fld1, Table1.Fld2 などとしておりました。
下記のように DISTINCT TOP の順で記述できます。
hatenaさん、ありがとうございました!
とってもよくわかりました!
コントロールソースに記述したら希望通りになりました。ありがとうございます。
数値というテキストボックスは連結フォームですか。
テキストボックスに表示するだけではなく連結したフィールドに値を入力したいということでしょうか。
はい、間違いです。
IIfの第3引数に [数値]=1 と設定しても[数値]に値が代入されるわけではありません。
引数に設定できるのは式でありステートメントは設定できません。
表示だけでいいなら、数値テキストボックスのコントロールソースに
=IIf([社員]="A",1)
と設定します。
数値フィールドに入力したいのなら、イベントプロシージャにコードを記述するかマクロを設定する必要があります。
「データベースツール」>「データベース構造の解析」でレポートとして出力できます。
それをExcelに変換もできるのでそちらで解析したり、見やすく体裁を整えたりもできます。
有料のツールとしては下記のようなものがあります。
私自身は使ったことはないので、現バージョンでは使えるかどうかは分かりません。
Access2016 仕様書 作成 ツール【A HotDocument】(Access2016対応 仕様書)
Access2010/2007仕様書作成ツール『T'sDoc 6』の詳細情報 : Vector ソフトを探す!
単純に改行を入れて入力すればいいかと思いますが、それではだめなんでしょうか。
Ctrl+Enterで改行を入力できます。
あるいは、テキストボックスの「Enterキー入力時動作」プロパティを「フィールドに行を追加」にすればEnterキーだけで改行されます。
もし、この方法をとるなら、テキストボックスのコントロールソースを下記のように設定すればいいでしょう。
chr(13) & Chr(10) は改行です。
できました!ありがとうございます。助かりました!
リッチテキスト形式を使うとテキストボックス内の文字に装飾を加えることができます
テキストボックスを背面に設置し、空白スペースで埋め尽くして、その文字の背景色としてカラーコードを指定すればイメージしたものができるかもしれません
背面に設置するテキストボックスの設定
表示したいラベルのサイズに合わせてフォントサイズや空白スペースの数を調整してみてください
クエリCの抽出条件
[Forms]|[フォームAの名前]![TXT_Aの名前]
If条件
IsNull(Me.テキストボックスの名前)
フォームを開く
DoCmd.OpenForm(“フォームB”)
どうですか?
区分によってレポートのデザインやレイアウトが大幅に異なるというのですか。
レポートのレコードソースのフィールド構成を提示してもらえますか。クエリなら、SQLビューで表示されるSQL文をコピーして貼り付けてください。
また、レコードソースに含まれるテーブルの主キーフィールドも提示してください。
そうです!
その通りになります。
説明不足で申し訳ありません。
レポートを3つ作り、フィールドの区分によってそれぞれのレポートを抽出したいです。
抽出条件は区分かつ商品番号で1つのレポートを出力したいです。
最初の質問に戻りますが、私が考えたのはラジオボタンで区分を選択し、テキストボックスなどで商品番号を入力、そして出力ボタンを押すと印刷プレビューが表示されるという形にしたいです。
これは知識不足の私が考えたものなので他にこっちのほうが良いという案がありましたら是非教えて頂きたいです。
なるほど、勉強になります。
ご回答ありがとうございます。
IDの値を取得したかったので、非表示では意味がありません。
ご回答いただいく直前に、自己解決しました。(報告遅れてすいません。)
「備忘録」
元データの名前をクエリ0とします。
クエリ1として、フィールド商品IDをグループ化、フィールド見積日を最大値とし、
ついでに、グループ化できないIDも、最大値としておく。
クエリ2として、クエリ0とクエリ1の商品IDと見積日をつなげ、
クエリ0のIDとクエリ1の商品IDと見積日を取得する。
これでクエリ1で取得した商品IDと(最新)見積日を持つ、クエリ0のIDが正確に取得できました。
IDフィールドを非表示でどうですか?
レポートが複数あり、区分によって異なるレポートで印刷したいということですか。
区分がお菓子のときは、レポートA
区分がお酒のときは、レポートB
とか。
その辺をもし少し具体的に説明してください。
テーブルAには商品番号というフィールドはなくテーブルAとお菓子を登録しているマスタのクエリを作りそれをレポートのレコードソースとしています。
そしてレポートに商品番号のテキストボックスを配置しております。
商品番号だけを指定してレポートを表示させても区分によって出力するレポートが違うので絞り込めないのです・・・
分かりにくい設定で大変申し訳ないです。
商品番号かつ区分がお菓子のときのレポート
商品番号かつ区分がお酒のときのレポート・・・という風に条件付きでレポートを印刷したいのでお力を貸して頂けると嬉しいです。
なるほど、そういうことですね。。わからずお恥ずかしい限りです。
優しく教えていただき、ありがとうございました!
それなら読み取り側のシステム次第でしょう
たいていのデータベースソフトならSQLでクエリを発行すればいいでしょうし、ACCESSならDLookup関数でもいいでしょう。データベース的な能力がないのならCSVでマスタをデータ化しておいてテキスト検索的な手法になるかもしれません
名刺の発行側で考えることではないですね
また、氏名という項目は同姓同名問題が発生するので画面の表示上日本語でも、システム内部ではかならずユニークな識別子をもってやり取りするものです
本当にQRコードに日本語データが必要なのかよく考えてみてください
hatena様
ご回答ありがとうございます。
説明不足で申し訳ございません。
>わさわざQRコードにする意味はなんですか。
弊社では名刺を名札がわりに首からぶら下げています。
ある作業をする際に名刺に記載されているQRコードを読み取って
作業を行います。(コンビニなどでされていますよね)
読み取った名前は作業記録に表示されます。
これで理解いただけましたでしょうか?
考え方は同じですよ
論理演算(基礎知識)や演算子の優先順位(システムによりけり)に気を付ける必要はありますが
例えばクエリにフィールドを追加するなら
すばらしい!そのようなアイデアがありましたね。ありがとうございます。
条件が追加されました・・
条件1~4はチェックボックスなのですが、それぞれ関連するテキストボックスがあり
それぞれ「「条件1テキストボックス」が空かつ「条件1チェックボックス」がfalse」という条件になりました。
こうなってくると、やはり4行(12行)ですよね。
各メールアドレスの最初にかならず「,」をつけて、最後に1文字目を取り除くとか
In演算子のことを勉強したことがありましたが、すっかり忘れていました。
このような使い方ができるのですね。ありがとうございます!
混雑時を避ければ表示は、早いのでformatによる整形とMe.Visible = Falseを入れてみたりして改善してみます。非常に助かりました。有難う御座いました。
定義域集計関数をループで繰り返し呼び出したり、クエリ内の演算フィールドで使う場合は重くなる可能性がありますが、
一回だけ呼び出すのなら、定義域集計関数の第2引数に設定するテーブル、クエリの設計、第3引数の抽出条件の設定次第です。
他の方法(DAO, ADOなど)を使ってもテーブル、クエリの設計、抽出条件の設定が悪ければ同様に時間がかかります。
T'sWareさんの定義域集計関数とSQLの比較でも
10000回呼び出して差が10秒ですので1回あたりでは0.001秒ですので体感できる差ではないです。一回だけ呼び出すのなら、代替関数と比較すべきですのて、むしろ遅くなってます。定義域集計関数で時間がかかっているのなら(それも本当にそうなかの検証も必要です。別の部分で時間がかかっているのかも知れません。)、テーブル、クエリの設計、抽出条件の設定から検討する必要があります。
高速化について参考になれば
Q.Access って1万件超えると遅くて使い物にならないって本当ですか?(Fly me to the Access Heaven (クラウド対応版)さん)
定義域集計関数とSQLの比較(T'sWareさん)
ネットワーク越しで何度も読み込みたくないならフォームを作って閉じる代わりに
Me.Visible = False
するような仕掛けが簡単かな私も、そこまで詳しくないので、VBAで探すか、クエリで集計しておくか、フォームのテキストボックスに計算式入れておくかで、軽くなるのかよくわかりません。分かる人に、回答を任せますね。
ご回答有難う御座いました。恐らくなんとかなりそうです。
一般的に、合計を求めてダイアログボックスに表示する方法は、集計関数を使う方法しかないのでしょうか?レコード数であればadoという手もあるのですが。ローカルな環境では無い為、混雑してる時間ですと8個の計算結果を1つのダイアログボックスに表示している為、パソコンが固まり、タスクマネージャーで消すというリスクがある為、一般的にもこの様な事象が起こっているのか気になりまして。そこの所を教えて頂けないでしょうか?
VBA TextBoxに入力された8桁の数値を日付に変換する、をググるといけるかも?
ご回答有難う御座います。テキストボックスには、8桁日付けしか入れれない為Format関数をどのタイミングで入れれば良いか分かりません。msgboxの前に変数の構文を作りそれに対して使えば良いのでしょうか?set 変数=format(value)見たいな感じでしょうか?
Format関数、“mm月dd日“でどうですか?
有難うございます。上手く行きました。テキストボックスの日付もmsgboxに表示する為に、me.日付入力.valueも入れています。ただ、8桁日付けで本日でしたら20201116と表示され見た目が良くない為、11月16日と置き換える事は、できますでしょうか?宜しくお願い致します。
エラーの状況がよくわからないけれど、
フォームに名前プロパティ:日付け入力のテキストボックスを作って
クエリの抽出条件に
[Forms]![作成したフォームの名前]![日付け入力]
でどうですか?
「商品番号」という名前から主キーのような感じですが、主キーですか。
主キーなら、「商品番号」を指定してたらレコードは1件になるので、ラジオボタンの意味がないと思いますが。
あるいは、商品番号とオプショングルーブで指定した区別の2つはAND条件ではなく、OR条件ということでしょうか。
社員情報テーブルに目標IDフィールドを追加、社員情報履歴テーブルの作成でも行けるかも?
例えば、
①朝の出勤ラッシュが終わったら、出勤した社員情報データを社員情報履歴テーブルに追加クエリ。
(とりあえず、社員IDと目標IDと日付)
②1日の業務が終わったら、出勤した社員情報テーブルの目標IDを更新クエリ。
hiroton さんの回答でいいと思いますが、別案を。
In演算子を使うと下記のように記述できます。
よく理解できました。場合分けが面倒で、妥協しようかと思ってたところもあったので、かなり助かりました。ありがとうございます!