Versuch, eine Effiziente Kalender in Microsoft Access
Arbeite ich an einem Geräte-management-system über eine MS-Access .mdb-Datei für das Frontend und SQL Server 2008 für das back-end. Bei Bedarf kann ich umwandeln das Frontend für einen MS-Access-2010-Datei.
Erstellte ich einen Kalender Formular, wo die Benutzer können sehen, welche Ausrüstung ist gebucht, angemeldet, oder über durch. Es sieht wie folgt aus:
Ich diese mit 42 Unterformulare, die ist leider langsam. Mit den Daten oben gezeigt, es dauert nur etwa 5 Sekunden zum laden, aber sobald ich mit real Daten, es beginnt wirklich bog unannehmbar. Ich versuchte diese effizienter zu gestalten, indem das source-Objekt die Unterformulare leer, bis Sie angezeigt werden, sowie nicht das laden der Datenherkunft bis zu diesem Zeitpunkt. Dies hat geholfen, genug, um das Beispiel oben gesehen laufen einigermaßen schnell, aber es ist noch nicht genug für realen Daten.
Also, was ich tun möchte, wird entweder einen Weg finden, um diese effizient, während immer noch mit Unterformulare, finden Sie ein anderes Steuerelement, das funktioniert in Ort der Unterformulare, oder das wechseln der Unterformulare mit Listboxen, aber irgendwie können Sie immer noch formatieren Sie die Farben der Zeilen. Ich verstehe, das ist unmöglich, nur mit Listboxen, wie es ist, aber ich bin ein Programmierer, und bin bereit, zu versuchen Unterklassen Listboxen, dies zu tun, wenn es nicht verschwenden zu viel von meiner Zeit. Leider habe ich noch nie getan, alle vba-Unterklassen, so würde ich werden müssen, wies auf einige gute Ressourcen, um so zu tun.
Den code zum setzen der Datenherkunft eines jeden Tages Unterformular wie folgt:
f("sub" & X & Y).Form.RecordSource = "SELECT * " & _
"FROM QRY_Calendar " & _
"WHERE CDate(StartDate) <= #" & curDate & "# " & _
"AND ((EndDate IS NULL OR CDate(EndDate) >= #" & curDate & "#)" & _
IIf(CDate(curDate) <= Date, " OR ((Date_In IS NULL OR CDate(Date_In) >= #" & curDate & "#) AND Date_Out IS NOT NULL)", "") & ") " & _
"ORDER BY IIF(Date_Out Is Not Null And (Date_In Is Null Or CDate2(Date_In)>=#" & curDate & "#) And CDate2(EndDate)<#" & curDate & "#,0,iif(CDate2(Date_Out)<=#" & curDate & "# And (Date_In Is Null Or CDate2(Date_In)>=#" & curDate & "#),1,2)), ID"
QRY_Calendar sieht wie folgt aus:
SELECT B.ID, Person, Initials, ProjectNum & '-' & ProjectYear & '-' & Format(TaskNum,'000') AS Project, Sign_Out_Code, Value AS Type, StartDate, EndDate, Date_Out, Date_In
FROM (((TBL_Booking AS B INNER JOIN TBL_Person AS P ON B.PersonID = P.ID) INNER JOIN LKUP_List AS T ON B.EquipTypeID = T.ID) LEFT JOIN TBL_Usage AS U ON B.ID = U.BookingID) LEFT JOIN TBL_Equipment AS E ON U.Equipment_ID = E.ID;
StartDate und EndDate in der Tabelle TBL_Booking sind Beginn und Ende einer Buchung, und Date_Out und Date_In in der Tabelle TBL_Usage sind der Anfang und das Ende eines Zeichens.
Jedes Schild ist mit einer Buchung über das foreign-key-BookingID. Wenn Date_In ist NULL, das bedeutet, dass die Ausrüstung ist derzeit abgemeldet.
LKUP_List ist eine schlecht benannte Tabelle aus, bevor ich begann die Arbeit an diesem vor Jahren, dass ich nie die Mühe zu ändern. Es enthält eine Liste mit (unter anderem) von Arten von Ausrüstung. Buchungen sind für die Geräte-Typen und nicht bestimmte Elemente, und wenn ein Nutzer sich anmeldet, Ihre Ausrüstung, ein Rekord in TBL_Usage erstellt wird, die verknüpft mit einem bestimmten Stück Ausrüstung.
Wenn jemand noch Ideen hat, auf welche Richtung ich nehmen soll und wo ich sehen kann für die Anleitung, es wäre sehr geschätzt werden.
Nein, Buchungs-und Abmeldung erfolgt an anderer Stelle. Das ist einfach so-Benutzer können eine gute Vorstellung von dem, was verwendet wird. Die einzige Wechselwirkung, die hier, abgesehen von der änderung der Monat ist, dass ein Klick auf einen Tag öffnet sich eine detaillierte Ansicht des Tages.
Dies ist also nur ein Bericht? Warum also nicht einfach einen Bericht erstellen?, nicht eine form? Würden Sie sich andere Technologien wie SQL Server Reporting Services? Dies ist über das Internet übermittelt, so dass niemand muss MS Access installiert. Und ich glaube, Sie können rufen Sie einen SSRS-Bericht von MS Access (nur eine URL)
Umgebucht: Dies ist nur eine Funktion in der Benutzeroberfläche für die Datenbank, und jeder hat zumindest die runtime für MS Access installiert sowieso. Ich möchte halten Sie die Kalender-Ansicht, und ein Bericht wird nicht funktionieren, da die Elemente passen nicht in die Boxen, und muss geblättert werden. Die Sache, die wirklich hängen mich ist die Formatierung der Daten. Ich möchte halten Sie die Farbcodierung, aber das ist man von MS-Access-Einschränkungen. Ohne die Farbcodierung, dies sollte einfach zu tun mit einfachen Listenfeldern, die ich ' m vorausgesetzt, würde die Arbeit viel effizienter als Unterformulare.
Vielleicht einen Schritt zurück machen und darüber nachdenken, was der Benutzer versucht zu tun. Welche Schnittstelle ist sehr nützlich für die Benutzer?. Wenn Sie diesen Bericht ausführen, was Sie wirklich suchen? Sind Sie zu sehen, wenn ein GPS ist abgemeldet? Oder wenn eine GPS kostenlos ist? Sind Sie auch interessiert an historischen Informationen? Wollen Sie einfach auf eine Schaltfläche klicken, und die nächste GPS auf den nächsten Tag? Ein Kalender mit Bildlaufleisten, in der Sie jeden Tag gut aussieht, aber möglicherweise nicht begegnen, was Sie sind wirklich nach. Die Tatsache, dass dies ein Bericht ist eine sehr wichtige Unterscheidung.
InformationsquelleAutor NinjaMeTimbers | 2012-11-16
Du musst angemeldet sein, um einen Kommentar abzugeben.
Zunächst das laden der 42 sub-Formulare ein Formular ist extrem schnell, und in der Tat habe ich das getan, für Jahre und Jahre und die Zeit für das laden der 42 sub-Formen ist in der Tat zeitlos.
Somit deutet darauf hin, dass die Leser hier ignorieren kann einige Kommentare hier, die darauf hindeutet, dass eine Skript-basierte-oder text-basierten interpretiert Systeme wie HTML wäre auch irgendwie schneller laufen im inneren irgendeine Art von browser-rendering-system im Vergleich zu einem windows-high-performance-desktop-Anwendung, die in der NÄHE die direkte Fähigkeit zu schreiben, die direkt auf die Grafikkarte.
Denken Sie daran, wenn Sie haben die einfache und grundlegende Kenntnisse, die windows-desktop-Anwendungen können in der Nähe direkt schreiben, um video-Karten, die dann nur wenige würden versuchen zu vergleichen und vorschlagen, dass Sie einen gerenderten system in HTML, keine wirkliche Hoffnung auf einen Vergleich in Bezug auf die Geschwindigkeit, wenn wir vergleichen das sind zwei unterschiedliche Architekturen hier.
Also der Kernpunkt hier ist, wie schnell das können Kalender gemacht werden können, zu laufen und 42 sub-Formen ein Problem sein?
Die Antwort ist einfach, dass 42 sub-Formen ist kein problem und SCHNELL!
Den folgenden Access-Kalender von mir macht in der Nähe von sofort.
Den oben genannten Access-Kalender von mir hat schon seit Jahren nutze, auch in Produktionsumgebungen. Auch wenn die calendas hat jeden Tag mit MEHR Daten, die nicht auf den Bildschirm passen ist es instanct in der Ladezeit. Eine gute Anzahl von diesen ausgeführt werden, in denen der desktop (client) auf eine SQL-server-backend ÜBER STANDARD-INTERNET-verbindungen, um eine gehostete version von SQL server auf einem web-site. Und selbst in diesem eher begrenzten Bandbreite Fall die Ladezeit und die Reaktion der Kalender ist in der Nähe von sofortige. Also Leistung ist, ohne ein Problem, egal ob ich mit einer accDB-Datei (Datei-basiert) - Backend verwenden von SQL server für das Backend, und noch erstaunlicher ist, und wie erwähnt, die form funktioniert gut mit vielen meiner Kunden, die mit diesem Access-Kalender ÜBER regelmäßige internet-verbindungen, bei denen das Backend ist SQL server auf einem gehosteten web-site. Und ich habe sogar eine version mit SharePoint (Liste) back-end und wieder läuft es ohne Probleme und merkliche Verzögerung.
Den oben genannten Entwurf hat 42 sub-Formen, und wie erwähnt, ohne Daten der Unterformulare laden absolut in der Nähe von sofortige. Es ist wichtig, dass Zustand und so habe ich einige Reale und sachliche Beweise herabzusetzen, die anderen Kommentare hier von denen, die eindeutig nicht erfassen und nicht verstehen, grundlegende computer-Architektur. Diese Leute würden daher vorschlagen, dass die Belastung von 42 sub-Formen ist irgendwie in Frage in Bezug auf die Verlangsamung der software, wenn in der Tat, ich kann leicht zeigen, dass dies nicht der Fall. So ist das Zeugnis und das Zeugnis anderer, die hier gezeigt werden können, werden ohne Verdienst und als solche diese Ansicht beruht auf einem MANGEL an Verständnis, wie man die grundlegenden Operationen von Computern die Arbeit in unserer Branche. HTML kann nicht hoffen, zu vergleichen, um so ein setup hier.
Apropos web-basierte jetzt, dass der Zugang ermöglicht es web-publishing-dann poste ich das folgende video von einem Kalender gebaut Zugriff, die in einem Webbrowser läuft. Das browser-basierte Kalender gebaut wurde NUR mit Zugang und ohne tools von Drittanbietern.
http://www.youtube.com/watch?v=AU4mH0jPntI
Das Ergebnis des obigen video zeigt eine BUTTER GLATT und sofort responsive web-basierte version des Kalender-Anwendung.
Nun sollte ich darauf hinweisen, dass in der oben genannten web-basiert Beispiel, die ich nicht verwenden 42 sub-Formen, da Sie in einem web-browser jedes Formular ist mit einem separaten Rahmen und bewirkt, dass ein re-rendering des Formulars, das senden vom server. Dies bedeutet, dass für den Zugriff auf web-basierte design, basierend auf 42 sub-Formen ist AUS der Frage. Sie erleiden einen enormen performance-Treffer in Bezug auf die Darstellung (auch wenn keine Daten da die XMAL form ist auf Abruf geladen, um Zeit zu sparen, aber in diesem Fall das setup weh tut).
Doch wie das video zeigt die Lösung für web-basierte (und würde auch die Arbeit für die client-basierend) war das ausfüllen einer Tabelle, in der Sie binden die Textfelder an die Tabelle. Damit ein Datensatz angezeigt wird, wie erwähnt und gezeigt, in das video oben zeigt, dass ein solches Ergebnis bedeutet, dass in der Nähe sofortige Reaktion und wie erwähnt auch in einem web-browser.
Ich stress die WEB-basierte Anwendung, die das video wurde gebaut, nur mit Hilfe von Access und keine anderen tools.
Nun kommen wir zurück zu den performance-Problemen und einer client-basierten Anwendung. Das problem ist natürlich, wie wir JETZT WISSEN, dass be-42 sub-Formen ist kein Problem.
Das Problem ist natürlich laufen 42 separate SQL-Abfragen mit allen Arten von Ausdrücken zu ziehen, Daten in diese Unterformulare ist, wo der Engpass und langsame Leistung auftreten. Dieser performance-Problem wird sich NICHT ändern, wenn wir mit 42 text-Boxen, oder sogar 42 Listboxen.
Also das Problem ist, dass der Versuch, ausführen 42 separate SQL-Abfragen. Beachten Sie, dass jede SQL-Abfrage braucht Zeit, um zu analysieren, Zeit, um überprüfen Sie die syntax, und dann Abfrage, Pläne etc. sind gebaut. In der Tat eine ziemlich große Zahl von Aktionen, die auftreten müssen, BEVOR die Daten beginnt zu fließen für eine bestimmte Abfrage. Ich habe in der Tat feststellen, dass eine Abfrage, die Kosten von etwa 10.000 Zeilen des Datenflusses in Bezug auf die Bandbreite.
Basierend auf den oben genannten Informationen, der Grund, warum meine mit meinem design diese 42 Unterformulare laden und ausführen momentane ist aufgrund der Tatsache, dass ich ERST ausführen EINER ABFRAGE die Daten für den ganzen Monat. In anderen Worten, führe ich eine Abfrage mit dem start-und Enddatum für die Anzeige. Ich habe dann die Ausführung von VBA-code zu verarbeiten, dass die Daten aus der resultierenden reocrdset in sub-form 1 bis 42. Also VBA-code stopft sich die resultierende Datensatz Daten in der 42 sub-Formen. Also das ist das wesentliche Konzept und Vorschlag hier, um sicherzustellen, high-performance-computing-und nicht eine Verlangsamung.
So, in Zusammenfassung und Fazit:
Den performance-Engpass ist nicht, dass der mit 42 sub-Formen, aber mit der 42 Datensätze und 42 Abfragen und potenziell zusätzlichen code und Ausdrücke müssen ausgewertet werden 42 mal. Beseitigung der 42-Abfragen und das 42 mal und ERNEUT die Durchführung eines solchen SQL-Anweisungen und dieser Engpass wird ziemlich viel verdunsten.
Ich wage zu behaupten, dass mit 42 Listenfelder, oder sogar nur 42 Textfelder und die weitere Ausführung 42 solche SQL-Anweisungen werden nicht Rendite sich lohnt und Verbesserungen in der performance.
SELECT B.ID, P.Person, P.Initials, ProjectNum & '-' & ProjectYear & '-' & FORMAT(TaskNum,'000') AS Project, E.Sign_Out_Code, T.Value AS Type, B.StartDate, B.EndDate, U.Date_Out, U.Date_In
FROM (((TBL_Booking AS B INNER JOIN TBL_Person AS P ON B.PersonID = P.ID) INNER JOIN LKUP_List AS T ON B.EquipTypeID = T.ID) LEFT JOIN TBL_Usage AS U ON B.ID = U.BookingID) LEFT JOIN TBL_Equipment AS E ON U.Equipment_ID = E.ID
WHERE StartDate <= #11/30/2012# AND ((EndDate IS NULL OR EndDate >= #11/01/2012#) OR ((Date_In IS NULL OR Date_In >= #11/01/2012#) AND Date_Out IS NOT NULL));
InformationsquelleAutor Albert D. Kallal
Eine Frage im Zusammenhang mit Kalendern gefragt wurde vor nicht langer Zeit: Erstellen Sie eine " Kalender-matrix in Access
Sagte, dass Sie wahrscheinlich nie eine gute Leistung erzielen, mit 43 Unterformulare gebunden, um nicht-triviale Abfragen.
Geringfügige Verbesserung möglich
Sie sagen nicht, dass, wenn Ihre Daten auf einem backend-server, in dem Fall jedes Unterformular hat zum abrufen von Daten über das Netzwerk.
Wenn das der Fall ist, sollten Sie vielleicht besser tun, eine Abfrage an den server zu ziehen, alle Daten und cache es in der front-end. Sie würde dann nur tun, eine einfache Filterung auf eine lokale Tabelle, die sollte schneller sein, obwohl der 42-Unterformulare sind wahrscheinlich zu einem großen Engpass in der Leistung.
Einem einfachen
INSERT INTO
Abfrage könnte Ihnen den Einstieg-vorausgesetzt, Sie haben eine lokale Tabelle namensmyCacheTable
auf der Grundlage der zurückgegebenen Daten aus Ihrem normalen Abfrage.Lightweight-Steuerelemente
Ist die erste Sache, sollten Sie wahrscheinlich versuchen, es zu verwenden, der ehrwürdige
listbox
.Es ist ziemlich leicht und es gibt viele Möglichkeiten, diese zu konfigurieren.
Wenn Sie kombinieren, dass mit Zwischenspeicherung der Daten vom server wie ich oben erwähnt, Sie könnte eine bessere Leistung erhalten.
Web-fähigen Steuerelemente
Als HelloW erwähnt, kann es eine gute Idee, benutzen Sie einfach die Textfelder gesetzt
TextFormat = RichText
und versorgen Sie mit einfachen HTML-Code (es unterstützt nicht viel) formatieren die Daten in:Voll auf die web-Seite
Vielleicht ein bisschen komplizierter zum einrichten, aber schwer zu schlagen in puncto UI, könnte sein, verwenden Sie eine vorhandene Javascript-Bibliothek, wie FullCalendar, oder Spritzen Sie Ihre eigenen html-Code direkt in den browser ein Dokument (könnten Sie einfachen
<table>
auf das format des Kalenders).Hier ist ein Beispiel dafür, was ein Beispiel online-Kalender sieht, wie in einem
WebBrowser
- Steuerelement in ein Access-Formular:InformationsquelleAutor Renaud Bompuis
Ich bin einverstanden mit der Idee, dass dies funktioniert am besten in HTML.
Ersetzen Sie jedes Unterformular mit einem Textfeld formatiert für rich-text. Dann laden der form (oder anderen Veranstaltungen ) erhalten Sie ein recordset für den Monat und loop es durch das hinzufügen von text zu jedem Textfeld. Die HTML-Untermenge verfügbar ist in der Regel genug, um die meisten Formatierungen, die Sie benötigen.
Überlegungen
<br>
und die color-tagsDas ist ein guter Punkt. Manchmal jedoch ist der client nicht über Outlook, in dem Fall kann dies vielleicht hilfreich sein. Meine Antwort erinnert mich an einen Spruch "Wenn man nur einen hammer hat sieht jedes problem aus wie ein Nagel" 🙂 Dein Kommentar ist gut.
InformationsquelleAutor HelloW
Andere Lösung wäre, machen viele textbox-Steuerelemente, die jeweils eine für den Eintrag in die Kalender-Tag.
Laufen Sie 1 Abfrage schnell!
In VBA Durchlaufen jedes textbox-Steuerelement und weisen Sie die horizontale und vertikale position, - Inhalt (Wert), das format, die Sichtbarkeit (Sie brauchen nicht zu zeigen, ohne Daten).
Nachteil ist, müssen Sie im Voraus entscheiden, wie viele Textfeld-Steuerelemente, die Sie brauchen und können es nicht genug für alle Datensätze geliefert, die query.
Dieses problem zu überwinden, könnte man arbitraryly entscheiden, dass Sie 100 steuert nur die erste Vertretung wichtiger Datensätze aus dem recordset (ex. Überfällig ist), und einen Hinweis, dass "nicht alle Datensätze angezeigt werden". Wenn Benutzer möchte alle Datensätze sehen, klickt er insbesondere Datum und detailliertere Unterformular öffnet, in dem alle Einträge für dieses Datum.
Ich habe nie versucht, in den Kalender, sondern ich habe ein Formular mit Gantt-Diagramm zeigt die Zeit-bars. Jede Zeitleiste ist ein textbox-Steuerelement.
Ich habe 120 steuert, und es funktioniert sofort.
InformationsquelleAutor Alexey
Andere Lösung ist die Verwendung von Tcal, die ich gerade aktualisiert auf version 1.4.2
Was ist Tcal?
Tcal ist ein Client-Server cross-Plattform-Kalender mit einer kompletten graphischen Schnittstelle. Mit TcalServer und TCP/IP, Tcal zeichnet Ereignisse, Termine und Arbeitszeiten für Ihr Unternehmen personalisierte FileMaker Pro, Microsoft Access oder MySQL-Datenbank-Dateien. Sie können die Ressourcen-und job-Namen zu Ihren Veranstaltungen finden Sie unter anderen Ressource-Kalender annehmen oder ablehnen der Einladung. Tcal arbeitet auf Mac OSX und Fenster (7 oder XP) und ist KOSTENLOS, für max 2 verbundenen Benutzer.
Finden Sie Tcal hier: http://www.tcal.it/eng/index.html
InformationsquelleAutor Trevix