Frontend Datenbank Ringversuche

  • VB.NET

Es gibt 88 Antworten in diesem Thema. Der letzte Beitrag () ist von dattKlobiche.

    Frontend Datenbank Ringversuche

    Moin zusammen,

    ich arbeite in der Firma an einer Access Datenbank. Leider ist Access beim Frontend im Bezug auf Benutzerfreundlichkeit an seine Grenzen gestoßen. Da hatte ich die tolle Idee doch mal meine ewig alten VB Kentnisse etwas aufzufrischen und das Frontend mit VB zu programmieren.

    Erstmal erklär ich euch kurz was die Datenbank können soll:
    Ich arbeite für ein Labor und für eine Anerkennung unserer Messergebnisse müssen die Verfahren regelmäßig überprüft werden. Dies geschieht in so genannten Ringversuchen. Wir kriegen in diesen Ringversuchen vom Veranstalter Proben zur Analyse welche in der abschließenden Bewertung nur eine bestimmte Toleranz der Messwerte haben dürfen.
    Der Ablauf(welcher quasi auch im Frontend durchlaufen werden soll) ist folgender:

    1. Der Ringversuch wird grob geplant (Datum/Jahr) (läuft)
    2. Die uns zugesandten Proben werden ins System aufgenommen. Dazu sind folgende Informationen wichtig:
    • Probennummer des Veranstalters
    • unsere Probennummer
    • das Eingangsdatum
    • Die zu untersuchenden Parameter in der Entsprechenden Matrix (z.B. Blei in Trinkwasser)
    3. Die eingegangenen Proben werden einem Ringversuch zugeordnet
    4. Die Ergebnisse werden eingetragen und bei Abweichungen der Messwerte wird ein Verweis zum entsprechenden Dokument des Qualitätsmanagement vermerkt

    Zusätzlich soll aus den geplanten Ringversuchen ein Bericht gedruckt werden, der alle geplanten Versuche der nächsten 2-3 Jahre enthält.

    Im Moment hänge ich am Probeneingang. Ich komm einfach irgendwie nicht drauf, wie man den Proben am einfachsten/sinnvoll die Parameter Matrix Kombis zuweisen kann. Datenbanktechnisch ist das Ganze mit 3 Tabellen gelöst:
    Proben(PID, Probeneingang, PNrVA, PNrHaus)
    PMV_Probe(PID, PMVID, CAPANr(für's QM), Z-Score(Bewertung des Ergebnisses))
    PMV(PMVID, Parameter, Matrix, Verfahren)

    Die Tabelle PMV wird durch 3 Tabellen mit den Stammdaten in verschiedenen Kombinationen gefüllt. Eine Probe kann logischerweise mehrere dieser PMVs enthalten und eine PMV Kombi kann durchaus auch in mehreren Proben benutzt werden.
    Im Moment habe ich im Form einen Split Container, der im linken Feld die Daten der Tabelle Proben als Details anzeigt. Jetzt hätte ich auf die andere Seite gerne irgendwie eine Möglichkeit die PMV Kombis einzugeben. Dazu sollen vorhandene wählbar sein oder bei Bedarf neue erstellbar sein.

    Ich hoffe ich hab das Ganze verständlich erklärt ;)

    Gruß

    Jonny
    Ich würde auch gerne mal ein Datenmodell sehen.
    Über Access oder über Visual Studio im Datasetdesigner.
    Das hilft immer ungemein.
    Es war einmal ein kleiner Bär... der wollte eine Geschichte hörn... Da erzählte ihm seine Mutti:
    Es war einmal ein kleiner Bär... der wollte eine Geschichte hörn... Da erzählte ihm seine Mutti:
    Es war einmal ein kleiner Bär... der wollte eine Geschichte hörn... Da erzählte ihm seine Mutti:
    ... Nun solltest es selber wissen. :'D
    So, hier das Datenmodell aus VS. Hab's jetzt etwas zusammengeschoben, damit alles halbwegs zu sehen ist :)
    Bei den Abfragen sind noch nen paar überflüssige dabei, die entfernt werden müssen. In Access lief auch so ziemlich alles, war halt nur stark unübersichtlich.
    Bilder
    • Datenmodell.png

      54,86 kB, 795×846, 205 mal angesehen

    dattKlobiche schrieb:

    Ich komm einfach irgendwie nicht drauf, wie man den Proben am einfachsten/sinnvoll die Parameter Matrix Kombis zuweisen kann.
    da besteht eine m:n-Relation, und ZwischenTabelle (alias "ZUordnungs-Tabelle") ist PMV_Probe.

    Um also einer Probe ein PMV zuzuordnen, musst du der PMV_Probe-Tabelle eine PMV_ProbeRow zufügen. Die PMV_ProbeRow enthält einen Verweis sowohl auf die Probe als auch auf das PMV.

    Von einer Kombination kannst du also sprechen, wenn du derselben Probe auf diese Weise mehrere PMVs zugeordnet hast.

    Ist letztlich Grundlage relationaler datenmodellierung.
    Wenn wolle guggemol diese Tut, und gern auch die Folge-Artikel: codeproject.com/Articles/1030969/Relational-Datamodel

    ErfinderDesRades schrieb:

    da besteht eine m:n-Relation, und ZwischenTabelle (alias "ZUordnungs-Tabelle") ist PMV_Probe.

    Um also einer Probe ein PMV zuzuordnen, musst du der PMV_Probe-Tabelle eine PMV_ProbeRow zufügen. Die PMV_ProbeRow enthält einen Verweis sowohl auf die Probe als auch auf das PMV.

    Von einer Kombination kannst du also sprechen, wenn du derselben Probe auf diese Weise mehrere PMVs zugeordnet hast.

    Also reicht die Zwischentabelle so nicht? Prinzipiell wäre doch jede Kombination aus ProbnID und PMVID einzigartig oder vertu ich mich da jetzt? Ist alles schon 10 Jahre her, bin dementsprechend schon froh gewesen dass das in Access so gut lief :D
    Ich hatte das Ganze im Prinzip als Joining View geplant (In dem Zuge herzlichen Dank für deine genialen Videos) aber irgendwie klappte das einfach nicht.

    Ist letztlich Grundlage relationaler datenmodellierung.
    Wenn wolle guggemol diese Tut, und gern auch die Folge-Artikel: codeproject.com/Articles/1030969/Relational-Datamodel

    Werde ich mir nachher mal zu Gemüte führen, ans Lesen hab ich mich schon gewöhnt :D
    Edit: Ist gedruckt und wird nachher gelesen :)

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „dattKlobiche“ ()

    hmm - ausgedruckt??

    hmm.

    ich find immer ganz wesentlich, dass man die Samples downloaded, ausprobiert, verändert, kaputt macht und wieder repariert.

    Und die Tabellen sind auch ganz in Ordnung - da fehlt glaub nix.
    Nur es muss ein m:n-View sein.
    Inne Videos mache ich ja beide richtungen, aber das ist nur zur Demo. Inne Praxis hat man nur eine Richtung, hier etwa ein m:n-View mit Probe als ParentTable, PMV_Probe als untergeordnet, und PMV wird rein-gejoint.

    ErfinderDesRades schrieb:


    ich find immer ganz wesentlich, dass man die Samples downloaded, ausprobiert, verändert, kaputt macht und wieder repariert.

    Keine Sorge, wird gemacht. Ich hab's zum ersten Lesen nur gerne ausgedruckt und das obwohl ich seit zig Jahren ohne Ende Zeit am Bildschirm verbringe. Außerdem sammel ich immer nen paar Sachen zum Nachschlagen für meinen Sammelordner :)
    Das Tutorial war schon mal ziemlich hilfreich. Ich bau jetzt mal das Problem alleine zusammen. Funktioniert mit den Datasets und einer XML Datei ja prächtig. Irgendwie will das nur alles noch nicht so wie ich will, ich bin aber zuversichtlich :)
    Ich steh mal wieder etwas auf dem Schlauch. Im Moment arbeite ich immer noch mit DatasetOnly. Jetzt habe ich ein Form mit der Tabelle Ringversuche als Details. Ringversuch hinzufügen, navigieren usw geht alles. Über einen Button kann man dann einen Dialog öffnen in dem eine neue Probe angelegt werden kann. Die wird dann auch übernommen und beim abspeichern in die XML geschrieben. Jetzt lese ich mir aber schon seit Stunden die Augen wund wie ich diese Probe mit dem Ringversuch verbinde. Die Tabellen sind ja Ringversuche -> Probe_Ring <- Probe. Gibt es eine Möglichkeit, dass das Ganze automatisch passiert oder muss ich beim schließen des Dialogs noch "händisch" die Tabelle Probe_Ring updaten? Das hab ich nämlich bisher versucht nur irgendwie will kein Code funktionieren.
    So gestellt kann man die Frage nicht beantworten.
    Was bedeutet "Probe mit dem Ringversuch verbinden"?
    Willst du eine Ansicht mit 2 DGVs, bei der du links einen Ringversuch auswählst, und rechts alle diesem Ringversuch zugeordneten Proben angezeigt bekommst?

    Sowas nennt man einen m:n- View, und gibts auf vier Views-Videos auch Filmle zu.
    Ich hab mal noch Bildchen gemacht, sonst versteht wahrscheinlich auch keiner was ich will ;)

    Oben wird der Ringversuch anzeigt und es kann durch die Ringversuche geklickt werden.
    Darunter wird auf der linken Seite die Tabelle Probe_Ring angezeigt und die Inhalte aus der Tabelle Probe über ComboBoxColumns reingejoint.
    Das funktioniert auch prächtig, hatte mich nur vorher darin verrannt alle Daten unten in einem DGV anzeigen zu wollen. Jetzt kommt halt noch das zweite DGV auf der rechten Seite dazu. In dem sollen dann zur Probe, die links ausgewählt ist, die zur Probe gehörendenden Parameter-Matrix-Methode Kombinationen (PMM) und der für diese PMM erreichte Z-Score(eine in Dezimalzahlen abgegebene Bewertung der von uns bei der PMM erhaltenen Untersuchungsergebnisse) angezeigt werden.
    Jetzt funktioniert hier doch die normale Vorghehensweise beim m:n-View nicht, weil die Bindingsource für das linke DGV ja die Tabelle Probe_Ring enthält und nicht die Tabelle Probe.
    Ist da evtl eine Verbindung über die Bindingsource möglich, die die Tabelle Probe im linken DGV reinjoint?
    Ich hoffe ich habe mich diesmal etwas verständlicher ausgedrückt. Ist echt gar nicht so einfach schriftlich wiederzugeben, was im Kopf vorgeht :)

    Gruß
    Jonny

    Edit: Hab noch mal ein Bild vom laufenden Programm dazu gepackt.
    Bilder
    • DataSet2902.png

      22,7 kB, 619×655, 178 mal angesehen
    • frmRingversuche2902.png

      20,76 kB, 809×607, 146 mal angesehen
    • frmRingversuchelauf2902.png

      21,13 kB, 807×609, 168 mal angesehen

    dattKlobiche schrieb:

    Ist echt gar nicht so einfach schriftlich wiederzugeben, was im Kopf vorgeht
    Ich weiß, aber das ist eine hervorragende Programmier-Übung, und hilft ungemein.
    Ich glaub ich schreibe mehr Frage-Posts, die ich verwerfe, als welche, die ich abschicke.
    Weil beim klaren Formulieren der Frage kommt oft auch schon die Lösung.
    /OffTopic

    Hier nun leider nicht, und das liegt daran, dass du schon richtig erkennst, dass hier codeseitig nachgeholfen werden muss.
    also ich nenne im weiteren das linke grid nu grdProbeRing, und dessen BindingSours bsProbeRing.
    Dann bastel in 2 neuen grids einen vorläufigen, ganz unabhängigen ParentChildView für Probe->PMM_Probe. Wichtig ist die neue BindingSource bsProbe, die dabei entstehen muss.

    Nun kannst du im bsProbeRing.CurrentChanged über die ProbeRingRow auf die ProbeRow zugreifen, und die Position dieser ProbeRow kannste in bsProbe suchen, und dann als bs.Probe.Position auch selectieren.
    Fertig.
    Wenn das klappt, kannste grdProbe löschen, aber bsProbe behalten, denn das steuert ja bsPmmProbe, also die BS des neuen ChildGrids.

    Kriegst du die Such-Schleife selber hin? Ich glaub ich hab sowas auch in einem der Tuts, zumindest in Daten laden und speichern bei den vielen Samples inne Helpers-Bibliothek ist eine Extension-Methode BindingSource.MoveToRow(), die das ermöglicht, als Einzeiler abzuhandeln.
    Na damit ist mir doch schon mächtig geholfen :) Nochmal viele herzlichen Dank für deine hilfreichen Antworten. Ich werd's dann jetzt mal ausprobieren, die Schleife krieg ich wohl hin(denke ich zumindest :D).
    Nochmal stürze ich mich auch nicht so unbedarft und mit rudimentären Grundkenntnissen in so ein Projekt :D
    Bin grad dabei in meiner Freizeit dabei von Grund auf C# zu lernen damit mir sowas nicht noch einmal passiert. Muss aber auch sagen das mir Programmieren mittlerweile echt Spaß macht, obwohl ich's damals in der Ausbildung gehasst habe.
    ah - hab jetzt auch das Sample der Such-Schleife gefunden - ist einfach in post#8 des verlinkten Tuts - in FindPerson()

    Zumindest so ähnlich - die Treffer-Bedingung lautet bei dir ja einfacher:

    VB.NET-Quellcode

    1. if drv.Row is mySearchedProbeRow then bsProbe.Position = i: Exit Sub


    ach hier, die Extension:

    VB.NET-Quellcode

    1. '''' <summary> stellt die angegebene DataRow ein </summary>
    2. <Extension()> _
    3. Public Function MoveToRow(bs As BindingSource, row As DataRow) As Boolean
    4. If bs.IsBindingSuspended Then Return False
    5. Dim dv = DirectCast(bs.List, DataView)
    6. For i As Integer = 0 To bs.Count - 1
    7. If dv(i).Row Is row Then
    8. bs.CancelEdit() 'ansonsten setzter u.U. beim Moven die vorherige Row auf Rowstate.Changed
    9. bs.Position = i
    10. Return True
    11. End If
    12. Next
    13. Return False
    14. End Function

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „ErfinderDesRades“ ()

    Habe ich das jetzt richtig verstanden, dass ich über bsProbeRing.CurrentChanged die Position in bsProbe finden muss und dann kann ich per Function(also MoveToRow(bsProbe, [Position in bsProbe])) die entsprechende Position in der Bindingsource einstellen. Dadurch würde dann die Bindingsource bsProbePMM jeweils die passenden Zeilen ausgeben. Dann muss ich das ja nur noch mit ProbeRingRow usw. gebacken kriegen und ich hab das gewünschte Ergebnis :) Echt schlimm sich das Alles so vorkauen zu lassen aber immerhin steigt das Verständnis mit jedem gelösten Problem mächtig und ich konnte schon an anderen Stellen den Code deutlich optimieren oder reduzieren. :)
    ja.
    lies dir post#8 aus dem Tut, da gehts genau darum, wie man von einer BindingSource die typisierten DataRows abruft, sowohl die aktuell selektierte, als auch alle in einer Schleife (letzters ist zB bei gefilterten Bindingsources von Belang. Oder halt zum Aufsuchen einer bestimmten Row, aber das übernimmt die Extension ja eiglich besser).
    Ist bischen unschön, weil man viel casten muss.

    Und dass du von einer ProbeRingRow die ProbeRow direkt und typisiert abrufen kannst, weißt du, ja?
    Fang nicht iein Gewurstel mit Schlüsselspalten an!

    evtl. studierste auch codeproject.com/Articles/10351…ped-Dataset-for-Beginners (falls du noch nicht hast) - damit kannst du quasi ein "Gesamt-Verständnis am Stück" gewinnen - zumindest was typDataset betrifft.