{"id":55000311,"date":"2016-02-01T00:00:00","date_gmt":"2020-01-24T15:59:33","guid":{"rendered":"http:\/\/access-im-unternehmen.aix-dev.de\/aiu\/?p=311"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-30T00:00:00","slug":"Horoskopgenerator","status":"publish","type":"post","link":"https:\/\/access-basics.de\/index.php\/Horoskopgenerator.html","title":{"rendered":"Horoskopgenerator"},"content":{"rendered":"<p class='introduction'>Nein, um jene Horoskope, die Sie gemeinhin in Zeitschriften finden, geht es hier nicht. Wir stellen eine Datenbankl&ouml;sung vor, die echte Geburtshoroskope auf astrologischer Basis erzeugen kann, wobei eine Deutung dieser allerdings nicht stattfindet. Ob Sie daran glauben, oder nicht, spielt weniger eine Rolle. Hier geht es um einige Techniken, die sich auch in anderen Datenbanken einsetzen lassen.<\/p>\n<h2>Beispieldatenbank<\/h2>\n<p>Die Beispiele dieses Artikels finden Sie in der Datenbank <b>1602_Horoskope.zip<\/b>.<\/p>\n<h2>Geburtshoroskope<\/h2>\n<p>In Bild 1 finden Sie gleich ein Beispiel f&uuml;r ein Geburtshoroskop, wie es das Formular <b>frmHoroskope<\/b> der Beispieldatenbank generiert. Im Block links oben geben Sie Daten einer Person ein, zu der das Horoskop erstellt werden soll. Das sind neben dem Namen das <b>Geburtsdatum<\/b> und die <b>Geburtszeit<\/b>, und schlie&szlig;lich noch der <b>Geburtsort<\/b>. Aus diesem berechnet die Datenbank mithilfe der Tabelle <b>tblOrte<\/b> den <b>L&auml;ngen<\/b>&#8211; und <b>Breitengrad<\/b>, die Sie gegebenenfalls aber auch manuell eingeben k&ouml;nnen. Ein Klick auf die Schaltfl&auml;che <b>Update<\/b> berechnet nun die Positionen der Horoskopelemente, listet diese tabellarisch auf, und zeigt sie in der Grafik rechts im Formular an. Sollte die Materie f&uuml;r Sie neu sein, wovon wir einmal ausgehen, so folgen hier einige Erl&auml;uterungen zur Horoskopberechnung und -gestaltung.<\/p>\n<p class=\"image\"><a rel=\"lightbox\" href=\"..\/tl_files\/images\/frmHoroskope_Runtime.png\"><img decoding=\"async\" src=\"..\/tl_files\/images\/frmHoroskope_Runtime.png\" alt=\"Das Formular frmHoroskope erstellt echte Geburtshoroskope unter Zuhilfenahme einer speziellen DLL\" width=\"325\" \/><\/a><\/p>\n<p class='imagetext'>Bild 1: Das Formular frmHoroskope erstellt echte Geburtshoroskope unter Zuhilfenahme einer speziellen DLL<\/p>\n<p>F&uuml;r ein Geburtshoroskop werden die Positionen der Planeten des Sonnensystems auf astronomischer Grundlage berechnet. Ausschlaggebend hierf&uuml;r sind Geburtsdatum und -zeit, da sich die Planeten schlie&szlig;lich dauernd fortbewegen. Als Ergebnis erhalten Sie den Winkel, welcher sich vom sogenannten <b>Fr&uuml;hlingspunkt<\/b> als Nullkoordinate zum Planeten l&auml;ngs &uuml;ber die <b>Ekliptik<\/b> aufspannt. Die <b>Ekliptik<\/b> ist quasi jene Bahn, die um die Erde herumf&uuml;hrt, und auf welcher sich die Planeten bewegen. Der Winkel kann daher Werte von 0 bis 360 Grad annehmen. Dieser Kreis wird linear in zw&ouml;lf Bereiche unterteilt, die sich den verschiedenen <b>Tierkreiszeichen<\/b> zuordnen. Tats&auml;chlich stehen in diesen Bereichen nur ungef&auml;hr die entsprechenden Sternbilder, weil auch diese sich mit der Zeit fortbewegen, die Astrologie beh&auml;lt die 30-Grad-Unterteilung aber stringent bei.<\/p>\n<p>Die Berechnung ergibt also f&uuml;r jeden Planeten eine Position, die einem Tierkreiszeichen zugeordnet ist. Damit bekommt der Planet nach astrologischer Auslegung einen bestimmten Charakter. So befindet sich die <b>Sonne<\/b> von <b>Herbert Klammer<\/b> in Bild 1 etwa im Winkel von 141,2 Grad zum Ursprung und ist damit dem Zeichen <b>L&ouml;we<\/b> zugeteilt. Und die Sonnenposition bestimmt nach dem Alltagsgebrauch das generelle Sternzeichen. <b>Herbert<\/b> ist also L&ouml;we. W&uuml;rde ein Astrologe dies deuten, so k&auml;me er zur Auffassung, dass Herbert in seinem Wesen recht selbstbewusst daher kommt, sich gerne im Mittelpunkt sieht, und auch motorisch ein gewisses Kraftpotential aufweist. Er ist nicht so leicht aus der Fassung zu bringen und das geborene Alpha-Tier.<\/p>\n<p>&auml;hnlich werden auch die weiteren Planetenpositionen gedeutet, wobei jeder Planet f&uuml;r eine bestimmte Charakteristik steht. &uuml;brigens werden Sonne und Mond in der Astrologie genau so behandelt, wie Planeten. Hinzu kommt noch als wesentlicher Bestandteil des Horoskops der <b>Aszendent<\/b>, welcher in der Grafik durch die rote Linie symbolisiert ist. Das ist kein Planet, sondern jene Position, welche zum Geburtszeitpunkt eben am Horizont im Osten aufging. Auch diese kann einem Sternzeichen zugeordnet werden. Der Aszendent soll, so die Astrologie, &auml;hnlich gewichtig sein, wie die Sonnenposition, und g&auml;be Auskunft &uuml;ber die Au&szlig;enwirkung einer Person.<\/p>\n<p>Nicht in unsere L&ouml;sung eingebaut sind die sogenannten <b>H&auml;user<\/b> des Horoskops. Das w&auml;ren, ausgehend vom Aszendenten, ebenfalls zw&ouml;lf Bereiche des die Erde entlang der Ekliptik umgebenden Universums. Sie sollen R&uuml;ckschl&uuml;sse &uuml;ber einzelne Lebensbereiche einer Person zulassen. Wir lassen das weg, weil die L&ouml;sung dann noch komplexer ausgefallen w&auml;re, als sie es ohnehin schon ist.<\/p>\n<p>Schlie&szlig;lich haben Sie m&ouml;glicherweise auch schon von den <b>vier Elementen<\/b> <b>Erde<\/b>, <b>Wasser<\/b>, <b>Luft<\/b> und <b>Feuer<\/b> geh&ouml;rt. Jedes Tierkreiszeichen korreliert mit einem dieser Elemente. Befindet sich zum Geburtszeitpunkt in einem Tierkreisbereich ein Planet, so verst&auml;rkt dieser den Charakter des zugeordneten Elements. Man kann die Elemente somit &uuml;ber eine Gewichtungsformel aufaddieren und kommt so zu den prozentualen Anteilen, die links unten im Formular zu sehen sind. Auf sie bezieht sich die Minideutung in der untersten Zeile &uuml;brigens.<\/p>\n<p>F&uuml;r das Horoskop sind an sich nur die Werte der Planetenpositionen relevant. &uuml;bersichtlicher ist jedoch deren Darstellung in einer Grafik. Jeder Planet besitzt ein Symbol und jedes Tierkreiszeichen ebenso. In der Abbildung befindet sich etwa der <b>Jupiter<\/b> links im Sternzeichen <b>Fische<\/b>. Wenn Sie herausfinden m&ouml;chten, welches Symbol welchem Element entspricht, so klicken Sie einfach mit der Maus auf entweder ein Sternzeichen im &auml;u&szlig;eren Ring, oder auf das Symbol eines Planeten im inneren Bereich. Rechts unten im Info-Label wird dann der Name des Elements ausgegeben.<\/p>\n<h2>Verwendete Techniken<\/h2>\n<p>Schauen wir uns im &uuml;berblick an, wie die L&ouml;sung in der Beispieldatenbank realisiert wurde.<\/p>\n<p>Die Grundlage der Datenbank sind nat&uuml;rlich ihre Tabellen. Hier gibt es eine Tabelle <b>tblHoroskope<\/b>, welche die Personendaten aufnimmt &#8211; man h&auml;tte sie genauso gut <b>tblPersonen<\/b> nennen k&ouml;nnen. Zwei weitere Tabellen listen als Nachschlagetabellen die Planeten und Sternzeichen namentlich auf. Zwischen diesen und der Horoskoptabelle besteht &uuml;ber die <b>n:m-Tabelle<\/b> <b>tblHoroskopZeichen<\/b> eine Beziehung. Schlie&szlig;lich vervollst&auml;ndigt eine Elemente-Tabelle <b>tblElemente<\/b>, verkn&uuml;pft mit den Tierzeichen und Planeten, das Datenmodell.<\/p>\n<p>Das Formular <b>frmHoroskope<\/b> baut auf diesen Tabellen auf, wobei nicht <b>tblHoroskope<\/b> die Datenherkunft darstellt, sondern ein Abfrage <b>qry_Horoskopzeichen<\/b>. Warum das so ist, das sehen wir noch sp&auml;ter. Neben den Textfeldern f&uuml;r die Werte der zugrundeliegenden Daten finden sich noch <b>ungebundene Textfeldern<\/b>, deren Inhalt per VBA berechnet wird. F&uuml;r die Grafik ist ein <b>Bildsteuerelement<\/b> verantwortlich, welches von einem roten <b>Liniensteuerelement<\/b> f&uuml;r den Aszendenten &uuml;berlagert wird. Einzelne Textfelder, die einen speziellen <b>Astrologie-Font<\/b> als Schriftart aufweisen, werden zur Laufzeit &uuml;ber der Grafik positioniert, wof&uuml;r die VBA-Routinen des Formularmoduls herangezogen werden.<\/p>\n<p>Die Berechnung der <b>Ephemeriden<\/b>, also der astronomischen Planetenpositionen zu einem bestimmten Zeitpunkt, ist einen Angelegenheit, die &uuml;ber VBA-Code nicht zu bew&auml;ltigen ist, F&uuml;r die iterative L&ouml;sung des als <b>Mehrk&ouml;rperproblem<\/b> in der Physik bekannten Themas kommen ungeheuer komplexe differenzielle Gleichungssystem zum Einsatz, f&uuml;r die die Performance von VBA nicht ausreicht. Zum Gl&uuml;ck gibt es eine frei verf&uuml;gbare und st&auml;ndig weiterentwickelte Komponente des Astrodienst Z&uuml;rich, die sogenannte <b>Swiss Ephemerisis<\/b>. Die kommt in Gestalt einer einzigen <b>DLL<\/b> daher, welche &uuml;ber <b>API-Programmierung<\/b> angesprochen wird. Sie berechnet mit nur einem Funktionsaufruf alle Positionen der Planeten und weitere Elemente. Wenn an die Genauigkeit dieser Berechnung h&ouml;here Anforderungen gestellt werden, so bedient sie sich optional weiterer Komponenten, n&auml;mlich einiger Datendateien, die vorberechnete Tabellen enthalten.<\/p>\n<p>DLL und die f&uuml;r den relevanten Zeitraum verantwortlichen Dateien sind der Beispieldatenbank beigef&uuml;gt.<\/p>\n<p>Die Datenbank kommt ansonsten ohne weitere Bibliotheken aus. Zus&auml;tzliche Verweise sind also nicht zu setzen. <\/p>\n<h2>Installation<\/h2>\n<p>Es gibt keine Installation. Die DLL muss nicht auf dem Rechner registriert werden. Es reicht aus, dass sie sich im Ordner parallel zur <b>ACCDB<\/b> befindet. Lediglich die Schriftart <b>AstroFont99<\/b> muss installiert werden. Dazu rechtsklicken Sie die Datei <b>Awf99.ttf <\/b>im Explorer und w&auml;hlen aus dem Kontextmen&uuml; <b>Installieren<\/b> aus. Die Schriftart wird damit in den <b>Font<\/b>-Ordner von Windows kopiert und im System registriert.<\/p>\n<h2>API-Programmierung<\/h2>\n<p>Mit diesem Thema hatten wir es in <b>Access [basics]<\/b> noch nicht zu tun. Grund daf&uuml;r ist, dass es sich dabei um eine eher fortgeschrittene Technik handelt, vor der viele VBA-Entwickler zur&uuml;ckschrecken. Dabei ist die Sache einfacher, als man denkt. Zwar k&ouml;nnte man damit nicht nur eine komplette Ausgabe von <b>Access [basics]<\/b> f&uuml;llen, sondern ohne weiteres ein ganzes Buch, doch die Grundlagen sind schnell erl&auml;utert.<\/p>\n<p>Unter <b>API-Programmierung<\/b> (<b>Application Programming Interface<\/b>) versteht man landl&auml;ufig den Zugriff auf Funktionen in externen Bibliotheken. Das sind in der Regel die System-DLLs von Windows, die manche Funktionen nach au&szlig;en hin ver&ouml;ffentlichen. Gerade hier liegt der Hund begraben. Denn zum einen gibt es kein einfaches Verzeichnis dieser Funktionen. Es ist die <b>Windows-SDK<\/b>-Dokumentation der Microsoft-MSDN-Seiten im Internet zu Rate zu ziehen. Zum anderen ist die Zielgruppe dieser Dokumentation der <b>C<\/b>-Entwickler. Beispiele und Funktionssyntax in den Artikel sind allesamt in der Sprache <b>C<\/b> gehalten, der Inhalt auf Englisch. Verst&auml;ndlicherweise ist das f&uuml;r  VBA-Entwickler schwer verdauliche Kost.<\/p>\n<p>Neben den Windows-eigenen Funktionen lassen sich nach dem gleichen Prinzip jedoch auch DLLs von Drittherstellern ansprechen. Hier ist eine ausf&uuml;hrliche Dokumentation nat&uuml;rlich noch wichtiger. Und vor allem ben&ouml;tigen Sie die Syntax der <b>API-Funktionen<\/b> auch in der Sprache VB(A). Denn das &uuml;bersetzen einer C-Syntax nach VBA ist eine Angelegenheit, die Experten vorbehalten ist.<\/p>\n<p>Nehmen wir einfach, statt uns in abstrakten Theorien zu ergehen, ein Beispiel zur Hand. Sie m&ouml;chten etwa &uuml;ber eine API-Funktion die Titelzeile des Access-Hauptfensters auslesen. Daf&uuml;r kommt die Funktion <b>GetWindowText<\/b> in der <b>user32.dll<\/b>, beheimatet im Systemordner von Windows, infrage. Damit sie angesprochen werden kann, ben&ouml;tigen wir zun&auml;chst zwingend eine VBA-Deklaration dieser Funktion. Sie finden sie in der ersten Zeile von Listing 1.<\/p>\n<pre><span style=\"color:blue;\">Public <\/span>Declare Function GetWindowText _\r\n     Lib \"user32.dll\" _\r\n     Alias \"GetWindowTextA\" _\r\n     (ByVal hwnd<span style=\"color:blue;\"> As Long<\/span>, _\r\n     ByVal lpString<span style=\"color:blue;\"> As String<\/span>, _\r\n     ByVal cch<span style=\"color:blue;\"> As Long<\/span>)<span style=\"color:blue;\"> As Long<\/span>\r\n<span style=\"color:blue;\">Sub <\/span>AccessFensterTitel()\r\n     <span style=\"color:blue;\">Dim <\/span>hwndAcc<span style=\"color:blue;\"> As Long<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>sTitle<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>ret<span style=\"color:blue;\"> As Long<\/span>\r\n     \r\n     hwndAcc = Application.hWndAccessApp\r\n     sTitle = String(255, 0)\r\n     ret = GetWindowText(hwndAcc, _\r\n                         sTitle, 255)\r\n     <span style=\"color:blue;\">If <\/span>ret > 0<span style=\"color:blue;\"> Then<\/span>\r\n         <span style=\"color:blue;\">Debug.Print<\/span> <span style=\"color:blue;\">Left<\/span>(sTitle, ret)\r\n     <span style=\"color:blue;\">End If<\/span>\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p class='imagetext'>Listing 1: API-Routine zum Auslesen des Fenstertitels von Access<\/p>\n<p>Eine <b>API-Deklaration<\/b> findet immer im Kopf eines Moduls statt und wird durch den Ausdruck <b>Declare Function<\/b> oder <b>Declare Sub<\/b> eingeleitet. Je nachdem, ob die Funktion dann nur in diesem Modul oder von &uuml;berall her aufgerufen werden soll, stellen Sie entweder ein <b>Public<\/b> oder ein <b>Private<\/b> voran.<\/p>\n<p>Darauf folgt der Name der Funktion, welcher hier <b>GetWindowText<\/b> lautet. W&uuml;rden Sie die DLL damit aufrufen, so k&auml;me es zu einer Fehlermeldung <b>DLL-Einsprungspunkt GetWindowText in user32.dll nicht gefunden<\/b>. Tats&auml;chlich gibt es diese Funktion in der DLL auch gar nicht! Vielmehr existieren zwei: einmal eine f&uuml;r <b>ANSI<\/b>-Strings ausgelegte und einmal eine f&uuml;r <b>Unicode<\/b>-Strings. Deren Namen laute dann aber <b>GetWindowTextA<\/b> und <b>GetWindowTextW<\/b> &#8211; das <b>W<\/b> steht f&uuml;r <b>Wide Character<\/b>. Der folgende Ausdruck <b>Alias<\/b> tr&auml;gt dem Rechnung. Zwar sprechen Sie die Funktion im Code sp&auml;ter mit <b>GetWindowText<\/b> an, der Aufruf wird jedoch &uuml;ber den <b>Alias<\/b> an <b>GetWindowTextA<\/b> der DLL weitergeleitet. Bliebe noch zu erw&auml;hnen, dass API-Funktionen <b>case sensitive<\/b> sind. Sie haben also auf korrekte Gro&szlig;- und Kleinschreibung der Zeichen zu achten.<\/p>\n<p>Vor dem <b>Alias<\/b>, aber nach dem Funktionsnamen, steht &uuml;ber den Ausdruck <b>Lib<\/b> noch die Bibliothek, in der die Funktion gefunden werden kann. Hier handelt es sich um die <b>user32.dll<\/b>. F&uuml;r den hier eingesetzten String gilt Folgendes: Entweder setzen Sie den Namen einer DLL-Datei ein, die sich im <b>Suchpfad<\/b> von Windows befindet, oder Sie geben den kompletten Pfad der Datei an. Die Dateierweiterung k&ouml;nnen Sie auch weglassen, wenn es sich um eine DLL handelt, da Windows dann automatisch von einer DLL ausgeht. Diese Angaben w&auml;ren also alle korrekt:<\/p>\n<pre>user32\r\nuser32.dll\r\nc:\\windows\\system32\\user32.dll<\/pre>\n<p>Der Suchpfad von Windows umfasst im Wesentlichen die Systemordner. Befindet sich eine Bibliotheksdatei au&szlig;erhalb dieses Suchpfads, so ist der komplette Pfad anzugeben &#8211; mit einer Ausnahme: DLLs, die Access f&uuml;r sein eigenes Funktionieren schon geladen hat, k&ouml;nnen ebenfalls ohne Ordnerpfad angesprochen werden.<\/p>\n<p>Was sich nun in der umgebrochenen Deklarationszeile anschlie&szlig;t ist die Liste der erwarteten Parameter und der R&uuml;ckgabewert der Funktion, genau so, wie es sich bei einer VBA-Funktion verh&auml;lt. Wir haben hier den Parameter <b>hwnd<\/b> des Datentyps <b>Long<\/b> vor uns, <b>lpString<\/b> ist die String-Variable, die nach dem Aufruf den Fenstertitel erhalten soll, und <b>cch<\/b> des Typs <b>Long<\/b> gibt an, wie lange der Text maximal sein darf. Die R&uuml;ckgabe der Funktion ist ebenfalls vom Typ <b>Long<\/b>. Bei Erfolg ist deren Wert gr&ouml;&szlig;er, als 0, und gibt dann die Anzahl der in den String eingesetzten Zeichen wider.<\/p>\n<p>Extrem wichtig ist auch der &uuml;bergabetyp der Parameter. Es ist, im Gegensatz zu den meisten VBA-Funktionen, nicht egal, ob eine <b>ByVal<\/b>&#8211; oder eine <b>ByRef<\/b>-&uuml;bergabe stattfindet. Eine Erl&auml;uterung, warum das so ist, sprengte allerdings den Rahmen dieses Beitrags.<\/p>\n<p>Einmal deklariert, l&auml;sst sich die API-Funktion &uuml;ber deren Namen von beliebiger Stelle Ihres Codes aus aufrufen.<\/p>\n<p>In der Routine <b>AccessFensterTitel<\/b>, die Sie etwa aus dem VBA-Direktfenster aus aufrufen, wird der Variablen <b>hwndAcc<\/b> zun&auml;chst das sogenannte <b>Fenster-Handle<\/b> von Access zugewiesen. Das steht &uuml;ber die Eigenschaft <b>hwndAccessApp<\/b> des <b>Application<\/b>-Objekts immer zur Verf&uuml;gung. Anhand dieses Fenster-Handles berechnet die <b>user32.dll <\/b>schlie&szlig;lich den Fenstertitel in der &uuml;bergebenen Variablen <b>sTitle<\/b>. Der Wert dieser Variablen wird davor jedoch noch mittels <b>String()<\/b>-Funktion auf 255 Null-Zeichen gebracht. Hier wird bereits eine Abweichung zu VBA-Routinen sichtbar. W&auml;hrend ein String hier meist von der Funktion selbst eingerichtet wird, sieht das h&auml;ufig bei API-Funktionen anders aus. Diese gehen davon aus, dass der &uuml;bergebene String bereits alloziert ist, also schon eine feste Speichergr&ouml;&szlig;e aufweist. W&uuml;rden Sie <b>sTitle<\/b> ungef&uuml;llt &uuml;bergeben, so enthielte die Variable nur einen <b>Null-String<\/b> der L&auml;nge 0. Die API-Funktion versuchte dennoch, den Fenstertitel an die Adresse des Strings zu schreiben &#8211; mit fatalen Folgen! Es k&auml;me zum Schreiben in ungesch&uuml;tzte Speicherbereiche, was Access meist mit einem Absturz quittiert.<\/p>\n<p>Zur&uuml;ck zu unserer Prozedur. Die Variable <b>ret<\/b> nimmt die Anzahl an Zeichen entgegen, die die API-Funktion produziert hat. Ist diese gr&ouml;&szlig;er, als 0, dann lief alles glatt, und der relevante Teil des Strings wird &uuml;ber <b>Left<\/b> und <b>Debug.Print<\/b> in das VBA-Direktfenster ausgegeben.<\/p>\n<p>Nun werden Sie wohl kaum die Syntax der API-Funktionen selbst anfertigen wollen. Zwar kann es nicht schaden, sich die Dokumentation etwa zu <b>GetWindowText<\/b> im Internet zu Gem&uuml;te zu f&uuml;hren, um weitere Details zu erfahren, aber das &uuml;bersetzen von <b>C<\/b> nach <b>VBA<\/b> &uuml;berlassen Sie einfach Anderen. Ein Werkzeug, das sich daf&uuml;r gut eignet, ist der API-Viewer von ActiveVB (siehe Bild 2), eine <b>Standalone<\/b>-Anwendung, die praktisch alle Windows-Funktionen auflistet, die Ihnen &uuml;ber den Weg laufen werden. &uuml;ber die Suchzeile navigieren Sie zum Funktionsnamen und doppelklicken ihn, worauf die Deklaration in das rechte Fenster &uuml;bertragen wird. Das k&ouml;nnen Sie mehrmals hintereinander durchf&uuml;hren. Zuletzt klicken Sie auf das <b>Copy<\/b>-Symbol, was den <b>API-Viewer<\/b> veranlasst, alle gew&uuml;nschten Deklarationen als Text in die Zwischenablage zu kopieren. F&uuml;gen Sie diese danach in ein VBA-Modul Ihrer Wahl ein.<\/p>\n<p class=\"image\"><a rel=\"lightbox\" href=\"..\/tl_files\/images\/APIViewer.png\"><img decoding=\"async\" src=\"..\/tl_files\/images\/APIViewer.png\" alt=\"Der API Viewer enth&auml;lt die gebr&auml;uchlichsten Windows-API-Deklarationen\" width=\"325\" \/><\/a><\/p>\n<p class='imagetext'>Bild 2: Der API Viewer enth&auml;lt die gebr&auml;uchlichsten Windows-API-Deklarationen<\/p>\n<h2>Ephemeridenberechnung per API-Funktion<\/h2>\n<p>Die Planetenposition werden in der Beispieldatenbank mithilfe der zus&auml;tzlichen DLL <b>swedll32.dll<\/b> berechnet. Die von dieser Bibliothek exportierten Funktionen sind auf den Seiten der Entwickler gut dokumentiert. Auch hier haben wir es allerdings mit dem &uuml;blichen <b>C<\/b>-Slang zu tun. Der Hersteller l&auml;sst uns aber nicht im Regen stehen, denn es steht auch ein <b>VB6<\/b>-Projekt bereit, welches schon die API-Deklarationen enth&auml;lt.<\/p>\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>Access &#091;basics&#093;<\/strong>:<\/span><br \/>\n<span style=\"color: #ff0000;\"><a style=\"color: #ff0000;\" href=\"https:\/\/shop.minhorst.com\/magazine\/282\/access-basics?c=77\">Zur Bestellung ...<\/a><\/span><br \/>\n<span style=\"color: #ff0000;\">Danach greifen Sie sofort auf <strong>alle rund 400 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:\/\/access-basics.de\/data\/wp\/v2\/posts\/55000311\/\">\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=\"\/index.php\/data\/wp\/v2\/posts\/55000311?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\t\t\t\t\t<input type=\"hidden\" name=\"rcp_redirect\" value=\"https:\/\/access-basics.de\/data\/wp\/v2\/posts\/55000311\/\"\/>\n\t\t\t\t\t\t\t\t<input type=\"hidden\" name=\"rcp_login_nonce\" value=\"a4912ba1e1\"\/>\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>Nein, um jene Horoskope, die Sie gemeinhin in Zeitschriften finden, geht es hier nicht. Wir stellen eine Datenbankl&ouml;sung vor, die echte Geburtshoroskope auf astrologischer Basis erzeugen kann, wobei eine Deutung dieser allerdings nicht stattfindet. Ob Sie daran glauben, oder nicht, spielt weniger eine Rolle. Hier geht es um einige Techniken, die sich auch in anderen Datenbanken einsetzen lassen.<\/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":[66012016,662016,44000014],"tags":[],"class_list":["post-55000311","post","type-post","status-publish","format-standard","hentry","category-66012016","category-662016","category-Loesungen"],"aioseo_notices":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v15.9.2 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Horoskopgenerator - Access [basics]<\/title>\n<meta name=\"description\" content=\"Nein, um jene Horoskope, die Sie gemeinhin in Zeitschriften finden, geht es hier nicht. Wir stellen eine Datenbankl\u00f6sung vor, die echte Geburtshoroskope auf astrologischer Basis erzeugen kann, wobei eine Deutung dieser allerdings nicht stattfindet. Ob Sie daran glauben, oder nicht, spielt weniger eine Rolle. Hier geht es um einige Techniken, die sich auch in anderen Datenbanken einsetzen lassen.\" \/>\n<link rel=\"canonical\" href=\"https:\/\/access-basics.de\/index.php\/Horoskopgenerator.html\" \/>\n<meta property=\"og:locale\" content=\"de_DE\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Horoskopgenerator - Access [basics]\" \/>\n<meta property=\"og:description\" content=\"Nein, um jene Horoskope, die Sie gemeinhin in Zeitschriften finden, geht es hier nicht. Wir stellen eine Datenbankl\u00f6sung vor, die echte Geburtshoroskope auf astrologischer Basis erzeugen kann, wobei eine Deutung dieser allerdings nicht stattfindet. Ob Sie daran glauben, oder nicht, spielt weniger eine Rolle. Hier geht es um einige Techniken, die sich auch in anderen Datenbanken einsetzen lassen.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/access-basics.de\/index.php\/Horoskopgenerator.html\" \/>\n<meta property=\"og:site_name\" content=\"Access [basics]\" \/>\n<meta property=\"article:published_time\" content=\"2020-01-24T15:59:33+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"-0001-11-30T00:00:00+00:00\" \/>\n<meta property=\"og:image\" content=\"http:\/\/..\/tl_files\/images\/frmHoroskope_Runtime.png\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Gesch\u00e4tzte Lesezeit\">\n\t<meta name=\"twitter:data1\" content=\"34\u00a0Minuten\">\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"WebSite\",\"@id\":\"https:\/\/access-basics.de\/#website\",\"url\":\"https:\/\/access-basics.de\/\",\"name\":\"Access [basics]\",\"description\":\"DAS ACCESS-MAGAZIN F\\u00dcR ALLE, DIE VON 0 AUF 100 WOLLEN\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":\"https:\/\/access-basics.de\/?s={search_term_string}\",\"query-input\":\"required name=search_term_string\"}],\"inLanguage\":\"de\"},{\"@type\":\"ImageObject\",\"@id\":\"https:\/\/access-basics.de\/index.php\/Horoskopgenerator.html#primaryimage\",\"inLanguage\":\"de\",\"url\":\"..\/tl_files\/images\/frmHoroskope_Runtime.png\"},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/access-basics.de\/index.php\/Horoskopgenerator.html#webpage\",\"url\":\"https:\/\/access-basics.de\/index.php\/Horoskopgenerator.html\",\"name\":\"Horoskopgenerator - Access [basics]\",\"isPartOf\":{\"@id\":\"https:\/\/access-basics.de\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/access-basics.de\/index.php\/Horoskopgenerator.html#primaryimage\"},\"datePublished\":\"2020-01-24T15:59:33+00:00\",\"dateModified\":\"-0001-11-30T00:00:00+00:00\",\"author\":{\"@id\":\"https:\/\/access-basics.de\/#\/schema\/person\/13395c4bcd7d7963efe33be9c584d93f\"},\"description\":\"Nein, um jene Horoskope, die Sie gemeinhin in Zeitschriften finden, geht es hier nicht. Wir stellen eine Datenbankl\\u00f6sung vor, die echte Geburtshoroskope auf astrologischer Basis erzeugen kann, wobei eine Deutung dieser allerdings nicht stattfindet. Ob Sie daran glauben, oder nicht, spielt weniger eine Rolle. Hier geht es um einige Techniken, die sich auch in anderen Datenbanken einsetzen lassen.\",\"breadcrumb\":{\"@id\":\"https:\/\/access-basics.de\/index.php\/Horoskopgenerator.html#breadcrumb\"},\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/access-basics.de\/index.php\/Horoskopgenerator.html\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/access-basics.de\/index.php\/Horoskopgenerator.html#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"item\":{\"@type\":\"WebPage\",\"@id\":\"https:\/\/access-basics.de\/\",\"url\":\"https:\/\/access-basics.de\/\",\"name\":\"Home\"}},{\"@type\":\"ListItem\",\"position\":2,\"item\":{\"@type\":\"WebPage\",\"@id\":\"https:\/\/access-basics.de\/index.php\/Horoskopgenerator.html\",\"url\":\"https:\/\/access-basics.de\/index.php\/Horoskopgenerator.html\",\"name\":\"Horoskopgenerator\"}}]},{\"@type\":\"Person\",\"@id\":\"https:\/\/access-basics.de\/#\/schema\/person\/13395c4bcd7d7963efe33be9c584d93f\",\"name\":\"Andr\\u00e9 Minhorst\",\"image\":{\"@type\":\"ImageObject\",\"@id\":\"https:\/\/access-basics.de\/#personlogo\",\"inLanguage\":\"de\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g\",\"caption\":\"Andr\\u00e9 Minhorst\"}}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","_links":{"self":[{"href":"https:\/\/access-basics.de\/index.php\/data\/wp\/v2\/posts\/55000311","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/access-basics.de\/index.php\/data\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/access-basics.de\/index.php\/data\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/access-basics.de\/index.php\/data\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/access-basics.de\/index.php\/data\/wp\/v2\/comments?post=55000311"}],"version-history":[{"count":0,"href":"https:\/\/access-basics.de\/index.php\/data\/wp\/v2\/posts\/55000311\/revisions"}],"wp:attachment":[{"href":"https:\/\/access-basics.de\/index.php\/data\/wp\/v2\/media?parent=55000311"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/access-basics.de\/index.php\/data\/wp\/v2\/categories?post=55000311"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/access-basics.de\/index.php\/data\/wp\/v2\/tags?post=55000311"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}