Access総合相談所 29
■ このスレッドは過去ログ倉庫に格納されています
ACCESSに関する質問はこちらへ ▼━ 質問のしかた ━━━━━━━━━━━━━━━━━━━━ ★ 質問内容は具体的に書いてください。 業務上の守秘義務も大事ですが、貴方の所属組織を特定できるほど、特異な業務・システムは滅多にありません。 作りたいものの内容を隠しすぎないようにし、列名、データ値を適当に変更して例示するなどしましょう。 ★ 事前にGoogle等で調べられる範囲は調べてください。 ★ 完全初心者はまず、新規作成テンプレから「NorthWind」を開いて、一通り触ってみてください。ACCESSの概念を理解する もっとも簡単な方法です。 ★ お金の管理でシステム設計ミスが会社経営に重大な支障が予見される場合は、パッケージソフトに誘導する場合があります。 格安なソフトもあるので設計に取りかかってから悩む前に、市場調査も行なってください。 ★ アドバイスを貰ったら、必ず経過・結果の報告をして下さい。 ギブアンドテイクで情報を共有しましょう。 ▼━初心者用質問テンプレ ━━━━━━━━━━━━━━━━━ 【Windows】 7, 8,10 【Access】 365,2013,2016,2019 【作りたいものの業務分野】 販売管理,買掛管理,営業予算管理,営業実績管理,生産管理, 財務管理,労務管理,学術研究統計,文字格納を主体としたDB,その他() 【あなたのスキル】 LV1:完全初心者, LV2:ACCESSの基本要素(テーブルやクエリーなど)の役割を知っている LV3:VBAが打てる 【どのオブジェクトに関する質問か】 テーブル,クエリー,フォーム,レポート,サブフォーム(サブレポート),リレーション,VBA 【やりたいこと】 (質問によっては各テーブル名と列名を例示) (クエリーの場合は、左上の「表示」を押し”SQLビュー”に変更して表示される”SQL文”を貼り付けると回答者がわかりやすい) (得たい出力結果や挙動) 【エラーメッセージに関する質問】 ・エラーメッセージの内容 ・windowsは32bit版か64bit版か 前スレ Access総合相談所 28 https://mevius.5ch.net/test/read.cgi/bsoft/1535638568/ >>192 他のバージョンも最初は全部その日だったんだぜ…? さすがに前倒しにはなると思ったけど予想以上に早かったな >>188 インスタントに答え求めるんじゃないよ。 だいたい皆さん、余裕があるときに書いてるんだから。 まずさ、その配属テーブルだけじーっと見てみ。 一行で「いつから」『いつまで』の配属か分かればもっと楽だよね。こっちも考えるけどおまいも 真剣に考えろ。 >>188 ===Q_配属M=== "セレクト” TBL_配属M.RECID, TBL_配属M.社員番号, TBL_配属M.配属, TBL_配属M.配属日, DCount("配属日","TBL_配属M",[WHERE句])+1 AS インデックス, "社員番号=" & [社員番号] & " AND 配属日<#" & [配属日] & "#" AS WHERE句, [インデックス]+1 AS インデックス2 FROM TBL_配属M; ===Q_配属M2=== SELECT Q_配属M.RECID, Q_配属M.社員番号, Q_配属M.配属, Q_配属M.配属日, Q_配属M.[インデックス], [Q_配属M_1].[配属日]-1 AS 転属1, IIf(IsNull([転属1]),DateAdd("yyyy",100,[Q_配属M].[配属日]),[転属1]) AS 転属日 FROM Q_配属M LEFT JOIN Q_配属M AS Q_配属M_1 ON (Q_配属M.[インデックス2] = Q_配属M_1.[インデックス]) AND (Q_配属M.社員番号 = Q_配属M_1.社員番号); 続き ===売り上げとの紐付け SELECT T_URI.RECID, T_URI.売上日, T_URI.売上, T_URI.社員番号, Q_配属M2.配属, Q_配属M2.配属日, Q_配属M2.転属日 FROM T_URI LEFT JOIN Q_配属M2 ON T_URI.社員番号 = Q_配属M2.社員番号 WHERE (((T_URI.売上日)>=[配属日] And (T_URI.売上日)<=[転属日])); やってること クエリー1つめ、社員番号の配属先の古い順にインデックス番号を生成する ついでに次のインデックスも+1で埋めて置く クエリー2つめ、Q_配属Mを2つ並べる。1つめの「Q_配属M」の 「社員」および「インデックス2」と2つめの「Q_配属M」の「社員および」「インデックス」 を紐づける。尚、当然、空値もあるので、紐付けはLEFT JOINとする。 そのうえで、転属1: [Q_配属M_1].[配属日]-1(次の配属日の1日前) さらに最後の所属の空値対策で、 転属日: IIf(IsNull([転属1]),DateAdd("yyyy",100,[Q_配属M].[配属日]),[転属1]) (最後の所属は、配属日の100年後)とする。 最後に、売り上げとQ_所属M2をつなげる。 Q_所属M2からは、(T_URI.売上日>=[配属日]) And (T_URI.売上日)<=[転属日]) を条件とする。 https://i.imgur.com/6WtnoHn.jpg >>184 上手くいきませんでしたか、それは失礼しました。 既に他の方が回答されているようですが、これが私の回答になります。改めて以下の手順でやってみてください。 選択クエリを作成 T_売上とT_配属を表示させ 社員と社員名で結合 フィールドは以下の3つ T_売上.*,配属日、配属先 配属日の抽出条件に <=[契約日] を入れます。 これをQ_売上+配属という名前で保存 これでそれぞれの契約日以前の配属日と配属先がT_売上に付加されます。 ただ、これには過去の複数の配属日が含まれます。 次に、別のクエリを作成 Q_売上+配属だけを表示させ フィールドは以下の2つ Q_売上+配属.*,配属日 配属日の表示のチェックを消して、抽出条件に DMAX("配属日","Q_売上+配属","[社員]=" & [社員] & "AND [契約日]=#" & [契約日] &"#") を入れます。 これにより、[社員]毎に[契約日]直前の配属日と配属先が特定されます。 このクエリとT_売上のレコード数は一致するはずです。 どうですかね? レスが遅くなってしまい申し訳ございません >>196 さん、>>198 さんお二人ともありがとうございます! 昨日は体調不良で何も出来てないので今日頑張ってみます!! また催促するような真似をしてしまい申し訳ございません 以後気を付けます >>199 一部訂正です 二つ目の抽出条件のANDの前後には半角スペース入れて下さい ちなみにDMAXのような定義域集計関数は処理に時間が掛かる事があります その場合はサブクエリに置き換える方法もあるのですが、エラーになることもあり こちらをオススメします >>188 です >>196 さん、>>198 さんのおかげで求めたいものが出せました! ただご指摘にもあった通り、DMAXで計算時、重たいものとなってしまいました。 調べてみた限りだとVBAのほうが軽くなるみたいなので やっぱりそっちも勉強していかないとダメですね 難しいと思って今まで逃げてきた道だけど、やっぱり難しい… 【 システム環境 】 Windows10, Access2010 【 VBAでの回答 】 可 SQLでも可 教えてください。 [日付] [店舗名] [購入品] [購入金額] というフィールド構成のテーブルがあります。 このテーブルから、それぞれの店舗ごと、一番最初に買物をした日付と その時の購入品、購入金額を抽出したいのですが、どうやればいいのでしょうか? 店舗ごとの一番最初の日付というだけならクエリを作れるのですが、 その最初の日付のときの購入品や購入金額も同時に取得することができません。 よろしくお願いいたします。 >>202 あえて一つのqueryに詰め込まないよ。 日付と商店だけ選択して 集計クエリーに変更 日付を最小値 これで一旦保存 q1 q1と元のテーブルを並べて日付と商店を線で結ぶ。 なお、同じ日に2アイテム買ったら 2アイテム出てくるのは、そういうもんだと思ってくれ。 >>202-203 集計クエリにして、 [日付] =最小値 [店舗名] =グループ化 [購入品] =先頭 [購入金額] =先頭 これでダメ? >>204 先頭や最後は使わないです https://www.feedsoft.net/access/sql/sql54.html にもあるように望みのレコードを得られないことがあるのです これはデータベースというのがハッシュテーブルというレコードの順序をあえてランダムに記録するテーブルだからでしょう >>202 そのテーブルをT_購入履歴とするなら そのテーブルの選択クエリ作って 日付フィールドの抽出条件に =DMin(“日付”,”T_購入履歴”,”[店舗名]=“&[店舗名]) を入れる 当然だけど、一番最初の日付で複数の商品を購入してたら、クエリの結果もそれが反映されて 1店舗で複数のレコードが表示されるけどね それから更に絞り込むかどうかは別の問題 >>206 自己レス訂正 抽出条件は =DMin(“日付”,”T_購入履歴”,”[店舗名]=‘“&[店舗名]&”’”) だった。 Criteriaでフィールド値を指定する場合 数値はそのまま 文字列はアポストロフィ'で挟む 日付は#で挟むんだったわ これは定義域集計関数だけじゃなくて フィルターでも同じ 【 システム環境 】 Windows10, Access2010 VBAのイミディエイトウィンドウにて ?30.76666666666667-29 ↓ 1.76666666666667 でOK、しかし ?30.76666666666667-30 ↓ 0.766666666666669 と結果がおかしい どうしてでしょうか? >>208 1.まずは、浮動小数点数というものを理解して、コンピュータでは実数を正確に 表せないので近似を使っていることを理解する さらに、significant digitというものについて調べておく 2.現在使われている標準的な倍精度浮動小数点数の規格に準拠すると、「普通は」それぞれ 1.7666666666666693 0.7666666666666693 を返すことを認めましょう(ブラウザのjavascript consoleで試せます) 3. で、VBA独自の仕様として、「signiifcant digitは15を超えない」という規則があるため、 前者は、16番目の数の9を切り上げて 1.76666666666667 後者は、(0.xxxの0はsignificant digitではないので)17番目の3を切り捨てて 0.766666666666669 となります。 すげ。2ヶ月くらい前にも この話題、出てたよね。 小数点4桁以下を扱う仕事を したことないから、型の仕様の違いに気づくことなかったわ。 現在、毎日社員が件数を打ち込む日報なようなものを作成しています EXCELでVBAを触っていたのでVBAの知識はそれなりにあると思います 課毎で項目が変わるのでフォームで課を入力すると、テーブルに保存してある 「課に適した項目・表示する箇所」をもとに抽出して、それをテキストボックスに項目を表示させます また件数用のテキストボックスを作成して、そこに打ち込んだあと 登録ボタンを押すとテーブルに保存させるようにしました(ここまでは完成済み) 更に件数を打ち込んだ時点で自動的にテーブルに保存させれないかなと考えてハマりました ・テキストボックスの合計を保持するテキストボックスを使用してその値が更新されたらテーブルに保存 →テキストボックスが60個あるので、似たような処理を全てに入れるのは大変 →classを作成して、読み込もうとしてもエラーになって上手くいかない (classの冒頭で行うテキストボックスの宣言でエラーになる) ・サブフォームでフィールドを読み込んで出来ないか?更新を自動的に行えないか? →調べても出来ない状態 何か良い案あるでしょうか? >>213 Access特有の仕様で、フォームにテーブルなとをレコードソースにしている限りは 入力後にそのコントロールを外れた瞬間に値の仮確定、 レコード移動ボタンやフォームを閉じるだけでレコードの保存が完了します。 レコードを移動しないで保存を完了するには、me.requeryや >96さんご教示のme.dirty=falseなど。 課ごとの入力項目は、そういったテーブルを用意してテーブルのフィールド名を1レコード1フィールド名で保存、 フォームのコントロール名はテーブルのフィールド名と一致させておきます。 課選択後に入力項目テーブルを読みにいかせて、ぶん回して me.controls(value).visible=true enabled(入力可 不可選択)でもいい。 じゃあ、入力項目以外をどうロックするかだけど 入力項目のテーブルからいわゆる60項目を並べたものをクエリーにして レコード移動時イベントプロシージャに入ったときに このクエリーを読みにいかせ、 dbo方式なら rst.fields.countでループ回数を取得、 ループに入ってから rst.fields(変数).nameで名前を拾って 上記のような手法で全部、非表示にしてはどうでしょうか。 フォームあれこれ1 レコードソースにレコードが無いとフォームビューでコントロールすら表示されない。 レコードソースがテーブルで、レコードセットがDynasetなら新規レコードが常にありますからそんなことにならないのですが 選択クエリだと、選択の結果が0レコードってこともあるので、その場合はコントロールすら表示されず、背景がただ表示されるだけになります。 解決方法 選択クエリで対象となるテーブルどうしのリレーションシップを設定します。 リレーションシップで選択クエリと同じ結合をします。 主キー側が1、そうでない側が∞の表示になります。 フィールドの連鎖更新等のチェックは全部いれてかまいません。 これを1:多の結合といいます。 フォームビューを見る前に、選択クエリのテーブルビューで*が最後のレコードの次に表示されているか確認しましょう。 フォームあれこれ2 サブフォームとの連携はどうする? メインフォームで選んでいるコントロールの値を選択条件の設定には 1 サブフォームのプロパティでリンク親フィールド(メインフォームのコントロール名)と 対応するリンク子フィールド(サブフォームのコントロール名)をそれぞれ指定する方法 2 サブフォームのレコードソースをメインフォームのコントロールの値で選択する設定をした選択クエリにする方法 があります。やりやすい方で良いかと フォームあれこれ3 絞り込み機能付きの帳票フォームはサブフォームでないといけないの? 絞り込みということであれば、メインフォームのフォームヘッダに選択条件を設定するコントロールを置いて その値で絞り込むことも可能です。 なお、絞り込みは、フィルターで設定するのが確実です。 今日は設計の失敗発覚。 サブフォームのフッターに合計式入れて、親フォーム(親テーブル)の同項目フィールドに代入するやり方、 あんましやらないほうがいいね。 あちこちのイベントにrecalc仕込んで置かないと、合計ゼロになったりサブの最後の入力レコードが 算入されなかったりする。 たぶん、親フォームのボタンアクションで、サブフォームのクローン取ってきてネストで合計作ったほうが確実なような気がする。 >>219 自分はフォームのコントロール同士で計算させるってのが考えるに面倒なので レコードソースのクエリで計算させて フォームはただそれを表示するだけにしてる まあ合計や平均とかの集計値をフッタで表示させても良いんだけど、表示させるだけで それを別のコントロールで参照してとか面倒に感じるのです コントロールの表示って泡沫のようなもので 実態はテーブルにのみあるわけですからね PCリカバリしたいんだけど サポート終了したOffice再インストールすると サポート期間中にリリースされたアップデートも OfficeUpdateで取得できなくなっちゃうんろうか? ごめん見つけた Windows XP/Office 2003サポート終了後の「世界」:「XPサポート終了」の具体的影響 - @IT https://www.atmarkit.co.jp/ait/articles/1402/19/news116.html > ●サポート終了日以前にリリースされたパッチは引き続き適用できる > ●アクティベーション(ライセンス認証)も引き続き実行できる >>221 アップデートファイルのダウンロードページが消える事もあるので それらもバックアップしてるよ >>223 はダウンロードページの閉鎖はしないとは言ってない リンクテーブルで 「テーブルのみデータファイル:accdb、プログラファイル:accdb」 の組み合わせより 「テーブルのみデータファイル:mdb、プログラファイル:accdb」 の組み合わせのほうが処理速度が断然早いね 少量規模(数百件)のデータでもすごい体感できるくらいに早い テーブルのみだったらmdbでも十分ですね Win10Pro 64bit Access2016 32bit リンク元のファイル形式で処理時間を比較 ◆10個のテーブルをADOXでリンクする時間 ・accdb: 0.644秒 ・mdb: 0.031秒 ◆数百件のデータをADOでテーブルに追加しレコードソース付きのフォームを開くまで ・accdb: 0.625秒 ・mdb: 0.109秒 Win10 Access2013 ためしにリンク後、以下のコードでやってみた ==================================== vTime = Timer For i = 1 To 1000 Set rst = CurrentDb.OpenRecordset("SELECT * FROM テーブル) rst.Close Next i Set rst = Nothing Debug.Print Timer - vTime ==================================== mdb: 0.9843秒 accdb: 63.738秒 えらい違うな、2013でも体感できるわw で実害はあるの? 1000回も開かないと体感できないとか すみません、初歩的なことで申し訳ないです 連結しているフォームで呼び出されているデータをVBAで処理するコードってどうするんですか? 非連結ならSQL設定してレコードセットして、というのは理解してますが そもそもそこにデータがあるのにわざわざ一から読み込む必要あるの?と悩んでます 「連結フォーム VBA」で検索しても「非連結フォーム VBA」の結果ばかりでて困ってます… >>231 私の言葉でゴチャゴチャ書くより 素晴らしい解説があるので。 T's wareさんはaccessでやれることのほぼ全てを網羅してます。 https://tsware.jp/study/vol16/vbabegin_43.htm >>232 ありがとうございます、閲覧してみます! 毎度助かっております >>228 Win7 Access2010 50万件レコードに部分一致検索10回して平均値取ってみたけど変わらんかった 2013以降でaccdbの仕様って変わったの? たしかにテーブルのみとのリンクのファイル形式はmdbのほうが処理速度がはるかに速い リンクする処理だけでも差が出るが、何故だ? 【 システム環境 】 Windows10, Access2019 コントロールソースに=Format(Now(),"yyyy/mm/dd")のあるテキストボックスのフォームを 2019でaccde化したファイルを2013で開くと#NAMEと表示され正常に表示されません。 2013でaccde化すると問題なく表示されます。 2019は前バージョンとの互換性がないのでしょうか? vba画面開いて、どっかに1文字足して、また1文字引いて元に戻して、再コンパイルすると、直る予感 <<237 再コンパイルもダメで、mdbに変換しmde化もしてみましたがダメでした 関係ないけど、now使うんだ? 日付だけ拾うならdate()をよく使うけど。 リンクテーブルのファイル形式で処理速度に差が出る件、 パスワードの有無で差が出るこが判明! >>228 のコードをFor i = 1 To 100で実行 accdb(パス無) :0.289 accdb(パス有):9.343 * mdb(パス無):0.258 mdb(パス有):0.234 OS、Accessの以下の組み合わせ Win10 acc2010〜2019 Win7 acc2010〜2019 すべてでほぼ同様の結果でOS、Accessの組み合わせは関係なし。 結論: パスワードありaccdbにあるテーブルとのリンクは極端に処理が遅くなる。 >>239 はい、以前Access95や97の時代にDate()で #Nameエラーが多発したのでそれ以来Now()を使い続けています。 ちなみに今回のソースをDate()に変えてもダメでした。 >>241 試し方が、結構access使いなれてる感じですね。 軽くググったら これは釈迦に説法だけど、フィールド名、ユーザー定義関数に まんまdate nowと名付けたらエラー、 あとvb6ランタイムの mscomctr.dll msctrctr2.dllというワードが出てきた。 >>240 それ、どっかに書いてあったで、hatenaなんとかかな hatenaのはパスワードかけるとそのファイル内の削除クエリが遅くなるやつじゃね? それならMicrosoft Security Essentialsが原因とか書いてたが... >>240 はMicrosoft Security Essentials関係なく遅くなる。 どちらにせよaccdbの暗号化(パスワード化)は色々と問題ありそうだ >>242 ありがとうございます。 それは、参照設定で参照不可が発生している問題ですね その辺も全部チェックしましたが問題ありません。 結局2010でaccde化して配布することにしました。 Office2010で使ってましてQRコード使いたくてAccessだけ2016にしてたのですが 20日のアップデートでQRコード使えなくなりました 2016だけ再インスコで回避できたのですが 参照設定のBarCode Controlが14.0のままで レポートのActiveXコントロールが16.0になってる辺りを疑ってるのですが 解決策ご存じの方おられませんでしょうか Office2019personalがインストールされた環境にoffce365access runtimeはインストール出来ますか? >>248 可能 ただしExcelの参照設定をいじる必要あるかも >>248 確か、office2013が入ってるところに、access2016runtime入れるな って注意書きがあったけど、 特に問題は起きていない。 ただ、VBAコード書いてruntimeに配布するときは、 on errorなんちゃらの処理をちゃんと書かないと、バッサリ落ちるので ユーザーである社内の人間から白い目で見られるから、 面倒くさいんだよね。 製品版だと問題行で一時停止するんだけど。 わかってるつもりだが、いまだに忘れがち。 ナビゲーション ウィンドウをF11キーで表示した後、 再度F11キーで最小化されますが、 最小化ではなく非表示にする方法はないでしょうか? VBA・マクロ以外の方法が見つかりません。 ACCESS2013だけど、クエリで選択した複数のレコードを1件のデータで管理したい場合どうすればいいですか? 例えば、在庫表の[ミカン、リンゴ、ブドウ]の3レコードを選択クエリで抽出して、これを1月16日にA宅に出荷したとします。 普通は1レコード単位でフォームに表示したりして管理すると思いますが、選択クエリの時点で3レコードに分かれているので、後で見ると単票フォームで表示できないので管理しにくくなってしまいます。 何か良いアイデアありますか? >>252 フォームのレイアウトを表形式にして、フォームのプロパティの既定のビューを帳票フォームに変更すればいい >>253 有難うございます。 メインフォームに出荷日や出荷先を入力して、サブフォームに帳票フォームを入れようと思ったのですが、メインフォームとサブフォームのレコードに同じ番号(連番)を振ることって可能ですか? 例えば [メインフォーム]1月17日 A宅に出荷 ID1 [サブフォーム]リンゴ ID1 ミカン ID1 メインフォーム]1月18日 B宅に出荷 ID2 [サブフォーム]リンゴ ID2 ミカン ID2 のように、同じIDでリレーションシップの1対多で管理するような感じにしたいです。 メインフォームのIDはオートナンバーで、サブフォームのIDは=メインフォーム!IDのような感じに出来ますか? よろしくお願いします。 SetFocus使うとOpenイベントの途中でLoadイベントが発生する Private Sub Form_Open(Cancel As Integer) Debug.Print "Form_Open Start" Me.SetFocus Debug.Print "Form_Open End" End Sub Private Sub Form_Load() Debug.Print "Form_Load" End Sub Private Sub Form_Activate() Debug.Print "Form_Activate" End Sub 誰にも言うなよ >>254 連鎖更新で同期は可能だけどリレーションシップまで理解してるなら分かるよね。 >>256 こういう挙動とかサイレント修正されると困る事ってあるよね 2003の頃と2010以降でレポート開く時のWhereconditionの違いとか >>258 マクロなら動くけどVBAで組んだイベントプロシージャが動かなくなったことは良くある あと参照設定のバージョン違いで同じコマンドやメソッドの動きが変わるとかもあったな いずれも迷惑なこっちゃで >>259 ヘルプに無い挙動っていうと、単項式の評価は0以外はTRUEなんだけど、 たぶんそれ明示されていないんだよね。それを使った処理は危険だな きちんと比較演算子で評価させよう 普通に開いたフォームと New Form_フォーム名で開いたフォーム 識別方法ってある? Openイベントで処理変えたいんだわ Visibleが使えるかと思ったがダメだった ごめん テーブルやグローバル変数にメモるの以外で です 「白いネコでも黒いネコでもネズミを取ってくるのがいいネコだ」@ケ小平 よって、共産党としてはフォームを開いた後に区別する方法は用意していない 本社と支社間のように離れた場所と共有する場合に、簡単で無料でする方法ってある? テーブルデータ(バックエンド)がwebやクラウドにあるイメージ。 最大でも3〜4人しか同時に使わない。 この前Win10にアップグレードしたんだけど VBエディターで縦スクロールすると 分割ウィンドウにした時のような横線が入って 画面が乱れるときあるの俺だけ? スクロールバーを上に向かって動かすとなりやすい >>268 別にそういうふうにならないが グラフィックドライバからみの問題な気がする GPUとドライバのバージョンは? >>269 Intel HD Graphics 2000 15.28.24.64.4229 (9.17.10.4229) 分割ウィンドウというより スクロールバーを上に向かって動かすと ツールバー下の オブジェクトのプロパティ選択コンボが 分身となって現れ下へ向かって動く。 スクロールバーを何度か大きく動かすと消える。 あと1つのIfにEnd Ifが2行続いてるので あれっ?と思ってその行クリックすると1行になる 質問よろしいでしょうか フォームでマイクロソフトアカウントの情報(表示名やメールアドレス)を取得することは可能ですか? >>271 環境変数 USERDOMAIN かUSERNAMEをEnviron関数で取得でいけるかと >>271 メールアドレスって環境変数には無いなあ。 そもそもメーラーは何使ってるの? >>271 レジストリのどっかに書いてあるんじゃね? >>271 です 皆様ありがとうございます Environ関数についてですが、ユーザーネームを取得は行ったのですが PC名の取得になってしまいます 不特定多数の人が開くACCESSでいちいち名前を選択してもらうより マイクロソフトアカウントで判別して名前を設定しようとしたんですが なかなか難しいですね… >>273 メーラーはoutlookを使用しています >>274 レジストリの情報を読み出せるんですね 探してみます accessでテーブル設計の参考になるような本やサイトを教えていただけませんか? 仕事でaccessを使わなければならなそうで、勉強がてら自分で趣味のデータベース作ったのですが、テーブル設計がエクセル的でダメと言われました。 >>276 エクセル的ってのは曖昧な表現だけど、おそらくは正規化してないってことだと思うよ。 端的な言い方すると、Excelでテーブルらしきものを作って、それをコピペして Accessがエラーなくテーブルとして取り込めるかどうかで判断しても良い。 エラーになったら、その原因を調べて直すでも、学習になるかも とはいえ、エラーでなければ十分かというと違うんだけどね。 正規化という作業が待っているのです。 正規化というのは、単純化です。 複雑にしたければ、単純なテーブルどうしをまとめるクエリを作るのですね。 そうすることで、新たな機能と追加したりするもの、元が単純だから別のフィールドを追加したり 別のテーブルを追加したりして、既存の仕組みに影響を与えない形で拡張ができるのです。 学習に向くのは https://www.accessdbstudy.net/entry/20140930/p1 ですかね。 魔法使いの開発工房さんも参考になりますよ。 >>279 ありがとうございます。 まさにご指摘の通りです。リンク先の商品1、商品2・・・と全く同じことをやってしまいました。 正規化の勉強してみます。また分からなかったら質問させて頂きます。 仕事の方は前任者が作ったデータベースがあるためクエリで簡単な抽出はできたのですが、前任者がこの世にいないのでいずれ1から作らないとならないと思い趣味の方で作成した次第です。 これ見てふと思ったけど、顧客や取引先情報で住所・電話番号なんか ごく普通に登録するけど、相手によっては住所や電話番号が空欄になる こともあるのなら、これもやっぱり正規化すべき? 電話番号なんか特に空欄だけじゃなく複数あったりするけど 顧客マスタで住所や電話番号のフィールドが複数あるのはDB設計では一般的だぞ 問題は際限なく住所や電話番号が増えていくようなシナリオが想定される場合で、大体の場合、顧客の支社や工場の情報とか担当者個人の情報とかが追加されていくパターン そういうのはChildでまとめるなりしてエンティティの階層を整理しないと駄目 >>282 サンクス 過去のDBを引き継いで使っているけど、顧客店舗テーブル眺めてると 電話番号の項目が3つあって、そのうち2、3は大体空欄なのが気になってたのです たとえば、顧客名簿テーブルが 顧客名簿ID(主キー)氏名 住所1 住所2 住所3 1 あああ 東京 千葉 埼玉 2 いいい 群馬 3 ううう 山梨 栃木 というフィールド構成になってたとします。 これを正規化して次のように2つのテーブルにしても良いかと 顧客名簿ID(主キー) 氏名 1 あああ 2 いいい 3 ううう 住所ID(主キー) 住所 顧客名簿ID 1 東京 1 2 千葉 1 3 埼玉 1 4 群馬 2 5 山梨 3 6 栃木 3 1テーブル A B C D 2テーブル ○ × △ 3テーブル A ○ 100 B × 100 4テーブル D ○ 200 E △ 200 これを A ○ 100 B ○ C ○ D ○ 200 A × 100 B × E × ってクエリで結合させてポンと表示できないですか? すみません、>>285 ですがユニオンクエリがそのものでして無事解決しました フォームやレポートでラベルとかを作ると ラベル××って連番つくじゃないですか あの連番こっちで操作できないんですかね 間違えて作成して元に戻すをやっても 連番は進んでるし… あれは便宜上自動で付けられている名前で そのまま使用するのではなく設定し直すのが本筋なのです >>287 ラベル自体を操作する 例えば.visibleで表示 非表示を制御する Circleで丸囲みする といった理由が無いなら放置してええかと ありがとうございます。 レポートで10個の項目が複数あって それぞれクエリから値を設定していくんですけど VBAを書くよりなにより、沢山あるテキストボックスの名前を変えてくのが苦痛で苦痛で… テキストボックスの名前を読み込み時に変えようかなとも思ったんですけど >>290 >10個の項目が複数 ??? 意味が分かりません。 VBAでtextbox.nameプロパティを一括変更できるでしょ? 単票レポートですか? 帳票レポートですか? >>290 何をしようとしてるのか、そんなケースがあるのか思い浮かばない。 プロが作った売上ソフトの設計見てると、テーブルの時点ではフィールド名を英数字のコードネーム状にして 割り付けテーブルを別に持っているようだけどね。 その場合、accesdならコントロール名はその汎用コードネームにして、開くときにVBAぶん回し、 関連付けたラベルの標題値を変えさせればいいんじゃないのかな。 コードソースはめんどくさいから書かないけど 全てのラベルコントロールを対象としたループ 紐付けテーブルの読み込み準備 紐付けテーブルに格納されてるレコード中のコードネームと、 [コードネーム]&"_ラベル"がマッチするなら紐付け名に変更して みたいな感じ。 追記 最近はグローバル化でウェブサイトとかゲームの字幕が多言語対応してるでしょ。 どうやって実現してるでしょう、とほぼ同じ設計思想でいいと思う。 webサイトなら、たいてい裏でmysqlなどを動かしてて htmlの要素にはidを振り、割り付け先idと、選択言語でマッチしたvalueを埋め込んでることが多い。 ■ このスレッドは過去ログ倉庫に格納されています
read.cgi ver 07.5.5 2024/06/08 Walang Kapalit ★ | Donguri System Team 5ちゃんねる