アプリ版:「スタンプのみでお礼する」機能のリリースについて

希望の位置へフィールドを追加するには?
WinXP、Access2003を使っております。
テーブルに希望の位置へフィールドを新たに追加する為にはどうすれば良いでしょうか?

テーブル名:顧客データ
フィールド:
名称(メモ型)
住所(テキスト型)
担当営業(テキスト型)
取扱品目(メモ型)
備考(テキスト型)

1.メモ型をテキスト型へ変更するのが目的の為、
  既存の「名称」、「取扱品目」のフィールド名の最後に「2」を追記します。
2.名称と取扱品目のテキスト型のフィールドを新たに追加します。

Private Subコマンド1_Click()

Application.CurrentDb.TableDefs("顧客データ").Fileds("名称").Name="名称2"
Application.CurrentDb.TableDefs("顧客データ").Fileds("取扱品目").Name="取扱品目2"

Dim db As Database
Set db = CurrentDb
db.Execute "ALTER TABLE 顧客データ ADD COLUMN 名称 TEXT(255)"
db.Execute "ALTER TABLE 顧客データ ADD COLUMN 取扱品目 TEXT(255)"
db.close
Set db = Nothing
MsgBox "終了"
End Sub

上記だと新しいフィールドが最後(一番下)に出来てしまします…希望の形は

名称2(メモ型)
名称(テキスト型)
住所(テキスト型)
担当営業(テキスト型)
取扱品目2(メモ型)
取扱品目(テキスト型)
備考(テキスト型)

以上、ヒント等ご指南よろしくお願いいたします。

A 回答 (3件)

【つづき】



Private Function GetPositions(tdf As DAO.TableDef, sName As String) As String
  Const sColumnOrder As String = "ColumnOrder"
  On Error Resume Next
  GetPositions = sName
  GetPositions = GetPositions & " : " & tdf(sName).OrdinalPosition
  GetPositions = GetPositions & " : " & tdf(sName).Properties(sColumnOrder)
End Function

Private Sub Sample2()
  Dim db As DAO.Database
  Dim tdf As DAO.TableDef
  Dim sTmp As String

  Set db = CurrentDb
  Set tdf = db.TableDefs("顧客データ")

  sTmp = ""
  sTmp = sTmp & GetPositions(tdf, "名称2") & vbCrLf
  sTmp = sTmp & GetPositions(tdf, "名称") & vbCrLf
  sTmp = sTmp & GetPositions(tdf, "住所") & vbCrLf
  sTmp = sTmp & GetPositions(tdf, "担当営業") & vbCrLf
  sTmp = sTmp & GetPositions(tdf, "取扱品目2") & vbCrLf
  sTmp = sTmp & GetPositions(tdf, "取扱品目") & vbCrLf
  sTmp = sTmp & GetPositions(tdf, "備考") & vbCrLf

  Set tdf = Nothing
  Set db = Nothing
  MsgBox sTmp
End Sub

Private Sub Sample3()
  Dim db As DAO.Database
  Dim tdf As DAO.TableDef

  Set db = CurrentDb
  Set tdf = db.TableDefs("顧客データ")

  Call SetPosAndOrder(tdf, "名称2", 1)
  Call SetPosAndOrder(tdf, "名称", 2)
  Call SetPosAndOrder(tdf, "住所", 3)
  Call SetPosAndOrder(tdf, "担当営業", 4)
  Call SetPosAndOrder(tdf, "取扱品目2", 5)
  Call SetPosAndOrder(tdf, "取扱品目", 6)
  Call SetPosAndOrder(tdf, "備考", 7)

  Set tdf = Nothing
  Set db = Nothing
  MsgBox "終了"
End Sub



確認される時には、
Sample2 で設定内容を随時確認しながら、いろいろいじってみてください。
(テスト用の環境で)


2000文字って少ないですね。
(ご迷惑かと思いますが、3つにわかれてしまいました)
    • good
    • 0
この回答へのお礼

お礼が遅くなり、申し訳ありませんでした。
実際には50フィールド近く処理をしないといけなかったので…希望通りの処理が出来、大変助かりました!
あきらめかけていた所へズバリな回答、誠にありがとうございました!

お礼日時:2010/06/29 22:26

【つづき】


以下、標準モジュールへ記述------

Private Sub SetPosAndOrder(tdf As DAO.TableDef, sName As String, iPos As Integer)
  Const sColumnOrder As String = "ColumnOrder"

  On Error Resume Next
  tdf(sName).OrdinalPosition = iPos - 1

  tdf(sName).Properties(sColumnOrder) = 0
  If (Err <> 0) Then
    tdf(sName).Properties.Append _
      tdf(sName).CreateProperty(sColumnOrder, dbInteger, 0)
  End If
End Sub

Private Sub Sample1()
  Dim db As DAO.Database
  Dim tdf As DAO.TableDef

  Set db = CurrentDb
  Set tdf = db.TableDefs("顧客データ")
  tdf("名称").Name = "名称2"
  tdf("取扱品目").Name = "取扱品目2"
  tdf.Fields.Append tdf.CreateField("名称", dbText, 255)
  tdf.Fields.Append tdf.CreateField("取扱品目", dbText, 255)
' ★
  tdf.Fields.Refresh
  Set tdf = Nothing
  db.TableDefs.Refresh
  Set tdf = db.TableDefs("顧客データ")

  Call SetPosAndOrder(tdf, "名称2", 1)
  Call SetPosAndOrder(tdf, "名称", 2)
  Call SetPosAndOrder(tdf, "住所", 3)
  Call SetPosAndOrder(tdf, "担当営業", 4)
  Call SetPosAndOrder(tdf, "取扱品目2", 5)
  Call SetPosAndOrder(tdf, "取扱品目", 6)
  Call SetPosAndOrder(tdf, "備考", 7)

  Set tdf = Nothing
  Set db = Nothing
  MsgBox "終了"
End Sub

【つづく】
    • good
    • 0

解決されていましたでしょうか。


不要ならスルーしてください。


テーブルを直に開いた時の表示順とかになるのでしょうか。
興味もあったので実機で確認してみましたが、正解なのかは???です。

データシートでの表示順は
1)OrdinalPosition で
2)表示した状態で移動等した場合は、ColumnOrder
が、使われているようです。

テーブルのデザインビューで順を変更した時には、
ColumnOrder は 0 となり、OrdinalPosition で順を決めているようです。

データシート表示で列(項目)順を変更した時には、
OrdinalPosition はそのままで、ColumnOrder で順を決めているようです。

なので、項目の追加時には、ColumnOrder を 0 にして
OrdinalPosition を設定すればよいように思います。

以下を標準モジュールに記述し、
Sample1 内をクリック後「F5」で名変更/追加するものとなります。
Sample2 内をクリック後「F5」で OrdinalPosition / ColumnOrder を表示します。
Sample3 内をクリック後「F5」で再設定(初期化)するものになります。

2007の場合は、★以下4行は不要でしたが、
2003では名前を変更したフィールド2つへ設定ができていませんでした。
タイミングをずらす(?)意味で tdf を再取得してみました。

なお、
  db.Execute "ALTER TABLE 顧客データ ADD COLUMN 名称 TEXT(255)"

  tdf.Fields.Append tdf.CreateField("名称", dbText, 255)
に変更していますが、デフォルトで作成されるプロパティが同じなのかは
確認してません。(プロパティ数は同じみたいですが・・・)

また、クエリ等で SELECT * とした時の順は、

OrdinalPosition が使われるようなことがヘルプに書いてあった様な・・・

【つづく】
    • good
    • 0

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

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


このQ&Aを見た人がよく見るQ&A