Access総合相談所 28
レス数が900を超えています。1000を超えると表示できなくなるよ。
ACCESSに関する質問はこちらへ
▼━ 質問のしかた ━━━━━━━━━━━━━━━━━━━━
★ OS、ACCESSのバージョンを明記してください。
★ 質問内容は具体的に書いてください。
・何がしたいのか
・どんな処理を試したか
・動作状況など駄目な理由
テーブル/フォームの構成、クエリ、VBAの内容など差し支えない
範囲で詳しく書くと、早く回答が得られるかもしれません。
図解があれば尚良し。
聞き返さなくても詳細が把握できる質問が望ましいです。
★ 事前にヘルプ・Google等で調べられる範囲は調べてください。
大概の疑問は検索することで解決します。
★ アドバイスを貰ったら、必ず経過・結果の報告をして下さい。
ギブアンドテイクで情報を共有しましょう。
▼━質問テンプレ ━━━━━━━━━━━━━━━━━
【 システム環境 】 Windows**, Access**
【 VBAが使えるか 】 はい・いいえ
【 VBAでの回答 】 可・否
【 検索キーワード 】 Googleやヘルプでの検索キーワード
前スレ
Access総合相談所 27
http://mevius.5ch.net/test/read.cgi/bsoft/1424828244/ >>806
だから用途による、と言ってるでしょう。
商品番号1 商品名A
で、リレーショナルデータベースの基本通りに
明細テーブルに 商品番号1、20個 だけ保管して
あとはマスターから引っ張り
商品番号1、商品マスタ.商品名”A”、20個、
商品マスタ.単価¥100、 金額=商品マスタ.単価×20個
なんて作ってごらんなさい。
単価は永久ですか? 全オペレーターが商品番号1の
内容・商品名をBに変えないと言い切れますか。
税法上も取引履歴の長期保管は義務なのに
参照表示により、記録が変わってしまっては役に立ちません。
伝票系で私が参照整合張るのは、
ヘッダー項目と明細項目で伝票番号をキーに親子関係を
結ぶときくらいですね。 >>807
単価は商品テーブルじゃなくて単価テーブルに置くやろ
んで単価テーブルには単価と有効期限を設定しとく
処理日と有効期限を比較して単価を特定 リレーションシップはテーブルだけじゃなくて
選択クエリとテーブル、選択クエリ同士でも可能 >>808
企業間取引だと得意先別単価、
見積単価は存在するので、そうですね、
別個テーブルが必要です。このテーブルとマスターの参照整合は必要でしょう。
ただ、実績系には売上額の直接埋め込みも必要です。
企業間取引だと、条件値引きが頻繁に発生するので
履歴を見るたびに複雑なクエリーやvbaを回すのは処理のリソースを食うからです。 Accessの主キー項目を文字列で指定出来るのはアレとして
*得意先マスター
*商品マスター
*納入単価は得意先、商品毎に違うので納入価マスター
ぐらいは必要でしょうな
で、売上トランザクションは得意先、商品、納入日、納入伝票番号毎に発生と
こんな感じ 単価テーブルを商品マスターに含める設計は難しいので商品コードと日付をキーに単価保持
条件等で値引きした結果はトランザクションとして売上計上されて実納入価は納入価マスターも作られる
値引き条件等はまた別のマスターとして値引きマスター、とかで保持する 文書管理とか、やってる人いますか?
バイナリファイルをDBに入れるのってどうなの? 文書は文書として別に保存してそのファイルをリンクしてアドレスを管理していくのが基本では >>813 リンクしか使わない。
本物のデータベースサーバーなら
blob格納でもいいけど
Accessファイルに入れると異様にファイルサイズでかくなるので。
Accessってファイルサイズに制限あったっけ? >>815
確か2GB
大きくなったらMySQLとかにデータ移して
access はフロントエンドだけにするのが妥当
複数のaccdbにテーブル分けて保管してリンクでまとめたりunionしたりで当座しのぐのも有りか? 知子の情報っていう最適な文書DBがありましてね
かなり歴史のあるソフトです 2次元配列型の入力フォームを作成しようとしていますが困ってます。
作りたいフォーム
項目 4月 5月 … 3月 ←ヘッダー
あれ 10 8 … 9
それ 15 12 … 7
…
…
テーブルへの格納結果
項目 月 数字
あれ 4月 10
あれ 5月 8
あれ … …
あれ 3月 9
それ 4月 15
それ 5月 12
それ … …
それ 3月 7
わかる方いらっしゃいましたら教えて下さい。よろしくお願いします。。 主キーを2つにしましたが、伝票型やリスト型の入力方式しか出てこなくて…
4月とかの月情報は、入力フォーム上に先に出しといて、項目と数字だけを入力させたいんですが、なかなか… >>818
excel漬けの人が陥りやすい罠なんだよね。
書いてくれた通り、格納するテーブルの形式がデータベースの正しい在り方で
入力フォームを作ろうとしている形式は本来、ピボットとかtransformと言われる結果の「見せ方」なんですね。
テーブルの形式でそのまま打たせるのが正しい。
フォームの見本通り、
どーしてもどーしても作りたいですか?
月には年は関係ないのですか?
それ次第で答えを考えるか決める。たぶんvba使うことになります。 文書管理に向いてるDBあったぞ
モンゴDBだっけ? >>821
ドヤ顔で語ってるけど、
こいつの作るフォームってユーザーから総スカン食らいそう >>818
Excelのピボットテーブル・ウィザードだと変換は簡単なんだけど。
ここにVBAも書いてあるけど、Accessでのヒントになるかな?
https://www.shegolab.jp/entry/excel-macro-flatten-matrix やりたいことはわかったけど、格納結果のまま素直に入力したほうが
入力者にとってラクだと思う 私は経理担当で、予算を人に入力させたいんですが、「あれ」「それ」みたいな項目が100近くあるので、100だと12ヶ月で1200行近くになります。
エクセルの2次元→1次元化は実際運用しているんですが、壊れやすいからアクセスで試すとのことでして。 >>825
ありがとうございます。
これと同じことはEXCELでやってまして。今回はアクセスのフォーム→DB格納で、同様の結果を求めたいのです。 >>821
ありがとうございます。
年は関係ありません。
VBAありきでもぜんぜん構いません。
こういった経験を過去されていれば、お知恵を借りたかったもので。 >>827
予算ならExcelで運用する方がいいと思うよ
一通り入力してからあれこれ操作するだろうから、DBよりも表計算の方が向いてるよ >>830
管理工学研究所というところのソフトですね?アクセスで、という縛りがあるので…。 >>833
エクセルでずっとやってきてて、データテーブル=入力フォームみたいな形にしていました。
でもしょっちゅう壊されるので、フォームとテーブル切り分けてフォームを作るか、と。
→エクセルのフォームくそダサいからアクセスのほうがよくね?と。 ちなみにデータを全て集めると数万行になるので、エクセルよりもアクセスのほうがデータベース格納がまだマシだろうと。 >>836
毎年何万行のデータをゼロスタートで入力してるのか、大部分が前年と同じで部分的に手を加えるのかで変わってくる
部分的に手を加えるだけなら、前年度データ(確定)+差分データ(毎年入力)で集計するような形でDBで運用できると思う >>818
一旦、項目、4月、5月...3月というフィールドのテーブル作って入力させて
そのテーブルから目的のテーブルに追記するコードをVBAで
組めば出来なくもない
いきなりは無理
月の並びが縦方向なら
項目名を入力させた後で
それと4月から3月までの12レコードを追加クエリで生成して、それを帳票フォームで開いて数日後を入力させる方法で目的の格納結果は得られる
ヒント
Accessの追加クエリでは値を指定しないフィールドにはnull が入る >>837
売上予測とか経費予測とかですね。
手入力してもらってます。
>>838
前年予算はほぼ使わないですかね。どちらかというと実績を参考に作りますが、実績との差分を取ることもデータ粒度の問題があったり政策的な問題も出るので、今年は計画してません。 >>841
あちこちの部署に入力フォームをばらまいて、各自で入力してもらうって感じ? >>839
ありがとうございます。
入力サイドには、直感的にというか慣れ親しんだインターフェイスで提供したいんです。
皆様ありがとうございます。
リアクションを拝見して、フォームUIが残念なのは諦めて、エクセルVBAとSQLサーバで対応したほうが現実的な気がしてきました。 >>818
追加クエリは素直に12個作って
項目テキストボックスのイベントでマクロのクエリの実行で連続して動かせば良いかと >>845
844で言っちゃってるけど、サーバー建てる方がいいと思うよ
SQLサーバーでもいいし、postgresql+PHPでも実現できるはず
あと、長期的に見ればHTMLのフォームに慣れてもらっておく方がいいと思う >>844
どうしてもいきなり目的のテーブルに追記したいというなら
レコードソースを指定しないで
非連結のテキストボックスを横に並べた単票フォーム >>848の続き
を作って各月のテキストボックスのイベントで追加クエリを実行するという方法もある
ただこの方法は入力した数字の修正が面倒になるよ >>832 これから分けてベタベタ貼ります。
テーブル設計編
1.「なんたら」のマスターテーブル(テーブル名 M)
なんたらID(UniqueKey),なんたら項目
2.ワークテーブル(W)
自動ID,なんたらID,1月,....12月
3.実際に欲しいテーブル(J)
月,なんたらID,Data
4.ワーク用のダミーテーブル(Dummy)
月,なんたらID,Data
-->作ったら、月にだけ、1月から12月まで書き込む SQL編 書き込めないので一部カタカナ
1.入力用(WorkQuery)
セレクト M.なんたらID,M.なんたら項目,W.[1月], W.[2月],
....,W.[12月],W.なんたらID
ROM M LEFT JOIN W ON M.なんたらID=S.なんたらID
(なんたら項目で繋いでもいいけど、万が一の重複よけで項目ID指定)
-->これで自動でデータシートビューフォームを作成(F_work)
2.ワークファイルの削除クエリー(DEL_W)
デリート W.* FROM W
3.JとダミーをUNIONで繋ぐ(UN)
セレクト 月 ,なんたらID,Data FROM J
UNION ALL
セレクト 月,ID,Data FROM Dummy;
3.UNをもとにしたクロス(Cross)
TRANSFORM First(UN.Data) AS Data
SELECT UN.ID FROM UN GROUP BY UN.ID PIVOT UN.月
4.Wへの書き込み(INS_W)
インサート INTO W ( ID, 1月, 2月, 3月, 4月, 5月,
6月, 7月, 8月, 9月, 10月, 11月, 12月 )
SELECT Cross.ID, Cross.[1月], Cross.[2月], Cross.[3月],
Cross.[4月], Cross.[5月],Cross.[6月], Cross.[7月],
Cross.[8月], Cross.[9月], Cross.[10月], Cross.[11月],
Cross.[12月] FROM [Cross] WHERE (((Cross.ID) Is Not Null)) フォーム設計編
[M.なんたらID]と[M.なんたら項目]の編集ロックを「はい」に。
>フォームVBA (dao記述で勘弁して)使いまわし用手続き
Private Sub UpdateJ(obj As Object)
Dim dbs As Database
Dim Rst As Recordset
Dim Wherestr As String
Set dbs = CurrentDb: Set Rst = dbs.OpenRecordset("J", dbOpenDynaset)
Wherestr = "月='" & obj.Name & "' AND ID=" & Me![M.ID]: Rst.FindFirst Wherestr
With Rst
If .NoMatch Then
.AddNew
!月 = obj.Name: !ID = Me![M.ID]: !データ = obj.Value
.Update
Else
.Edit
!データ = obj.Value
.Update
End If
End With
Rst.Close
Set Rst = Nothing: Set dbs = Nothing
End Sub '1月から12月までの更新後処理イベント
Private Sub Ctl1月_AfterUpdate()
Call UpdateJ(Me.ActiveControl)
End Sub
(自動で作ると、1月のイベントプロシージャ項目名が
Ctl1月になったけど、nameとしては特に問題なく”1月”として動いてた)
これを12月まで貼る 'JテーブルからWテーブルへの展開用
Private Sub Form_Open(Cancel As Integer)
Dim dbs As Database
Dim qdf As QueryDef
On Error GoTo JP
DoCmd.SetWarnings False
Set dbs = CurrentDb:Set qdf = dbs.QueryDefs("DEL_W"):qdf.Execute:
Set qdf = dbs.QueryDefs("INS_W"):qdf.Execute
DoCmd.SetWarnings True
exit_Here:
If Not (qdf Is Nothing) Then
Set qdf = Nothing: Set dbs = Nothing
End If
Me.Requery
Exit Sub
JP:
MsgBox Err.Number & " " & Err.Description:Resume exit_Here
end sub >>851
入力用の記述変だった
1.入力用(WorkQuery)
セレクト M.なんたらID,M.なんたら項目,W.[1月], W.[2月],
....,W.[12月],W.なんたらID
FROM M LEFT JOIN W ON M.なんたらID=W.なんたらID >>836
複数部署の予実算集計かな?
そのレベルになるともうERPかも? >>856
それかもね
月テーブルと項目テーブルをあらかじめ持ったmdbを起動するとフォームが現れて、項目月毎に数字を打ち込み
↓
項目月テーブル作成
↓
それを統括DB(My SQLやPostgreSQL)に部署コード付きで追加して部署項目月毎テーブル作成
mdbは打ち込みExcelの代わりにmdbに変更しました、と言う感じ
mdbで全て管理出来んでしょ、万単位のレコード有るならね >>858続き
rs2.AddNew
rs2![項目]=rs1![項目]
rs 2![月]="4月"
rs2![数字]=rs1[4月]
rs2.Update
rs2.AddNew
rs2![項目]=rs1![項目]
rs2![月]="5月"
rs2![数字]=rs1![5月]
rs2.Update
これを3月まで繰り返し 1-12月、全てVBAで書き込むのか?
テーブルで用意しときゃ良いだろ vbaで書き込むのは古い手法じゃないの
Accessにマクロも変数も無い時代は、vbaで代用してました
今はデータマクロがあるで VBAはクソ うんうん分かる
VBAを使わない具体的な方法をサクッと教えてあげてとっとと終了してくれる? >>860
だって、4月から3月まで横並べで入力させたいと
>>818が言うんだもん
こんな設計はどうなんだよと俺も思うけどね
だから横並びにしたテーブルから
縦並びにしたテーブルまで転機するしかないやん >>818が言うにはexcelだとエラー起こすからってことだけど
そもそも設計が悪いからだと思われ こういうのって入力する側が自分の使い勝手を最重視させるからな どうせ今一所懸命作っても、寿命十年がせいぜい と思えば
120ヶ月のフィールドで済む という諦観も大事
十年以内にはもっと優秀な奴がこれに係るだろ
2008年4月1日〜2020年3月31日の日付がテーブルに成ってるブツを見たことある
それ以前はその業務無かったし、期日が満タンに成ったら追加すりゃいい
と、開き直ってたけど、あながち発想は間違って無い 気がする 気がするだけだけど >>872
こういう奴が2000年問題を引き起こしたんだよな 12ケ月のテーブルと項目テーブルを作る
その2つのテーブルから項目月毎のテーブルを作る(クエリーでOK)
FORM作って項目月毎の実績値の入力をさせる
それを格納するMDBを各部署に配布する(部署毎に配布するMDBごとに部署コードが違う)
結果を回収して部署コードごと違う実績値をテーブルに作成する(MySQLやPostgreSQLなどに)
これで終わりだと思うが FileMakerユーザーの嘆き
これゆえAccess需要は無くならない
656 名前:名無しさん@そうだ選挙にいこう[sage] 投稿日:2019/08/28(水) 17:27:49.49
値段上げることばっか考えないでユーザー増やす努力してくれればいいのに
潜在的な需要はあるのに高くて諦めてるパターン多いだろ
うちもそうだけど accessでEXCELのIndirectのようなことはできませんか? >>877
https://www.forguncy.com/blog/20170905_indirect_sheet
テーブルの作り方次第だが
この例で言えば事業所テーブルに有る値に紐付く各事業所の月別商品数量を実績テーブルからクエリーで作れば良い
Excelシート名称をAccessテーブル名称と考えるとテーブルの中身の値に一致したテーブル(名称で引っ張る)のは簡単には無理だな
VBAでグリグリやるしか無い >>878
ありがとうございました。やはりExcelは使い勝手がいいなあ。ドロップダウンの連動も簡単だったし。 >>877
indirect、初めて聞いて使い方を今知ったわ。
シート名引っ張ってくる使い方なんて思いもよらなかった。
この関数が古くからあるのかわからんけど、excelって地味に関数拡充してるよね。
ググった先の用例でいくと、「大島さん」シートのデータは何々を
indirectで呼び出すらしいのだが
データベースの世界では
基本的には
大島さん、なんとか、データ
のように列で格納するんだわ。
毎回「大島さん」を打たなくていい仕組みについては割愛するけど。 エクセルは列番号をフィールド名って考えると可変だけどデータベースって基本的には固定だから必要ないかなあ 後accessでは同じことやろうと思ったらリレーションシップ使ったクリエ作るんじゃないかなあ Accessの勉強法で質問です。全くの素人で試行錯誤をしながら操作をしています。
具体的にはFOM出版のよくわかるAccess2019基礎を使って勉強しています。操作方法はとてもわかりやすく順に操作を出来るのですが、正直中身の用語の意味などが分からず宙に浮いている状態です。
独学で習得された方でうまい方法がありましたら教えてください。よろしくお願いします。 分からん、の内容によるとしか。具体的に、「説明されてない用語」でどんなものがわからなかったのでしょう?
説明内でつかわれた用語も含みます。
できるとかよくわかるシリーズなんて、とりあえず誰でも読めるように書かれてるわけで、用語がわからなく
なることはないと思うんだけど。
最近の本は全く知らないけど、その基礎と応用で最終的に作る総合問題のデータベース
見る限り、応用まで読み終わってもあまり役に立たないと思う。
大きな書店にいって、その本で作る最終的なデータベースに興味を持てる、かつ、
最終的な目標が複雑そうなものを選ぶのがいいと思う。
写真が多いのは実際の情報量を少ないので避けたほうがいいです。 MOS試験対策の参考書を一通りこなして満点で受かったのに正直チンプンカンプンだった
その後業務で必要なこんなもんも作りたいってビジョンを持って本を読んだら理解が深まった 自分で作ったものを使いながらこんな機能ほしいと思った物を追加して行くのが一番じゃないかなあ
acceessの本じゃなくて運用関係の入門書を読んで行くのもいいよ アクセス特有の用語なんてそんなにないから。
最初の言葉はテーブルとクエリーとフォームとレポートとリレーションシップ
だけ覚えておけばいい。
そのあとは、ベースとなってるSQLの機能をわかりすく言い換えた各種のアクションクエリーの名前と組み立て方を覚えるくらいで
ざっくりとしたシステムは作れる。 返事をくれた皆さんありがとうございます。
今はクエリ、リレーションシップ、フォームなどの言葉が全く繋がっていない状態です。しばらくは今の使っているテキストをしばらく使って、用語の繋がりが見えて来たら応用に移りたいと思います。
挙げてもらった書籍は探してみたいと思います。 オンメモリDBでリアルタイムデータ
を表示し続けるIoT監視ツール作れますか?
定期的にリクエリかけまくるフォーム作るしかないですか?
C#だと非同期マルチスレッドでtimerとかやればできてた気がします >>890
access限定であれば、フォームにタイマーイベントがあるので
それでリアルタイム表示してください。
記録しないならたぶんデータベース(テーブル)すらつかいません。
ただ、IoTがrestAPIとか実装してなくて、昔ながらの
RS232Cとかだたと、もはやこのスレの範疇を越えた記述が必要になるので、
ちょっと大変ですよ。 VBA(VB6レベル)で面倒な事するにはWindowsAPI使う事になるが
Windows10でもAPI使えれば、何とかなるとは思うけどね 演算のタイミングを教えて下さい
税込価格から税抜価格で集計を行います
フィルタなどが間に入るのですが、この場合は最初に税抜価格を出した方が良いのでしょうか?
それとも最後の方が良いでしょうか 日本語変でした、すいません
税込価格での販売リストからフィルタして税抜価格で集計になります >>894
丸め誤差を最小にするには割り算は1回で済ます。
というのが原則
ちなみに、税込価格を求める際に1円未満の端数を切り捨て、切り上げ、四捨五入
のいずれかでもやってると
税抜価格<>本体価格
になる。
つまりこの時点で丸め誤差が発生している。
なので、それでも構わないというならOKかと
本体価格で集計したいなら、本体価格で記録すべき
税込価格は、それを購入・販売した時点での税率を本体価格に掛ければ求められるので
記録する必要は無い。 >>896
ありがとうございます
最初に計算してしまいます
>税抜価格<>本体価格
はい、こちらは問題ありません
主に成績を見るための資料作成なので、少々の端数は良いみたいです
>本体価格で集計したいなら、本体価格で記録すべき
本体価格もデータ上はあるのですが、
業者間の場合に価格が交渉で決まるため、この方法が出来なくなってしまいました
以前は業者間取引が少なかったので気にせずに全て本体価格にしていたのですが、
今は取引が大きくなってきたので計算方法に困った、という次第です フィルタしてから割り算した方が計算量少ないからそっちの方がいいんじゃないの?
個人的には生に近いデータはできるだけ保持したい。最初に触ると後で面倒になる 計算結果の列に対して、データ型を指定することは出来ますか?
売上税抜: [売上金額]/1.08
の結果を全て整数にしたいのです
int()などを使うしかないでしょうか?
売上税抜: Int([売上金額]/1.08) >>894
ID、品目、単価、単価有効期限
という品目テーブル(IDは主キー)
税率、有効期限
という税率テーブル
品目ID、個数、販売日(購入日)
という販売(あるいは購入)テーブル
を用意しておいて
品目テーブルと販売テーブルの品目_IDと品目IDを1:多のリレーションシップして、必要なクエリも作って集計 今、買掛台帳の軽減税率対応の
修繕やってるけど
結局、明細単位(1品目単位)の課税対象計算にするしかなかったな。
実際に請求書届いたときに数円程度のズレが生じるのは
会計士も税務署も特に指摘しないようだし。 税務署も消費税の端数に関してはなにも言わない
個々に消費税切り捨てても大丈夫
この辺はDB・経理間に温度差があるかなとは思う 客毎の売上明細毎に計算した消費税を積み上げるのと、日次ないしは月次の売上合計から消費税計算するのでは誤差が出る
もちろん日次に計算した消費税を積み上げて月次売上から計算した消費税も誤差が出る
さらに月次で出した消費税を積み上げて年間合計出したのと年次売上合計から(ry
税務署的にはどっちでもいいみたいだけど、敵は身内や客 消費税は掛締日の合計ごと・伝票一枚ごと・商品一行ごと とか相手によって変わるから困る レポートで複数のクエリ結果をまとめて出力しようと思っています
高さを自動的に変更することは出来ますか? レス数が900を超えています。1000を超えると表示できなくなるよ。