プロが教えるわが家の防犯対策術!

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

A 回答 (7件)

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

この回答への補足

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

補足日時:2008/11/10 17:15
    • good
    • 0
この回答へのお礼

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

お礼日時:2008/11/10 16:51

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



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

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

お礼日時:2008/11/13 16:42

「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

この回答への補足

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

補足日時:2008/11/11 14:11
    • good
    • 0

>追加したフィールドを表示すると「Nullの使い方が不正です。


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

この回答への補足

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

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

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

補足日時:2008/11/11 11:18
    • good
    • 0

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年以上前)からあるクセでオカシイとは思ってるんですが、
直りませんね。
あと、インデックスやプロパティも同様の感覚で作れます。
    • good
    • 0
この回答へのお礼

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

お礼日時:2008/11/10 17:05

ごめんなさい 1つプロパティが抜けてました


  tbldef.Fields.Append newFld
Fieldsが抜けておりました m(__)m
    • good
    • 0
この回答へのお礼

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

お礼日時:2008/11/10 16:58

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

この回答への補足

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

補足日時:2008/11/09 19:33
    • good
    • 0

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

このQ&Aを見た人はこんなQ&Aも見ています