Microsoft Access 掲示板

6,622 件中 3,921 から 3,960 までを表示しています。
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;
1

リンク先では、方法1 と 方法2 の2つの方法を紹介していますが、どちらの方法でしていますか。

方法1なら、[印刷設定]の[レイアウト]の[幅]で2列目の表示位置を調整できますので、それで合わせてください。

方法2ならずれることは考えられません。

3

レコードソースをバラメータクエリにする方法もありますが、フォーム経由にした方が自由度は高いです。

2

開くときに設定する条件を都度任意のものにしたいときは
フォームを経由させることになりますか?

1

レポートをデザインビューで開いて、「レコードソース」プロパティをクエリ名に変更すればいいでしょう。

フィルタリングするだけなら、マクロかVBAでレポートを開くときに抽出条件を設定できますので、レコードソースはテーブルのままにしておけば、レポートは一つですみます。

VBAの場合のコード例

DoCmd.OpenReport "レポート名", acViewPreview, , "取引先='〇〇'"

DoCmd.OpenReport メソッド (Access) | Microsoft Docs

7

まずは問題を切り分けましょう。

問題のファイルの「閉じる時に最適化」をオフにしたときは、バックグラウンドプロセスが残りませんか。

残るなら、「閉じる時に最適化」が原因ではないので、別の部分に原因があることになります。

残らないなら「閉じる時に最適化」をオフにして運用する方法を検討しましょう。
方法としてはタスクスケジューラでWindowsの起動時または終了時に問題のファイルを最適化するプログラムを実行するようにすればいいでしょう。

Accessの最適化をバッチファイルで行う方法 – 外資系SEパパのブログ

Accessデータベースファイルを最適化する関数 - hatena chips

2
行脚 2021/05/27 (木) 04:42:46 35ab5@adc4f

コードには rs.Fields("file_image") とあるのですが、file_image というフィールドは t_filedetaにあるのですよね。

⇒ です。確認がイマイチでした。申し訳ありませんでした。

あと、内側の Do Loop の最後でも rs.EOF でチェックしないとエラーになると思います。

⇒ 記載しませんでしたがエラーが出て困っておりました。

印刷用ワークテーブルで15列に出力しているのだと思いますが、

⇒ 一旦は15列での出力を試みましたが画像が粗く埋め込みにしようかとその為のワークテーブル作りでした。
  他に策があればご教授下さいますようお願い致します。
  と言うか、新たにトピックを起こします。
  hatena様ありがとうございました。

4

朱色様、

なるほどです。これもやってみます。

こういったデータの並び替えって、需要が結構ありそうだと思っていたんですが、以外に少ないみたいですね。

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

6
まゆ 2021/05/26 (水) 21:17:29 81a37@d1249

こんばんは。

色々試してみましたが、結局解決しませんでした…。
とりあえずは、下記の対応で当分は対応しようと思います。

①起動用のaccessの起動
(フォームを表示せず、単体の起動でバックグラウンドプロセスが残らないようにします)
②本体のaccessの使用(最適化はそのままの設定)
③本体を終了(バックグラウンドプロセスが残る)

accessのバックグラウンドプロセスが残っていても、起動用accessから開くと通常通り使用できました。
ただし、起動→本体終了を繰り返した分だけバックグラウンドプロセスは残ります。
私以外のPCは退社時に電源をオフにしますので、
タスクキルもせず、そのままにしようかと思います。
(本当はよくないかと思いますが…)
私のPCは夜間自動更新がありますので、タスクキルのバッチファイルでも作成して、しばらく運用してみようと思います。

「閉じる時に最適化」が原因なのか、とも思いましたが、単体運用しているmdbでは同じ設定でもバックグラウンドプロセスが一度も残らなかったので、違ったようです。

何かご存知の情報などありましたら、ご教示頂ければ幸いです。

1

コードには rs.Fields("file_image") とあるのですが、file_image というフィールドは t_filedetaにあるのですよね。

あと、内側の Do Loop の最後でも rs.EOF でチェックしないとエラーになると思います。

        Do
            tg.Fields("f_" & c) = rs.Fields("file_image")
            rs.MoveNext
            c = c + 1
        Loop Until c > 15 Or rs.EOF

蛇足

コードを見た感じ、印刷用ワークテーブルで15列に出力しているのだと思いますが、
レポートの印刷設定で列数を設定できますのでそれでいいように思いますか、
なにか特別なレイアウトになっているのでしょうか。

3

回答するのに情報が不足しているということです。

実際のテーブルのデータ例と欲しい出力結果を提示してもらえませんか。

2
りんご 2021/05/26 (水) 00:48:47 48103@0e907

 お試しクロス集計クエリを作ってみたけれど、過去1年間の絞り込み条件式が難しいという事でしょうか?
 それと、過去1年間とは、いつからと考えていますか?

1

テーブル[T-取引]のデータ例を提示してもらえますか。

在庫量の計算は一般的に、期首在庫量+入庫量-出庫量 という計算になりますが、期首在庫量をどこにどのように格納しているのでしょうか。

9
a!neko 2021/05/24 (月) 20:09:38 17b98@1fad2

こんばんは。
タブ・スペース・改行の違いがよく分かりました。ありがとうございます!
タブ文字が文字化けしていたのですね。アプリケーション依存で表示されるとは知りませんでした。
クエリに式を入れていたのですが、テキストボックスの更新後処理の方がスマートですね、変更してみます!

10
nokonoko 2021/05/24 (月) 16:55:39 653a6@54883

返信遅くなりました。
うまくいかない理由が分かりました。ありがとうございました。

8
hiroton 2021/05/24 (月) 09:48:57 52a80@f966d

Chr(9)はタブ文字ですね

247 タブとスペースの違いは何ですか?どちらを使えばいいですか?(FELLOWS Inc. さん)

コピーした文章をメモ帳に張り付けてみてください。謎の□が出る位置に1カーソル分の空白が存在することがわかると思います。タブ文字はどう表現するかがアプリケーション依存なので今回の現象が発生しているのでしょう

また、文字として「タブ」がなくてもコピペすると「タブ」になる場合があります。(多分今回もそう)

EXCELで

AB
1AB
2CD

のようなデータを作り、A1~B2セルをコピーしてメモ帳に張り付けてみましょう

A	B
C	D

このように貼り付けされます。「AとBの間」、および、「CとDの間」はタブ文字になっています。また、行の切り替わり「Bの後ろ」と「Dの後ろ」には改行が入ります

これが確認できたら、こんどはメモ帳の内容をコピーしてEXCELに張り付けてみましょう。メモ帳の内容はただのテキストデータなのに、きちんと2x2のセルに分かれてデータが貼り付けできると思います

このように、表形式の表示を異なるアプリケーション間でコピペするため、テキストのデータ加えて、制御用にタブ文字や改行が追加されることがあります


今回の問題はコピーした元のテキストデータに不要なデータがくっついてきたのが原因でしょうから、データ登録時に修正するのがいいです

フォームのテキストボックス貼り付けし、データを追加する

なので、テキストボックスの更新後処理でReplace(Me![項目名],Chr(9),"")するといいと思います

3
朱色 2021/05/23 (日) 16:42:20 db0eb@978e4

速度のほうはさっぱりわからないのですが、クエリくみくみするのは好きなので一例。

SELECT D.*, DateDiff("s", D.START, D.END) as DURATION
  FROM ( SELECT s1.EVENT, s1.E_Time as START
              , ( SELECT TOP 1 e1.E_Time
                    FROM 表1 e1
                   WHERE e1.EVENT = s1.EVENT
                     and e1.E_Time > s1.E_Time
                     and e1.E_Cond = "END" ) as END
           FROM 表1 s1
          WHERE s1.E_Cond="START"
     ) D
 ORDER BY D.START, D.EVENT

考え方としては、STARTだけの抽出結果(Sテーブル)に対し、
「同じEVENT、より遅いTime、CondがEND」の条件で最初にHITする抽出結果(Eテーブル)を
くっつけるというものです。

7
a!neko 2021/05/23 (日) 12:26:40 17b98@a27e5

こんにちは。クエリに下記の式を入れたところ□を消すことが出来ました!!
項目名: Replace([テーブル]![項目名],Chr(9)," ")

試行錯誤でやっており、なぜ消せたのか理屈はよく理解出来ていないのですが💦(;^_^A

6
a!neko 2021/05/22 (土) 19:39:25 17b98@1fad2

すみません、説明に不足がありました。
レポートは、テーブルにフィルタ条件(項目:募集終了フラグ=false)を付けたクエリ(q1)より作成しております。
検索フォームにはそのレポートのPDF出力のボタンが付いているだけです。

5
a!neko 2021/05/22 (土) 17:34:55 17b98@1fad2

PDF出力はhatenaさんの下の記事を参考に作成させていただいています。
https://hatenachips.blog.fc2.com/blog-entry-380.html

入力用フォームと検索用フォームに分けており、PDFは「検索用フォーム」からPDF出力するようにしています。

■入力用フォーム:入力専用、テーブルを更新します。PDF出力ボタンは作っていません。
■検索用フォーム:テーブルにフィルタ条件(項目:募集終了フラグ=false)を付けたクエリ(q1))を閲覧・PDF出力出来るようにしています。

4

レポートからPDFへの出力はどのようにしてますか。

3
a!neko 2021/05/22 (土) 13:16:37 17b98@84ff1

私の説明が分かり辛く申し訳ございません。
添付の画像にて補足させて頂きます。
画像1