ACCESS2000総合相談所

このエントリーをはてなブックマークに追加
>>950
ごめんなさい その強引な方法っていうのは
ちっとも汎用的じゃなくて、うちのDBでしか使えない方法なので
掲載しても無意味と思う。しかも説明しようとしたらテーブル構造も
相当書かなきゃなので勘弁して・・ m(__)m
953名無しさん@そうだ選挙にいこう:01/12/06 02:23
機材管理のDBを作りたいのですが
管理コードは、連続しているが、項目ごとにフォームの内容を切り替える
事は出来ないでしょうか?

つまり
0001 PC-A
0002 CRT
0003 Printer
といった機材があるとして
PCはOSやCPUの種類、メモリ、HDの容量
CRTはサイズ
プリンターは、種類と白黒・カラーの有無、用紙サイズ
といった具合に、入力&表示する内容を切り替えたいのです。
954949:01/12/06 14:25
>951 さん レスありがとうございます。
やはりBugですよね、パッチが出てないかみてこよう。
MSの事だから、もう97のサポートはしてないと思うけど

しかしこんな致命的なのに表立って聞いた事が
なかったですねぇ
955943:01/12/06 14:41
>927
・検索条件を入力するテキストボックスとコマンドボタンは、
 検索結果が出るフォームのヘッダーにあります。
 (レコードがフォームの本体に表示されます。)
 レコードを表示するフォームと、検索条件を入力、表示するフォームは
 同一です。分かれてないです。
 これで判りますでしょうか?
 それから、下に検索のコマンドボタンのVBAを載せておきます。

Private Sub レコードの検索_Click()
' コントロールの値と一致するレコードを検索する
On Error GoTo Err_レコードの検索_Click
Dim rs As Object

Me.RecordsetClone.FindFirst "PCテーブル.[コンピュータ名] = '" & Me![PC検索] & "'"
Me.Bookmark = Me.RecordsetClone.Bookmark

If IsNull(Me![PC検索]) Then
Msgbox ("該当するレコードはありませんでした")
End If

Me!PC検索 = Null

Exit_レコードの検索_Click:
Exit Sub

Err_レコードの検索_Click:
Msgbox Err.Description
Resume Exit_レコードの検索_Click

End Sub
956名無しさん@そうだ選挙にいこう:01/12/06 15:27
>>955

Dim rs As Recordset

set rs = Me.RecordsetClone
rs.FindFirst "PCテーブル.[コンピュータ名] = '" & Nz(Me![PC検索],"") & "'"

if rs.EOF then
Msgbox ("該当するレコードはありませんでした")
else
Me.Bookmark = Me.RecordsetClone.Bookmark
endif

Me!PC検索 = Null

だと思われ
957名無しさん@そうだ選挙にいこう:01/12/06 15:40
訂正

Me.Bookmark = rs.Bookmarkだった。
958955:01/12/06 16:50
>956
うーん、折角教えて頂いたのに悪いのですが、
一度そのVBAでしてみたのですが、
メッセージボックスが出なくなりました・・・
959名無しさん@そうだ選挙にいこう:01/12/06 16:56
FindFirstだから rs.EOFではなく rs.NoMatch では?

if rs.Eof then … ×
if rs.NoMatch then … ○

これで動かん?
960名無しさん@そうだ選挙にいこう:01/12/06 17:00
VBAのコード中に変数を埋め込んだSQL文を書くのが非常に面倒なんですけど、
どうやってかいてますか?
""、&、 _を使って手で書いてると発狂しそうになる。。
なんかツールとかあるんですか?
961名無しさん@そうだ選挙にいこう:01/12/06 17:32
予約ID, 会員コード, 予約時間, 席
というテーブルがあって、今日は誰が来るかの一覧を、会員コード、
時間、席、その会員コードの人は前回、前々回いつ来たか、というのを
出したいんですが、クエリだけでは無理ですか?
962949:01/12/06 18:30
>961
できそうだが…
963名無しさん@そうだ選挙にいこう:01/12/06 19:45
>953
まずテーブル設計から
T機材管理
 管理コード 主キー テキスト型
 機材種別 数値型
 詳細A テキスト型
 詳細B テキスト型
 詳細C と必要なだけテキスト型の詳細を作る。

T機材種別
 機材種別 主キー 数値型
 詳細A列名 テキスト型
 詳細B列名 テキスト型
 詳細C列名 詳細と同じだけ作る。

T機材管理とT機材種別を元にしたクエリQ機材管理
SELECT T機材管理.*, T機材種別.機材種別名, T機材種別.詳細A列名, T機材種別.詳細B列名, T機材種別.詳細C列名 FROM T機材管理 INNER JOIN T機材種別 ON T機材管理.機材種別 = T機材種別.機材種別;
をレコードソースにしたフォームF機材管理を作る。
機材種別に数値を入力すると機材種別名や詳細A列名等が表示されるので
それに沿って詳細A等を入力してもらう形式。機材種別名・詳細A列名等は
編集ロックをかける。
入力はこんなもんかな?機材種別をコンボボックスにするとか
タブストップをいじるとか使いやすいように変えてね。
964963:01/12/06 19:46
で、表示だけど、複数項目による絞込ってことだあね。作るのが楽(っていうか作らなくて良い)
のはフォームフィルタ。なんだけど、使い方が面倒臭いってゆーか
あまりPC使わない人が使う場合、教えるのが面倒臭いとゆ〜か。
クエリの抽出条件のとことおんなじだからねえ(「あ」を含むなら Like "*あ*")

まじめに作るとこんな感じかな?
フォームヘッダに抽出条件管理コード・抽出条件機材種別・抽出条件詳細A列名等を
コントロールソースなしで作って絞込検索ってボタンを作って

Private Sub 絞込検索_Click()
Dim SQLCode As String
SQLCode = ""

If Me![抽出条件管理コード] <> "" Then
SQLCode = " Q機材管理.管理コード Like '*" & Me![抽出条件管理コード] & "*'"
End If

If Me![抽出条件機材種別] <> "" Then
If SQLCode <> "" Then
SQLCode = SQLCode & " AND Q機材管理.機材種別=" & Me![抽出条件機材種別]
Else
SQLCode = " Q機材管理.機材種別=" & Me![抽出条件機材種別]
End If
End If

If Me![抽出条件機材種別名] <> "" Then
If SQLCode <> "" Then
SQLCode = SQLCode & " AND Q機材管理.機材種別名 Like '*" & Me![抽出条件機材種別名] & "*'"
Else
SQLCode = " Q機材管理.機材種別名 Like '*" & Me![抽出条件機材種別名] & "*'"
End If
End If

If Me![抽出条件詳細A列名] <> "" Then
If SQLCode <> "" Then
SQLCode = SQLCode & " AND Q機材管理.詳細A列名 Like '*" & Me![抽出条件詳細A列名] & "*'"
Else
SQLCode = " Q機材管理.詳細A列名 Like '*" & Me![抽出条件詳細A列名] & "*'"
End If
End If

'以下同様に続く

If SQLCode <> "" Then
SQLCode = "SELECT * FROM Q機材管理 WHERE" & SQLCode
Else
SQLCode = "SELECT * FROM Q機材管理"
End If
Me.Form.RecordSource = SQLCode
End Sub

ってなイベントプロシージャを書く。でどうでしょ?ツカレタ
でもおかげで「改良しないとなあ」と思ってたものの、ど〜しようか
って悩んでいたののヒントになったよ。
965963:01/12/06 19:47
>960
SQL文を手で書くのは確かにめんどくさいですね。しかもその後スキャナで取り込んで
OCRで認識させて間違えて認識した所を修正してってやっていると僕も気が狂いそうです。

ごめんよ。ちょっとふざけてみた。

クエリを作って、抽出条件に'"& 変数 &"'とか"& 変数 &"とか入力してSQLビューに
して改行を半角スペースに打ち変えてコピペがキーボードで打ち込むのが好きじゃない
人のSQL文の作りかたかなあ。
後は「自動入力くん パスワード入力など特定条件に合致する画面に対して登録した文字列の入力を行う」
ttp://www.vector.co.jp/soft/win95/util/se217786.html
とかに'"& &"'とかを登録しておくとか。
966名無しさん@そうだ選挙にいこう:01/12/06 20:22
>964

丁寧に解説ありがとうございます。
週末に実践してみようと思います。
967名無しさん@そうだ選挙にいこう:01/12/06 20:27
>>962
出来るんですか?前回前々回の履歴が取れない気がしたんですけど。。

一時テーブル作って一時テーブルから一覧をつくりました。
その日に来る会員コードを取得するSQL書いて
それを1件ごと取り出して、取り出した会員コードを元に別のSQLで
履歴を取得して、その履歴を一時テーブルに保存してくのをVBAで
シコシコ書いたんですけど無駄な作業だったりしますか?
初めてレコードセットの取得とかやったんでえらく時間が掛かりました。。
勉強にはなったから良いけど。。
969厨房:01/12/06 21:16
すみません。
ByLayerの太さって0.20mmくらいですか?
正確な太さってわかりますか?
>>967

前回前々回と限定すれば可能じゃないかな?

>シコシコ書いたんですけど無駄な作業だったりしますか?

そういう経験は決して無駄ではないと思う。
問題解決へのアプローチは一つではない。
自力で何とかなってるならそれはOK。
971958:01/12/07 10:17
>959
確かに、NoMatchに変えたら
メッセージボックスが出るようになりました。
ありがとうございました。
しかし、やっぱり他の操作をすると
レコードが一番前に戻って、
メッセージボックスが出ないです。
972958:01/12/07 10:19
で、更にまた厨房的質問ですいませんが、

Private Sub PC検索_AfterUpdate()
' コントロールの値と一致するレコードを検索する
On Error GoTo Err_PC検索_AfterUpdate
Dim rs As Objectta

Me.RecordsetClone.FindFirst "PCテーブル.[コンピュータ名] = '" & Me![PC検索] & "'"
Me.Bookmark = Me.RecordsetClone.Bookmark

If IsNull(Me![PC検索]) Then
Msgbox ("該当するレコードはありませんでした")
End If

Me!PC検索 = Null

Exit_PC検索_AfterUpdate:
Exit Sub

Err_PC検索_AfterUpdate:
Msgbox Err.Description
Resume Exit_PC検索_AfterUpdate

End Sub

これで、メッセージボックスが出ないのは
どうしてなんでしょう?
考えてみたんですが、判らないです・・・
質問ばかりですいません
973958:01/12/07 10:20
上のは、テキストボックスに入力した文字で、
Enterキーを押した時に検索するVBAです。
974名無しさん@そうだ選挙にいこう:01/12/07 12:13
テキストボックス([PC検索])がNullのときにMsgboxが出るようになってるから。
975927:01/12/07 12:57
>レコードが一番前に戻って
rs.closeしてないとか、MoveFirstして先頭から検索してもらうとかかな?
もしくはMe.RecordsetCloneだと検索後の絞り込まれたのから検索してるんじゃ?

>メッセージボックスが出ないのは
If IsNull(Me![PC検索]) Thenをif rs.NoMatch then(959さんの)
検索条件を見てもしょうがないんじゃ?

DAOはにがてなんだよなあ。何回か使ってるし、動けば他では出来なかったり
重いのを軽く出来たりするだけど毎回悩む。
僕なら検索程度なら全然違う方法でこうする。

Private Sub PC検索_AfterUpdate()
If Me![PC検索] <> "" Then
Me.Form.RecordSource = "SELECT PCテーブル.* FROM PCテーブル WHERE PCテーブル.コンピューター名='" & Me![PC検索] & "';"
 'SQL文はフォームに合わせて変えてね。
'部分一致なら WHERE PCテーブル.コンピューター名 Like '*" & Me![PC検索] & "*';" 但し重いと思われ
If IsNull(Me![コンピューター名]) Then
MsgBox ("該当するレコードはありませんでした")
End If
Else
Me.Form.RecordSource = "SELECT PCテーブル.* FROM PCテーブル;"
'PC検索をからにすると全件表示
End If
End Sub

エラーの処理やMe![PC検索]をからにするとか(その場合Else以下を変更)は
案件にあわせてそれなりに。
976958:01/12/07 16:59
>927=975
うーん、上のVBAだと、レコードが1件に絞り込まれてしまうのですね。
そうすると、全件をもう一度表示するのが判らないので、
ちょっと・・・

で、>If IsNull(Me![PC検索]) Thenをif rs.NoMatch then(959さんの)
  >検索条件を見てもしょうがないんじゃ?
を参考に、If RecordsetClone.NoMatch Thenにしたらなんとか出来ました。
が、また不都合が・・・
こうすると、検索終了したらMe!PC検索 = Nullで
テキストボックスをクリアにする操作をするので、
AfterUpdateが効いてしまって、
2回メッセージボックスが出てきてしまうのです。
これを回避する方法って、ありますか?
次から次へと質問してすいませんです・・・・
>>976
くだらん。
フォームフィルタをHELPで調べろ
978927:01/12/07 18:49
>958 の 976
を〜い、ちゃんと読んどるんか〜
>そうすると、全件をもう一度表示するのが判らないので、
975>Else
975>Me.Form.RecordSource = "SELECT PCテーブル.* FROM PCテーブル;"
975>'PC検索をからにすると全件表示
ここじゃ。

DAOにこだわるなら
>2回メッセージボックスが出てきてしまうのです。
If isnull(Me![PC検索]) then
Exit sub
end if
とでもしとけ。とりあえず956/957さん959さんのレスを見直す。たとえば
957>Me.Bookmark = rs.Bookmarkだった。
とか君宛のレスじゃろ?972には反映されとらんけど、試して問題でもあったん?
もし問題があったんならそれをかかにゃいけんじゃろおが?
ヘルプを「DAO」で検索。関係なさそうなところもよく読めえや。
同じく「Recordset」もよく見れ。リンク先や関連項目・使用例・対象も。
特に使用例のSet rstとかSet dbs書いてある辺りをいろいろ見て
自分のデータベースで動かしてみいや。グーグルも使え。
DAOはいろいろできて強力なだけにむずかしいんで?使うなら真面目に
取り組まんとらちあかん。コピペですぐ動くもんじゃないけえね。
自分で勉強する気がないなら977さんのいうようにしときんちゃいや。
979977:01/12/07 19:55
>>978
漏れのいいたかったことはチト違うな・・
厨房が、意味もわからず余計なことをしていたため
あのような発言をしたまでのこと。

ACCESSを使う上で、帳票フォームを利用する最大のメリットは
ひとつがフィルタ・並び替えを簡単に行うことだと思っている。

わざわざそれに逆らう必要など微塵もない。
VBAでも簡単に制御できるしな
980927:01/12/07 20:41
>977-979さん
なるほど。
>ACCESSを使う上で 〜中略〜 逆らう必要など微塵もない。
ってゆ〜のは確かに頷けます。僕も検索ならRecordSourceプロパティを
使う派ですから。フォームフィルタは実際に使う人がそれなりに
分かってくれる人なら使いたいところですが、964(これも僕でした)
>なんだけど、使い方が面倒臭いってゆーか
>あまりPC使わない人が使う場合、教えるのが面倒臭いとゆ〜か。
なので使わないですねえ。
>VBAでも簡単に制御できるしな
って言われてますのでいわずもがなですね。

以下毎回名前がかわる774君関連のレス。
>>926-928 >>932-933 >>936 >>943-944 >>955-959 >>971-979
981親切な人:01/12/07 21:06

ヤフーオークションで、幻の人気商品、発見!!!

今は無き「コピーガードキャンセラー」↓
http://page2.auctions.yahoo.co.jp/jp/auction/b18505597

ヤフーオークション内では、現在、このオークション
の話題で、持ちきりです。
982名無しさん@そうだ選挙にいこう:01/12/09 01:19
dateという名前のテキストボックスがフォーム上にあるんですが
別のテキストボックスに現在の日付を取得しようとして
Me!F.acceptday = dateとすると、acceptdayにテキストボックスdateの値が
入ってしまいます。
明示的に関数だということを宣言する方法はありませんか?
date()と書けないし。。
>>982
標準モジュールに適当な関数作って呼んだら?

Public Function DateA() as Date
DateA = Date
End Function

テキストボックスの名前変えるのがいいんだろうけどね
984名無しさん@そうだ選挙にいこう:01/12/09 10:28
>>982
Dateの代わりに、Nowを使えば??
format(now,"yyyy/mm/dd")
985名無しさん@そうだ選挙にいこう:01/12/09 18:02
テキストボックスの名前を変えろ
関数名とかぶらせる奴があるかい
フィールド名とも重複させるなよ
986名無しさん@そうだ選挙にいこう:01/12/09 20:39
>>982
Me!F.acceptday = VBA.Date
>>982
テキストボックスだったら、
txtDateみたいな命名基準がよさげ。
988名無しさん@そうだ選挙にいこう:01/12/10 21:24
結局名前を変えました。
後々別の人が見たときに分かりにくいですし。。
こっちは使い切りきり魔性
どーすか
そゆことで
ねえ?
999!
1000?
10011001
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。