(空欄)を先頭に持ってくるようにするために、[年月日] Is Null AS N というフィールドを追加
ORDER BY 2, 1 DESC;
の数字は何列目かを指定しています。下記と同じ意味になります。 ORDER BY [年月日] Is Null, Format(Format([年月日],"yyyy/mm"),"&;""(空欄)""") DESC;
フィールドの式が長いときは簡略化できるので便利です。
cbo年月の更新後処理のイベントプロシージャ
Private Sub cbo年月_AfterUpdate()
If Nz(Me.cbo年月) = "" Then
Me.Filter = ""
Me.FilterOn = False
ElseIf Me.cbo年月 = "(空欄)" Then
Me.Filter = "年月日 Is Null"
Me.FilterOn = True
Else
Me.Filter = "年月日>=#" & Me!cbo年月 & "# AND 年月日<#" & _
DateAdd("m", 1, Me!cbo年月) & "#"
Me.FilterOn = True
End If
End Sub
★降順にしていたものを昇順としたが、その他の問題は解決。
【値集合ソース】
SELECT DISTINCT "(空欄)" AS 年月
FROM T_案件
WHERE (((T_案件.年月) Is Null))
UNION SELECT DISTINCT T_案件.年月
FROM T_案件
WHERE (((T_案件.年月) Is Not Null));
インポート定義と、インポート保存が別物であることがようやく理解できました。ありがとうございました。
せっかくデータベースソフトなんですから、テーブルに出力すればいいのでは。
テーブルなら、結果データの検索、抽出、などの操作も簡単ですよね。
Excel VBA を学ぶなら moug モーグ | 即効テクニック | Recordsetオブジェクト(DAO)を使ってレコードを追加する
Print # ステートメント
をお使いになってはいかがでしょうか。
https://docs.microsoft.com/ja-jp/office/vba/language/reference/user-interface-help/printstatement
保存済みのインポート操作ではなく、新たにテキストファイルのインポート等を実行してインポートウィザードを立ち上げると設定できます
③のサイトでもインポート定義だけ触れればいいのにインポートの操作しないとそれができないからという方向で説明してますね
冒頭はインポート定義を編集するための方法の説明になってますよ
色々調べて「MSysIMEXSPecs」がまっさらな場合の対応方法などもわかり、インポート定義には問題がなかったことがわかった後、インポートできない原因がやっと特定できました。元データのほうに問題があったようです。申し訳ありません。
ただ、①②ができるということであれば、やり方を知りたいのですが
どうしてもやり方がわかりません。
①外部データ>保存済のインポート操作>定義のどれかを選ぶ(テキスト)>左下にボタンは「実行」「Outlook~」「削除」の3つしかない・・・?
といった状況です。
②新規で定義を作ろうとすると、設定(どのフィールドをとばすかなど)を飛ばして進んでしまいます。
①も②もできます
インポートそのものはどのように行っているんですか?
インポートできない原因はきちんと特定できてますか?
基本的な部分を理解していない状態でシステムの根幹部分に直接手を入れてもシステムを壊すだけですよ
ありがとうございました。おかげさまで、他の問題点も解決いたしました。
※都合によりVBAは消しております。申し訳ありません。
非連結コントロールだとそうなります。各レコード毎にデータを保持できませんので。
対処するには、下記の2つの方法があります。
請求日を計算する関数を作成して、それをtxt請求日のコントロールソースに設定する。
テーブルに「請求日」フィールドを追加して、txt請求日のコントロールソースにそのフィールドを設定する。
この 2. の方法ならコードは現状のままでいいはずです。
VBAかマクロで、フィールド1の更新後処理か、フォームの更新処理前で、フィールド2にランダムにプラスした値を代入することになるでしょう。
ありがとうございます!いただいたファイルを参考に、データを作り直したところ正常に動くようになりました。
また、リレーションシップの組み方も自信が持てなかったので、お手本をいただいて本当に感謝です。
手元に置いて、今後も参考にさせていただきます。
大変お手数をおかけいたしました。
サンプルファイルを作成しましたので、参考にしてください。
案件管理どんぐり.zip
上記の「F案件登録」が案件登録フォームになります。
会社、担当者、商品 はコンボボックスで選択できるようになってます。
会社、担当者、商品 でリストにないデータを新規追加したい場合は別に新規追加用のフォームをそれぞれ用意して入力するようにします。入力後、それぞれのコンボボックスを再クエリすればリストに追加されます。(新規追加用フォームは作成してませんので、作成してください。)
コンボボックスのとなりに新規追加用コマンドボタンを配置しておくいいかと思います。
リレーションシップの設計は下記のようになってます。
別件の質問のサンプルフォームを同封してます。
どのようなフォーム設計になっているのか、現状の情報からはよく分からないので、提示のテーブル構成の場合の一般的な設計のサンプルを作成しましたので、ダウンロードして参考にしてください。
案件管理どんぐり.zip
サンプルを見てもらえれば分かると思いますが、
会社情報登録フォーム(F会社)も商品情報登録フォーム(F商品)もサブフォームの項目はコンボボックスで選択するようになっています。コンボボックスは ID で選択しても 名称 を入力してもいいようにしています。(詳細は下記を参照)
コードでも名称でも入力できるコンボボックス - hatena chips
こうすれば、
の問題は解決できると思います。
なお、上記のサンプルには別件の質問のサンプルフォームを入ってます。
度々すみません。色々いじっていたら、会社フォームのサブフォームから商品データを追加することはできるようになりました。
商品フォームのサブフォームから会社データを追加しようとすると、
「LinkMasterField/リンク親フィールド プロパティ設定でエラーReturnに対応するGoSubがありません。が発生しました。」と出ます。
そのあと、「テーブルT商品にリレーションシップが設定されたレコードが必要なので、レコードの追加や変更はできません。」と出て、追加することができません。
ちなみに会社フォームはオートナンバーではないので、入力するときにコンボボックスで選択して会社IDを入力するような形にしています。
すみません。実際に作ってみて、もう1つ問題が発生しました。
サブフォームからデータを追加しようとすると
「レコードを追加できません。T取扱商品の結合キーがレコードセットにありません。」
というエラーが表示されます。
教えていただいた方法で設計してみて、問題にぶつかりました。
今まで一対多の形でサブフォーム(データシートビュー)を活用したことしかなかったので気づかなかったのですが
多対多でサブフォームから登録する形にした場合、
①すでに登録しているものかどうかの判断が難しい
②すでに登録されている場合、正確に語句を統一して登録するのが難しい
という2つの問題があります。
解決法としてわたしに思いつくのは、
(1)両方のサブフォームに書き込み可能なコンボボックスを配置する。
もしくは
(2)片方には(商品情報フォームから仕入先を登録するとき)コンボボックスを複数置いて追加する。
もう片方は(仕入先フォームから商品)情報の閲覧のみで、追加ができないようにする。
(1)は得策とは思えないので、(2)になるかと思っているのですが、
それ以外に何か良い方法はありますでしょうか。
ご確認ありがとうございます。こちらは仕入先会社の担当者で、自社との担当者が複数存在しています。
T担当者の担当者は、自社の社員でしょうか。それとも相手先の社員でしょうか。
もし、自社の社員がどの取引先の会社の担当するかを格納するものだとしたら、
このテーブル設計だと、一人の社員は一つの会社しか担当できないことになりますが、そういう運用形態なのでしょうか。
取引先の担当者ということなら、取引先の社内に、自社との担当者が複数存在するということでしょうか。
仕事が休みに入って、まだ実践できていないのですが、くわしく教えていただきありがとうございます。
お陰様でイメージはできたので、作成するのが楽しみです。インデックスのことも勉強になりました。
hatena様
早速の返信ありがとうございました。
ご教授いただいた内容を確認し当方の求めていたものでした。
活用させていただきます。
複数の選択肢に情報をつなげる方法 Microsoft Access 掲示板 - zawazawa
で提示されているテーブルと同じものかな?
だとしたら、データベース設計のセオリーとしては、正規化しましょう、ということになりますね。
正規化については、下記のページの「4.正規化」の項目を読んで学習してください。
もう一度学ぶMS-Access
具体的には下記のようにテーブルを分割します。
●T会社
会社ID 主キー
会社名
会社備考
・・・
●T商品
商品ID 主キー
商品名
単価
・・・
●T取扱商品
会社ID 主キー
商品ID 主キー
複数のフィールドに主キーを設定する方法は下記を参照。
複数のフィールドの組み合わせで重複がないようにする - hatena chips
リレーションシップで、同じ名前のフィールド同士結合しておきます。
リレーションシップの設定と効果 - もう一度学ぶMS-Access
T会社とT取扱商品を結合したクエリをレコードソースとする帳票フォームを作成します。
T商品をレコードソースとする単票フォームに、上記のフォームをサブフォームとして埋め込みます。
サブフォームのリンク親フィールド、リンク子フィールドは「会社ID」と設定します(リレーションシップの結合にあわせて自動で設定される場合もあり)
このフォームから、商品を見ながら、扱っている会社名のリストもサブフォームで見れます。また、サブフォームで取り扱い会社を追加することもできます。
逆に、
T商品とT取扱商品を結合したクエリをレコードソースとする帳票フォームを作成します。
T会社をレコードソースとする単票フォームに、上記のフォームをサブフォームとして埋め込みます。
サブフォームのリンク親フィールド、リンク子フィールドは「商品ID」と設定します。
このフォームからは、会社情報を見ながら、扱っている商品のリストもサブフォームで見れます。また、サブフォームで取り扱い商品を追加することもできます。
このような設計にしておけば、取り扱い商品や取り扱い会社の数に制限なくいくらでも追加できます。
現状のテーブル名と、そこに含まれるフィールド名、主キーフィールド、を提示してもらえますか。
教えていただいた方法でうまくいきました!色々方法がありますね。ありがとうございます。
うまくいきました!""の使い方がまだよく理解できておらず、助かりました。ありがとうございます。
としては、いかがでしょうか。
ID, パスワードが一致したらフォームを開く - hatena chips
上記で紹介したものてすね。
とりあえずサンプルを作成してみました。下記のリンクからダウンロードできます。
参考にしてください。
FrmRogIn2.zip
エラーはどのような間違いをしているのかを教えてくれる大事なものなのでエラーの内容も提示しましょう
見た感じ間違いがあるように見えませんが、よくあるパターンとしては会社IDがテキスト型であるとか
そもそもクエリ上でやりたいのなら「T会社」テーブルを2回入れてしまうのが良いです
クエリデザインでテーブルの表示から「T会社」を2回選ぶと、一つ目は「T会社」、二つ目は「T会社_1」となります
「T商品」の「会社1」と「T会社」の「会社ID」、「T商品」の「会社2」と「T会社_1」の「会社ID」を紐づけて上げれば
備考1:[T会社].[会社ID]
備考2:[T会社_1].[会社ID]
で望みの結果になります
自分なら、だと
メニュー画面で「出勤簿」「運転日報」それぞれのボタンを用意して入力フォームを開いたときに規定値を弄るとか、ですかね
どのコードでエラーはでますか。
当方のサンプルでの実験では問題なく実行できました。
アドバイスありがとうございます。
テストしてみましたがエラーのままでした。
マクロで以下のプロシージャの実行
オートナンバー型初期化("TEST3","ID")
※前後これ以外の処理はありません。
テーブルTEST3に定義しているフィールド名IDは以下の設定になっています。
データ型オートナンバー型
フィールドサイズ 長整数型
新規レコードの値 インクリメント
インデックス いいえ
文字配置 標準
ローカル変数のSQLは以下のようになっていました。
"Alter Table [TEST3] Alter Column [ID] Counter(1,1)"
連投すみません
新しいファイルでやり直したら問題なくできました
原因はわかりませんが、できなかったファイルでは
レイアウトビュー レポートビューで、一切レコードが表示されていませんでした
なにかのプロパティをいじってしまったのでしょうか?
正常なものと見比べましたがどこに違いがあるかわかりませんでした
何度も印刷プレビューとデザインビューを切り替えていると
”印刷時縮小 はい”で入力したレコードが表示される場合があるようですが
印刷するとレコードは表示されていませんでした
またすべてのレコードに余計な空白行が挿入されています
データ数が多くて処理が重く感じた時点で、インデックスを付けることを検討するということでもいいです。
インデックスとは、百科事典・学術書などの最後についている索引のようなものと考えればいいでしょう。
それが、あると検索や抽出が高速になります。
内容確認しました!とても勉強になりました。
「抽出条件でインデックスが無効になる場合」につきましては、また新しい知識なので勉強したいと思います。インデックスもいまいち理解できていなかったので貴重なお話をありがとうございます。
すみません…コンボボックスを左寄せ設定したら解決できました。(右寄せ設定になっていたわけではないので、原因は結局不明ですが…)お騒がせしました
とても丁寧な解説、本当にありがとうございます。じっくり読み解きたいと思います。心から感謝申し上げます。
フィールドを同じにする場合、下記のようなフィールド構成にする。
開始時刻 日付/時刻型
終了時刻 日付/時刻型
運転日報 Yes/No型
レポートの設計は、
出勤簿も運転日報も 開始時刻、終了時刻 をコントロールソースにすればよい。
ラベルの標題を出勤簿なら、出勤時間、退勤時間 に、
運転日報なら、開始点呼時間、終了点呼時間 にすればよい。
出勤簿と運転日報のレイアウトが同じでラベルの標題だけが違うのなら、
ラベルをテキストボックスに変換して、コントロールソースを下記のようにすれば一つのレポートでどちらでも使えます。
=IIf([運転日報],"開始点呼時間","出勤時間")
=IIf([運転日報],"終了点呼時間","退勤時間")
入力フォームは、フォームヘッダーにコンボボックスかラジオボタンを配置しておいて、運転日報か出勤簿か選択できるようにして、「運転日報」フィールドに対してフィルターをかけて対象レコードを表示するようにする。
あるいは、メイン/サブフォーム形式にしてもいいでしょう。
ラベルはレポートの同様にテキストボックスにすればいいでしょう。
自分なら上記のような設計にします。
サンプルの解説
テーブル T_案件 に 日付/時刻型の「年月日」フィールドがある。
「年月日」は未入力(NUll)のレコードもある。
上記のテーブルから帳票フォームを作成する。
フォームヘッダーにコンボボックスを「cbo年月」を配置する。
値集合ソース
テーブルに未入力のレコードが存在するのでユニオンクエリにする必要はなかったです。
Format([年月日],"yyyy/mm")
で年月日を年月に変換、さらに
Format(・・・,"&;""(空欄)""")
をかぶせることで、Nullを(空欄)に変換。(空欄)を先頭に持ってくるようにするために、
[年月日] Is Null AS N
というフィールドを追加ORDER BY 2, 1 DESC;
の数字は何列目かを指定しています。下記と同じ意味になります。
ORDER BY [年月日] Is Null, Format(Format([年月日],"yyyy/mm"),"&;""(空欄)""") DESC;
フィールドの式が長いときは簡略化できるので便利です。
cbo年月の更新後処理のイベントプロシージャ
cbo年月 が未選択の時は全件表示、
"(空欄)"を選択したときは年月日が空欄のレコードを抽出、
年月を選択したときは、その年月のレコードを抽出。
年月でフィルターをかける時、
Me.Filter = "Format([日付],"yyyy/mm")='" & Me!cbo年月 & "'"
とした方がコードは短くなるが、インデックスが無効になるので、処理を軽くしたい場合は上のコードのように年月日フィールドに直接条件を設定するようにしたほうがよい。
詳細は下記参照。
抽出条件でインデックスが無効になる場合 - hatena chips
レポートレイアウトのテクニックになるのかもしれませんが
出勤簿の提出があったとき
レポートには出勤時間や退勤時間レベルフィールドを配置したものにしますが
運転日報で入力したレコードに関してはその項目に値がないので
フラグでいずれかのフィールドを表示させるとかでしょうか?
簡単なサンプルを作成してみました。
下記のリンクでダウンロードできます。
案件管理.zip
何度も連投してしまい、申し訳ありません。自己解決する度、お答えする手間をかけないようにと思って都度都度投稿してしまっておりました…
現状のファイルをお送りしたい気持ちは山々なのですが、難しい状況です。
お言葉、ありがとうございます。
今回の件は、下記で解決とすることにしました。
大変お騒がせしました。
★降順にしていたものを昇順としたが、その他の問題は解決。
【値集合ソース】
SELECT DISTINCT "(空欄)" AS 年月
FROM T_案件
WHERE (((T_案件.年月) Is Null))
UNION SELECT DISTINCT T_案件.年月
FROM T_案件
WHERE (((T_案件.年月) Is Not Null));