Function f_strInsAfter(strOrg As String, strBgn As String, strEnd As String, strIns As String) As String
Dim p1 As Long
Dim p2 As Long
p1 = InStr(strOrg, strBgn)
If p1 = 0 Then
f_strInsAfter = strOrg
Exit Function
End If
p2 = InStr(p1, strOrg, strEnd)
If p2 = 0 Then
f_strInsAfter = strOrg
Exit Function
End If
If Len(strOrg) < (p2 + Len(strEnd)) Then
f_strInsAfter = Left(strOrg, p2 + Len(strEnd) - 1) & strIns
Else
f_strInsAfter = Left(strOrg, p2 + Len(strEnd) - 1) & strIns & f_strInsAfter(Mid(strOrg, p2 + Len(strEnd)), strBgn, strEnd, strIns)
End If
End Function
ご連絡ありがとうございます。
「T_モニタリング」に「ケアプランID」を設ける形で再度挑戦してみようと思います。
毎月、記録するT_モニタリングと、計画をするT_ケアプランは記録をする担当者が違う為、ケアプランが期日を過ぎてもモニタリングは毎月可動するように考えています。(過ぎている場合警告を出す予定で)
毎月のモニタリングはお客様数が50名を超えるのでできれば表形式を使いたいと思っています。
クエリの組立が勉強不足なのだと痛感しました。hirotonさんありがとうございます。
テーブル一つで組めば楽だと思いますが
『「評価」は2か月に1度にしよう』とか業務内容変更の可能性なんかを考えるとテーブル1つにしちゃったら発狂間違いなしですねぇ
もう一つ例を挙げているように「T_モニタリング」に「ケアプランID」を設けてあげればクエリで簡単にモニタリングの計画月に対応するケアプランの計画日が拾えるので日付の比較で3か月目かどうかが簡単に計算できます。「評価日」も簡単に計算できるのでフィールドに持つ必要もなさそうです
質問のように対応する「ケアプランID」が不明の状態だと、自前で対応するケアプランの計画日を探すという計算式を組むことになります。結構めんどくさいです
「関係性がよくわからない」とはこの部分のことで、それぞれのテーブルに日付のデータが入っているので頑張れば関係性を見つけることはできそうですが、そんな頑張りせずにIDで紐づけできないか?という話です
「T_モニタリング」に「ケアプランID」を設けて、メインフォーム(T_ケアプラン)、サブフォーム(T_モニタリング)としてプランIDとケアプランIDをリンクさせ、よくあるメイン-サブフォーム形式で組めば難しいものでもないのではないでしょうか
ありがとうございます。説明足らずですみません。
やはりテーブル一つで組むのがよいのでしょうか…
モニタリングというのは毎月報告していく書式ですのでお客様の様子を日付と内容を挿入し毎月更新します。
ケアプランは初回から6か月おきに作る書式です。関連性は、ケアプランで作成した計画が3か月目で毎月行うモニタリングを元に評価する。という点だけです。ただ、毎月行うモニタリングの書式のフォームに評価をする項目も盛り込みたいと考えています。(記録者にわかりやすくしたい為です)
テーブルを一つにまとめて挑戦もしていますが、構成がいまいち頭に描けず混乱しています。
うまくいきました。ありがとうございます!
モニタリングとケアプランの関係性がよくわかりませんね
少し乱暴ですがテーブルを分けずに「T_ケアプラン」に「モニタリング評価1」、「モニタリング評価2」、「その他情報フィールド」をつけてしまえば解決するのでは?
テーブルを分ける必要があるのなら「T_モニタリング」に「ケアプランID」を設けて関係性を持たせれば楽ができると思います
未記入のフィールドにデータを書き込むなら更新クエリです。それともケアプランを作成したときに自動的に「T_モニタリング」にデータを追加したい(6か月分)という内容でしょうか?
あっ、2つのテーブルはちがいますね。kitasueさんの回答でいいと思います。
2行目の
の部分を消せば良いのでは。
ご確認ありがとうございます!上記の教えていただいたSQLは重複無しで使用できておりました、
そのコンボボックスを、もう一つ条件をプラスして(具体的には、もう一つリレーションシップで繋がる別のテーブルの主キーとつながるものだけに絞り込んで表示する)使用しようとしたところ、重複が発生しました。
もしや、今度こそユニオンクエリを使えば良いのですね…?あとでやってみようとおもいます。
hatena様
お世話になっております。
お忙しい中、ご回答して頂き、ありがとうございます。
頂いたヒントを調べながら制作してみます。
難易度がかなり高そうですが(-_-;)、少しずつ勉強しながら頑張ります。
引き続き、今後とも宜しくお願い致します。
検索コンボボックスの選択肢追加 Microsoft Access 掲示板 - zawazawa
の続きですね。
そこで紹介した下記のSQLで重複なしの年月リストになると思いますが、それではダメでしたか。
「N」は演算フィールドに適当な名前を付けたという理解でよろしいです。
私自身、実運用でそのような仕様のものは作ったことがないので、脳内シミュレーションのみで提案してますので、実運用で問題が発生するかもしれませんが、その場合はその都度、修正していくことになると思います。
顧客情報履歴テーブルに移動をした方がいいと思います。また、それだけ変更項目が多いなら、前者の方法がいいと思います。
顧客マスターテーブルに、最新顧客情報履歴CD のフィールドも追加しておくといいでしょう。
顧客情報を更新したときに、その 顧客情報履歴CD でマスターの 最新顧客情報履歴CD を更新するようにVBAで組んでおきます。
顧客情報の最新の情報のみ簡単に抽出できますので。これがないと、DMax関数かサブクエリの複雑なSQLになります。
質問2に関してはVBAが必要になりますね。重複チェックも必要になります。ランダムな値は、rnd関数を使って取得します。この辺はWEB検索で調べてみてください。
質問3は、WEBで探せばありそうな気がします。
あるいは、入社年 と 連番 は別フィールドにして、複数フィールド主キーにするという方法もあります。
こうすると、連番の採番が楽になります。
今、ちょっと時間がないので、とりあえず回答になりましたが、上記をヒントにいろいろ調べてみてください。
kitasue様
モジュールを記載いただきありがとうございます。
頂きましたモジュールで試してみたところ無事思うような動きになりました。
大変助かりました。 本当にありがとうございます。
少しずつ私も勉強していきたいと思います。
今後ともよろしくお願いします。
標準モジュールに以下を定義すると、
f_strInsAfter([説明文],"<img",">","<br>")
がご所望の文字列を返します。
hatena様
すみません。
質問3に誤りがあります。(6月→3月)
修正できなかったので質問3のみ再度書き込みました。
不慣れで大変申し訳ありません。
質問3:
社員コードは入社年と連番の組合せでしたく、年が変わったら連番を001にリセットしたいです。
例:2020年4月~2021年3月まで020001~、2021年4月~2022年3月まで021001~みたいです。
hatena様
早速、ご回答と分かりやすい説明をして頂きありがとうございます。
Accessを勉強し始めたばかりで前者の設計例と後者の設計例どっちがいいのか判断すらまだできません(-_-;)
同じ情報を何回も登録したくないので前者の設計例を参考させながら制作したいと思っております。
テーブル構成は下記を想定しています。(Excelで仮表を作成した程度でAccessでは未作成です。)
テーブル設計で新たに質問がいくつか出てきました。
顧客マスター
顧客コード 主キー (AAAA0001)(AAAA:は任意4文字)(0001:自動ランダム採番)
顧客名
登録日
顧客情報履歴
顧客情報履歴CD 主キー(数値型)
顧客コード
変更日
電話番号
顧客先担当者名
・・・
取引情報
取引情報ID 主キー(数値型)
顧客コード
顧客情報履歴CD
取引日
取引内容
社員コード
・・・・
社員マスター
社員コード 主キー(020001)(020:入社年)(001:連番)
名前
フリガナ
入社日
・・・・
質問1:
顧客マスターテーブルの顧客名も変更される可能性があり、顧客情報履歴テーブルに移動をした方がいいでしょうか。
(顧客マスターテーブルのフィールドが登録日だけになってしまいます。)
質問2:
顧客コードでアルファベット4文字とランダムで自動生成した数値にしたいですが参考している書籍に書いて無く、可能でしょうか。
質問3:
社員コードは入社年と連番の組合せでしたく、年が変わったら連番を001にリセットしたいです。
例:2020年4月~2021年6月まで020001~、2021年4月~2022年6月まで021001~みたいです。
いきなり最初のフィールドのコード設定で躓きましたがご教授の程宜しくお願いします。
現在は書籍を読み続きながらhatena様のサイトの過去の投稿等で勉強させて頂いてます。
ありがとうございます。
色々と質問等出てくるかもですが、どうかご教示の程、宜しくお願い致します。
インポートをやめて、追加クエリを使ったリンクテーブルに修正したら、とても使い勝手が良くなりました。本当に助かりました!
方法としては2つあります。
前者の設計例(一例ですので、実態にあわせて修正の必要あり)
顧客マスター
顧客コード 主キー
顧客名
・・・その他変更の可能性のないフィールド
顧客情報履歴
顧客情報履歴CD 主キー
顧客コード
変更日
電話番号
担当者名
・・・その他変更の可能性あるフィールド
取引情報
取引情報ID 主キー
顧客コード
顧客情報履歴CD
取引日
取引内容
・・・・
顧客情報履歴CD は入力フォームのテキストボックスの規定値に最新値を設定しておく。(DMax関数で)
※顧客情報履歴 は 顧客コード と 顧客サブコード で複数フィールド主キーにする方法もあります。
後者の設計例
顧客マスター
顧客コード 主キー
顧客名
変更日
電話番号
担当者名
・・・・
取引情報
取引情報ID 主キー
顧客情報履歴CD
取引日
取引内容
電話番号 変更の可能性のあるフィールドは重複して持たせる
担当者名 変更の可能性のあるフィールドは重複して持たせる
・・・・
フォームで入力時に、変更の可能性のあるデータは、VBAでマスターの値を代入する。
ありがとうございます。参考にさせていただきます。
リンクテーブルから追加クエリを作成すればよいのですね。よくわかりました。この方法でやっていきたいと思います。ありがとうございました。
クエリで関数を使わなくても、フォームのテキストボックスの書式に、
0000¥/00¥/00
と指定すれば、表示されます。
編集もできますが、編集時は、
/
は消えます。
元データは何で、どのように取り込んでますか。
自分なら下記のような方法をとります。
元データはリンクテーブルにする。
Access側のテーブルのフィールドは日付/時刻型にしておく。
リンクテーブルから追加クエリを作成して、追加クエリのフィールドで Format([年月日],"0000/00/00") と変換しておく。
追加クエリを実行すれば、日付/時刻型として取り込めるので、あとは書式設定で、好きな書式で表示できます。
インポート定義と、インポート保存が別物であることがようやく理解できました。ありがとうございました。
せっかくデータベースソフトなんですから、テーブルに出力すればいいのでは。
テーブルなら、結果データの検索、抽出、などの操作も簡単ですよね。
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様
早速の返信ありがとうございました。
ご教授いただいた内容を確認し当方の求めていたものでした。
活用させていただきます。