Forums Neueste Beiträge
 

Wie würdet ihr... (Mehrfache Formulare und Datenabtrennung)

03/05/2010 - 20:07 von Michael H. Bosch | Report spam
Hallo NG,

ich bin dabei ein größeres Projekt umzusetzen. Da ich nicht so der
Programmierer bin, muß ich mich ganz schön reinarbeiten.

Momentan bin ich bei 2 Dingen am hardern, und weiß nicht, ob ich auf den
richtigen Weg bin.

Aber mal zu dem Projekt:
Ich habe mehrere Tabellen mit Stammdaten.
Im Programm befülle ich eine Tabelle mit Vorgàngen (versuche es abstrakt
zu halten). Diese Vorgànge haben alle eine fest zugeordnete einmalige
Nummern.
Jetzt muß ich zB Mitarbeiter einem Vorgang zuordnen. Dafür will ich eine
Tabelle schreiben, in der die Vorgangsnummer hinterlegt ist und die
zugeordnete einmalige Mitarbeiternummer. Dies sollte soweit kein Problem
sein.

Nach vielem Text jetzt die "Probleme".
Ich lade zu Beginn alle Mitarbeiter in eine Datatable. Diese binde ich
im Erfassungsformular an ein Datagridview. Dies klappt wunderbar. Wenn
ich jetzt die Mitarbeiter dem Vorgang im Formular zuordnen will, kopiere
ich die Daten in eine neue Datatable und binde die an eine Listbox. Hier
frage ich mich, ob das überhaupt Sinn macht, von der Verarbeitung. In
der Listbox möchte ich ja gerne die Mitarbeiternamen haben. Beim
Speichern benötige ich nur die Vorgangsnummer und die Mitarbeiternummer.
Sollte hier vielleicht besser ein Dictionaryobjekt gebunden werden? Ich
habe zB das Problem, das ich natürlich einen Mitarbeiternamen doppelt in
die Listbox bekomme, da ich sie ja nicht in der eigentlichen Datatable
lösche. Zudem muß ich wenn ich einen Vorgang lade, natürlich im Formular
auch wieder nur die Mitarbeiter laden (kann natürlich per SQL Select aus
der MySQL Datenbank auch schnell eine Datatable laden. Frage mich nur,
was die elegantere Lösung ist.

Das zweite Problem war, das ich eine Vorgangserfassung mehrfach zur
gleichen Zeit möglich machen will (MDI Anwendung). Daher mußte ich die
Datatables für den Vorgang an das Formular binden, sonst würden ja bei 2
gleichzeitig geöffneten Formularen die Datatables Daten von 2 Formularen
haben (Hatte diese zuvor in einem Modul Global deklariert).
Bei der im Formular gebunden Datatable klappte es nicht mehr, eine
zweite Form zur Erfassung von Eintràgen aus der Datatable zu starten, da
das binden an die Hauptform in der Listbox (Valuemember) nicht möglich
war. Wie würdet ihr das lösen?

Ich möchte hier keinen generellen Quellcode, aber gerne eure
Überlegungen dazu, da hier ja sehr viel Know How unterwegs ist.

Vielleicht muß ich mir ja bestimmte Programmiertechniken nochmal genauer
ansehen!

Ich bin für jeden Konstruktiven Input dankbar.

VG,

Michael
 

Lesen sie die antworten

#1 Peter Fleischer
04/05/2010 - 06:22 | Warnen spam
"Michael H. Bosch" schrieb im Newsbeitrag
news:hrn3e3$g15$
...
Ich habe mehrere Tabellen mit Stammdaten.
Im Programm befülle ich eine Tabelle mit Vorgàngen (versuche es abstrakt
zu halten). Diese Vorgànge haben alle eine fest zugeordnete einmalige
Nummern.
Jetzt muß ich zB Mitarbeiter einem Vorgang zuordnen. Dafür will ich eine
Tabelle schreiben, in der die Vorgangsnummer hinterlegt ist und die
zugeordnete einmalige Mitarbeiternummer. Dies sollte soweit kein Problem
sein.



Hi Michael,
das wàre eine n:m-Beziehung. Jedem Vorgang können mehrere Mitarbeiter
zugeordnet werden. Bei einer 1:n-Beziehung könnte jedem Vorgang nur ein
Mitarbeiter zugeordnet werden.

Nach vielem Text jetzt die "Probleme".
Ich lade zu Beginn alle Mitarbeiter in eine Datatable. Diese binde ich im
Erfassungsformular an ein Datagridview. Dies klappt wunderbar. Wenn ich
jetzt die Mitarbeiter dem Vorgang im Formular zuordnen will, kopiere ich
die Daten in eine neue Datatable und binde die an eine Listbox. Hier frage
ich mich, ob das überhaupt Sinn macht, von der Verarbeitung.



Diese Lösung empfinde ich als nicht optimal.

In der Listbox möchte ich ja gerne die Mitarbeiternamen haben. Beim
Speichern benötige ich nur die Vorgangsnummer und die Mitarbeiternummer.



Damit wird mit den Tabellen "Mitarbeiter", "Vorgànge" und
"Verbindungstabelle" eine n:m-Beziehung realisiert.

Sollte hier vielleicht besser ein Dictionaryobjekt gebunden werden?



Dies Art der Speicherung ist erst einmal sekundàr. Wichtig sind die
logischen Beziehungen in den Daten. In deiner n:m-Beziehung sind die
Tabellen "Mitarbeiter" und "Vorgànge" jeweils Master-Tabellen (übergeordnet)
zur Child-Tabelle "Verbindungstabelle" (untergeordnet). Solche Beziehungen
lassen sich einfach in einem DataSet verwalten anstelle in Dictionaries.

Ich habe zB das Problem, das ich natürlich einen Mitarbeiternamen doppelt
in die Listbox bekomme, da ich sie ja nicht in der eigentlichen Datatable
lösche. Zudem muß ich wenn ich einen Vorgang lade, natürlich im Formular
auch wieder nur die Mitarbeiter laden (kann natürlich per SQL Select aus
der MySQL Datenbank auch schnell eine Datatable laden. Frage mich nur, was
die elegantere Lösung ist.



Zuerst sollte eine Bedientechnologie festgelegt werden, um dann die
passenden Steuerelemente in der Oberflàche auszuwàhlen.

Eine mögliche Lösung ist die Anwendung einer zweigeteilten Darstellung in
einem Formular (linke und rechte Hàlfte). Links werden Vorgànge in einer
Liste (z.b. DataGridView) dargestellt, rechts alle Mitarbeiter in einer
CheckedListBox. Für den aktuell links selektierten Eintrag (Zeile) werden
rechts die dem Vorgang zugeordneten Mitarbeiter mit einem Hàkchen
gekennzeichnet. Der Anwender kann dann beliebig neu zuordnen (Hàkchen setzen
und/oder entfernen). Bei Datensatzwechsel und beim Schließen der Form wird
die "Verbindungstabelle" aktualisiert und ggf. sofort oder auch asynchron
(spàter) die Änderungen in der Datenbank abgelegt. Beim Aktualisieren der
"Verbindungstabelle" wird geprüft, ob ein Eintrag bereits existiert, ob zu
löschen ist (Hàkchen entfernt) oder ob ein neuer Eintrag hinzuzufügen ist
(Hàkchen hinzugefügt).

Das zweite Problem war, das ich eine Vorgangserfassung mehrfach zur
gleichen Zeit möglich machen will (MDI Anwendung). Daher mußte ich die
Datatables für den Vorgang an das Formular binden, sonst würden ja bei 2
gleichzeitig geöffneten Formularen die Datatables Daten von 2 Formularen
haben (Hatte diese zuvor in einem Modul Global deklariert).
Bei der im Formular gebunden Datatable klappte es nicht mehr, eine zweite
Form zur Erfassung von Eintràgen aus der Datatable zu starten, da das
binden an die Hauptform in der Listbox (Valuemember) nicht möglich war.
Wie würdet ihr das lösen?



Auch da gibt es verschiedene Lösungswege. Um in einer Anwendung Daten
mehrfach zu nutzen (in unterschiedlichen Forms) sollte nur eine Datenquelle
angelegt und genutzt werden. Das geht am einfachsten mit einem statischen
verweis auf die Datenquelle. Ein statischer Verweis kann entweder mit dem
Schlüsselwort Shared oder auch in einer VB-Anwendung in einem Modul
deklariert werden.

Ein möglicher Lösungsweg ist die Kapselung des Datenzugriffs in einer
separaten Klasse, am besten in einem separaten Projekt vom Typ
Klassenbibliothek. Diese Klassenbibliothek kann als Objekt-Datenquelle bei
der Arbeit des Designers beim gestalten der Form genutzt werden. Im
Programmcode ist dann lediglich der BindingSource der statische Verweis auf
die Datenquelle zuzuweisen. Damit arbeiten mehrere Instanzen mit der
gleichen Datenquelle.

Ich hoffe, damit ein paar Anregungen gegeben zu haben.

Viele Gruesse

Peter

Ähnliche fragen