Neuigkeiten:

Ist euer Problem gelöst, dann bitte den Knopf "Thema gelöst" drücken!

Mobiles Hauptmenü

SQL Update / Insert

Begonnen von dmaccs, Juni 24, 2012, 16:10:42

⏪ vorheriges - nächstes ⏩

dmaccs

Hallo,

ich habe zwei Tabellen. Diese sollen mit einer Nummer, die in beiden Tabellen drin stehen wird, verknüpft sein. In einem Formular habe ich eine Dropdownliste aus der Tabelle1. Die weiteren Textfelder sollen alle aus der Tabelle2 kommen. In dieser Tabelle2 sind jedoch nur dann Werte enthalten, wenn das Formular erstmalig gespeichert wurde.

Ich stehe momentan vor dem Problem, wie ich dieses Abfrage mittels SQL schreiben muss. Ich kann den "einfachen" INSERT Befehl für das erzeugen eines neuen Eintrags verwenden. Doch sobald einmal der Eintrag vorhanden ist, dann soll es nur noch mit dem UPDATE Befehl aktualisiert werden. Könnte jemand mir helfen, wie dies zu bewerkstelligen ist?

Danke schon im Voraus!

Gruß
dmaccs

DF6GL

Hallo,

mysteriös, was Du da anstellen willst...
Wie auch immer, in EINER SQL können beide Sachen nicht zusammen erledigt werden.

Du kannst z. B. mit der Dcount-Funktion auf die Existenz eines (bestimmten) DS prüfen und im Fall von Vorhandensein eine Update-Abfrage , ansonsten eine Insert-Abfrage absetzen...

Vermutlich ließe sich der (nebulöse) Vorgang besser mit einer Haupt-Unterformular-Konstruktion behandeln.


dmaccs

Hallo,

danke schon mal für den Tipp.

Versuche den Vorgang etwas genauer zu beschreiben:

Ich habe eine Tabelle die mir zur Verfügung gestellt wird mit einer Artikelnr. Diese Tabelle enthält auch noch weitere Spalten, die ich nicht verwende. In dieser Tabelle darf ich nicht schreiben.
Deswegen habe ich ein Formular und eine zweite Tabelle. In dem Formular ist eine DropDownListe mit eben jenen Artikelnr. aus der Tabelle1. Im Formular habe ich dann bsp. Textfelder wie, Kurzbeschreibung, Ersteller und Links für 3 Bilder. Diese Informationen sollen in der Tabelle2 gespeichert werden, aber NUR für die Artikelnr. die auch bearbeitet werden. D.h. in Tabelle2 ist nur eine Teilmenge der Artikelnr. von Tabelle1. Nun ist am Anfang Tabelle2 komplett leer, so dass ich beim ersten Mal ein INSERT Befehl aufrufen kann. Ab dem zweiten Mal kann nun die gewählte Artikelnr. bereits vorhanden sein oder eben noch nicht, und genau dort fehlt mir der Befehl, wie diese zu bewerkstelligen ist.

Ich hoffe, dass es so verständlicher ist.

Gruß

MzKlMu

Hallo,
nach meiner Auffassung ist das ein Fall für eine 1:1 Beziehung. Erstelle die Tabelle 2 mit den gewünschten Feldern. Mit einem Feld Artikelnummer (gleicher Datentyp wie in Tabelle1).
Dann stellst Du über die Arzikelnummer eine Beziehung her.
Erstelle dann ein Hauptformular zur Anzeige der Daten der Tabelle1 und darin ein Unterformular für Tabelle2. Über die Schlüsselfelder werden Hafo und Ufo verknüpft.

Wenn Daten in Tabelle2 vorhanden sind werden diese angezeigt, wenn nicht, kannst Du direkt Daten in der Tabelle 2 erfassen. Die Artikelnummer wird dabei automatisch an Tabelle2 übertragen. Dann brauchst Du keine einzigen Buchstaben Code, geht alles automatisch.
Gruß Klaus

dmaccs

Hallo,

das hört sich gut an. Dann werde ich diesen Weg einschlagen und schauen, dass alles funktioniert.

Gruß

dmaccs

Hallo nochmal,

nun habe ich es versucht mit den Formularen, jedoch komme ich noch mit der Einrichtung der Abfragen nicht ganz klar, was wem wie wo übergibt. Ich habe nun ein Hauptformular, welches das Dropdown enthält. Zudem ist nun ein Unterformular eingerichtet, dass die anderen Felder besitzt. Die Verknüpfung zwischen dem Unterformular und dem Hauptformular läuft über die Artikelnummer. Braucht es nun im Unterformular auch ein Textfeld mit der Artikelnummer oder nicht mehr? Und wie verknüpfe ich dann die restlichen Textfelder? Sorry für die vielen Rückfragen, aber mit Formularen hatte ich bis jetzt noch nicht so in Access, die nicht per SQL aufgebaut wurden.

Gruß

MzKlMu

Hallo,
wie hast Du die Verknüpfung zwischen Hafo und Ufo gemacht?
Im Ufo brauchst es die Artikelnummer nicht (als feld) aber die Artikelnummer muss in der Datenherkunft vorhanden sein.
Die restlichen Textfelder müssen nicht verknüpft werden, die Artikelnummr reicht.
Zitat, aber mit Formularen hatte ich bis jetzt noch nicht so in Access, die nicht per SQL aufgebaut wurden.
Mit SQL kann man doch keine Formulare aufbauen, nur die Datenherkunft ist SQL.
Gruß Klaus

dmaccs

Hallo,

also bei mir sieht die Verknüpfung wie folgt aus:

Ich habe in Hafo das Formlar Ufo eingebunden. Dazu habe ich unter Ufo Daten folgendes eingestellt:

Herkunft: Ufo
Verkn. von: Artikelnr. (von Hafo)
Verkn. nach: Artikelnr. (von Ufo)
Aktiviert: ja
Gesperrt: nein

Nun befinden sich beim Ufo Textfelder, die allesamt ungebunden sind.

Edit: Ok, wenn ich diese nun an die Tabelle2 binde, dann werden mir die Werte angezeigt. Und ich kann die dann direkt bearbeiten. Das klappt. Nun muss ich nur noch herausfinden wie ich es am besten realisiere, dass beim Überschreiben eine "Warnung" kommt, bzw. die Speicherung erst dann stattfindet, wenn ich auf den Button "Speichern" klicke.

Sorry, ich meinte auch nicht mit SQL die Formular aufbauen, sondern den Inhalt der Formulare habe bis jetzt direkt mit den SQL Befehlen "gefüttert".

Schönen Gruß

MzKlMu

Hallo,
Zitatsondern den Inhalt der Formulare habe bis jetzt direkt mit den SQL Befehlen "gefüttert".
bist Du sicher, dass Du SQL meinst und nicht VBA, bzw. VBA mit SQL Bestandteilen? Warum verschenkst Du überhaupt serienmäßige Funktionen von Access?
Zur Datenspeicherung in Formularen bedarf es keines einzigen Buchstaben Code, das kann Access mit seinen Standardfunktionen besser als Du.
Verwende immer gebundene Formulare, der Rest macht Access.
Gruß Klaus

dmaccs

#9
Hallo,

ja du hast wohl recht, VBA mit SQL Bestandteilen ist die beste Formulierung. Ja ich habe VBA Code geschrieben, das mit SQL - Befehlen ausgestattet war.

Ich möchte klar das meiste direkt aus Access nehmen und nicht unbedingt alles neu schreiben, was ev. schon Access mir direkt mitliefert.

Das mit der Datenspeicherung klappt sehr gut. Jedoch würde ich gerne, dass der Nutzer "gezwungen" wird ein "Save button" zu drücken damit die Einträge wirksam werden. Es kommt leider häufig bis jetzt vor, dass mal kurz was geändert wird, von einem Telefonat unterbrochen und dann noch mal den alten Stand haben möchte.
Ich vermute mal es sollte irgendwie mit dem Ereignissen bewerkstelligt werden könnte. Vielleicht hast du da noch einen Tipp für mich. Bis jetzt habe ich ein Button auf dem Formular gehabt, das eben jenen SQL-Update Befehl ausgeführt hat, sobald darauf gedrückt wurde.

Sorry für die vielen Fragen.

Edit: Und noch eine zusätzliche Frage: Nun kriege ich die Daten aus der zweiten Tabelle in das Unterformular. Kann ich irgendwie Werte aus der Tabelle1 auch im Unterformular anzeigen lassen? (Diese sollen nicht geändert werden können oder dergleichen, ausschließlich anzeigen.

Gruß

MzKlMu

Hallo,
im Anhang mal ein Beispiel mit Pflichtfeldern und Buttons zum Speichern (oder nicht). Mit einem gebundenen Formular.
Man kann noch nicht mal die DB beenden ohne Button. Schaue Dir den Code an und versuche da durchzusteigen.
Ob Du wirklich Pflichtfelder brauchst, weis ich natürlich nicht. Aber das Speichern kannst Du abkupfern.  ;D

[Anhang gelöscht durch Administrator]
Gruß Klaus

oma

Hallo dmaccs,

die Methodik von Klaus zum Prüfen von Pflichtfeldern kann man verallgemeinern, insofern als das man nicht in bei jedem Formular alle Felder einzelnd mit Code überprüft.
Schaue im Modul die beiden Funktionen FormsCheck u.  Part.  Mit diesen Funktionen wird ein Speichern mit dem Button "Speichern" nur realisiert, wenn alle Felder ausgefüllt sind.

Zum Festlegen eines Feldes als Pflichtfeldes wird dieses nur mit Marke="X" festgelegt.
So kannst du in jedem beliebigen Formular diese Module in Zusammenhang mit dem Belegen  von Marke benutzen.

Gruß Oma


[Anhang gelöscht durch Administrator]
nichts ist fertig!

dmaccs

Hallo,

danke euch beiden für die Beispiele. Leider bin ich noch nicht dazu gekommen diese anzuschauen, da andere Arbeit anstand. Jedoch hätte ich noch eine Frage, die ich bin schnellen probieren nicht auf anhieb gelöst habe: Ich möchte Werte im Unterformular anzeigen, die jedoch aus dem Hauptformular kommen. Wie lautet dann dazu der Syntax? Ich kann ja nicht zwei Tabellen an das Unterformular binden. In dem Textfeld soll ein Wert aus der Spalte "Comment" aus Tabelle1 angezeigt werden, das in der Zeile steht, welche Artikelnr. ausgewählt wurde.
Ich wollte es in den Abfrageeditor hineinpacken und es mit einer WENN Abfrage machen, jedoch scheitert es noch am Code. Gibt's dazu auch eine elegantere Lösung?

Und eine Frage am Rande: Bis jetzt sind die Tabelle in einer Access DB. Kann ich die Formulare und alle weiteren Abfragen ohne Änderung übernehmen, wenn aus der Access DB eine SQL DB wird, jedoch mit Access Frontend / Formularen?

Gruß

MzKlMu

Hallo,
ZitatIch möchte Werte im Unterformular anzeigen, die jedoch aus dem Hauptformular kommen.
das musst Du mal näher erklären, wenn die daten im Hauptformular sind, wozu dann nocht mal im Ufo?

Und natürlich kannst Du 2 Tabellen über eine Abfrage als Datenherkunft verwenden. Die Tabellen benötigen nur eine Beziehung, dann geht das problemlos.
Gruß Klaus

dmaccs

Hallo,

es ist vielleicht auch mehr nur das Problem auf Grund des Layouts. Letztlich habe ich eine vordefiniertes Layout, welches aus PPT stammt und ich in Access nachbilden darf, so dass die Pflege der Daten nicht mehr in PPT geschehen, sondern in Access. Das Hautpformular mit der Tabelle1 hat mehrere Spalten, von denen ich einige zur Information darstellen möchte, jedoch nicht geändert werden dürfen / müssen.
Das Unterformular hat die Verknüpfung zu Tabelle2 welches meine Arbeitstabelle ist.

nun sollte in einer Zeile folgendes Sein.

FeldTab1 FeldTab1 FeldTab2 FeldTab1

Und dieses layoutmäßig sollte sich im Ufo befinden.

Gruß


PS: Trotz der Lösung mittels Formularen und Unterformularen, besteht die Möglichkeit es mit SQL / VBA Befehlen zu erledigen? Ich denke gerade an so etwas wie, dass es nach der Artikelnr. suchen soll, wenn es nichts findet, dann soll nichts darstellen und nach dem beenden soll das INSERT Befehl kommen, wenn er etwas gefunden hat, dann soll das UPDATE Befehl ausgeführt werden.