collapse

* Benutzer Info

 
 
Willkommen Gast. Bitte einloggen oder registrieren. Haben Sie Ihre Aktivierungs E-Mail übersehen?

* Wer ist Online

  • Punkt Gäste: 50
  • Punkt Versteckte: 0
  • Punkt Mitglieder: 0

Es sind keine Mitglieder online.

* Forenstatistik

  • stats Mitglieder insgesamt: 14542
  • stats Beiträge insgesamt: 72939
  • stats Themen insgesamt: 9848
  • stats Kategorien insgesamt: 5
  • stats Boards insgesamt: 17
  • stats Am meisten online: 443

Autor Thema: Doppelte Auswahl unterbinden  (Gelesen 396 mal)

Offline were

  • Newbie
  • Beiträge: 9
Doppelte Auswahl unterbinden
« am: Juni 11, 2019, 20:40:03 »
Hallo,
sorry, dass ich diesen sehr alten Thread rausgrabe, der beschreibt genau das Problem, welches ich momentan zu lösen versuche, die hier beschriebene Lösung ist allerdings nicht ausreichend.

Also ich habe auch eine Spezialisierung, in meinem Fall Vertrag und Vertragsarten. Also eine Tabelle Vertrag und mehrere weitere für Vertragsarten. Folgendes Problem: bei 1:0/1 Beziehung muss nun dafür gesorgt werden, dass die Daten im UFO (Vertragsarttabelle) nur in dieser bestimmten Tabelle eingegeben werden. Bei der erneuten Auswahl des Kombifeldes Vertragsart im Formular Vertrag kann man allerdings auch in der weiteren Vertragsarttabelle Daten eingeben. So würden in mehreren (Vertragsart)Tabellen Datensätze mit gleichem PK existieren. Das darf aber nicht sein.

Frage: wie kann das unterbunden werden? Meine Überlegungen: eine Möglichkeit wäre nachdem die Auswahl getroffen wurde, das Kombifeld verschwinden zu lassen, damit der Benutzer gar nicht die Möglichkeit hätte noch eine andere Wahl zu treffen. Die andere Möglichkeit – die nochmalige Auswahl der Vertragsart zu erlauben, dann muss aber der vorhandener Datensatz in der anderen Vertragsarttabelle gelöscht werden. Seht ihr bessere Varianten/Möglichkeiten das zu lösen? Wie kann man das praktisch lösen?
 

Offline MzKlMu

  • Moderator
  • Access-Oberguru
  • *****
  • Beiträge: 8179
Re: Doppelte Auswahl unterbinden
« Antwort #1 am: Juni 11, 2019, 23:10:53 »
Hallo,
kannst Du das mal genauer erklären ?
Im Normalfall kann doch ein Kombi nur in eine Tabelle schreiben, nämlich in das Feld an das das Kombi gebunden ist. Und das ist das Feld einer Tabelle.

Bitte zeige mal ein Bild des Beziehungsfensters.

PS:
Ich habe Deinen Beitrag von dem alten Thema abgetrennt. Solche alten Themen wieder auszugraben macht keinen Sinn.
Gruß
Klaus
 

Offline were

  • Newbie
  • Beiträge: 9
Re: Doppelte Auswahl unterbinden
« Antwort #2 am: Juni 11, 2019, 23:56:04 »
Danke für die Rückmeldung und die Zuordnung des Themas.

Das Kombi befindet sich in der Tabelle Vertrag, da wird auch die Auswahl getroffen, welche Vertragsart es sein soll. Je nach Auswahl soll ein UFO eingebunden und eingeblendet werden. Ein Vertrag kann nur eine einzige Vertragsart haben, es gibt aber mehrere davon. Vereinfacht sieht es so aus:
vertragsart (id(PK), bezeichnung)
vertrag (id(PK), vertragsart_id, text1, text2) -> HFO
vertragsart1(vertrag_id(PFK), text3, text4) ->UFO
vertragsart2(vertrag_id(PFK), text5, text6) ->UFO
vertrag_id – PFK -> übernommener PK vom Vertrag
Die Datenbank hat zu den Tabellen Verknüpfungen, daher kein Beziehungsfenster, ich hoffe, es war verständlich.
Wenn der Benutzer nun zuerst vertragsart_id = 1 auswählt, irgendwas in text3 einträgt und danach (anders überlegt) vertragsart_id auf 2 ändert und in text5 Eingabe macht, dann existieren von einem Vertrag zwei „Kind“-Datensätze – es darf aber nur eins geben. vertragsart1 und vertragsart2 sollen dynamisch eingebunden werden.
 

Offline MzKlMu

  • Moderator
  • Access-Oberguru
  • *****
  • Beiträge: 8179
Re: Doppelte Auswahl unterbinden
« Antwort #3 am: Juni 12, 2019, 00:04:07 »
Hallo,
wieso gibt es für die Vertragsarten unterschiedliche Tabellen?
Haben die Vertragsarten so unterschiedliche Felder ?
Wieso gibt es in der Datenbank keine Beziehungen ?
Verknüpfungen werden ja erst nach den Beziehungen angelegt. Können zwar gleich sein, sind aber unabhängig.
Gruß
Klaus
 

Offline were

  • Newbie
  • Beiträge: 9
Re: Doppelte Auswahl unterbinden
« Antwort #4 am: Juni 12, 2019, 07:03:35 »
Hallo,
Access dient in dem Fall als Frontend und hat Verbindung zu der backend Datenbank über ODBC. Die Beziehung ist über die bereits beschriebene PK, PFK festgelegt, da
die Vertragsarten tatsächlich  unterschiedliche Felder haben, die teilweise nicht NULL bleiben dürfen. Auf der DBMS Ebene kann man also dafür sorgen, dass in der Tabelle Vertragsart nur Beziehung zum Vertrag entsteht. Wie kriegt man nun aber hin, dass bei mehreren möglichen Beziehungen nur eine einzige erlaubt wird?
 

Offline Josef P.

  • Access-Profi
  • **
  • Beiträge: 306
    • Code-Bibliothek für Access-Entwickler
Re: Doppelte Auswahl unterbinden
« Antwort #5 am: Juni 12, 2019, 07:19:38 »
Hallo!

Zitat
Wie kriegt man nun aber hin, dass bei mehreren möglichen Beziehungen nur eine einzige erlaubt wird?

Variante 1:
Du könntest vertragsart_id auch in den Detailtabellen vertragsart1 usw. führen und die Beziehung mit den Feldern vertrag_id und vertragsart_id herstellen. (unique index reicht aus, muss kein PK sein.)
Wenn dann in der Tabelle vertragsart1 im Feld vertragsart_id per Regel nur eine 1 erlaubt ist, würde das DBMS eine Änderung von vertragsart_id auf 2 in der Tabelle vertrag verbieten, wenn noch ein Datensatz in vertragsart1 existiert.

Variante 2:
Mittels Datenbanktrigger dafür sorgen, dass die nicht passenden Datensätze in den Detailtabellen gelöscht werden, wenn das Datenfeld vertragsart_id geändert wird.

mfg
Josef
« Letzte Änderung: Juni 12, 2019, 07:31:11 von Josef P. »
 

Offline were

  • Newbie
  • Beiträge: 9
Re: Doppelte Auswahl unterbinden
« Antwort #6 am: Juni 12, 2019, 10:16:21 »
Hallo,
Josef, danke für die Vorschläge.
Zu 1.  Den Aufbau von Tabellen habe ich nicht ganz verstanden. Wenn ich in den Tabellen Vertrag und Vertragsart jeweils einen (und den gleichen) PK habe und zusätzlich in jeder Tabelle vertragsart_id die als unique zusammen mit dem id definiert ist, hindert mich das nicht in der Elterntabelle (vertrag) die vertragsart_id zu ändern. Könntest du evtl. erläutern, wie du das „..und die Beziehung mit den Feldern vertrag_id und vertragsart_id herstellen“ gemeint hast.
Zu 2. Könntest du evtl. mit der Formulierung des Triggers helfen? Danke
 

Offline Josef P.

  • Access-Profi
  • **
  • Beiträge: 306
    • Code-Bibliothek für Access-Entwickler
Re: Doppelte Auswahl unterbinden
« Antwort #7 am: Juni 12, 2019, 10:41:34 »
Zitat
hindert mich das nicht in der Elterntabelle (vertrag) die vertragsart_id zu ändern
Ja, das hindert dich die Vertragsart zu ändern falls in einer Detailtabelle mit einer anderen Vertragsart bereits ein Datensatz vorhanden ist.
Du müsstest diesen vor dem Speichern des Datensatzes der Vertrags-Tabelle löschen.

Zitat
Könntest du evtl. erläutern, wie du das „..und die Beziehung mit den Feldern vertrag_id und vertragsart_id herstellen“ gemeint hast.
Ich meinte eine Beziehung die mit den 2 Tabellenfeldern definiert wird.

Bei der Triggerformulierung kann ich nur eingeschränkt helfen, da dieser vom DBMS abhängt.

Grundprinzip (meist gibt es die inserted- und deleted-Systemtabellen):
DECLARE @DelTab TABLE (id int, Typ int)

insert into @DelTab (id, Typ)
select
    N.id, O.Typ
from
    inserted N
    inner join
    deleted O ON O.id = N.id
where
    n.Typ <> O.Typ  or n.Typ is null

delete from vertrag_1 where id in (select id from @Deltab where Typ = 1)
delete from vertrag_2 where id in (select id from @Deltab where Typ = 2)
...

mfg
Josef
« Letzte Änderung: Juni 12, 2019, 10:57:19 von Josef P. »
 

Offline were

  • Newbie
  • Beiträge: 9
Re: Doppelte Auswahl unterbinden
« Antwort #8 am: Juni 12, 2019, 12:11:34 »
1. meinst du also noch eine zusätzliche Tabelle wie bei n:m Beziehung die vertrag_id und vertragsart_id zusammenfasst oder wie? Eine Lösung auf DBMS Ebene wäre natürlich schön.
2. Für den Trigger vielen, vielen Dank, werde ich mal testen.
3. was würde gegen die Variante mit dem Verstecken der Auswahl sprechen, nachdem die Auswahl einmal getroffen wurde?
in der Art
If IsNull(Me!frmVertrag.Controls("vertragsart_id")) Then
        Me!frmVertrag.Controls("vertragsart_id").Visible = True
    Else
        Me!frmVertrag.Controls("vertragsart_id").Visible = False
End If
Schöne Grüße
 

Offline Josef P.

  • Access-Profi
  • **
  • Beiträge: 306
    • Code-Bibliothek für Access-Entwickler
Re: Doppelte Auswahl unterbinden
« Antwort #9 am: Juni 12, 2019, 15:33:05 »
Zitat
meinst du also noch eine zusätzliche Tabelle wie bei n:m Beziehung die vertrag_id und vertragsart_id zusammenfasst oder wie?
Nein. Die Felder in die bestehenden Tabellen einbauen.

Aufbau:
Haupttabelle "Vertrag":
 * Felder: id, vertragsart_id, text1, ...
 * PK: id
 * zusätzlicher unique index: vertragsart_id + id
Anm.: Beim unique index habe ich bewusst zuerst die vertragsart_id geschrieben, da dann der Index-Speicher nicht zu sehr verschwendet wird, da ein Index auf  vertragsart_id bestimmt von Nutzen sein wird.

Detailtabelle "vertragsart1"
 * Felder: vertrag_id, vertragsart_id (Standardwert = 1, NOT NULL), text3, ..
 * PK: vertrag_id (FK nur auf dieses Feld wird nicht benötigt)
 * FK = vertragsart_id + vertrag_id
 * Regel: vertragsart_id = 1 (jeder andere Wert ist nicht erlaubt)

Detailtabelle "vertragsart2"
 * Felder: vertrag_id, vertragsart_id (Standardwert = 2, NOT NULL), text5, ..
 * PK: vertrag_id
 * FK = vertragsart_id + vertrag_id
 * Regel: vertragsart_id = 2 (jeder andere Wert ist nicht erlaubt)

Dieser Aufbau setzt die Regel um, dass nur eine oder keine Detailtabelle gefüllt sein kann.

Meiner Meinung nach ist es mit einem Trigger einfacher umgesetzt, es gibt aber einen Nachteil. Der Trigger löscht aktiv den nicht benötigen Datensatz während die obige Struktur eine Fehlermeldung auslöst, wenn versucht wird, die Vertragsart zu ändern, wenn bereits eine Detailtabelle für eine andere Vertagsart befüllt wurde.

Beispiel: Benutzer ändert irrtümlich die Vertragsart und schließt das Formular, weil er die Vertragsart nicht ändern wollte, vergisst aber die Änderung rückgängig zu machen => Datensatz wird gespeichert => Trigger löscht Daten aus Detailtabelle.

Bei der Tabellenstruktur variante, hätte der Datensatz nicht gespeichert werden können, da zuvor bewusst vom Client aus der andere Detaildatensatz gelöscht werden muss.

Zitat
3. was würde gegen die Variante mit dem Verstecken der Auswahl sprechen, nachdem die Auswahl einmal getroffen wurde?
in der Art
Wenn das so gewollt ist, spricht meiner Meinung nach nichts dagegen. Du verhindert damit aber nicht, dass jemand (z. B. ein anderes Programm) die Vertragsart ohne deiner Detaildatensatz-Regel ändern kann.

Ich habe eine ähnliche Struktur für eine Dokumentenverwaltung. Dort gehe ich den Weg, dass für das Anlegen eines Dokuments zuerst ein ungebundenes Formular geöffnet wird, in das der User die Hauptdaten eingibt. Erst nach Bestätigung seiner Eingaben wird der Dokumentendatensatz inkl. dem jeweiligen Detaildatensatz (je nach Dokumentenart) erstellt.
Änderungen am Dokumententyp darf nur eine Admin in einem speziellen Formular durchführen. Diese Änderung schreibt er allerdings nicht direkt in die Tabelle sondern es wird per VBA eine gespeicherte Prozedur am Server aufgerufen, die die Dokumentenart ändert und sich auch um die Detaildatensätze kümmert.

mfg
Josef
« Letzte Änderung: Juni 12, 2019, 16:10:44 von Josef P. »
 

Offline were

  • Newbie
  • Beiträge: 9
Re: Doppelte Auswahl unterbinden
« Antwort #10 am: Juni 12, 2019, 16:21:10 »
Josef, herzlichen Dank für deine Mühe und detaillierte Erklärung, ich muss es erst verdauen :D und abwägen was in meinem Fall besser passt.
 

 

doppelte Dtensätze beim export exel in access vermeiden

Begonnen von thomutBoard Microsoft Excel

Antworten: 2
Aufrufe: 3412
Letzter Beitrag Juli 05, 2010, 21:28:04
von thomut
Doppelte Einträge nach Datum aussortieren

Begonnen von macpitBoard Tabelle/Abfrage

Antworten: 5
Aufrufe: 5489
Letzter Beitrag Juli 21, 2010, 21:39:55
von database
Doppelte Einträge nach mehreren Kriterien löschen

Begonnen von Falke22Board Microsoft Excel

Antworten: 4
Aufrufe: 6389
Letzter Beitrag August 06, 2010, 19:49:32
von Stapi
Gültigkeitsregel für nicht doppelte Kundennummern

Begonnen von AccessfreundBoard Formular

Antworten: 55
Aufrufe: 27524
Letzter Beitrag Oktober 07, 2010, 12:16:38
von Accessfreund
Doppelte Einträge nicht berücksichtigen

Begonnen von bigralaBoard Tabelle/Abfrage

Antworten: 9
Aufrufe: 6538
Letzter Beitrag November 22, 2010, 02:00:06
von bigrala

Advertisment / Werbung - Amazon Affiliate Links