こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

ACCESSデータベースにVB6(DAO)でフィールドを追加したい

既存のACCESSデータベースのテーブルにVB6のDAOでフィールドを追加したいのですが、テーブル名.Fields.Append とかいうメソッドがあるようですが、使用方法がわからずフィールドを追加が出来ません。
具体的には、フィールド名"電話番号"で、文字型で固定文字数13を追加したいのです。
どうぞよろしくお願いします。

投稿日時 - 2008-11-09 11:59:18

QNo.4464815

困ってます

質問者が選んだベストアンサー

VB6.0からDA0を使用して、既存のAccessのテーブルへのフィールド追加、という事でしたら以下のコードで出来ました。

Sub Main()
Dim dbs As DAO.Database
Dim s_sql As String

Set dbs = OpenDatabase("C:\test.mdb")
s_sql = "ALTER TABLE テーブル名 ADD COLUMN フィールド1 TEXT(10)"
dbs.Execute s_sql
Set dbs = Nothing

End Sub

投稿日時 - 2008-11-10 11:22:33

補足

追加したフィールドを表示すると「Nullの使い方が不正です。」と出ます。 表示でエラー処理をするといいのですが、SQL記述で""をセット出来ないのでしょうか?

投稿日時 - 2008-11-10 17:15:41

お礼

ありがとうございました。
短いコードで出来よろこんでいます。
色んな方法があるのですね。 とても勉強になりました。

投稿日時 - 2008-11-10 16:51:41

このQ&Aは役に立ちましたか?

1人が「このQ&Aが役に立った」と投票しています

回答(7)

ANo.7

>tbl.Fields("電話番号").???????? = "" とかで""をセットするフィールドプロパティはないのでしょうか?

ないです。
プロパティというのは属性、初期値、規約などの性格を決めるだけで、
現存するレコードの、あるいは追加されたフィールドの値を設定/更新
するものではありません。
つまり、「プロパティを設定/変更する」と、「値を設定/変更する」は
全く違う行為です。プロパティを変更しただけで、値まで変わって
しまうようなシステムでは危なくて誰も使えないでしょう。

投稿日時 - 2008-11-13 09:04:00

お礼

回答ありがとうございました。
初期値としてNULLでなく""をセット出来ないかと思って書いたのですがNULLしかセット出来ないのですね。

投稿日時 - 2008-11-13 16:42:32

ANo.6

「Nullの使い方が不正です」が表示される状況が
こちらでは掴めないので、すみませんが推測になります。
新しく追加したフィールドの「値要求」と「空文字列の許可」の設が関係しているような気がします。

まだ解決されてない様でしたら、
テーブルの上記のフィールドプロパティを直接直しみて、
現象が改善されるか確認してみて頂けますか?
改善されるようでしたら、
下記のコードの様に、
フィールド追加時に「値要求」は「いいえ」、
「空文字列の許可」は「はい」の設定を
プラスしてやればOKだと思います。
(コード自体の動作確認はしてあります。)

Sub フィールド追加テスト2()

Dim dbs As DAO.Database
Dim tbl As DAO.TableDef
Dim s_sql As String

Set dbs = OpenDatabase("C:\test.mdb")
'フィールドの追加
s_sql = "ALTER TABLE テーブル名 ADD COLUMN フィールド2 TEXT(10)"
dbs.Execute s_sql

'フィールドプロパティの設定
Set tbl = dbs.TableDefs("テーブル名")
tbl.Fields("フィールド2").Required = False '値要求
tbl.Fields("フィールド2").AllowZeroLength = True '空文字列の許可

Set tbl = Nothing
dbs.Close
Set dbs = Nothing

End Sub

投稿日時 - 2008-11-11 10:35:31

補足

テーブルの上記のフィールドプロパティを直接直してみて、nda23 さんから教わったCurrentDb.Execute "UPDATE Youken SET 電話番号=''" をやるとエラーはでなくなりましたので、フィールドプロパティの設定をするプログラム追加しその後、
CurrentDb.Execute "UPDATE Youken SET 電話番号=''" をやると全てプログラムから出来る様になりました。
CurrentDb.Execute "UPDATE Youken SET 電話番号=''" じゃなく
tbl.Fields("電話番号").???????? = "" とかで""をセットするフィールドプロパティはないのでしょうか?

投稿日時 - 2008-11-11 14:11:04

ANo.5

>追加したフィールドを表示すると「Nullの使い方が不正です。」
どういう表示のしかたをしたのでしょう?データシートビューなら
開けるはずです。
追加したフィールドの最初の設定値はNullです。空文字列にしたい
場合はフィールド追加後に「UPDATE テーブル SET 新フィール=""」を
実行しなければなりません。
cf.
CurrentDb.Execute "UPDATE テーブル SET 新フィールド=''"

投稿日時 - 2008-11-10 19:29:29

補足

アドバイスありがとうございます。

>どういう表示のしかたをしたのでしょう?
フォームのテキストボックスに表示しようとしただけです。

CurrentDb.Execute "UPDATE Youken SET 電話番号=''" を追加してみましたがダメでした。
ACCESS で直接テーブルのデザインを見てみたら、空文字列の許可項目が’いいえ’になっていますが関係あるのでしょうか?

投稿日時 - 2008-11-11 11:18:13

ANo.4

Dim S As DAO.TableDefs
Dim T As DAO.TableDef
Dim F As DAO.Field

Set S = CurrentDb.TableDefs
Set T = S("Table") '★実際のテーブル名に合わせてください
Set F = T.CreateField("NewName", dbText, 50) '★
T.Fields.Append F

CreateField(DAO)のヘルプを参照してみてください。

基本的に複数形で表現してあるものはコレクション(集団)で
単数形のものはオブジェクトです。
(1)テーブル定義コレクションを記録する
(2)コレクションから名前を指定してテーブル定義オブジェクトを取得する。
(3)フィールドを作成する。テーブル定義オブジェクトのメソッドだが
  できたフィールドオブジェクトとは関連付かない。
(4)テーブルの中のフィールド・コレクションに上記を追加(Append)する。

尚、Set S = CurrentDb.TableDefs を省略して
Set T = CurrentDb.TableDefs("Table") とやると失敗します。
これは昔(10年以上前)からあるクセでオカシイとは思ってるんですが、
直りませんね。
あと、インデックスやプロパティも同様の感覚で作れます。

投稿日時 - 2008-11-10 14:05:12

お礼

回答ありがとうございます。
いくつかの回答を見てわかって来た気がします。 まだ完全じゃありませんが.....
追加したフィールドを表示すると「Nullの使い方が不正です。」と出ます。 表示でエラー処理をするといいのですが、追加(Append)するとき""をセット出来ないのでしょうか?

投稿日時 - 2008-11-10 17:05:40

ANo.3

ごめんなさい 1つプロパティが抜けてました
  tbldef.Fields.Append newFld
Fieldsが抜けておりました m(__)m

投稿日時 - 2008-11-10 13:58:17

お礼

出来ました。 ありがとうございました。
私に応用力があれば気づくんだったんでしょうけどすみません。
もっと勉強したいと思います。 また何かありましたらよろしくお願いいたします。

投稿日時 - 2008-11-10 16:58:47

ANo.1

DAOでやるなら そのテーブルのTableDefオブジェクトを取得して
CreateFieldでFieldオブジェクトを生成
Appendメソッドで追加
といった手順です

' MDBファイルを objDB(DAO.Database型)に取得してあると仮定
Dim objTBLDef as TableDef
Dim objFld as Field

Set objTblDef = objDB.TableDefs("テーブル名")
on error resume next
' 列:電話番号があるかをチェック
set objFiel = objTBLDef.Fields("電話番号")
On error goto 0
if objFld Is Nothing then
  ' 新規に 列:電話番号を作成
  Set objFld = objTBLDef.CreateField("電話番号", dbText, 13 )
  ' テーブルに 電話番号を追加
  objTBLdef.Append objFld
End if
set objFlg = nothing
Set objTBLdef = nothing

投稿日時 - 2008-11-09 13:22:03

補足

早速のご回答ありがとうございます。
いろいろやってみましたが解決しません。
'MDBファイルを objDB(DAO.Database型)に取得してあると仮定
とありますが、MDBファイルをopen するといいのでしょうか?
Set objDB = Workspaces(0).OpenDatabase(App.path "\Data\master.mdb")
を付け加えてしてやっていましたが、objTBLdef.Append objFld の所で、「メソッドまたはデータメンバが見つかりません。」とコンパイルエラーが出てしまいます。
宜しくお願いいたします。

投稿日時 - 2008-11-09 19:33:59

あなたにオススメの質問