{"id":55000221,"date":"2020-04-01T00:00:00","date_gmt":"2020-08-25T09:52:37","guid":{"rendered":"http:\/\/access-im-unternehmen.aix-dev.de\/aiu\/?p=221"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-30T00:00:00","slug":"Access_zu_EDM_Validierung","status":"publish","type":"post","link":"https:\/\/vbentwickler.de\/Access_zu_EDM_Validierung\/","title":{"rendered":"Access zu EDM: Validierung"},"content":{"rendered":"<p><b>Im Beitrag &#8220;Access zu EDM: Dateien erstellen&#8221; haben wir gezeigt, wie Sie mit einer einfachen Access-Prozedur aus einem Access-Datenmodell die f&uuml;r ein Entity Data Model notwendigen Dateien erzeugen k&ouml;nnen. Wenn Sie nun noch passende Klassen mit den Grundfunktionen f&uuml;r die Validierung hinzuf&uuml;gen wollen, k&ouml;nnen Sie die Erweiterungen aus diesem Artikel dazu verwenden. Wir legen f&uuml;r jede Entit&auml;tsklasse des Entity Data Models auf Basis des Datenmodells einer Access-Datenbank zus&auml;tzlich eine weitere Klasse in einem Unterordner namens Validierung an, der die grundlegenden Funktionen f&uuml;r die Validierung enth&auml;lt. Diese m&uuml;ssen allerdings noch angepasst werden. An welchen Stellen, lesen Sie im Folgenden.<\/b><\/p>\n<p>Die grundlegenden Techniken zum Validieren von Daten in Benutzeroberfl&auml;chen, die Daten aus einem Entity Data Model nutzen, haben wir im Artikel <b>Validieren mit VB und EDM <\/b>beschrieben (<b>www.datenbankentwickler.net\/175<\/b>). Dort zeigen wir eine Methode, die in verschiedenen Bereichen implementiert werden muss. Der erste dort beschriebene Teil erl&auml;utert, wie Sie die Entit&auml;tsklassen um eine Schnittstelle erweitern, die das Ausl&ouml;sen von Ereignissen beim Eintreten von Validierungsfehlern erlaubt. Diese Schnittstelle implementieren wir nicht direkt in der Klasse, zum Beispiel <b>Kunde<\/b>, sondern machen uns zunutze, dass man Klassen auf mehrere Dateien aufteilen kann. Das hat den Vorteil, dass automatisch erzeugte neue Versionen des Entity Data Models nach &Auml;nderungen im Datenmodell sich nicht auf die Klassen mit der Validierung auswirken.<\/p>\n<p>Wir erstellen also eine neue partielle Klasse, welche die f&uuml;r die Validierung notwendigen Elemente aufnimmt und das ist genau das, was wir automatisch auf Basis des Datenmodells der Access-Datenbank erledigen wollen.<\/p>\n<p>Die &uuml;brigen Schritte, die im oben genannten Artikel beschrieben werden, beziehen sich auf die &Auml;nderungen, die per XAML f&uuml;r die Benutzeroberfl&auml;che umgesetzt werden m&uuml;ssen.<\/p>\n<p><b>Ben&ouml;tigter Code f&uuml;r die partielle Klasse mit der Validierung<\/b><\/p>\n<p>Die partiellen Klassen, welche den Code f&uuml;r die Validierung enthalten, wollen wir wie gesagt in jeweils einer eigenen Klassendatei unterbringen, die in einem Unterverzeichnis namens <b>Validation <\/b>liegen. Eine solche Klasse soll wie folgt aussehen und zun&auml;chst den Namespace importieren, der die ben&ouml;tigte Schnittstelle enth&auml;lt:<\/p>\n<pre>Imports System.ComponentModel<\/pre>\n<p>Dann folgt die Klasse, welche die Schnittstelle <b>IDataErrorInfo <\/b>implementiert:<\/p>\n<pre>Partial Public Class Kunde\r\n     Implements IDataErrorInfo<\/pre>\n<p>Die Implementierung besteht aus zwei &ouml;ffentlichen Eigenschaften, von denen uns nur die erste interessiert &#8211; die zweite muss aber dennoch implementiert werden. Die erste sieht wie folgt aus:<\/p>\n<pre>     Default Public ReadOnly Property Item(columnName<span style=\"color:blue;\"> As String<\/span>)<span style=\"color:blue;\"> As String<\/span> Implements IDataErrorInfo.Item\r\n         Get\r\n             <span style=\"color:blue;\">Dim <\/span>strErrorMessage<span style=\"color:blue;\"> As String<\/span> = \"\"\r\n             Select Case columnName\r\n                 <span style=\"color:blue;\">Case <\/span>\"Vorname\"\r\n                     <span style=\"color:blue;\">If <\/span>(String.IsNullOrEmpty(Vorname))<span style=\"color:blue;\"> Then<\/span>\r\n                         strErrorMessage = \"Bitte geben Sie einen Vornamen ein.\"\r\n                     <span style=\"color:blue;\">End If<\/span>\r\n                 ...\r\n             <span style=\"color:blue;\">End Select<\/span>\r\n             Return strErrorMessage\r\n         End Get\r\n     End Property<\/pre>\n<p>Die Methode erwartet den Namen der zu untersuchenden Eigenschaft als Parameter und unterscheidet diese in einer <b>Select Case<\/b>-Bedingung.  Hier pr&uuml;ft sie die Bedingung und tr&auml;gt dann die Validierungsmeldung in die Variable strErrorMessage ein, die dann auch zur&uuml;ckgegeben wird.<\/p>\n<p>Den Rest der Schnittstelle f&uuml;gen wir wie folgt an:<\/p>\n<pre>     <span style=\"color:blue;\">Public <\/span>ReadOnly Property [Error]<span style=\"color:blue;\"> As String<\/span> Implements IDataErrorInfo.Error\r\n         Get\r\n             Throw <span style=\"color:blue;\">New<\/span> NotImplementedException()\r\n         End Get\r\n     End Property\r\n<span style=\"color:blue;\">End Class<\/span><\/pre>\n<p>Nun ben&ouml;tigen wir eine VBA-Prozedur analog zu der im Artikel <b>Access zu EDM: Dateien erstellen <\/b>(<b>www.datenbankentwickler.net\/219<\/b>), die uns diesen Code auf Basis des Datenmodells erstellt. Da wir in den dort vorgestellten Prozeduren und Funktionen schon sehr viele der auch f&uuml;r die Erstellung der Validierungsklassen ben&ouml;tigten Informationen zusammentragen, werden wir diese nochmals erweitern. Das geschieht so, dass die ermittelten Informationen genutzt werden, in weiteren Variablen die Inhalte der Validierungsklassen zusammenzustellen, die wir dann von der Hauptprozedur aus in die Validierungsdateien in einem neuen Verzeichnis namens <b>Validation <\/b>ausgeben.<\/p>\n<p>Die Prozedur <b>EDMDateienErstellen<\/b> erweitern wir dazu zun&auml;chst wieder um einen Parameter, diesmal namens <b>bolValidation<\/b>:<\/p>\n<pre><span style=\"color:blue;\">Public Sub <\/span>EDMDateienErstellen(bolEineDatei<span style=\"color:blue;\"> As Boolean<\/span>, strContextname<span style=\"color:blue;\"> As String<\/span>, strUnterverzeichnisEntities _\r\n        <span style=\"color:blue;\"> As String<\/span>, <span style=\"color:blue;\">Optional<\/span> bolINotifyPropertyChanged<span style=\"color:blue;\"> As Boolean<\/span>, <span style=\"color:blue;\">Optional<\/span> bolValidation<span style=\"color:blue;\"> As Boolean<\/span>)<\/pre>\n<p>Au&szlig;erdem f&uuml;gen wir die folgende Variable hinzu:<\/p>\n<pre>     <span style=\"color:blue;\">Dim <\/span>strValidation()<span style=\"color:blue;\"> As String<\/span><\/pre>\n<p>Die Variable <b>strValidation <\/b>&uuml;bergeben wir als neuen Parameter beim Aufruf der Funktion <b>EntityDataModelZusammenstellen<\/b>:<\/p>\n<pre>     ...\r\n     <span style=\"color:blue;\">Set<\/span> colMappings = EntityDataModelZusammenstellen(strDBSets, strEntities, strEntityNames, strValidation, _\r\n         bolINotifyPropertyChanged, bolValidation)\r\n     ...<\/pre>\n<p>Die fertigen partiellen Klassen mit dem Validierungscode landen dann in der Array-Variablen <b>strValidation<\/b>.<\/p>\n<p>Weiter unten pr&uuml;fen wir dann, ob <b>bolValidation <\/b>den Wert <b>True <\/b>hat. In diesem Fall erstellen wir ein neues Unterverzeichnis namens <b>Validation <\/b>und f&uuml;gen dort in einer Schleife die von der Funktion <b>EntityDataModelZusammenstellen <\/b>gelieferten und im Array <b>strValidation(i) <\/b>gespeicherten Klassen in jeweils eine Datei im soeben erstellten Verzeichnis:<\/p>\n<pre>     ...\r\n     <span style=\"color:blue;\">If <\/span>bolValidation = <span style=\"color:blue;\">True<\/span><span style=\"color:blue;\"> Then<\/span>\r\n         MakeDirectory strBasispfad & \"\\Validation\"\r\n         For i = <span style=\"color:blue;\">LBound<\/span>(strEntities) To <span style=\"color:blue;\">UBound<\/span>(strEntities)\r\n             TextdateiErstellen strBasispfad & \"\\Validation\\\" & strEntityNames(i) & \"_Validation.vb\", strValidation(i)\r\n         <span style=\"color:blue;\">Next<\/span> i\r\n     <span style=\"color:blue;\">End If<\/span>\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Die gr&ouml;&szlig;te Arbeit &uuml;bernimmt wieder die Funktion <b>EntityDataModelZusammenstellen<\/b>. Sie nimmt die neuen Parameter <b>strValidation <\/b>und <b>bolValidation <\/b>entgegen, von denen letztere entscheidet, ob eine Validierung erfolgen soll. Au&szlig;erdem ben&ouml;tigen wir einige neue Variablen:<\/p>\n<pre><span style=\"color:blue;\">Public Function <\/span>EntityDataModelZusammenstellen(strDBSets<span style=\"color:blue;\"> As String<\/span>, strEntities()<span style=\"color:blue;\"> As String<\/span>, _\r\n         strEntityNames()<span style=\"color:blue;\"> As String<\/span>, <span style=\"color:blue;\">Optional<\/span> strValidation<span style=\"color:blue;\"> As Variant<\/span>, <span style=\"color:blue;\">Optional<\/span> bolINotifyPropertyChanged<span style=\"color:blue;\"> As Boolean<\/span>, _\r\n         <span style=\"color:blue;\">Optional<\/span> bolValidation<span style=\"color:blue;\"> As Boolean<\/span>)<span style=\"color:blue;\"> As <\/span>Collection\r\n     ...\r\n     <span style=\"color:blue;\">Dim <\/span>strObject<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>i<span style=\"color:blue;\"> As Integer<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>strValidationBase<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>strValidationCode()<span style=\"color:blue;\"> As String<\/span><\/pre>\n<div class=\"rcp_restricted\"><p><span style=\"color: #ff0000;\">M&ouml;chten Sie weiterlesen? Dann l&ouml;sen Sie Ihr Ticket!<\/span><br \/>\n<span style=\"color: #ff0000;\">Hier geht es zur Bestellung des Jahresabonnements des Magazins <strong>Visual Basic Entwickler<\/strong>:<\/span><br \/>\n<span style=\"color: #ff0000;\"><a style=\"color: #ff0000;\" href=\"https:\/\/shop.minhorst.com\/magazine\/363\/visual-basic-entwickler-jahresabonnement?c=77\">Zur Bestellung ...<\/a><\/span><br \/>\n<span style=\"color: #ff0000;\">Danach greifen Sie sofort auf <strong>alle rund 200 Artikel<\/strong> unseres Angebots zu - auch auf diesen hier!<\/span><br \/>\n<span style=\"color: #000000;\">Oder haben Sie bereits Zugangsdaten? Dann loggen Sie sich gleich hier ein:<\/span><\/p>\n<\/div>\n\n\t\n\t<form id=\"rcp_login_form\"  class=\"rcp_form\" method=\"POST\" action=\"https:\/\/vbentwickler.de\/data\/wp\/v2\/posts\/55000221\/\">\n\n\t\t\n\t\t<fieldset class=\"rcp_login_data\">\n\t\t\t<p>\n\t\t\t\t<label for=\"rcp_user_login\">Username or Email<\/label>\n\t\t\t\t<input name=\"rcp_user_login\" id=\"rcp_user_login\" class=\"required\" type=\"text\"\/>\n\t\t\t<\/p>\n\t\t\t<p>\n\t\t\t\t<label for=\"rcp_user_pass\">Password<\/label>\n\t\t\t\t<input name=\"rcp_user_pass\" id=\"rcp_user_pass\" class=\"required\" type=\"password\"\/>\n\t\t\t<\/p>\n\t\t\t\t\t\t<p>\n\t\t\t\t<input type=\"checkbox\" name=\"rcp_user_remember\" id=\"rcp_user_remember\" value=\"1\"\/>\n\t\t\t\t<label for=\"rcp_user_remember\">Remember me<\/label>\n\t\t\t<\/p>\n\t\t\t<p class=\"rcp_lost_password\"><a href=\"\/data\/wp\/v2\/posts\/55000221?rcp_action=lostpassword\"><\/a><\/p>\n\t\t\t<p>\n\t\t\t\t<input type=\"hidden\" name=\"rcp_action\" value=\"login\"\/>\n\t\t\t\t<input type=\"hidden\" name=\"rcp_redirect\" value=\"https:\/\/vbentwickler.de\/data\/wp\/v2\/posts\/55000221\/\"\/>\n\t\t\t\t<input type=\"hidden\" name=\"rcp_login_nonce\" value=\"123b777de9\"\/>\n\t\t\t\t<input id=\"rcp_login_submit\" class=\"rcp-button\" type=\"submit\" value=\"Login\"\/>\n\t\t\t<\/p>\n\t\t\t\t\t<\/fieldset>\n\n\t\t\n\t<\/form>\n<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Im Beitrag &#8220;Access zu EDM: Dateien erstellen&#8221; haben wir gezeigt, wie Sie mit einer einfachen Access-Prozedur aus einem Access-Datenmodell die f&uuml;r ein Entity Data Model notwendigen Dateien erzeugen k&ouml;nnen. Wenn Sie nun noch passende Klassen mit den Grundfunktionen f&uuml;r die Validierung hinzuf&uuml;gen wollen, k&ouml;nnen Sie die Erweiterungen aus diesem Artikel dazu verwenden. Wir legen f&uuml;r jede Entit&auml;tsklasse des Entity Data Models auf Basis des Datenmodells einer Access-Datenbank zus&auml;tzlich eine weitere Klasse in einem Unterordner namens Validierung an, der die grundlegenden Funktionen f&uuml;r die Validierung enth&auml;lt. Diese m&uuml;ssen allerdings noch angepasst werden. An welchen Stellen, lesen Sie im folgenden.<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"om_disable_all_campaigns":false,"_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0,"_uf_show_specific_survey":0,"_uf_disable_surveys":false,"footnotes":""},"categories":[66022020,662020,44000024,44000027,44000022],"tags":[],"yst_prominent_words":[],"class_list":["post-55000221","post","type-post","status-publish","format-standard","hentry","category-66022020","category-662020","category-Berichte_und_Reporting","category-Excel_programmieren","category-Von_Access_zu_NET"],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/posts\/55000221","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/comments?post=55000221"}],"version-history":[{"count":0,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/posts\/55000221\/revisions"}],"wp:attachment":[{"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/media?parent=55000221"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/categories?post=55000221"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/tags?post=55000221"},{"taxonomy":"yst_prominent_words","embeddable":true,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/yst_prominent_words?post=55000221"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}