August 05, 2020, 21:44:51

Neuigkeiten:

Wenn ihr euch für eine gute Antwort bedanken möchtet, im entsprechenden Posting einfach den Knopf "sag Danke" drücken!


Anzeigen und Modifizieren in einem Formular

Begonnen von OPS, Mai 06, 2010, 13:38:50

⏪ vorheriges - nächstes ⏩

OPS

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?

Hondo

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

OPS

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.

DF6GL

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.

OPS

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.

DF6GL

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

database

Mai 10, 2010, 10:18:37 #6 Letzte Bearbeitung: Mai 10, 2010, 10:20:54 von database
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

OPS

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!

database

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

OPS

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?