現在Accessで開発をしています
ライブラリはADOを使用しております
メインフォーム データ検索 帳票フォームに全データを出力
サブフォーム1 修正/削除 連結フォームにフィルタをかけて修正/削除を
サブフォーム2 追加 非連結フォームで追加処理を
データ件数が多いのと項目数が多いのでメインフォーム上では
修正/追加/削除はやらず サブフォーム(単票フォーム)を呼び出しそこでやる
ことにしています
本当はサブフォーム1だけで修正/削除/追加をしたいのですが
ADOだと非連結のフォームでは更新ができないとわかり
連結フォームで対応しました
DAOでやろうかとも考えましたが、ADOとDAOの共存はメンテナンス等を踏まえ
やめました。また、DAOは入りにくいのも理由です
ちなみにSQLサーバーは将来使用しません
あくまでAccess単体(MDB)のみの開発をすると想定して
みなさんは、以下の3つどのパターンで開発をしていますか?
1、ADOのみ
2、DAOのみ
3、ADOとDAO両方
また、理由もお聞きしたいです
よろしくお願いします
No.1ベストアンサー
- 回答日時:
Accessnoバージョンを記載しましょう。
>DAOは入りにくい
しかし、Accessの規定はDAOですからねぇ。
どこがどう「入りにくい」のでしょう。例えば、
Set A = CurrentDb.OpenRecordset(~)で
返るレコードセットはDAOのレコードセットです。
その他、テーブル情報を調べる時もDAOのセットを
使う方がマッチしています。
わざわざADOのオブジェクトを作らなくても利用
できます。他のDBをリンクする場合はADOを考え
ますけど、AccessのみならDAOだけで十分だと
思います。
この回答への補足
早速のレスポンスありがとうございます
Accessのバージョンは2003です
入りにくいのは、ADOの場合
ネットまたは本において、定義なども含めてコーディングの仕方が同じ
であることが入りやすい理由にあげられます。
調べる場合などはいいんですよね。
対してDAOの場合は、ネットまたは本でバラバラであることが入りにくい
理由です。
パターン1
Dim DB as database
dim RS as recordset
set DB = currentDB
set RS = db.openRecordset(TBL名,dbopenDynaset)
Me.RecordSource = TBL名 → set Me.RecordSource = TBL名
(左だとエラー(本推奨)、右だと成功。わけわからん)
RS.close
DB.close
パターン2 終了処理がない
strSQL = "Select *~省略"
me.recordsource = SQLstatement
名前.controlsource = "名前"
パターン3
Set DB = CurrentDb
strSQL = "SELECT * FROM TBL名 where [NO] =" & 1
Set RS = DB.OpenRecordset(strSQL, dbOpenDynaset)
Set Me.Recordset = RS
Me.NO = RS!NO
Me.市町村 = RS!市町村
Me.薬局名 = RS!薬局名
Me.所在地 = RS!所在地
Me.電話番号 = RS!電話番号
微妙にちがうんですよね~
No.4
- 回答日時:
方向はきまったようようなので以下は付け足し
程度ですが。
>しかし、非連結のフォームに対してレコードセットの更新は
>DAOではできるが
>ADOではできない 理由が私には理解できないんですよね~
えーっと、少し分かり辛い文面なので勘違いならごめんです。
工夫と言えば工夫ですが、#1さんへの補足の最後のコードを
ADOに切り替え、
strSQL = "SELECT * FROM TBL名"
とし、
Me.NO = RS!NO
Me.市町村 = RS!市町村
Me.薬局名 = RS!薬局名
Me.所在地 = RS!所在地
Me.電話番号 = RS!電話番号
をひっくり返し、
RS!NO = Me.NO
RS!市町村 = Me.市町村
RS!薬局名 = Me.薬局名
RS!所在地 = Me.所在地
RS!電話番号 = Me.電話番号
にすれば、非連結フォームに書き込まれた
データを元にテーブルの更新ができます。
以下は直書きなので何かが抜けているかも
しれませんが、
Dim cn As New ADODB.Connection
Dim RS As New ADODB.Recordset
Dim cmd As New ADODB.Command
Set cn = CurrentProject.Connection
cmd.CommandText = "SELECT * FROM TBL名"
Set cmd.ActiveConnection = cn
RS.Open cmd, , adOpenKeyset, adLockPessimistic
With RS
.AddNew
.Fields("NO") = Me.NO
.Fields("市町村")= Me.市町村
.Fields("薬局名") = Me.市町村
.Fields("所在地") = Me.市町村
.Fields("電話番号") = Me.市町村
.Update
End With
このような感じで非連結フォームの
コントロールの値を参照してテーブルの
更新をします。
あるいは、strSQLを更新クエリにして、
cn.Execute strSQL
という方法もあります。こちらは速い。
No.3
- 回答日時:
#1です。
>Me.RecordSource = TBL名 → set Me.RecordSource = TBL名
>(左だとエラー(本推奨)、右だと成功。わけわからん)
レコードソースはテキスト型ですので、左が正しいし、
エラーになることはありません。他のプロパティと
間違えていませんか?
また、レコードソースを変更した後、Me.Requeryを
実行しているでしょうか?
>終了処理が無い
レコードセットで更新するならフォームを使う理由は?
それと、フォームは静的に作ることが多いので、動的に
コントロールソースを設定するというのが不自然です。
設計企図が見えません。
>Set Me.Recordset = RS
普通、このプロパティは変更しません。レコードソースを
変更し、Requeryすれば変更されるからです。参照する
ことは無いことはないものの、極めて稀です。
連結フォームで処理するのか、フォームは非連結で、
内部でレコードセットや更新クエリで処理するのか
バラバラのように思えます。統一すべきでしょう。
この回答への補足
#1さん
早いレスポンスありがとうございます 助かります(_ _)m
ずばり言いますと、わけがわからなくなっちゃってるんですね。(汗'')
整理しますと、
1 ADOかDAO どちらか1つにしてコーディングする
2 追加/更新/削除/は1つのサブフォームで行う
3 書き方は全て統一する。SQLを使用して2をやるならSQLで全てやる
SQLを使用しないでやるならSQL不使用でやる
4 テーブルを開く→メソッド→テーブルを閉じると一連の流れになっているか
さきほど、ADOのレコードセットをフォームにもってきたとき読み取り専用になる
現象を他の方法でできないか試してみました。
こちらは一度変数に格納してからフォームのテキストボックスに変数を設定して
更新ボタンを押すと
wCNN.Execute strSQL
で更新できるロジックに変更しました。
これが解決できたことにより 1、2、3、4全ての条件を満たすことが可能となりました。
DAOだと私のもっているテキスト本ではSQLでやる場合 4がぬけてるんですね。
ADOだとSQLを使用しても4のステートメントがテキスト本でもネットでもあるので
ADOにしました。
これで、フォームは非連結で、
内部でレコードセットや更新クエリで処理し統一しました。
ちなみに
Set Me.Recordset = RS
これはレコード群をフォームのレコードソースに設定していることで
連結フォームのレコードソースプロパティにTBL名やクエリ名を設定していることと
一緒の意味なんですよね?
徐々に理解しながら、ADOのコーディングの形を構築していきたいと思います
レスポンスありがとうございました(^^)/
No.2
- 回答日時:
(1),(2),(3)のどれで開発するかと言われれば、
時と場合による、です。
(1)は横槍が入った場合と必要に迫られた場合。
(2)は縛りが無ければADOを使うメリットは無いから。
(3)は横槍が入った場合と必要に迫られた場合。
ADOは他の言語からmdbファイルにアクセスする場合は
使いますが、Access単独の場合は上記の感じです。
したがって、ユーティリティなども含めてほとんどDAOです。
(1),(2),(3)のどれで開発しますか、という問いも
変な感じですが、DAOがはいりにくいならばADOでも
いいでしょう。Accessは2000からはADOもサポート
しています、が、新しいバージョンになってもAccessの
ネイティブランゲージはDAOです、と言い切ってしまい
ましたが他意はありません。
>メインフォーム データ検索 帳票フォームに全データを出力
>・・・・・・・
ならば、私はだまってDAOです。
まあ、好きなほうで開発されればいいかと思います。
回答ありがとうございます。
ADOのコーディングをDAOで現在書き換えています
しかし、非連結のフォームに対してレコードセットの更新は
DAOではできるが
ADOではできない 理由が私には理解できないんですよね~
本もADOが大半だし、、、
レスありがとうございます(^^)/
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・人生のプチ美学を教えてください!!
- ・10秒目をつむったら…
- ・あなたの習慣について教えてください!!
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・【大喜利】【投稿~9/18】 おとぎ話『桃太郎』の知られざるエピソード
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
vba クリップボードクリアにつ...
-
python エラー
-
Google ColaboでGUI作成
-
以下の技能を無料で受講できる...
-
chatGPTで次々と質問をしていく...
-
このURLで広告を出しているのは...
-
python3について。
-
python の 連鎖代入の文法
-
昔のパソコン少年の武勇伝「店...
-
HTMLソースが表示のページのも...
-
pythonでのカーソル移動がずれる
-
プログラミングを学ぼうと思い...
-
プログラマーに向いている人の...
-
matplotlibでのLaTex表示
-
Win11で作業を自動化したいです...
-
プログラミングの雑談がしたい...
-
Pythonのコードエラーについて...
-
このプログラミング言語のfor分...
-
Pythonで仮想通貨の自動売買が...
-
入力された文字列が、LD22000を...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
vba クリップボードクリアにつ...
-
Pythonでの文字列からfloatへの...
-
プログラミング言語について
-
matplotlibでのLaTex表示
-
Google ColaboでGUI作成
-
HLMT、CSSについて相談です。 ...
-
近年誕生したプログラミング言語
-
長門有希のようにコンピュータ...
-
hostファイル
-
プログラマーに向いている人の...
-
Win11で作業を自動化したいです...
-
Pythonを使ってせん断応力図、...
-
・オブジェクト指向のメリット...
-
ホログラムを作ってくれる会社...
-
このURLで広告を出しているのは...
-
エディターで以下のような色に...
-
google Colabでmatplotlibの描...
-
プログラマーは誘惑にさらされ...
-
VBAでパワーシェルを実行したい...
-
特定の項目セルにスキャン(入...
おすすめ情報