>>950 ごめんなさい その強引な方法っていうのは
ちっとも汎用的じゃなくて、うちのDBでしか使えない方法なので
掲載しても無意味と思う。しかも説明しようとしたらテーブル構造も
相当書かなきゃなので勘弁して・・ m(__)m
953 :
名無しさん@そうだ選挙にいこう :01/12/06 02:23
機材管理のDBを作りたいのですが 管理コードは、連続しているが、項目ごとにフォームの内容を切り替える 事は出来ないでしょうか? つまり 0001 PC-A 0002 CRT 0003 Printer といった機材があるとして PCはOSやCPUの種類、メモリ、HDの容量 CRTはサイズ プリンターは、種類と白黒・カラーの有無、用紙サイズ といった具合に、入力&表示する内容を切り替えたいのです。
>951 さん レスありがとうございます。 やはりBugですよね、パッチが出てないかみてこよう。 MSの事だから、もう97のサポートはしてないと思うけど しかしこんな致命的なのに表立って聞いた事が なかったですねぇ
>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だった。
>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, 会員コード, 予約時間, 席 というテーブルがあって、今日は誰が来るかの一覧を、会員コード、 時間、席、その会員コードの人は前回、前々回いつ来たか、というのを 出したいんですが、クエリだけでは無理ですか?
>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列名等は 編集ロックをかける。 入力はこんなもんかな?機材種別をコンボボックスにするとか タブストップをいじるとか使いやすいように変えてね。
で、表示だけど、複数項目による絞込ってことだあね。作るのが楽(っていうか作らなくて良い) のはフォームフィルタ。なんだけど、使い方が面倒臭いってゆーか あまり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 ってなイベントプロシージャを書く。でどうでしょ?ツカレタ でもおかげで「改良しないとなあ」と思ってたものの、ど〜しようか って悩んでいたののヒントになったよ。
>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で
シコシコ書いたんですけど無駄な作業だったりしますか?
初めてレコードセットの取得とかやったんでえらく時間が掛かりました。。 勉強にはなったから良いけど。。
すみません。 ByLayerの太さって0.20mmくらいですか? 正確な太さってわかりますか?
>>967 前回前々回と限定すれば可能じゃないかな?
>シコシコ書いたんですけど無駄な作業だったりしますか?
そういう経験は決して無駄ではないと思う。
問題解決へのアプローチは一つではない。
自力で何とかなってるならそれはOK。
>959 確かに、NoMatchに変えたら メッセージボックスが出るようになりました。 ありがとうございました。 しかし、やっぱり他の操作をすると レコードが一番前に戻って、 メッセージボックスが出ないです。
で、更にまた厨房的質問ですいませんが、 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 これで、メッセージボックスが出ないのは どうしてなんでしょう? 考えてみたんですが、判らないです・・・ 質問ばかりですいません
上のは、テキストボックスに入力した文字で、 Enterキーを押した時に検索するVBAです。
974 :
名無しさん@そうだ選挙にいこう :01/12/07 12:13
テキストボックス([PC検索])がNullのときにMsgboxが出るようになってるから。
>レコードが一番前に戻って 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以下を変更)は 案件にあわせてそれなりに。
>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で調べろ
>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さんのいうようにしときんちゃいや。
>>978 漏れのいいたかったことはチト違うな・・
厨房が、意味もわからず余計なことをしていたため
あのような発言をしたまでのこと。
ACCESSを使う上で、帳票フォームを利用する最大のメリットは
ひとつがフィルタ・並び替えを簡単に行うことだと思っている。
わざわざそれに逆らう必要など微塵もない。
VBAでも簡単に制御できるしな
>977-979さん
なるほど。
>ACCESSを使う上で 〜中略〜 逆らう必要など微塵もない。
ってゆ〜のは確かに頷けます。僕も検索ならRecordSourceプロパティを
使う派ですから。フォームフィルタは実際に使う人がそれなりに
分かってくれる人なら使いたいところですが、964(これも僕でした)
>なんだけど、使い方が面倒臭いってゆーか
>あまりPC使わない人が使う場合、教えるのが面倒臭いとゆ〜か。
なので使わないですねえ。
>VBAでも簡単に制御できるしな
って言われてますのでいわずもがなですね。
以下毎回名前がかわる774君関連のレス。
>>926-928 >>932-933 >>936 >>943-944 >>955-959 >>971-979
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?
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。