PDA

Vollständige Version anzeigen : Feld über qry_Feldliste hinzufügen


bbachmann
03.08.2001, 19:10
Hi
Ich habe gelesen, daß man mit folgender Anweisung über ein Kombifeld neu Daten in eine Tabelle einfügen kann.

Private Sub Kombifeld_NotInList(NewData As String, Response As Integer)
Dim strSQL As String
strSQL = "INSERT INTO Tabelle ([Feld]) SELECT ""& NewData &"";"
DoCmd.RunSQL strSQL
Response = acDataErrAdded

Mein Kombifeld ist eine Feldliste mit Feldern des gleichen Datentyps aus eine Tabelle. (scorfun weiß warscheinlich was ich meine)
Wenn ich dort einen Wert eingebe, der nicht in der Liste steht, müsste ein neues "Feld" in die Tabelle geschrieben werden, das die gleichen Eigenschaften hat wie die anderen.

Danke für Euer Bemühen
Burkhard

A.S.
03.08.2001, 19:36
Hallo Burkhard,

das Coding kommt mir so bekannt vor, als wäre es von mir ;) Muß aber nicht unbedingt sein...

Wie dem auch sei, mit diesem SQL-String fügst Du kein Feld an eine Tabelle an. Der Tabelle wird lediglich ein neuer Datensatz hinzugefügt.

Warum willst Du der Tabelle unbedingt zur Laufzeit neue Felder hinzufügen, bzw. welchen Zweck verfolgst Du? Evtl. finden wir ja eine bessere Lösung ;)

Gruß

Arno

bbachmann
03.08.2001, 20:48
Okay
Das Coding hab' ich von Dir abgeschrieben.
Ich habe in meiner DB ein Formular mit einem Kombifeld.
Das Kombifeld enthält die Felder [12/99] - [xx/xx] (für jeden Monat ein neues Feld), aus qry_Felder (Herkunft: tab_Top100), in die die Platzierungen als Zahl für jeden Monat eingetragen werden.
Im Kombifeld (Feldliste) wähle ich ein Feld aus und öffne über einen Button den dazugehörigen Bericht mit folgendem Ereignis.

...
Dim stDocName As String
Dim strstring As String
Dim strfeldVormonat As String
Dim q As QueryDef
Dim q1 As QueryDef, i As Integer

Set q1 = CurrentDb.QueryDefs("qry_Felder")
For i = 0 To q1.Fields.Count - 1
If q1.Fields(i).Name = Me.Feldliste Then
strfeldVormonat = q1.Fields(i - 1).Name
Exit For
End If
Next

stDocName = "rep_Top100"
'SQL-String zusammensetzen für die Abfrage
strstring = "SELECT [tab_GermanTop100].[Interpret], [tab_GermanTop100].[Titel], [tab_GermanTop100].[Länge], [" & Me![Feldliste] & "] AS Ausdr1,[" & strfeldVormonat & "] As Ausdr2 FROM tab_GermanTop100 WHERE (([" & Me![Feldliste] & "] <> Null));"

'Abfrage neu erstellen
Set q = CurrentDb.CreateQueryDef("qry_Top100", strstring)

DoCmd.OpenReport stDocName, acPreview
...

Für den nächsten Monat muß ich also ein neues Feld an die Tabelle anfügen.

Gruß Burkhard

Scorefun
03.08.2001, 23:08
Hi Burkhardt,

sicher kannst Du beim Ereignis "NotInList" ein neues Feld in der Tabelle anlegen lassen :

If MsgBox("Feld " & NewData & "neu hinzufügen?", 36, "NeuesFeld") = 6 Then
Dim db As Database
Dim t As TableDef
Set db = CurrentDb
Set t = db.TableDefs("tab_GermanTop100")
With t
.Fields.Append .CreateField(NewData$, dbLong)
End With
End If

Allerdings habe ich keine Möglichkeit gefunden, dann einen entsprechenden Response-Parameter zu übergeben, der das Kombi-Feld aktualisiert.
Zumal es sich bei der Feldliste ja um eine Abfrage handelt (qry_Felder), der man dieses neue Feld ja auch erstmal hinzufügen muesste...)


Vielleicht solltest Du Dir mal gedanken über Dein tabellendesign machen.

Wäre es nicht sinnvoller, eine separate Tabelle zu generieren
z.B. "Tab_Plazierungen"
mit den Feldern:

Lied-Nr (Verknüpfung zur Tabelle Top100)
Monat (Datum, Zeit im Format jjjj.mm)
Plazierung (Zahl)

Damit könntest DUu das Ganze bestimmt handlicher verwalten.

bbachmann
03.08.2001, 23:34
Hi Ralf

Du hast Recht, außerdem ist das frm_Start auch nicht das Formular, in dem ich das neue Feld eingeben sollte.
Es muß frm_German Top100 sein (hab' ich Dir das mit geschickt?), weil ich da auch die neuen Titel eingebe.(Ursprünglich hatte ich da für jeden Monat ein Textfeld =>unpraktich!!!)
Da müsste ich die Daten praktisch nach dem ausgewählten Eintrag im Kombifeld (Vormonat) filtern. (Formulardaten nach Kombifelauswahl sortiert, damit man schnell zum entsprechenden DS kommt)
Zusätzlich bräuchte ich dann noch ein (Textfeld?), wo die Neuplatzierung eingetragen wird.

Ich hab keine Ahnung, wie ich weitermachen soll.
Neue Tabelle, OK und dann??? Gübel

Gruß Burkhard

Scorefun
04.08.2001, 09:10
Hi Burkhardt,

es klappt theoretisch doch mit Deinem Kombifeld:

hier das komplette Coding:

Private Sub Feldliste_NotInList(NewData As String, Response As Integer)
If MsgBox("Feld " & newData & " neu hinzufügen?", 36, "NeuesFeld") = 6 Then
'Tabellenfeld an Tabellenstruktur anfügen
Dim db As Database
Dim t As TableDef
Dim f As Field
Set db = CurrentDb
Set t = db.TableDefs("tab_GermanTop100")
With t
.Fields.Append .CreateField(NewData$, dbLong)
End With
'Tabellenfeld der Feldliste hinzufügen
Dim qstring As String, qneu As QueryDef
'SQL String der Feldliste
qstring = CurrentDb.QueryDefs("qry_felder").SQL
'mit neuem Feld ergänzen
qrystring = Left(qstring, Len(qstring) - 24) & ",[" & NewData$ & "] FROM tab_GermanTop100;"
'alte Abfrage löschen
DoCmd.DeleteObject acQuery, "qry_Felder"
'Neue Abfrage speichern
Set qneu = db.CreateQueryDef("qry_felder", qrystring)
'Kombifeld aktualisieren
Response = DATA_ERRADDED
Else
Response = DATA_ERRCONTINUE
End If

Trotzdem würde ich eine neue Tabelle machen.
In Deinem Formular frmGermanTop100 kommen die ganzen Textfelder mit den Monaten raus, Du machst ein Unterformular (Endlos) auf Basis der neuen Tabelle und verknüpfst das Ganze mit dem Feld Lied-Nr und kannst dann
beliebig viele Plazierungen untereinander eingeben ohne neue Monats-Felder generieren zu müssen.
Deine bestehenden Daten müssten allerdings zunächst mittels Anfügeabfragen in die neue Tabelle übertragen werden.
Dürfte aber auch das kleinste Problem sein.

Bis demnächst

A.S.
04.08.2001, 09:27
Hallo Burkhardt,

ja, es ist machbar einer Tabelle zur Laufzeit neue Felder hinzuzufügen, das bringt aber Probleme in der Formulargestaltung etc. mit sich.

Ich möchte Dir empfehlen anstelle dessen zwei Tabellen zu benutzen:

In der einen führst Du die Einträge für Dein Kombinationsfeld - Du kannst diese Tabelle auch über das Kombinationsfeld pflegen (siehe mein Beispiel zur Kontakte-Pflege im Downloadbereich) - und in der anderen Tabelle stellst Du a) die Verknüpfung zu der Eintragstabelle her und stellst die weiteren benötigten Werte (zum einen den zu erfassenden Wert zum anderen etwaigen benötigte Bezüge auf andere Tabellen wie zum Beispiel den Kundenstamm) daneben. Somit muß zur Laufzeit die Definition der Tabellen nicht noch verändert werden.


Gruß

Arno

bbachmann
04.08.2001, 13:26
Ich danke Euch beiden
'werd mir mal ein bischen Mühe geben, wird schon klappen.

Burkhard