Hallo
Folgendes Problem:
Meine Tabelle hat mehrere Werte, 3 dieser Werte, 2 davon stammen aus anderen Tabellen, identifizieren das Objekt eindeutig.
Das Objekt hat auch eine ID.
Für den Anwender ist diese ID aber später weder interessant noch kann er sie ansehen.
Ich möchte nun in ein Formular ein bestimmtes Objekt eingeben.
Gebe ich nun einen neuen Wert ein, so soll er als neues Objekt eingespeichert werden, gebe ich ein schon bestehendes Objekt ein, so wird dieses Objekt angezeigt.
Beispiel:
tbl_Objekt
ID
X
FK_Y (stammt aus anderer Tabelle)
FK_Z (stammt aus anderer Tabelle)
(Andere Felder)
Formular:
X:1
Y:5
Z:6
ID (nicht sichtbar): 15 (Objekt existiert noch nicht- ID neu vergeben)
(Eingabemöglichkeiten anderer Eigenschaften dieses Objekts)
X:1
Y:2
Z:3
ID (nicht sichtbar): 3 (Objekt existierte schon, Sprung zu ID)
(Anzeige anderer Eigenschaften dieses Objekts)
Wie mache ich das?
Hallo,
dein Satz "Meine Tabelle..." macht keinen Sinn, imo fehlt da 1-2 Wörter.
Erstelle dein Formular ungebunden, und füge z.B. einen Speichern-Button ein (oder speichere im Ereignis Beim Anzeigen).
Prüfe z.B. mit Dlookup() ob ein bestimmtes Objekt schon gespeichert wurde, falls ja mach z.B per MsgBox eine Ausgabe, falls nein speichere den Datensatz per Einfügeabfrage.
z.B. so:
Dim db AS Database
set db = Currentdb
db.Execute "Insert into Tabelle (Feld1, Feld2....) Values (" & Me!Feld1 & ", " & Me!Feld2...... & ")"
Gruß Andreas
Hallo
Schon Mal danke.
Dass das schon existierende Objekt ausgewählt wird, geht nicht?
Also ich könnte ja sagen:
"Okay ich wähle nach ID aus. Hier ist ID 1 mit den koordinanten 1,2,3- dazu nun der gespeicherte Wert A.
ID 2 hat die koordinaten 4,5,6 mit dem gespeicherten Wert Z."
->Das möchte ich nicht, weil der User keine IDs sehen soll.
Mit dem Dlookup-Befehl würde es jetzt so laufen (wenn ich das richtig verstanden habe):
"Ich gebe 1,2,3 ein, Dlookup checkt ob diese Kombination schon gespeichert ist: Nein? Speichern.
Ich gebe 4,5,6 ein, Dlookup checkt ob diese Kombination schon gespeichert ist: Ja? Ausgabe: gespeicherter Wert."
Was ich möchte:
"Ich gebe 1,2,3 ein, ist diese Kombination schon gespeichert ist: Nein? Speichern.
Ich gebe 4,5,6 ein, ist diese Kombination schon gespeichert ist: Ja? Gehe zur ID (unsichtbar) und zeige den zugehörigen Wert an (sichtbar)."
Was ich auch noch überlegt habe, ist getrennte Eingabemasken für bloße Eingabe und Aufruf zu machen. Aber auch da bleibt das Problem, dass ich meine Koordinaten eingebe, und er automatisch zur zueghörigen ID springt.
---
Der Satz war etwas umständlich formuliert
Meine Tabelle hat mehrere Werte, 3 dieser Werte, 2 davon stammen aus anderen Tabellen, identifizieren das Objekt eindeutig.
Meine Tabelle hat mehrere Werte. Drei dieser Werte identifizieren das Objekkt eindeutig. Zwei dieser Drei Werte stammen aus anderen Tabellen.
Hallo,
doch, geht schon,Hondo hat's doch gesagt..
Zitat
Prüfe z.B. mit Dlookup() ob ein bestimmtes Objekt schon gespeichert wurde, falls ja mach z.B per MsgBox eine Ausgabe, falls nein speichere den Datensatz per Einfügeabfrage.
Statt der Msgbox kannst Du auch ein gebundenes Form öffnen und den vorhandenen Datensatz anzeigen.
Ich habe daran jetzt eine Weile rumprobiert und mangels VBA-Erfahrung nicht viel hinbekommen. Ich denke dass ich es irgendwann schaffe, aber ich habe das Gefühl hier stundenlang an etwas zu arbeiten, das ein Profi in einer Minute fertig kriegt.
Kriege ich also bitte den richtigen Code für einen Aufruf?
tbl_CO
ID_CO
FK_X
FK_Y
FK_Z
Info
tbl_X (tbl_Y, tbl_Z entsprechend)
ID_X
X
Ich möchte nun in einem Formular durch Eingabe von X Y und Z eindeutig einen Datensatz hervorbringen (laden) oder modifizieren (speichern), indem ich auf einen entsprechenden Knopf klicke oder die Auswahl automatisch bei der Eingabe erfolgt.
Was ich übrigens bisher hervorgezaubert habe ist eher schwach, und obwohl ich darüber nachdachte es zu posten ist es dafür dann doch ZU schwach.
Hallo,
es gibt nicht allein nur DEN Code....
Dazu muß eine ganze (Formular-) Konstruktion her..
Erstell ein (gebundenes) Form auf Basis der Tabelle tbl_CO. Die Werte für FK_X, FK_Y, FK_Z werden mittels passend eingestellten gebundenen Kombis angezeigt.
Im Formularkopf baust Du 3 ungebundene Kombifelder und einen Button ("btnSuchen")mit folgenden Einstellungen ein:
Name: cmbX
Datensatzherkunft: Select ID_X, X from tbl_X order by X
Spaltenanzahl: 2
Spaltenbreiten: 0cm;4cm
gebundene Spalte: 1
Die beiden anderen Kombis entsprechend der Tabellen- und Feldnamen anpassen.
Ereignisprozedur für das "Click"- Ereignis des Buttons:
Sub btnSuchen_Click
Me.Filter = "FK_X = " & Me!cmbX & " and FK_Y = " & Me!cmbY & " and FK_Z = " & Me!cmbZ
Me.FilterOn=true
End Sub
Um einen neuen DS zu erstellen, bau eine weitere Schaltfläche ("btnNeu") im Form-Kopf ein mit diesem Code:
(Könnte auch anstelle des Buttons mit der Navileiste erledigt werden, oder den entspr. Navi-Tasten)
Sub btnNeu_Click()
Docmd.Gotorecord,,acNewrec
End Sub
Extra Buttons für das Speichern von neuen oder geänderten Daten ist im Grunde nicht nötig.
Wenn gewünscht, dann halt so:
Sub btnSpeichern_Click()
Docmd.Runcommand accmdSaverecord
End Sub
Hallo auch,
entsprechend der Aussage von ...
Zitat von: DF6GL am Mai 10, 2010, 09:53:20
Hallo,
es gibt nicht allein nur DEN Code....
...versuch ich mal meine 'Weisheit' an den Mann zu bringen :)
In der Annahme, dass dein Formular zur Eingabe von Daten dient,
befinden sich auf diesem Formular 3 Kombifelder und ein Textfeld
Kombifelder cboX, cboY und cboZ, sowie Textfeld txtInfo.
Du wählst aus allen 3 Comboboxen Werte aus und beim Ereignis 'Nach Aktualisierung' des 3. Kombis (cboZ) läuft folgender (beispielhafter) Code ab:
Dim lngID as Long
lngID = NZ( DLookup("ID_CO","tbl_CO","FK_X=" & me.cboX & " AND FK_Y=" & Me!cboY & " AND FK_Z=" & Me!cboZ),0)
If lngID > 0 then
Me! txtInfo = DLookup("Info","tbl_CO","ID_CO=" & lngID)
Else
MsgBox "Eine neue Kombination wurde entdeckt!", vbInformation, "Kombinationen"
Me!txtInfo.SetFocus
End If
Dieses bewirkt, dass der Cursor auf das Infofeld gesetzt wird, wenn die Datenkombination noch nicht vorhanden ist. Andernfalls wird das txtInfo mit dem Wert aus der tbl_CO befüllt.
Das Ereignis 'Nach Aktualisieren' des txtInfo KANNST du dann noch mit folgendem Code beleben:
Dim lngID as Long
Dim db AS Database
Set db = Currentdb
lngID = NZ( DLookup("ID_CO","tbl_CO","FK_X=" & me.cboX & " AND FK_Y=" & Me!cboY & " AND FK_Z=" & Me!cboZ),0)
If Not IsNull(Me!txtInfo) then
if lngID = 0 then
db.Execute "Insert into tbl_CO (FK_X, FK_Y, FK_Z, Info) Values (" & Me!cboX & ", "
& Me!cboY & "," & Me!cboZ & ",'" & Me!txtInfo & "')"
Else
db.Execute "UPDATE tbl_CO Set Info='" & me.txtInfo & "' WHERE ID_CO=" & lngID
End If
End If
Dies bewirkt, dass im Falle einer neuen Kombination der Datensatz gespeichert wird oder beim Vorhandensein der Kombination eine eventuelle Änderung der Info aktualisiert wird.
Alles unter der Voraussetzung, dass deine Kombifelder mit ID als gebundene Spalte und Text als Anzeigewert auf einem ungebundene Formular aufgebaut wurden.
LG
Peter
Oah vielen Dank! Habe eben DF6GLs Lösung ausprobiert, und ich bin froh dass das endlich mal funktioniert aber ich werde auch Databases Lösung ausprobieren und sehen was für mich besser funktioniert.
Da sitze ich da den ganzen Freitag dran und krieg das hier in wenigen Worten mitgeteilt ;D
Danke!
Hi,
solltest du Zeit Lust und Laune verspüren meine Vorschläge zu testen dann bitte
ZitatDas Ereignis 'Nach Aktualisieren' des txtInfo
noch mit der folgenden Zeile abschließend ergänzen
Set db = Nothing
::) ;D
LG
Peter
Ich habe da eine Frage.
lngID = NZ( DLookup("ID_CO","tbl_CO","FK_X=" & me.cboX & " AND FK_Y=" & Me!cboY & " AND FK_Z=" & Me!cboZ),0)
Die hinteren beiden Me!cbo schreibst du mit ! (ausrufezeichen), den ersten aber me.cboX (mit Punkt).
Es funktioniert, aber warum?
Hallo,
vermutlich nur vertippt...und hier keine weitere Bedeutung hat.
www.donkarl.com/?FAQ6.3