Access総合相談所 其の19 【桐にしとけ】
at BSOFT
1:ビートたけし
08/07/17 20:18:58
ACCESSに関する質問はこちらへ!
▼━ 質問のしかた ━━━━━━━━━━
★ OS、ACCESSのバージョンを明記してください。
★ 質問内容は具体的に書いてください。
・何がしたいのか
・どんな処理を試したか
・動作状況など駄目な理由
テーブル/フォームの構成、クエリ、VBAの内容など差し支えない
範囲で詳しく書くと、早く回答が得られるかもしれません。
図解があれば尚良し。
聞き返さなくても詳細が把握できる質問が望ましいです。
★ 事前にヘルプ・Google等で調べられる範囲は調べてください。
大概の疑問は検索することで解決します。
★ アドバイスを貰ったら、必ず経過・結果の報告をして下さい。
ギブアンドテイクで情報を共有しましょう。
▼━質問テンプレ (出来れば使ってね) ━━━━━━
【 システム環境 . 】 Windows**, Access**
【 VBAが使えるか .】 はい・いいえ
【 VBAでの回答 】 可・否
【 検索キーワード 】 Googleやヘルプでの検索キーワード
前スレ
ACCESS総合相談所 その18 【桐にしとけ】
スレリンク(bsoft板)
桐はこちら↓
管理工学研究所「桐」【4】
スレリンク(bsoft板)
2:ビートたけし
08/07/17 20:19:31
ACCESS2000総合相談所
URLリンク(pc.2ch.net)
ACCESS総合相談所 その2
URLリンク(pc.2ch.net)
ACCESS総合相談所 その3
URLリンク(pc.2ch.net)
ACCESS総合相談所 その4
URLリンク(pc.2ch.net)
ACCESS総合相談所 その5
URLリンク(pc.2ch.net)
ACCESS総合相談所 その6
URLリンク(pc2.2ch.net)
ACCESS総合相談所 その7
URLリンク(pc2.2ch.net)
ACCESS総合相談所 その8(消息不明です)
URLリンク(pc2.2ch.net)
ACCESS総合相談所 その9(消息不明です)
スレリンク(bsoft板)
ACCESS総合相談所 その10
スレリンク(bsoft板)
ACCESS総合相談所 その11
スレリンク(bsoft板)
ACCESS総合相談所 その12
スレリンク(bsoft板)
ACCESS総合相談所 その13 【桐にしとけ】
スレリンク(bsoft板)
ACCESS総合相談所 その14 【桐にしとけ】
スレリンク(bsoft板)
ACCESS総合相談所 その15
スレリンク(bsoft板)
ACCESS総合相談所 その16 【桐にしとけ】
スレリンク(bsoft板)
3:名無しさん@そうだ選挙にいこう
08/07/17 20:23:52
.∧__,,∧
(´・ω・`)
(つ乙と)
`u―u´
4:ビートたけし
08/07/17 20:28:16
関連スレッド一覧
★関連スレ★
データベース板
【Access】アクセスは最強のデータベース!
スレリンク(db板)
【I love Access】やっぱりアクセスが良い
スレリンク(db板)
プログラム板
VBプログラマ質問スレ(6.0以前) Part51 ※Office, Access 固有の質問はスレ違いにつき注意!
スレリンク(tech板)
★Microsoft Access★
スレリンク(tech板)
資格全般板
【荒らしは】MOS試験ACCESSスレ【来ないで!】
スレリンク(lic板)
ビジネスsoft板
Access2000+SQL Server難しい・・・(´д`;)
スレリンク(bsoft板)
ACCESS2000の分かりやすい本
スレリンク(bsoft板)
microsoft access で成績証明書作成
スレリンク(bsoft板)
もう『Access2002』使ってる人いるっしょ?集合!!
スレリンク(bsoft板)
EXCEL,ACCESSで曖昧な表現を。
スレリンク(bsoft板)
5:名無しさん@そうだ選挙にいこう
08/07/17 20:32:36
DAOのことは知らない
VBAでデータベース(mdb)にADO接続してSQLを操る
ってことならまあ、ありかな
何だか書いてるうちに俺も混乱してきた
そんなことをしなくても小規模なシステムならもっともっと楽に作れる
6:ビートたけし
08/07/17 20:38:15
関連ウェブサイト
Microsoft Access Club
URLリンク(www.accessclub.jp)
T'sWare HomePage
URLリンク(www.tsware.jp)
MOUG
URLリンク(www.moug.net)
MS Access Discovery & Access庵BBS
URLリンク(www.f3.dion.ne.jp)
Accessむかむか - Access VBA TIPS
URLリンク(www.sanryu.net)
データベースアクセスの技術情報とアクセス実用サンプル集
URLリンク(www.friendlysw.com)
7:ビートたけし
08/07/17 20:49:17
個人的には、C/S型で、バックグラウンドにMySQL、クライアントにAccess 2007 ランタイム
という組み合わせが好きです。
ちなみに、Access 2007 ランタイム他はURL
Access 2007 ランタイム日本語版:URLリンク(www.microsoft.com)
Office 2007 XPS/PDF出力アドイン:URLリンク(www.microsoft.com)
Office 2007 FileFormat Converter:URLリンク(www.microsoft.com)
XPS/PDFアドインを入れると、ランタイムであってもPDF出力が可能になりますし、マクロのエクスポートにおいて、
選択フォーマットでPDFを指定できます。
また、FileFormat Converterを導入すると、Access2007のExcelエクスポートにおいて、Excel2007形式での出力が
可能になります。
以上テンプレ終了。では、みなさま、お楽しみください。
8:名無しさん@そうだ選挙にいこう
08/07/17 22:34:53
>>1
乙
>> 前スレ1000
ちょっとズレてる。
アプリケーション >> マクロ言語 >> ミドルウェア >> DBエンジン
という関係になる。
これが
Access >> VBA >> DAO >> Jet
だったり、
Excel >> VBA >> ADO >> SQL鯖
だったり、
HTA >> JScript >> ADO >> Oracle
になったりする。
文章だけだと分かりにくいようなら、下を見れ。
URLリンク(www.ruriplus.com)
9:名無しさん@そうだ選挙にいこう
08/07/17 22:51:53
>>1 乙です! テンプレートが増強されてる。あと、桐スレへのリンクが追加されとるw
既に>>8が説明してくれたけど、せっかく書いたので投下。
前スレ>>1000へ。「VBA=ADO(DAO)=SQL」の認識は間違ってる。
簡単に説明すると。
VBAは(データベース操作に限らず)汎用的な操作・処理を行うために使用する言語。
ADO(DAO)は様々な言語から呼び出して使う、(データベース等の)データを操作するための機能セット(言語じゃない)。
SQLはデータベースを操作するための言語。
VBAからADO(DAO)は使えるけど、VBAからSQLは直接使えない。
なので、VBAからデータベースを操作したいときはVBAからADOの機能を呼び出して、ADOからSQLを発行してもらう。
「VBA->ADO->SQL->データベース」みたいに、ADOがVBAとSQLの間を中継してくれるわけ。
なぜ、わざわざVBAからSQLを使うかというと、
フォームやレポートの操作、ファイル入出力などはVBAからしか行えないので、それらと連携したい場合に使う。
あと、AccessのSQLでは書き辛い複雑な処理をする場合にもVBAを使う。
実際にVBAからADOを使っているサンプルコードを探してみれば分かってくるはず。
ちなみに>>5の言うとおり、簡単なものならVBAを知らなくても作れるので、
VBAやADOとかは本当に必要になったときに学習すれば良いと思うよ。
正規化を知ってればテーブルとリレーションシップは分かるはずだし、
テーブルとクエリ(AccessではSQL言語で記述したもの=クエリ)が分かれば、
フォームやレポートも単純なものなら作れるよ。
以上です。あとは、いくつか入門サイトを巡るなり、入門書を買い足してみて。
それでは頑張ってくださいな。
10:名無しさん@そうだ選挙にいこう
08/07/17 22:56:12
>>1
前々スレ
ACCESS総合相談所 その17 【桐にしとけ】
スレリンク(bsoft板)
11:名無しさん@そうだ選挙にいこう
08/07/17 23:10:38
Dim obj As Object
Dim kazu As Long
For Each obj In CurrentProject.AllForms
kazu = kazu + 1
Next
MsgBox kazu
としてカレントプロジェクトのフォーム数を数えることができますが、
テーブル数を数えるにはどう書けばいいのでしょうか?
12:名無しさん@そうだ選挙にいこう
08/07/17 23:32:23
失礼、こうみたいです。
Dim obj As AccessObject, dbs As Object, kazu As Long
Set dbs = Application.CurrentData
For Each obj In dbs.AllTables
kazu = kazu + 1
Next obj
MsgBox kazu
13:名無しさん@そうだ選挙にいこう
08/07/18 01:26:46
本当に数だけ知りたいなら、CurrentData.AllTables.Countや
CurrentDb.TableDefs.Countだけでいい気がするが。
いかにも不自然だから、ループしたいのが本題で、数を数える
というのは処理の例として適当に出したんだろうけど。
14:前スレ>>1000
08/07/18 13:58:39
皆様からのいろいろなご教示ありがとうございました。
最後に私がご教示通りに理解したかを確認させてください。
1.マイクロソフトのRDBMSであるJETを操作する言語はSQLである。
2.JETを操作するSQLを簡単につくる便利ツールとしてDAO(ADO)がある。
3.DAO(ADO)は、VBAなどの言語から呼び出して使う。
4.VBAやSQLに精通しているなら、ADO(DAO)は必要ない。
(VBAから直接SQLを操作すればいいから。)
もし、上記の認識が正しければ、概念段階のデータモデリングについて教えてください。トップダウンとかボトムアップとかあるようなのですが、どちらにしてもあらかじめどのようにデータベースを運用していくのかを決めないと駄目なようなのです。
しかし、将来的な拡張性を考慮すると、予め全てを決めておかなければいけないというのが作業を躊躇させるのです。
15:名無しさん@そうだ選挙にいこう
08/07/18 14:08:17
>>14
まじに、桐にしといたほうが良いぞ
16:名無しさん@そうだ選挙にいこう
08/07/18 14:35:23
>>14
DAOやADOを中心に考えた方が理解しやすいかもしれませんねぇ。
DAO(ADO)‘が’操作するのがJETやSQLserverなどのRDBや、他データ。
DAO(ADO)‘を’操作するのがVBAなどのプログラミング言語。
プログラミング中、データ操作を指示する際に使う文法がSQL句。
プログラムを組む際はDAO(ADO)を通してSQL句を使ってデータを操作する。
こんな感じでしょうか。
17:名無しさん@そうだ選挙にいこう
08/07/18 16:59:42
>>14
SQL文を操るにはDAOやADOを経由することが必要。
個人的にはDAOやADOに直接SQL文を発行するやり方が好きだが、素人同然だったらクエリを使うべきだと思う。
参照、追加、更新、削除、クエリは全部できるから、そしてクエリはほぼマウス操作だけで作れるから。
混乱しすぎ、難しく考えすぎ。肩の力を一度抜けれ。
まずはVBAのことが書かれていない超入門書を見つけて「ACCESSでは何ができるか」を把握すれ。
てか、ふと思ったんだがどんだけの規模のシステム作るつもりだ!?
会社の基幹システムでも作るつもりじゃまいだろな・・・??(作るつもりならアウトソーシングするべきだ)
18:名無しさん@そうだ選挙にいこう
08/07/18 17:14:56
別にSQL使うのにDAOもADOも関係ないじゃん
Accessから普通にSQL使えるから
VBA他プログラム言語からデータベースの要素をオブジェクトとして扱いたい時に、DAO/ADOを介在させるんだよ
2007からはマクロで変数使えるようになったから、Access使うのには、VBAもDAO/ADOも不要だよ
19:名無しさん@そうだ選挙にいこう
08/07/18 17:32:57
それでもマクロは使わないでください(><;)
20:18
08/07/18 18:19:20
んん? 何でよ
Access native 言語のマクロ最強じゃん、tbl 操作するときは SQL 投げれば良いんだし
DAO/ADO で無理やりVBから操作するより安全確実簡単
21:前スレ>>1000
08/07/18 18:57:17
多くの方々からご教示いただきまして、本当にありがとうございました。
皆様のレスを何度も読み返して、徐々にですが腑に落ちるところがありました。
まさか、超初心者の私の質問に、これほど多くの方々からご支援いただけるとは思わず、
皆様のお心づかいに本当に感謝しております。
本当に、どうもありがとうございました。
22:名無しさん@そうだ選挙にいこう
08/07/19 09:07:45
とりあえず使ってみればいいのに。
23:名無しさん@そうだ選挙にいこう
08/07/19 14:09:04
VBA終わったな
24:名無しさん@そうだ選挙にいこう
08/07/19 17:56:31
よかったな。
次こそガンバレよ。
25:名無しさん@そうだ選挙にいこう
08/07/19 19:20:10
アクセス2000でjpgデータの表示出来ないんだっけ?
bmpにいちいち変換はやだしなぁ
26:名無しさん@そうだ選挙にいこう
08/07/19 19:28:40
イメージコントロールにはふつうに表示できたと思うが。
非連結オブジェクト フレーム コントロールの話なら、下に該当しているとか。
URLリンク(support.microsoft.com)
27:名無しさん@そうだ選挙にいこう
08/07/20 08:06:31
あー
そんなんでは不特定PCには使えないなぁ
28:名無しさん@そうだ選挙にいこう
08/07/20 14:09:21
不特定PCに播くのにOLEオブジェクト使うヤシはただのアホ。
29:名無しさん@そうだ選挙にいこう
08/07/21 15:03:14
VBAを使用しているファイルを開こうとすると、「セキュリティの警告 データベースの一部の内容が無効にされました」
という警告がでるんですが、この警告が出ないようにするには、どのように設定すればいいのでしょうか?
30:名無しさん@そうだ選挙にいこう
08/07/21 15:07:04
>>29
ヘルプ嫁
31:名無しさん@そうだ選挙にいこう
08/07/21 16:51:23
>>30
オプションで「信頼できる場所」に登録すればいいんですね。
しかし、何だか面倒だな。
32:名無しさん@そうだ選挙にいこう
08/07/22 00:05:15
レジストリも弄っとけ
33:名無しさん@そうだ選挙にいこう
08/07/22 00:41:29
>>32
そうなんですか?
ヘルプには書いていないみたいなんですが…
34:名無しさん@そうだ選挙にいこう
08/07/22 00:51:45
Accessの課題でたけど、やる暇ねえええ
というわけで、課題をやってくれた人には何かあげます^^
35:名無しさん@そうだ選挙にいこう
08/07/22 08:14:18
出題内容
アクセス2003
ファイル名 : 成績管理(自分の名前)
目的 : 学生情報の管理を行うデータベースシステム
機能 : @学生情報の(番号/名前/性別/生年月日/住所など)登録/変更/削除
A学生成績(国/数/理/社/英等)の登録
B一覧印刷(レポート)
条件 : @上記の機能を実行するためのボタンを配置したメニューホームを作成
A上記以外に自分なりの機能を追加すること(最低1つ)
Bテーブルを設計し、各テーブルに最低5つはデータ登録すること
C最低1つはクエリを作成・利用すること
Dレポートの見栄え、操作性などユーザインタフェースにこだわること
36:名無しさん@そうだ選挙にいこう
08/07/22 09:20:34
AccessからSQLServerへデータを保存しようとする際、フィールド数が30くらいある場合、
insert や update文で更新するのは一般的なんでしょうか?
本来ならレコードセットを開いて書き込めば何の問題もないのですが、
データ件数が数万になるとレコードセットを開くのにも時間がかかるようで・・・。
37:名無しさん@そうだ選挙にいこう
08/07/22 12:29:11
>>34-35
成績管理システムを作ろう!2【社会貢献】
スレリンク(db板)
38:名無しさん@そうだ選挙にいこう
08/07/22 15:05:19
>>36
エクスポートって使えなかったっけ(適当回答でスマソ)
39:名無しさん@そうだ選挙にいこう
08/07/22 15:08:58
>>36
そうなんだが、だったらAccessいらないよな
40:名無しさん@そうだ選挙にいこう
08/07/22 15:54:27
>>36
というか、たかだか数万レコード程度で時間がかかることの方が問題。
インデックスの見直しでもしてみては?
41:名無しさん@そうだ選挙にいこう
08/07/22 15:58:55
>>36
まあぶっちゃけ、数万件だとCSVかなんかに吐いてDTS蹴ったほうが速くないか?
42:36
08/07/22 16:23:42
ごめんなさい。読み返してみたらちょっと書き方に問題があったかもしれません。
あるデータを書き込む時、追加の場合はレコードセットで問題ありません。
更新の際に、たとえば3件のデータを更新する時に少し問題があります。
1)キーで特定のレコードを開く
2)ローカルテーブルのデータを書き込む
sql("xxx").Value = mdb("xxx").Value
sql("xxy").Value = mdb("xxy").Value
sql("xxz").Value = mdb("xxz").Value
・
・
・
sql.update
3)閉じる
sql.Close
を3回繰り返すのですが、元のテーブルのデータ件数が少ないときはいいのですが、
多くなるとどうも遅くなって困ります。(それだけが原因じゃないかもしれませんが。)
で、"update aaa set xxx = '" & xxx & "', xxy = '" & xxy & "', xxz = '" & xxz & "' where key = ・・・"
のようなSQLを投げた方が早いかなとも思ったのですが、
あまり変数の多い長いSQL文を書くのはどうなのかなと思って質問しました。
>>39
Accessはレポート機能が神過ぎて手放せないのです。
印刷が無ければ.Netでもいいんですけど・・・。
43:名無しさん@そうだ選挙にいこう
08/07/22 16:28:07
じゃ Access いらないじゃん
印刷のときだけなら桐にしとけ、ODBCで取込んで印刷できるから
44:名無しさん@そうだ選挙にいこう
08/07/22 16:44:41
>>42
30フィールドくらいはぜんぜん長くないぞ。
200フィールドくらいのをSQL文で更新してるシステムは余裕で見かける。
値として長文が入るとかなら、別の考慮(なんか文字数上限みたいな)が
必要になるかもしれないけど。
45:名無しさん@そうだ選挙にいこう
08/07/22 19:08:50
ADOって内部でSQL投げてるんじゃないの?
46:名無しさん@そうだ選挙にいこう
08/07/22 20:21:27
ふつうに考えて、それは無い。
OLE DBから先は知らんが。
47:46
08/07/22 20:35:39
。。。と漏れが思っていただけで、特に根拠は無いことに気付いた。
48:名無しさん@そうだ選挙にいこう
08/07/22 22:54:03
>>42
ボトルネックが分からないから、とりあえず思いつく範囲で。
データを取得しない分、SQL 投げた方が早くなるとは思うけど。
・キーで特定のデータを開くときにインデックスが使用されているか?使用されてないなら使用を検討。
・レコードセットを排他ロックで開いていないか?排他ロックしている場合は共有ロックを検討。
・更新するデータを一度に取得してバッチで更新できないか検討。
(ADO ならCursorLocationを adUserClient として、LockTypeを adLockBatchOptimisticで開く)。
例えば SELECT ... FROM ... WHERE a IN (1,2,3,...) ORDER BY a のようにレコードセットを開いて更新。
・フィールド数が多い場合は列インデックスを使用してフィールドにアクセスできないか検討。
sql(1) = mdb(1)
(バッチ更新の場合は更新ループ前に参照を作成して、それ経由でも可。
Dim fA(1) as ADODB.Filed
Set fA(0) = sql("a")
Set fA(1) = mdb("a")
Do Loop ...
fA(0).Value = fA(1).Value
... )
・更新不要な列を更新していないか?値が変化しない列を更新しないようにコード変更を検討。
・テーブルに不要なインデックスがないか?あるなら使用しないインデックスの削除を検討。
あと、ロジックが多少変わるけど。
・常に更新データで上書きするなら元データを全削除してからバッチで追加できないか検討。
49:名無しさん@そうだ選挙にいこう
08/07/22 23:47:45
SQLServerへのデータ転送が.Netで上手く出来てるのであれば
それはそれでいいのでは?
Accessは印刷専用ツールとして別に使えばいいんじゃね?
50:ビートたけし
08/07/23 00:25:03
>>49
Accessは、ほんと、レポート機能が一番好きだ。
もうちょっとだけ、フロントエンドの機能が増強してくれるなら嬉しいんだけれどね。
Visual Basicのようにもうすこしだけ、コントロールが欲しい。
51:36
08/07/23 09:55:10
>>44
なるほど。
たしかに考えてみると、レコードセットのような仕組みよりも
SQL文を投げるやりかたをする方が一般的な気がしてきました。
本当はパラメータークエリがもう少し使いやすければいいのですけどね。
>>48
キーは主キーなのでインデックスは使われていると思います。
バッチで更新というのは盲点でした。
IN (1,2,3...) で一気に呼び出すというのは考えていませんでした。
でも、キーが2つのフィールドで構成されているので今回は難しいですが。
でも、バッチで更新は試してみたいと思います。
>>49
.Netを出したのは、それでもできないこともないということで、
業務で使うツールを作るにあたっては、やはりAccessのほうが
使いやすいと思うのです。
MSは.Netのいいところを取り入れてVBAをもう少し改善してくれないかなと
思ってたりしますw
52:名無しさん@そうだ選挙にいこう
08/07/24 14:51:08
Access2003を使用しています。
Access2000でしたら、adpファイルでSQLServerのストアドプロシージャを編集する際に
コメントの部分のフォントが緑色になったと思うのですが、2003だと黒一色になってしまい
コメント部分と非コメント部分の見分けがつけにくくなってしまいました。
[ツール] → [オプション] を見てみてもどこの設定をいじれば良いのかわかりませんでした。
ストアドプロシージャのコメント部分の文字色はどのようにすれば変更できますでしょうか?
もしくは変更できなくなってしまっているのでしょうか?
どうぞよろしくお願いします。
53:名無しさん@そうだ選挙にいこう
08/07/24 16:43:33
>>52
普通にVBEのメニューから
ツール->オプション->エディタの設定 の コードの表示色
で「コメント」の「前景」を緑色にする。
54:52
08/07/24 17:50:40
>>53
VBEではもちろんコメントの前景色は緑になっています。
すみません、VBEでの話ではなくて、データベースウィンドウっていうんでしたっけ?
「テーブル」
「クエリ」
「データベース ダイアグラム」
「フォーム」
:
ってあるところで「クエリ」からストアドプロシージャを新規作成したり編集したりできるじゃないですか?
そこでのフォント色の話なんですけど...
説明が足りてなかったみたいで申し訳ありません。
55:名無しさん@そうだ選挙にいこう
08/07/25 09:48:05
クエリのSQLエディタはクソだからね〜
そもそもそんな機能あったっけ?もともと真っ黒な気がしないでもない。
56:名無しさん@そうだ選挙にいこう
08/07/26 02:13:38
教えてください。
レポートのテキストフィールドに検索結果を連結して表示させたいです。
そんなに難しくないと思っているのですが、クエリーでできない。
VBAで組んでしまえば良いのですが、できればクエリーで解決したいです。
【 システム環境 . 】 Windows XP Pro Access Ver2003
【 VBAが使えるか .】 はい
【 VBAでの回答 】 否
【 検索キーワード 】 Access 検索結果 連結, Access 文字列 連結
下のように列Aから検索した結果を,区切りで1つの文字列にしてレポートで表示したいのですが、
どのようにすれば良いのか教えてください。
列A
-----
AAAA
BBBB
CCCC
DDDD
検索結果
AAAA
CCCC
DDDD
最終的にはこの形になれば、良いのですが・・・
レポートのテキストフィールド
AAAA, CCCC, DDDD
57:残念ながらクエリでは無理
08/07/26 05:40:49
>>56
ググレカス
58:名無しさん@そうだ選挙にいこう
08/07/26 09:06:49
>>56
VBAじゃないと無理
59:名無しさん@そうだ選挙にいこう
08/07/26 09:26:22
まあ、そういうイレギュラーなのは桐にしとけ
60:名無しさん@そうだ選挙にいこう
08/07/26 09:30:08
VBAってもADO,DAOで簡単に実現可能と思われるんだが
61:名無しさん@そうだ選挙にいこう
08/07/26 09:50:15
10+ reasons why IT pros hate Access (but really shouldn’t)
Published 25 July 08 02:49 PM
URLリンク(blogs.msdn.com)
62:名無しさん@そうだ選挙にいこう
08/07/26 11:17:52
>そんなに難しくないと思っているのですが
出発点からして間違ってる。
63:名無しさん@そうだ選挙にいこう
08/07/26 12:29:37
>>56
検索結果が出るってことは、検索のパラメータを入れたんでしょ?
レポートのテキストフィールド=検索パラメータ では?
64:名無しさん@そうだ選挙にいこう
08/07/26 14:01:19
>57
ググッてはみたのですが・・・
>62
えっ、そうなのですか、ググッても出てこないのはそのあたりに問題があるのかしら
VBA内にSQL組んで、結果をTEXT型で返さないとだめなのですね。
65:名無しさん@そうだ選挙にいこう
08/07/26 14:06:36
VBAいやならピボット使え
66:名無しさん@そうだ選挙にいこう
08/07/26 14:28:14
>>64
ここで>>62が言っているのは、
検索結果が極端に多かった場合について言及しているのでは?
・テキスト型がオーバーフローする可能性がある
・テキストフィールドで表示しきれない可能性がある
ということで、そもそもそんな危うい設計でレポートを作るのは
好ましくないと思うんですけどねぇ。。
67:名無しさん@そうだ選挙にいこう
08/07/26 14:48:37
>66
なるほど、おっしゃるとおり
VBAで下記のように考えてみたのですが
Dim strClum As String
Do Until objADORS.EOF
strClum = objADORS!カラム名 + ", "
objADORS.MoveNext
Loop
想定していたデータ量が多くても6件程度
全部連結しても300文字程度と軽いのでそこまで深く考えなかったのですが、
言われている事を考慮すると危ういものになりますね。
68:名無しさん@そうだ選挙にいこう
08/07/26 18:39:48
困った仕事を頼まれてます。
Access2007の中にあるあるテーブルをもとに、ある条件で抽出したクエリがあります。
そのクエリを元に、レポートを作成しPDF出力するマクロは作り上げてあります
その結果出力されるPDFファイルをその同じクエリのある列にあるメールアドレス宛に
個別に送信しろと言われました。現在は、ボタン一つでPDFファイルを作って、メーラー
に添付して一人ずつ送っているのですが、100名ほどいるので困っています。
このクエリ そしてそれに基づくレポート -> PDF出力 且つメールで連続送信はどのよ
うなコードを書けば、ボタンを押すだけで、スポッと送れるのでしょうか?
なお、マクロは、レポート出力の際にクエリに対して、現在表示しているフォームの社員
IDを元に抽出、PDF出力という仕組みになっています。
69:名無しさん@そうだ選挙にいこう
08/07/26 18:53:29
>>67
オブジェクトはセットしてるんだよね、書いてないけど。
で、strClumにその答えを出したいなら、
strClumに答えをためてかなきゃ。
でしょ?
70:名無しさん@そうだ選挙にいこう
08/07/26 20:16:36
>>68
まず、抽出結果のレポート出力は、コードが書けるんですよね。
2007ならアドインを入れれば、できるんじゃないすか?
71:名無しさん@そうだ選挙にいこう
08/07/26 20:30:24
>>70
PDFアドインを入れて、エクスポートした上でメーラに添付までは、マクロのレベルで
できることですから。そこまでは掛けています。
問題なのは、これをクエリの結果に基づいて、一人一人に連続送信をしたい。これを
現在は手作業で小茄子状況なので、ボタンぽんで、それぞれにそれぞれ用のレポート
を送りたいわけです。
たとえば、送りたいレポートとは、個々の勤怠レポートや健康診断の予約状況通知など
です。いままではある一部署の長に、まとめて送って、それぞれ渡してもらっていたので
すが、これを嫌がる人続出したため、こうなってしまいまして・・・
100人ほどですが、100個のPDFを一個一個、ボタンぽんで個々に送信作業を毎月お
こなうのは、しんどいもので、どうしたら、クエリに基づいて今までやっていた作業を自動化
できるかを悩んでいるのです。
クエリの段階で送るべき人は抽出済みですが、これをレコードセットとして扱い、そして、
それをForループでレコードを移動しながら、マクロを実行をすればいいのかとも思ったの
ですが、自分はこの辺りのコードの書き方がよくわからんのです。
72:名無しさん@そうだ選挙にいこう
08/07/26 20:40:00
AccessのVBA(モジュール)はマクロとは別だから一緒にしないでね
Excelなんかでは一緒なんだけど
73:名無しさん@そうだ選挙にいこう
08/07/26 23:44:44
AccessのマクロってAutoExecしか使ったこと無いんで、
わからないんだけど、あて先とか、Bccに変数使えるの?
74:名無しさん@そうだ選挙にいこう
08/07/27 01:03:48
標準の機能で楽勝なら俺も知りたい。
ダメならBASPユーティリティでググって。
75:名無しさん@そうだ選挙にいこう
08/07/27 02:46:34
SPAM送信ツールを作ってくれるスレはここですか?
76:名無しさん@そうだ選挙にいこう
08/07/27 02:57:32
確かに、
AccessでSPAM作れるな。
77:名無しさん@そうだ選挙にいこう
08/07/27 05:05:07
2008
├商品リスト1
│ ├ 棚1
│ ├ 棚2
│ ├
│ ├
├商品リスト2
こんな感じでテーブルをツリーにできませんか?
78:名無しさん@そうだ選挙にいこう
08/07/27 07:30:02
> 小茄子状況
ワロタ
79:名無しさん@そうだ選挙にいこう
08/07/27 07:31:05
>>77
TreeViewコントロールで出来るんじゃね?
80:名無しさん@そうだ選挙にいこう
08/07/27 08:42:30
>>74
CDO.Message
81:名無しさん@そうだ選挙にいこう
08/07/27 09:04:14
>>79
TreeViewコントロールは微妙極まりないからな
相当なスキルが必要かと
82:名無しさん@そうだ選挙にいこう
08/07/27 20:49:05
>>79
thx
83:名無しさん@そうだ選挙にいこう
08/07/27 22:31:05
普通にサブデータシートじゃ駄目なん?
84:名無しさん@そうだ選挙にいこう
08/07/27 23:35:34
JETが廃止されてSQL Server Compactになるのか?
85:名無しさん@そうだ選挙にいこう
08/07/28 10:51:57
Access2007もJetは4.0ですか?
Jetって開発終了したわけではないですよね?
86:名無しさん@そうだ選挙にいこう
08/07/28 17:46:54
Access2007のデータベースエンジンはACE 12.0です
87:名無しさん@そうだ選挙にいこう
08/07/28 19:23:47
>>84
見つけてきた
URLリンク(cs.albis.jp)
88:名無しさん@そうだ選挙にいこう
08/07/29 02:32:48
Access2007で[新しいフィールドの追加]の列を消す方法を教えてください
89:名無しさん@そうだ選挙にいこう
08/07/29 11:20:26
>>86
ありがとう。
実質Jetの進化版のようですね。
90:名無しさん@そうだ選挙にいこう
08/07/29 13:55:26
TempVars Versus Global VBA Variables
TempVars are handy for moving values between queries and forms and form controls and macros and VBA. Before 2007, you could only do this with global variables and even then, that only applied to VBA code.
The problem with global variables was that if the VBA code failed, you could lose the information in the global variable. TempVars are far more robust.
91:名無しさん@そうだ選挙にいこう
08/07/29 23:26:27
ACE・・・
まるで成長していない・・・
92:名無しさん@そうだ選挙にいこう
08/07/30 07:00:02
すみませんが教えてください。
集計クエリで項目の合計をだして、
その合計値を別テーブルへ更新クエリを作成したいのですが
出来ないようです。
やり方が間違ってるのでしょうか。
93:名無しさん@そうだ選挙にいこう
08/07/30 19:31:47
追加クエリと更新クエリを混同してね?
94:名無しさん@そうだ選挙にいこう
08/07/30 20:10:54
>>92
別テーブルに合計値の項目があるの?
95:92
08/07/30 22:07:26
説明不足ですみません。
在庫管理みたいのをやってまして
あるテーブルに現在庫の一覧と数量(重複無)。
別テーブルに1日ごとの数量みたいなものを
蓄積入力していきます。
そしてそれを集計して現在庫数があるテーブルの数量を更新したいのです。
96:名無しさん@そうだ選挙にいこう
08/07/30 22:48:38
>>95=92
更新クエリは作れそうな気がするんですけどね。
何かエラーメッセージが出るのでしょうか?(型の不一致とか)
それと、集計結果を表示させるだけでなく更新する必要性は本当にあるのでしょうか?
何となく合理的でない感じがします。
[商品マスター] 商品コード(Key),商品名
[処理名マスター] 処理コード(Key),処理名
[入荷販売マスター] 商品コード(Key1),処理コード(Key2),営業日付(Key3),増減数量
こんな感じにして、通常は入荷販売マスターのみ累積入力。
商品ごとの現在庫が必要な時は集計クエリを実行して表示。
これじゃ駄目なのかな?
97:92
08/07/31 21:31:19
今回の場合は他の要素もありクエリ表示だけでは
足りないのかなと思いまして・・・。
そこで集計クエリを作成して、それを元に更新クエリをするとエラーがでます。
結局集計クエリからテーブル作成クエリで新規テーブルを作成し、それを元に
更新クエリをすることに。
そんなものなのかなと疑問が残りますが・・・。
98:名無しさん@そうだ選挙にいこう
08/07/31 23:01:45
この場合、集計クエリにこだわる必要はないと思う。
入荷の明細1件1件を元に在庫マスターを更新するだけでいいのでは?
99:名無しさん@そうだ選挙にいこう
08/08/01 02:20:38
別ファイルでインポートするとかではないなら
俺も都度更新でいいと思うな。
たぶん同期の問題だとは思うが、
集計クエリを元に更新クエリってできなかったと思う。
mdbをどこかにupしてもらうのが、一番早いのだが。
100:名無しさん@そうだ選挙にいこう
08/08/01 04:46:47
>>97-99
明細入力のたびに在庫を更新する方法だと、トランザクションを使う必要が生じると思うんです。
明細データの追加には成功したが、在庫の更新には失敗した。
業務使用でこんなケースが1件でも発生すると、その後の信頼性に問題が出るような・・・
何かの値を導き出す場合、おおもとになるデータは1本の方が好ましいと思いますよ。
101:名無しさん@そうだ選挙にいこう
08/08/01 05:58:45
>>100
集計クエリをもとに選択クエリを1度つくる
その選択クエリをもとに、更新クエリをつくる
といった具合に、間に選択クエリを1個置いてみるとかは?
あとは、テーブルの側 つまり集計の結果を出すほうを毎回
クリアし最新データを書き込む形にして、更新クエリは使わな
いとか。つまりこの場合、テーブル作成クエリを使う。
102:98
08/08/02 01:12:39
>>100
在庫数の更新が目的ならば集計クエリの作成は必須ではない、というのが発言の趣旨です。
というかAccessなんだからそんな銀行のオンライン更新みたいな手法は最初から選択肢になし。
UPDATE T_入荷 LEFT JOIN T_在庫 ON T_入荷.品番 = T_在庫.品番
SET T_在庫.在庫数 = T_在庫.在庫数 + T_入荷.入荷数
WHERE DateDiff("d", T_入荷.入荷日, #2008/08/01#) = 0
仮に在庫数更新のサイクルが日次ならば↑のような更新クエリを毎日1回実行すればいいのでは?
という意味だったのですが・・・
103:名無しさん@そうだ選挙にいこう
08/08/03 18:39:33
レコードを追加できません。テーブル'受注明細'の結合キーがレコードセットにありません。
なにこれ?
サブフォーム受注明細は受注ID 商品ID 数量 単価
メイン受注伝票の受注IDが主キーなんだけど・・・
104:名無しさん@そうだ選挙にいこう
08/08/03 20:42:56
>>103
受注明細の明細番号が無いんとちゃう?
105:名無しさん@そうだ選挙にいこう
08/08/04 00:23:38
質問です
アクセスの抽出条件またはの行って少ないのですがあれは増やすことはできるのですか
困っております。
たとえば、特定の200人の情報についていろいろな項目を抽出したいばあい
クエリを増やしていかなければなりません
クエリ一つでまとめてできる方法はないのでしょうか?
よろしくお願いします
106:名無しさん@そうだ選挙にいこう
08/08/04 01:04:53
通常のデザインビューでは限界があるけど
SQL直書きにすればいくらでも増やせる
左上のアイコン、▼から"SQLビュー"
107:98
08/08/04 01:50:58
あれはたしか挿入→行で増やせたよ。
200までいけるかどうかは試してないけどw
108:名無しさん@そうだ選挙にいこう
08/08/04 23:51:13
ふつうIn句使わないかそれ。
109:名無しさん@そうだ選挙にいこう
08/08/05 09:44:23
>>106
それでデザインビューに戻すときにエラーが出るんですね、わかります。
110:名無しさん@そうだ選挙にいこう
08/08/16 12:47:54
ACCESSでタブブラウザーは作れますか?
111:名無しさん@そうだ選挙にいこう
08/08/16 13:07:27
タブの増減が難しそうだがIEコントロール使ってむりやりやればなんとか
112:名無しさん@そうだ選挙にいこう
08/08/18 10:11:57
CentOS5.1に入ってるMySQL5.1にACCESS2003からODBCでつないでリンク作ってます。
で、そのリンクをADOで開いて
Dim Connection As ADODB.Connection
Set Connection = Application.CurrentProject.Connection
Dim RS As ADODB.Recordset
Set RS = New ADODB.Recordset
RS.Open "LinkTable", Connection, adOpenDynamic, adLockOptimistic
RS.AddNew
RS("field_01") = "AAAA"
RS("field_02") = "BBBB"
RS.Update
とした後でRSにアクセスしようとすると、
すでに削除されています、とエラーが来ます。
リンク先にはAutoIncrementな主キーがあってUpdate後のそれを読み取りたいのですが
どうにかならないでしょうか?
113:名無しさん@そうだ選挙にいこう
08/08/18 13:29:31
RS.Updateの際に、実際にAutoIncrementして主キーの値を決めているのは
MySQLなのでAccess側の変数RSに主キーの値がセットされることは無い。
という解釈でよろしいかと。どうしても必要なら別途取得。
114:名無しさん@そうだ選挙にいこう
08/08/18 14:29:03
>>112
よう解らんが、逃げの手段としてnextしてPreviousしてみてはどうだろう。
115:名無しさん@そうだ選挙にいこう
08/08/18 15:08:38
>> 113
すみません、その別途取得の方法でもいいので教えてもらえませんか?
>> 114
Update後はそのリンク先テーブルの最初を参照してます。
一回目は削除されています、だったのですが、
二回目からは最初のレコードの主キーが返りました。
116:113
08/08/18 17:50:32
>>115=112
MySQL独自の関数としてLAST_INSERT_IDというものがありますので
これを使って取得するようなコードを追加するのが良いかと思います。
117:名無しさん@そうだ選挙にいこう
08/08/19 23:03:30
あるクエリに基づくレポートを、1つづつPDF化(ファイル名は、レコードの最初の列にある
社員コード)を行いたいと思っている次第。ですがなかなか旨くいかない。
Dim My_Db As DAO.Database
Dim My_Rst As DAO.Recordset
Dim My_Qry As QueryDef
Dim My_Path As String
Dim i As Integer
Set My_Db = CurrentDb()
Set My_Rst = My_Db.OpenRecordset("勤怠レポート")
My_Path = CurrentProject.path
i = 1
My_Rst.MoveFirst
Do Until My_Rst.EOF > i
DoCmd.OutputTo acOutputReport, "勤怠レポート", acFormatPDF, My_Path & "\" & My_Rst!社員コード & ".pdf", False, 0
My_Rst.MoveNext
i = i + 1
Loop
明らかにこれではコードが足りず、このままでは、延々とPDFが社員コードのファイル名で、しかも
PDFの中身は全部同じで、全部のレコードが混じっている状況です。
このコードにどういうフィルタを加え、どういうループを書いたら、1つづつPDF化してくれるのか
を知りたい次第。およそ70レコードあり、70個のそれぞれの社員コードの名前がついたPDFに
出来るのか、お教え願えませんでしょうか?
Accessは2007で、PDF出力アドインが入ってます。
118:名無しさん@そうだ選挙にいこう
08/08/20 05:12:44
>>117
.EOFはBoolean型なのにInteger型と比較してますよ。
Do Until My_Rst.EOF > i を
Do Until My_Rst.EOF とすれば社員コードごとのPDFになりそう。
(変数 i は不要)
あと、
Set My_Rst = My_Db.OpenRecordset("勤怠レポート") を
Set My_Rst = My_Db.OpenRecordset("SELECT * FROM 勤怠レポート ORDER BY 社員コード") に。
そうすると、My_Rst.MoveFirst の1文も不要になります。
119:名無しさん@そうだ選挙にいこう
08/08/20 06:47:34
AllowBypassKey
AllowSpecialKeys
trueにして自分ではまってしまいました!
これを無効にする方法はありませんか?
昨夜から徹夜で探っていますがわかりません。
よろしくお願いします!
120:名無しさん@そうだ選挙にいこう
08/08/20 15:45:44
>>119
AllowBypassKey
でググって一番上のサイトに方法が書いてあったよ。
121:名無しさん@そうだ選挙にいこう
08/08/20 19:29:12
>>118
そのコードを取り入れて実行してみました。
結果として、ファイル名に社員コードで出力はでき、社員コードがある分だけ
PDFファイルは出たのですが、問題のそのひとつひとつの中身なのですが、
その社員コードに該当するレポートだけでなく、すべてのレポートが含まれて
しまう現象は以前なおらず。
勤怠レポートというレポートの中身が社員コードできちんとフィルタリングされ
ていないようで、勤怠レポートというテーブルの中身が全部レポート化された
状態になってしまいました。
あと一歩という感じなのですが、このレポート、それぞれの社員コードに該当
するものだけが、レポートに含まれるようにするために、どうフィルタリングする
コードを追加したら良いでしょうか?
122:118
08/08/20 22:37:28
なるほど、それならここも追加で修正。
DoCmd.OutputTo acOutputReport, "勤怠レポート", _
acFormatPDF, My_Path & "\" & My_Rst!社員コード & ".pdf", False, 0
↓
DoCmd.OutputTo acOutputReport, "SELECT * FROM 勤怠レポート WHERE 社員コード='" & My_Rst!社員コード & "'" , _
acFormatPDF, My_Path & "\" & My_Rst!社員コード & ".pdf", False, 0
レポートのソースが勤怠レポート全件になっていたのを、社員コードでセレクトするように修正。
123:名無しさん@そうだ選挙にいこう
08/08/20 23:18:52
>>122
ちょっとやってみます。これができると、格段に能率が上がるので非常に
ありがたいです(応用したい物がたくさんあります
124:名無しさん@そうだ選挙にいこう
08/08/20 23:34:58
まてまて、「勤怠レポート」ってレポートオブジェクトだろ?
DoCmd.OutputTo の第1引数が acOutputReport なら第2引数はレポート名の単体指定のみ可で
SQLは不可というか、仮に可であったとしても「SELECT * FROM レポート名」はないと思うけど・・・
125:名無しさん@そうだ選挙にいこう
08/08/20 23:39:07
>>124
わかりづらくてもうしわけありません。
勤怠レポートというテーブルと、勤怠レポートというレポートがあるんです。でこの
勤怠レポートというテーブルをソースとして勤怠レポートというレポートという形に
しているのです。
ですが、仰るとおり、acOutput Reportの第二引数はレポートオブジェクトの指定し
かできず、SQLが使えませんでした。となると、このレポートを開く直前で、クエリに
手を入れるコードが必要となるのでしょうか?
126:名無しさん@そうだ選挙にいこう
08/08/21 00:41:24
なるほど… このままだとちょっと話がややこしくなるから名前を以下のように変更させてくれ
テーブル → T_勤怠
レポート → R_勤怠
そして事情が許すならT_勤怠に抽出用のBoolean項目「印刷フラグ」を追加して、
R_勤怠は印刷フラグ=Trueだけを印刷するような仕様に変更するのが一番簡単な方法だと思う。
Dim rst As DAO.Recordset
Set rst = CurrentDb.OpenRecordset("SELECT * FROM T_勤怠 ORDER BY 社員コード")
Do Until rst.EOF
CurrentDb.Execute "UPDATE T_勤怠 SET 印刷フラグ = False"
CurrentDb.Execute "UPDATE T_勤怠 SET 印刷フラグ = True WHERE 社員コード='" & rst!社員コード & "'"
DoCmd.OutputTo acOutputReport, "R_勤怠", acFormatPDF, CurrentProject.Path & "\" & rst!社員コード & ".pdf", False, 0
rst.MoveNext
Loop
rst.Close : Set rst = Nothing
DoCmdは非同期コマンドだから実はまだ安心できないけど、一応これでいけるはず。
T_勤怠にフィールドを追加できないとか、R_勤怠のWhere句を変更できないとかの事情があるなら
また別の方法で・・・
127:118
08/08/21 01:31:13
>>123-125
DoCmd.OutputTo の引数を勘違いしていました。正直スマンカッタ…orz
拝見したところ、>>126さんの方法で良さそうですね。
一応、DoCmd.OutputTo の直前でレポートの修正を行う方法を考えてみました。
Do Until My_Rst.EOF
'デザインモードで開き
DoCmd.OpenReport "勤怠レポート", acViewDesign, , , acHidden
'フィルタを設定(レコードソースの修正でも可)
Application.Reports("勤怠レポート").Filter = "社員コード='" & My_Rst!社員コード & "'"
'レポートを保存する
DoCmd.Close acReport, "勤怠レポート", acSaveYes
DoCmd.OutputTo 〜(以下略)
ということで失礼します〜
128:名無しさん@そうだ選挙にいこう
08/08/21 19:45:11
【 システム環境 . 】 WindowsXP
【 VBAが使えるか .】 いいえ
【 VBAでの回答 】 否
【 検索キーワード 】 インデックス、制限
ひとつのテーブルに24個のフィールドがあり、その内18個のフィールドに他のテーブルとのリレーションとインデックスを設定しようとしたのですが、うまくいきません。
「インデックスの数が多すぎる」とかいうエラーメッセージが出てきます。そこで質問なのですが、ひとつのテーブルに設定できるインデックス付きのフィールド数には制限があるのでしょうか?
超初心者なのですが、顧客のデータ管理をアクセスでできたらと考えています。
具体的には、
1.ひとつの製品は数十個の部品から構成され、
2.それらの部品は、それぞれ数十個の記録すべきパラメータがあります。
3.約数万台の製品の保守を行っています。
数十個の各部品ごとにテーブルを作り、ひとつの製品のテーブルにリレーションを張り、
製品テーブルの各部品フィールドにインデックスを定義しようとしたのですが、
「インデックスの数が多すぎます」というメッセージが出ました。
インデックスを定義しないほうがいいのでしょうか?しかし、数万のレコードを
素早く検索するのはインデックスがあったほうがいいと思うのですが。。。。
ご教示の程、よろしくお願い致します。
129:名無しさん@そうだ選挙にいこう
08/08/21 19:53:39
>>126
>>127
大変、大変ありがとうございます。ここ1ヶ月こいつの実装に苦しんでいました。
おかげさまで、社員コード別にPDFが出力することができました。このあと、これ
をBASPIをつかって、連続メール送信を実装しようと思っていて、その際に添付
ファイルの指定で、この社員コードとリンクするPDFを自動的に選択して送信する
予定でしたので、大変助かりました。他にも応用できるので、感謝感謝です。
ただ難点が、PDFを70人ほど出力しているのですが、ガンガンメモリ消費量があ
がっていって、一度閉じないと、メモリが解放されない点でしょうか。maxlockfile
を指定するコードを入れて、メモリ不足ギリギリで抑えましたが、70名ほどでだい
た、520MBほどメモリを消費するので、今後ここに取り組みたいと思います。
ありがとうございました。
130:名無しさん@そうだ選挙にいこう
08/08/21 19:59:38
約数十個×約数万台つったら、テーブル100万個ぐらい作ってんの?スゲーな。
んで、それらがくもの巣のようにリレーション張りめぐらしてるのか・・・
想像したらオラわくわくしてきたぞ!
ちなみにAccessの場合リレーション張ったら双方に自動的に隠しインデックス作っちゃうからそれも数に入れてね。
131:名無しさん@そうだ選挙にいこう
08/08/21 20:49:16
>>130
test
次ページ最新レス表示スレッドの検索類似スレ一覧話題のニュースおまかせリスト▼オプションを表示暇つぶし2ch
4837日前に更新/156 KB
担当:undef