電子書籍の厳選無料作品が豊富!

現在Accessで開発をしています
ライブラリはADOを使用しております

メインフォーム データ検索 帳票フォームに全データを出力
サブフォーム1  修正/削除  連結フォームにフィルタをかけて修正/削除を
サブフォーム2  追加 非連結フォームで追加処理を


データ件数が多いのと項目数が多いのでメインフォーム上では
修正/追加/削除はやらず サブフォーム(単票フォーム)を呼び出しそこでやる
ことにしています

本当はサブフォーム1だけで修正/削除/追加をしたいのですが
ADOだと非連結のフォームでは更新ができないとわかり
連結フォームで対応しました
DAOでやろうかとも考えましたが、ADOとDAOの共存はメンテナンス等を踏まえ
やめました。また、DAOは入りにくいのも理由です

ちなみにSQLサーバーは将来使用しません
あくまでAccess単体(MDB)のみの開発をすると想定して

みなさんは、以下の3つどのパターンで開発をしていますか?

1、ADOのみ
2、DAOのみ
3、ADOとDAO両方

また、理由もお聞きしたいです

よろしくお願いします

A 回答 (4件)

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!電話番号


微妙にちがうんですよね~

補足日時:2010/07/24 18:13
    • good
    • 0

方向はきまったようようなので以下は付け足し


程度ですが。

>しかし、非連結のフォームに対してレコードセットの更新は
>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
という方法もあります。こちらは速い。
    • good
    • 0

#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のコーディングの形を構築していきたいと思います
レスポンスありがとうございました(^^)/

補足日時:2010/07/25 02:54
    • good
    • 0

(1),(2),(3)のどれで開発するかと言われれば、


時と場合による、です。

(1)は横槍が入った場合と必要に迫られた場合。
(2)は縛りが無ければADOを使うメリットは無いから。
(3)は横槍が入った場合と必要に迫られた場合。

ADOは他の言語からmdbファイルにアクセスする場合は
使いますが、Access単独の場合は上記の感じです。
したがって、ユーティリティなども含めてほとんどDAOです。

(1),(2),(3)のどれで開発しますか、という問いも
変な感じですが、DAOがはいりにくいならばADOでも
いいでしょう。Accessは2000からはADOもサポート
しています、が、新しいバージョンになってもAccessの
ネイティブランゲージはDAOです、と言い切ってしまい
ましたが他意はありません。

>メインフォーム データ検索 帳票フォームに全データを出力
>・・・・・・・

ならば、私はだまってDAOです。

まあ、好きなほうで開発されればいいかと思います。
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
ADOのコーディングをDAOで現在書き換えています

しかし、非連結のフォームに対してレコードセットの更新は
DAOではできるが
ADOではできない 理由が私には理解できないんですよね~

本もADOが大半だし、、、

レスありがとうございます(^^)/

お礼日時:2010/07/24 18:19

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!