Discussion:
Tabellenspalte einfügen via SQL
(zu alt für eine Antwort)
Maik Rudolph
2007-01-31 15:02:00 UTC
Permalink
Hallo NG,

ich habe ein Problem und weis nicht wie ich es lösen soll,
uns zwar ist es nötig per VBA in eine vorhandene Tabelle eine SPalte
einzufügen, ohne das die Tabelle zuvor gelöscht wird.

wenn ich SELECT ... INTO ... verwende dann löscht er mir blöderweise immer
die vorhandenen Daten.
konkret: die tabelle "tbl_nenndaten" soll um ein memofeld "info" erweitert
werden.

Diese Tabelle befindet sich im Backend, mit dem das Frontend korrekt
verbunden ist. Verwendet wird Access XP (2002 - SP3)

Kann mit da mal jemand einen Denkanstoss geben ?!?
Oder muss ich erst die vorhandene Tabelle kopieren und dann die Spalte neu
einfügen und dann zurückkopierne? (wäre aber ziemlich umständlich oder?)

mfg Maik
Elisabeth Reuter
2007-01-31 15:19:47 UTC
Permalink
Post by Maik Rudolph
Hallo NG,
ich habe ein Problem und weis nicht wie ich es lösen soll,
uns zwar ist es nötig per VBA in eine vorhandene Tabelle eine SPalte
einzufügen, ohne das die Tabelle zuvor gelöscht wird.
wenn ich SELECT ... INTO ... verwende dann löscht er mir blöderweise immer
die vorhandenen Daten.
konkret: die tabelle "tbl_nenndaten" soll um ein memofeld "info" erweitert
werden.
Diese Tabelle befindet sich im Backend, mit dem das Frontend korrekt
verbunden ist. Verwendet wird Access XP (2002 - SP3)
Ich würde es ungefähr so machen

dim db as database
Dim Tabellexy As TableDef

set db= currentdb ' oder öffne die Backenddatenbank - opendatabase(...)
Set Tabellexy = db.TableDefs!Tabellexy
Tabellexy.Fields.Append Tabellexy.CreateField("Memofeld", dbMemo)

Beste Grüße

Elisabeth
Henry Habermacher [MVP Access]
2007-01-31 15:34:18 UTC
Permalink
Hallo Maik
Post by Maik Rudolph
wenn ich SELECT ... INTO ... verwende dann löscht er mir blöderweise
immer die vorhandenen Daten.
konkret: die tabelle "tbl_nenndaten" soll um ein memofeld "info"
erweitert werden.
Diese Tabelle befindet sich im Backend, mit dem das Frontend korrekt
verbunden ist. Verwendet wird Access XP (2002 - SP3)
Damit Du das machen kannst, musst Du zuerst die Backend öffnen, z.B. über
OpenDatabase
Dort kannst Du dann über Execute ein SQL Statement abschicken. Für die
Strukturdefinitionen ist die DDL (Data Definition Language) zuständig. Der
Befehl würde etwa so aussehen:

ALTER TABLE DeineTabelle ADD COLUMN MemoFeld MEMO

Beim Datentypen bin ich nicht ganz sicher, evt. heisst dier anders. Das
kannst Du aber in der OH nachschauen.

Gruss
Henry
--
Keine E-Mails auf Postings in NGs senden!
KB: http://support.microsoft.com/default.aspx
FAQ: http://www.donkarl.com (neu mit Suchfunktion!)
OH: Online Hilfe von Microsoft Access (Taste F1)
Downloads: http://www.dbdev.org
Maik Rudolph
2007-01-31 16:41:12 UTC
Permalink
Hallo Henry
Post by Henry Habermacher [MVP Access]
Hallo Maik
Post by Maik Rudolph
wenn ich SELECT ... INTO ... verwende dann löscht er mir blöderweise
immer die vorhandenen Daten.
konkret: die tabelle "tbl_nenndaten" soll um ein memofeld "info"
erweitert werden.
Diese Tabelle befindet sich im Backend, mit dem das Frontend korrekt
verbunden ist. Verwendet wird Access XP (2002 - SP3)
Damit Du das machen kannst, musst Du zuerst die Backend öffnen, z.B. über
OpenDatabase
Dort kannst Du dann über Execute ein SQL Statement abschicken. Für die
Strukturdefinitionen ist die DDL (Data Definition Language) zuständig. Der
ALTER TABLE DeineTabelle ADD COLUMN MemoFeld MEMO
Beim Datentypen bin ich nicht ganz sicher, evt. heisst dier anders. Das
kannst Du aber in der OH nachschauen.
Habe mich mal dran versucht, erst mal mit einem Testfeld als Datentyp
"number" da weiß ich das es das gibt und wie es heisst.
Aber leider kam eine Fehlermeldung... "Laufzeitfehler 3611
Datendefinitionsanweisungen auf verknüpften Datenquellen können nicht
ausgeführt werden."
CODE:
Set db = DBEngine.Workspaces(0).OpenDatabase(BE_Pfad)
Dim tbl_Colum_insert As String
tbl_Colum_insert = _
" ALTER TABLE tbl_nenndaten ADD COLUMN anz_teilnahme number "
DoCmd.RunSQL tbl_Colum_insert

Also BE ist korrekt verbunden.
Noch eine Idee?

Gruss Maik
Jörg Ackermann
2007-01-31 17:03:43 UTC
Permalink
Hi,
Post by Maik Rudolph
Habe mich mal dran versucht, erst mal mit einem Testfeld als Datentyp
"number" da weiß ich das es das gibt und wie es heisst.
Aber leider kam eine Fehlermeldung... "Laufzeitfehler 3611
Datendefinitionsanweisungen auf verknüpften Datenquellen können nicht
ausgeführt werden."
Set db = DBEngine.Workspaces(0).OpenDatabase(BE_Pfad)
Dim tbl_Colum_insert As String
tbl_Colum_insert = _
" ALTER TABLE tbl_nenndaten ADD COLUMN anz_teilnahme number "
DoCmd.RunSQL tbl_Colum_insert
Also BE ist korrekt verbunden.
Noch eine Idee?
DoCmd.RunSQL wird immer in der aktuellen Datenbank
ausgeführt. Verwende db.execute.

Das synonym NUMBER steht für FLOAT (Double).
Willst Du das so?

Also:

Dim db as DAO.Database
Dim tbl_Colum_insert As String

Set db = DBEngine.Workspaces(0).OpenDatabase(BE_Pfad)
tbl_Colum_insert = _
"ALTER TABLE tbl_nenndaten ADD COLUMN anz_teilnahme number;"

db.execute tbl_Colum_insert, dbFailOnError

db.Close: Set db = Nothing



Gruß
Maik Rudolph
2007-02-01 01:07:48 UTC
Permalink
Hallo Jörg
Post by Jörg Ackermann
Post by Maik Rudolph
Habe mich mal dran versucht, erst mal mit einem Testfeld als Datentyp
"number" da weiß ich das es das gibt und wie es heisst.
Aber leider kam eine Fehlermeldung... "Laufzeitfehler 3611
Datendefinitionsanweisungen auf verknüpften Datenquellen können nicht
ausgeführt werden."
Set db = DBEngine.Workspaces(0).OpenDatabase(BE_Pfad)
Dim tbl_Colum_insert As String
tbl_Colum_insert = _
" ALTER TABLE tbl_nenndaten ADD COLUMN anz_teilnahme number "
DoCmd.RunSQL tbl_Colum_insert
Also BE ist korrekt verbunden.
Noch eine Idee?
DoCmd.RunSQL wird immer in der aktuellen Datenbank
ausgeführt. Verwende db.execute.
Das synonym NUMBER steht für FLOAT (Double).
Willst Du das so?
Dim db as DAO.Database
Dim tbl_Colum_insert As String
Set db = DBEngine.Workspaces(0).OpenDatabase(BE_Pfad)
tbl_Colum_insert = _
"ALTER TABLE tbl_nenndaten ADD COLUMN anz_teilnahme number;"
db.execute tbl_Colum_insert, dbFailOnError
db.Close: Set db = Nothing
OK verde es morgen mal veruchen (oder besser heute morgen) und nein ein
einfaches Integer oder Long hätte mir gereicht...
Da muss ich mal suchen was daszu der passende Datentyp im SQL ist. Mir fehlt
ja auch noch das "Memofeld" oder kann ich da ein Textfeld mit der Länge(max)
einsetzen?
Wo liegen da eigentlich die Únterschiede zw. Memo und String. Ausser in der
maximalen Länge.

mfg Maik

Loading...