{"id":3028,"date":"2021-11-25T17:11:55","date_gmt":"2021-11-25T16:11:55","guid":{"rendered":"https:\/\/gdksoftware.com\/?post_type=knowledge&#038;p=3028"},"modified":"2022-01-17T10:30:04","modified_gmt":"2022-01-17T09:30:04","slug":"delphi-en-database-events","status":"publish","type":"knowledge","link":"https:\/\/gdksoftware.com\/nl\/kennisbank\/delphi-en-database-events","title":{"rendered":"Delphi en database events"},"content":{"rendered":"<p><strong>Delphi en Microsoft SQL Server events<\/strong><\/p>\n<p>Database events zijn een erg handig manier om applicaties te laten weten dat er een bepaalde gebeurtenis zich heeft voorgedaan. In plaats van de applicatie continue naar de database te laten \u2018pollen\u2019, krijg je via een event precies op het juiste moment een seintje dat je vanuit de database dat je actie moet ondernemen. Als voorbeeld; stel dat een applicatie een wijziging maakt in een specifiek klantenrecord, wat ervoor zorgen moet dat in een andere applicatie een handeling verricht moet worden. De andere applicatie hoeft met events alleen maar te wachten op het specifieke event, en hoeft niet continu een SQL-statement uit te voeren om te zien of het record aangepast is.<\/p>\n<p><strong>FDEventAlerter<\/strong><\/p>\n<p>Binnen Delphi (of eigenlijk binnen <a href=\"https:\/\/docwiki.embarcadero.com\/RADStudio\/Sydney\/en\/Database_Alerts_(FireDAC)\" target=\"_blank\" rel=\"noopener\">FireDAC<\/a>) kun je dit oplossen voor middel van het component <a href=\"https:\/\/docwiki.embarcadero.com\/Libraries\/Sydney\/en\/FireDAC.Comp.Client.TFDEventAlerter\" target=\"_blank\" rel=\"noopener\">FDEventAlerter<\/a>. Dit component is gemaakt om te \u2018luisteren\u2019 naar events binnen een database omgeving. Het mooie van het FDEventAlerter component is dat het gemaakt is om \u00e9\u00e9n \u2018interface\u2019 te geven, onafhankelijk welke database je gebruikt. Je kunt met deze interface zelf bepalen of je op een specifiek event wacht, of zelf op een wijziging in specifiek record in een tabel.<\/p>\n<p><strong>Voorbeeld met Microsoft SQL Server<\/strong><\/p>\n<p>In het voorbeeld hieronder maken we gebruik van een Microsoft SQL Server. Om de events bij Microsoft SQL Server te kunnen versturen kun je gebruik maken van de <a href=\"https:\/\/docs.microsoft.com\/en-us\/sql\/relational-databases\/native-client\/features\/working-with-query-notifications?view=sql-server-ver15\" target=\"_blank\" rel=\"noopener\"><em>Query Notifications<\/em><\/a>.<\/p>\n<p>Om deze Query Notifications aan te maken kunnen we de volgende code gebruiken:<br \/>\n<code><br \/>\n-- Create the queue and the service<br \/>\nCREATE QUEUE [NotificationsQueue];<br \/>\nCREATE SERVICE [NotificationsService] ON QUEUE [NotificationsQueue] (<br \/>\n[http:\/\/schemas.microsoft.com\/SQL\/Notifications\/PostQueryNotification]<br \/>\n);<br \/>\nGRANT SEND ON SERVICE::[NotificationsService] TO [];<\/code><br \/>\n<code><br \/>\n-- Permissions needed for []<br \/>\nGRANT SELECT to []<br \/>\nGRANT SUBSCRIBE QUERY NOTIFICATIONS TO []<br \/>\nGRANT RECEIVE ON QueryNotificationErrorsQueue TO []<br \/>\nGRANT REFERENCES on CONTRACT::[http:\/\/schemas.microsoft.com\/SQL\/Notifications\/PostQueryNotification] to []<br \/>\nGRANT RECEIVE ON [NotificationsQueue] TO []<br \/>\nGRANT VIEW DEFINITION TO []<br \/>\n<\/code><\/p>\n<p>Zodra deze zaken geregeld zijn kunnen we in Delphi de implementatie van het event systeem uitvoeren. Dit doe je door het FDEventAlerter component op een form of datamodule te plaatsen, en deze via de property Connection te koppelen aan je database. Ook moet je door middel van de Names property de queue, service en <em>change events<\/em> zetten:<\/p>\n<div style=\"background: #ffffff; overflow: auto; width: auto; border: solid gray; border-width: .1em .1em .1em .8em; padding: .2em .6em;\">\n<pre style=\"margin: 0; line-height: 125%;\">FDEventAlerter<span style=\"color: #333333;\">.<\/span>Connection <span style=\"color: #333333;\">:=<\/span> <span style=\"background-color: #fff0f0;\">''<\/span>\r\nFDEventAlerter<span style=\"color: #333333;\">.<\/span>Names<span style=\"color: #333333;\">.<\/span>Add(<span style=\"background-color: #fff0f0;\">'QUEUE=NotificationsQueue'<\/span>)<span style=\"color: #333333;\">;<\/span>\r\nFDEventAlerter<span style=\"color: #333333;\">.<\/span>Names<span style=\"color: #333333;\">.<\/span>Add(<span style=\"background-color: #fff0f0;\">'SERVICE=NotificationsService'<\/span>)<span style=\"color: #333333;\">;<\/span>\r\n<\/pre>\n<\/div>\n<p>Vervolgens kun je de OnAlert event handler van het component gebruiken om via onderstaande code de events af te vangen en actie te ondernemen:<\/p>\n<div style=\"background: #ffffff; overflow: auto; width: auto; border: solid gray; border-width: .1em .1em .1em .8em; padding: .2em .6em;\">\n<pre style=\"margin: 0; line-height: 125%;\"><span style=\"color: #008800; font-weight: bold;\">procedure<\/span> <span style=\"color: #bb0066; font-weight: bold;\">TFrmMain<\/span><span style=\"color: #333333;\">.<\/span><span style=\"color: #0066bb; font-weight: bold;\">FDEventAlerterAlert<\/span>(ASender<span style=\"color: #333333;\">:<\/span> TFDCustomEventAlerter<span style=\"color: #333333;\">;<\/span> <span style=\"color: #008800; font-weight: bold;\">const<\/span> AEventName<span style=\"color: #333333;\">:<\/span> <span style=\"color: #008800; font-weight: bold;\">string<\/span><span style=\"color: #333333;\">;<\/span>\r\n  <span style=\"color: #008800; font-weight: bold;\">const<\/span> AArgument<span style=\"color: #333333;\">:<\/span> <span style=\"color: #333399; font-weight: bold;\">Variant<\/span>)<span style=\"color: #333333;\">;<\/span>\r\n<span style=\"color: #008800; font-weight: bold;\">begin<\/span>\r\n  mmLog<span style=\"color: #333333;\">.<\/span>Lines<span style=\"color: #333333;\">.<\/span>Add(<span style=\"background-color: #fff0f0;\">'Event - ['<\/span> <span style=\"color: #333333;\">+<\/span> AEventName <span style=\"color: #333333;\">+<\/span> <span style=\"background-color: #fff0f0;\">'] - ['<\/span> <span style=\"color: #333333;\">+<\/span> AArgument <span style=\"color: #333333;\">+<\/span> <span style=\"background-color: #fff0f0;\">']'<\/span>)<span style=\"color: #333333;\">;<\/span>\r\n<span style=\"color: #008800; font-weight: bold;\">end<\/span><span style=\"color: #333333;\">;<\/span>\r\n<\/pre>\n<\/div>\n<p>&nbsp;<\/p>\n<p>Specifiek voor Microsoft SQL Server moet je de service-broker aanzetten (ALTER DATABASE &lt;your db name&gt; SET ENABLE_BROKER), anders worden er geen events gedeeld met de queue en dus ook geen alerts opgevangen door de FDEventAlerter. Dit staat ook beschreven in <a href=\"https:\/\/docwiki.embarcadero.com\/RADStudio\/Sydney\/en\/Database_Alerts_(FireDAC)\">https:\/\/docwiki.embarcadero.com\/RADStudio\/Sydney\/en\/Database_Alerts_(FireDAC)<\/a> bij Microsoft SQL Server.<\/p>\n<p>Per gebruiker van een FDEventAlerter is er een queue en service nodig. De FDEventAlerter zal deze queue en service aanmaken op het <em>default schema <\/em>van de user van de ingelogde gebruiker. Hierdoor is het dus noodzakelijk om rechten te hebben voor de <em>user <\/em>van de ingelogde gebruiker, zodat deze kunnen aanmaken. De queue en service zullen een unieke naam toegewezen krijgen, wanneer deze niet zijn gegeven. Na afsluiten of unregisteren van de FDEventAlerter ruimt het component de zelf aangemaakte unieke queue en service op.<\/p>\n","protected":false},"featured_media":0,"parent":0,"template":"","class_list":["post-3028","knowledge","type-knowledge","status-publish","hentry","knowledge-category-delphi"],"acf":{"author":310,"type_hero":"compact","hero_image":3030,"hero_image_position":"","hero_title":"","hero_content":"","hero_link":null,"hero_show_h1":false},"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v26.8 (Yoast SEO v27.3) - https:\/\/yoast.com\/product\/yoast-seo-premium-wordpress\/ -->\n<title>Delphi en database events<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/gdksoftware.com\/nl\/kennisbank\/delphi-en-database-events\" \/>\n<meta property=\"og:locale\" content=\"nl_NL\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Delphi en database events\" \/>\n<meta property=\"og:description\" content=\"Delphi en Microsoft SQL Server events Database events zijn een erg handig manier om applicaties te laten weten dat er een bepaalde gebeurtenis zich heeft voorgedaan. In plaats van de applicatie continue naar de database te laten \u2018pollen\u2019, krijg je via een event precies op het juiste moment een seintje dat je vanuit de database [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/gdksoftware.com\/nl\/kennisbank\/delphi-en-database-events\" \/>\n<meta property=\"og:site_name\" content=\"GDK Software\" \/>\n<meta property=\"article:modified_time\" content=\"2022-01-17T09:30:04+00:00\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Geschatte leestijd\" \/>\n\t<meta name=\"twitter:data1\" content=\"3 minuten\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/gdksoftware.com\\\/nl\\\/kennisbank\\\/delphi-en-database-events\",\"url\":\"https:\\\/\\\/gdksoftware.com\\\/nl\\\/kennisbank\\\/delphi-en-database-events\",\"name\":\"Delphi en database events\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/gdksoftware.com\\\/nl#website\"},\"datePublished\":\"2021-11-25T16:11:55+00:00\",\"dateModified\":\"2022-01-17T09:30:04+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/gdksoftware.com\\\/nl\\\/kennisbank\\\/delphi-en-database-events#breadcrumb\"},\"inLanguage\":\"nl-NL\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/gdksoftware.com\\\/nl\\\/kennisbank\\\/delphi-en-database-events\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/gdksoftware.com\\\/nl\\\/kennisbank\\\/delphi-en-database-events#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/gdksoftware.com\\\/nl\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Knowledgebase\",\"item\":\"https:\\\/\\\/gdksoftware.com\\\/nl\\\/kennisbank\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Delphi\",\"item\":\"https:\\\/\\\/gdksoftware.com\\\/nl\\\/kennisbank-categorie\\\/delphi\"},{\"@type\":\"ListItem\",\"position\":4,\"name\":\"Delphi en database events\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/gdksoftware.com\\\/nl#website\",\"url\":\"https:\\\/\\\/gdksoftware.com\\\/nl\",\"name\":\"GDK Software\",\"description\":\"Zet de stip op je horizon\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/gdksoftware.com\\\/nl?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"nl-NL\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Delphi en database events","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/gdksoftware.com\/nl\/kennisbank\/delphi-en-database-events","og_locale":"nl_NL","og_type":"article","og_title":"Delphi en database events","og_description":"Delphi en Microsoft SQL Server events Database events zijn een erg handig manier om applicaties te laten weten dat er een bepaalde gebeurtenis zich heeft voorgedaan. In plaats van de applicatie continue naar de database te laten \u2018pollen\u2019, krijg je via een event precies op het juiste moment een seintje dat je vanuit de database [&hellip;]","og_url":"https:\/\/gdksoftware.com\/nl\/kennisbank\/delphi-en-database-events","og_site_name":"GDK Software","article_modified_time":"2022-01-17T09:30:04+00:00","twitter_card":"summary_large_image","twitter_misc":{"Geschatte leestijd":"3 minuten"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/gdksoftware.com\/nl\/kennisbank\/delphi-en-database-events","url":"https:\/\/gdksoftware.com\/nl\/kennisbank\/delphi-en-database-events","name":"Delphi en database events","isPartOf":{"@id":"https:\/\/gdksoftware.com\/nl#website"},"datePublished":"2021-11-25T16:11:55+00:00","dateModified":"2022-01-17T09:30:04+00:00","breadcrumb":{"@id":"https:\/\/gdksoftware.com\/nl\/kennisbank\/delphi-en-database-events#breadcrumb"},"inLanguage":"nl-NL","potentialAction":[{"@type":"ReadAction","target":["https:\/\/gdksoftware.com\/nl\/kennisbank\/delphi-en-database-events"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/gdksoftware.com\/nl\/kennisbank\/delphi-en-database-events#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/gdksoftware.com\/nl"},{"@type":"ListItem","position":2,"name":"Knowledgebase","item":"https:\/\/gdksoftware.com\/nl\/kennisbank"},{"@type":"ListItem","position":3,"name":"Delphi","item":"https:\/\/gdksoftware.com\/nl\/kennisbank-categorie\/delphi"},{"@type":"ListItem","position":4,"name":"Delphi en database events"}]},{"@type":"WebSite","@id":"https:\/\/gdksoftware.com\/nl#website","url":"https:\/\/gdksoftware.com\/nl","name":"GDK Software","description":"Zet de stip op je horizon","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/gdksoftware.com\/nl?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"nl-NL"}]}},"_links":{"self":[{"href":"https:\/\/gdksoftware.com\/nl\/wp-json\/wp\/v2\/knowledge\/3028","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/gdksoftware.com\/nl\/wp-json\/wp\/v2\/knowledge"}],"about":[{"href":"https:\/\/gdksoftware.com\/nl\/wp-json\/wp\/v2\/types\/knowledge"}],"acf:post":[{"embeddable":true,"href":"https:\/\/gdksoftware.com\/nl\/wp-json\/wp\/v2\/team\/310"}],"wp:attachment":[{"href":"https:\/\/gdksoftware.com\/nl\/wp-json\/wp\/v2\/media?parent=3028"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}