Microsoft Access 掲示板

views
4 フォロー
6,283 件中 3,561 から 3,600 までを表示しています。
1
hiroton 2021/06/11 (金) 09:06:42 d36e7@f966d

「無作為抽出」とか「ランダムに抽出」とか似たような意味でも言葉を変えると新しい情報が見つかったりしますよ

3

問題あるかどうかは、運用次第ですので、実際やってみて問題が出たときに解決法か分からなければ、その時点で質問してください。

2
るんるん 2021/06/10 (木) 07:05:40 a9f72@146f8

返答ありがとうございます。
説明が乏しくすみません。

テーブル等が同じ形なら追加インポートで問題ないのですね。
まずは、通常の追加ですのでインポートを日々行いデータ作成いたします。
ありがとうございました。

2
ひんやり 2021/06/09 (水) 09:46:51 8be4a@c8e67 >> 1

ありがとうございます。おかげで解決いたしました。
おっしゃるとおり「ショートカットキーを有効にする」が無効になっていました。
「閉じるときに最適化」のチェックを外したつもりで間違ってチェックを外してしまったようです。
なお質問時のショートカットキーは「既定のショートカットメニューを無効化」の書き間違いでした(ショートカット誤り)
ありがとうございました

2

hirotonさん、ご回答ありがとうございます。
貴重な経験談をありがとうございます。
やはり、WEB上のAccessは問題ありそうですね。
一応、トライしてみようかなあ。

1

DBの起動時の設定は以下の通りです。
・ナビゲーションウィンドウ非表示
・ステータスバー非表示
・ショートカット無効化
・VBAにてリボン非表示
・VBAにてShift起動抑制
・VBProjectはパスワードで保護

上記の「ショートカット無効化」というのが、
[オプション]-[現在のデータベース]の[ショートカットキーを有効にする]のチェックが外れている状態でしたら、
Alt+F11 というショートカットキーも無効になるのは当然だと思いますが。

8

ご返答、ありがとうございます。

色々試してみましたが、最適化が原因ではないようです…。

業務中に使用しているaccessが3〜4種類あり、
それぞれチェックしたいのですが、なかなか進んでいません。申し訳ありません。

フォームを開いて終了しただけでバックグラウンドプロセスが残るものとたまに残るもの、また全く残らないものもあります。
それぞれフォームの作りは違うので、まだこれといった原因を特定できていません。

とりあえず、お知らせまで。

1

もう少し現状の具体的な情報と、どこで困っているのか、を説明してもらえませんか。

CSVのフォーマットが正規化されたもので、テーブルと同じ形なら、そのまま追加インポートすればいいかと思いますが、
どの辺でうまくいっていないのでしょうか。

1
hiroton 2021/06/07 (月) 10:14:39 25b67@f966d

経験上の話で資料とかはありませんが、動いたり動かなかったりします。例えばMe.RequeryMe.Refresh。どちらでも同じように動作するようなフォームを作成していて、レコードソースにACCESS自身のテーブルを使っていた時は問題ないものが、sharepointのデータに切り替えたらうまく動かなかったなんてことがあります。限定的に見れば同じ動作をする複数の手法を試してうまくいく方法で実装、なんてことをしたことがあります

ACCESS+sharepointはろくな資料がないのでひとたびコケるとえらい目にあいますね

6

インポートまたはリンクはエクセルのシートのレアイアウトのままです。
それを、クエリやVBAで正規化した形に変換して、正規化テーブルに追加していくということになります。

エクセルのシートのデータ例を出してもらえれば、変換するクエリやVBAは提案できると思います。

5
じらいや 2021/06/04 (金) 16:17:11 58219@b36b8

ひとつのEXCELシートからインポートするときに1対多の関係性をもたせて複数のテーブルにインポートできるのですか?

4

Excelデータはインポートではなくリンクでいいと思います。
そのリンクテーブルをクエリかVBAで正規化されたテーブルに追加するという処理にすればいいでしょう。

テーブル設計に関しては、出されている情報からはりんごさんの提案されたものでいいと思います。

3
りんご 2021/06/04 (金) 00:55:05 48103@0e907 >> 2

 出勤時間や退勤時間は、従業員と日付に従属するので
詳細テーブル:{従業員名.日付}.出勤時間.退勤時間
 朝礼内容は、日付に従属するっぽいので
日付テーブル:{日付}.朝礼内容
と考えてみましたが、正直、自信がないです。
 出勤簿に必要なフィールドが増えたり、朝礼内容が実は個人目標だったり、なんて事になるとどうなるかわからないです。
 Excelインポートは、経験不足でわかりません。うーん、仮テーブルにすんなりインポートしたのち、クエリを駆使して整える感じでしょうか。
 過不足あると思いますので、もっと詳しい方の意見も聞いてみて下さい。

2
じらいや 2021/06/03 (木) 15:08:48 58219@b36b8

日付テーブルは単純に日付と朝礼内容のメモ(これもマスタから任意の指示内容のIDを入力するだけです)程度です
詳細については
従業員名 出勤時間 退勤時間
です

これらをひとつのテーブルにすると、日付と朝礼内容が従業員の数だけ重複することになりますからデータベース的に間違っていることになるのかな、と思って質問しました

ACCESSが使えないときにタブレットなどでEXCELに入力するときもあります
そのときは
日付 朝礼内容 従業員名 出勤時間 退勤時間
と1行ごとに入力しています
これをインポートすることがあるので、正規化してテーブルを分けると、すんなりインポートできなくなりますよね?

1
りんご 2021/06/02 (水) 00:27:17 48103@0e907

こんなのだったら、もっと分ける意味がありそうかと思うんですが、
例えば、

従業員日付時間イベント
りんご6/18:00出勤
りんご6/15:00退勤

例えば、

従業員年月シフト区分日付出勤時間退勤時間
りんご2021/6早出6/18:205:20
りんご2021/6早出 6/28:305:30

日付テーブルや詳細テーブルは、それぞれ、どんなフィールドになっているのでしょうか?

9

私も結構読んできましたが、私も見たことが無いです。Access 職人の食い扶持として秘密なのか、「だいたい分かるよね?」みたいなことなのか。

推測ですが、かなりのコード量になる、その手間に対して見合う信頼性、安全性が得られるのか、というところだと思います。
そこまで人的コストをかけるなら、SQL Serverの無料版とかその他のデータベースサーバー製品にした方がコストに見合った結果が得られるということだと思います。

8
hatena 2021/06/01 (火) 09:38:21 修正

教えて頂いたコードであれば指数関数的に重くなるということもないですか?

ないです。
クエリで連番を取得しようとすると、レコード毎に集計が発生するので指数関数的に重くなりますが、
提示のコードで新規レコードの連番数値フィールドに代入するだけですので、
DMaxやDLookupでの集計、検索は1回だけです。

日付フィールドにインデックスを設定しておくのは、今回の1回だけの集計、検索にも有効ですが、体感できる差はでないでしょう。
ただし、日付フィールドに対して、並べ替え、グループ化、抽出、、、などのデータ操作が発生する場面は多いと思われますので、インデックスを設定しておいた方がいいでしょう。

7
l2105 2021/06/01 (火) 08:03:59 e1234@179c9

日付にインデックスを張る(フルスキャンを避ける)
テーブルのレコードは適当なタイミングで削除(アーカイブへ移動、最適化)する

あたりでどうでしょうか

6
ぴぽ 2021/06/01 (火) 01:47:34 2a30e@98864

すみません
スマホなのでタイプミスしました
比較することになりますよね?
です

5
ぴぽ 2021/06/01 (火) 01:46:52 2a30e@98864

教えて頂いたコードであれば指数関数的に重くなるということもないですか?
全レコードを対象に日付を比較することになりますよねん

8
l2105 2021/05/31 (月) 20:26:18 ee209@0ae5e

たびたびありがとうございます。

なるほどです。Access は知って長いですが、やっと納得できる文章を目にできて感動的ですらあります。

>ワークテーブルや非連結フォームを推奨するサイトや書籍があるのは知ってますが、同時編集の排他処理までをきちんと解説しているものは見たことがありません。

私も結構読んできましたが、私も見たことが無いです。Access 職人の食い扶持として秘密なのか、「だいたい分かるよね?」みたいなことなのか。

ともあれ「解決」でクローズさせていただきたいと思います。
ありがとうございました。

4

上記の制限に沿っているとして、下記のような感じでしょうか。

Private Sub Form_BeforeUpdate(Cancel As Integer)
    Dim maxDate As Date, Num As Long

    If Me.NewRecord Then
        maxDate = DMax("日付", "テーブル名")
        Num = DLookup("数値", "テーブル名", "日付=#" & maxDate & "#")
        If Me.日付 = maxDate Then
           Me.数値 = Num
        ElseIf Me.日付 > maxDate Then
           Num = Num + 1
           If Num > 10 Then Num = 1
           Me.数値 = Num
        End If
    End If
End Sub
3

と、レコードを追加するたびに自動で”数値フィールド”に数値が入力されればよいです

そういうことなら、フォームの挿入前処理か更新前処理でVBAで連番数値フィールドで連番を入力していくのがよさそうです。

ただし、入力は日付順に入力するという制限が付きますが、それは大丈夫ですか。
例えば、6/1を入力してから、5/29を入力するというようなことがあると面倒です。

2
ぴぽ 2021/05/31 (月) 18:07:09 58219@b36b8

最終的に印刷されればいいですが、印刷のたびに変わると困ります
別紙に1~10までの通し番号がついた安全のための機械の点検項目がかかれたものがあり、
毎日違ったものをやった、という書類をつくるのが目的です
内部監査のようなもので印刷した書類のチェックがあり、一応毎日違ったところを
順繰り点検しました、といった感じです

自動連番フィールド、はACCESS標準機能のオートナンバーです
数値フィールドというところに日が変わるごとに+1した数値を入れていき、
10でリセットといった具合です。伝え方が悪くてすみません

手段はどのようなものでもよいので

| 日付  |数値 |オートナンバー|
|05/31 | 10  |1
|06/01 | 1  |2
|06/02 | 2  |3

と、レコードを追加するたびに自動で”数値フィールド”に数値が入力されればよいです
(上記以外にも手入力するフィールドは多数あります)

1

この連番は最終的にはどのような目的で使用するものでしょうか。

もし、最終目的が印刷出力なら、レポートの設定で簡単に可能です。

クエリで実現しようとすると、かなり複雑なものになりますし、レコード数が増えるにしたがって指数関数的に重くなりますので、レコード件数が多いときは避けたいですね。

テーブルに「自動連番フィールド」があるなら、VBAで連番を入力しておく方法が比較的シンプルでパフォーマンス的にもお勧めです。

まずは、連番の最終的に使用目的を教えてもらえませんか。

7
hatena 2021/05/31 (月) 16:47:21 修正

Accessのオプションに、共有モードやレコードロックの設定があるので、連結フォームでの共有は使えるものでしょう。

MSの公式ドキュメントにも下記の記載があります。

複数のユーザーがネットワーク上で共有しているデータベースを分割する場合は、分割を検討してください。 共有データベースを分割すると、パフォーマンスが向上し、データベース ファイルが破損する可能性が軽減されます。
Access データベースを分割する - Access

この破損する可能性が軽減させるというのがどの程度なのか、は不明確ですので、これをどうとらえるかで結論も変わってくるでしょう。

・4, 5人までの利用 × 同じレコードの同時編集を回避する -> Access が用意している排他制御で OK

自身の経験から、これはOKと思っています。(もちろん定期的なバックアップは取ってますが)

・それ以外 -> ワークテーブルや非連結フォームの実装必須

それ以上の場合は、 連結フォームでどこまでOKかは分かりません。同じレコードの同時編集を回避すればかなりの人数の共有まではOKではないかと予想してます。

同じレコードの同時編集が頻発する運用だと、連結フォームではきついかなという印象です。

ただ、ワークテーブルや非連結フォームで、同時編集までの排他処理を考慮して設計しようとすると、膨大な工数になるでしょう。また、ワークテーブルや非連結フォームを推奨するサイトや書籍があるのは知ってますが、同時編集の排他処理までをきちんと解説しているものは見たことがありません。

そこまでの信頼性を求めるなら、SQL Server などのデータベース サーバー製品と連携させることを検討したほうがいいようにも思います。ただ、一桁台の人数のでの共有はコスト的に見合わないと思います。

この辺は主観的な部分が多分にありますので、あくまで一個人の意見として参考にしてください。

6
l2105 2021/05/31 (月) 04:39:25 bcfbe@ea524

連投ですみません。整理すると、

大前提 「AccessのDBファイルを長期的に安定して使用するには」のようにする
その上で
・4, 5人までの利用 × 同じレコードの同時編集を回避する -> Access が用意している排他制御で OK
・それ以外 -> ワークテーブルや非連結フォームの実装必須

でいいのでしょうか。結構調べてきたつもりですがなかなか明快な説明に会えず、よろしくお願い致します。

5
l2105 2021/05/31 (月) 02:58:56 c3a3e@ea524

お返事ありがとうございます。

例えば私の手持ちの『Access VBA ポケットリファレンス』(2010年)に「業務システムとして Access を利用するなら、非連結フォームを心がけて下さい」とあり、その他書籍かウェブサイトかを問わずそれ的な情報にしばしば遭遇し、最近の
『Access VBA 実践マスターガイド』(2019年)を確認してもやはり非連結フォーム、SQLでの更新をピックアップしています。ので、Access はそうしないと共有できない仕様なのかと誤解(?)しておりました。
hatena さんは、このあたりどう学習なさったのでしょうか。何か良い書籍をご存じでしょうか。

ちなみに私の当初の質問は「ロックがだめでも楽観的排他制御で工数を省けるなら省きたい」というだけで、楽観的排他制御が主目的だったわけではありません。

4
hatena 2021/05/30 (日) 21:26:11 修正

前回の回答の設定で「レコードレベルロック」は可能です。
ただし、データベースパスワードを設定できないという制限があります。
(データベースパスワードを設定すると「ページレベルロック」になる。)

AccessのDBファイルを長期的に安定して使用するには - hatena chips

上記でもふれてますが、Access95から機能追加、改修しながら使用してますが、ここ15年間ぐらいはこの設定でデータベースの破損やトラブルはありません。Access2000頃までは、たまに破損していたのでバックアップからリストアしたということはありましたが。

ワークテーブルを使うとか、非連結フォームを使うとか、特別なことはせずに、普通に連結フォームで問題なく運用しています。あくまで、当方の環境と運用においてということですが。

当方の運用
忙しいときは5名で同時入力、ただし顧客毎に担当分けしているので同じレコードを同時入力ということはほぼない。

3
l2105 2021/05/30 (日) 20:19:18 f4a88@8edb2

直々のお出ましありがとうございます。
hatena 様と同じく有線LAN5名程度(小事務所)での使用、フォームからの入力のことで思案しています。
Access(バックエンドが Access の ACE(?))の場合、
レコードレベルロックができない、ページレベルロックしかできずワークテーブルを用意して何だかんだと学んだのですが、
VBA でいろいろとお膳立てしない(Access の機能・仕様の)レコードレベル悲観ロックも
(少人数であれば)普通に実用できるということでしょうか。
このへんいまいち分からず、ご教授いただければ非常にありがたいです。

6

詳しく解説していただいて助かりました
方法1について試行錯誤で調整シてみようと思います
方法2については”式”を見つけることができました

いっそのことプリンタの設定にA4横にA5縦を2ページ印刷しようと思いましたが?
このように
画像1
縮小印刷されて大きく余白があいてしまうことになります
レポートをA5縦で作成して、プリンタでは用紙をA4横で2ページ印刷にしています
EXCELではこのような感じでできていたのですが
ACCESSは別途なにか設定が必要でしょうか?

2

[オプション]→[クライアントの設定]→[詳細設定]での設定のことかな?

私の場合は、デフォルトではなく下記のような設定で運用してますが、

画像1

フォームの「レコードロック」プロパティは「編集済みレコード」に設定。

画像1

有線LANで5名程度の同時使用でトラブったことはないです。
デフォルトでの場合は分かりません。

環境や運用状況によると思いますので参考までに。

5

方法1の場合
画像の[印刷設定]の[レイアウト]の[サイズ]の[幅]を 14.674cm から減らすと、2列目が左にずれるので、プレビューが確認しながら少しずつ減らしていって、同じ位置になるように調整してみてください。

方法2の場合
画像の「フィールドの選択」の右の▼をクリックすると、フィールドのリストが表示されてその下に「式」という欄があるのでそれをクリックすると式ビルダーが開くので、そこに「=1」と入力してOKをクリックしてください。

画像2
画像1

4

2列めの最初の左位置14.674cmにして
画像2
このように設定しましたが([印刷設定]の[レイアウト]の[幅]がなかったので)、このように
画像1
1文字程度のズレがでてしまいます。こだわりすぎかもしれませんが、目分量で左右にずらすと
一列目と比較して多少のずれが気になってしまいます
なにか設定がまずいでしょうか?

方法2でやろうと思いましたがグループ化の項目がこのようになっていて
解説して頂いているような数式を入れるところがどこかわかりませんでした
画像1

方法2を使わせてもらったとしても、
上記の幅の設定はどうようにするということですので
やはりずれてしまうのでしょうか

度々の質問になりますがよろしくお願いいたします

3

二列目の表示位置の調整方法がわかりません

ヘッダーの2列目の最初の項目ラベルと「左位置」と[印刷設定]の[レイアウト]の[幅]を同じにします。
それでずれているから、デザインビューで項目ラベルの位置を左右にずらしてプレビューして確認しながら、調整すればいいでしょう。

方法2の固定値でグループ化するというのは
=1とするとすべてのレコードが対象になるのですか?

すべてのレコードが同じグループ(一つのグループ)になるということです。
よって、グループヘッダーを表示させると先頭に一つできます。
「セクション繰り返し」を「はい」にすることで各ページの先頭に表示されます。

2

方法1でやりました
二列目の表示位置の調整方法がわかりません
レイアウトの幅は、どのように2列目の位置に影響をあたえるのでしょうか?

方法2の固定値でグループ化するというのは
=1とするとすべてのレコードが対象になるのですか?

2
hideki 2021/05/30 (日) 13:50:52 338ee@4ee24

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

1

デフォルトの楽観的排他制御(競合した時にクリップボードに退避できたりするあれ)は、
信用してよさそうなのでしょうか。

具体的にはどのように設定しているもののことでしょうか。

DAOあるいはADOでデータ操作しているときの話なのか、
フォームからデータ入力している話なのかとか。

もう少し具体的に説明してもらえますか。

1

クラスをグループとして、点数順に降順をしたいのです。

下記でどうですか。

SELECT *
FROM MT_点数
ORDER BY クラス, 点数 DESC;