![]() |
Arbeitszeiterfassung: Die Fortsetzung
Hallo mwerk,
heute möchte ich ein paar Tipps zum Hauptformular zum Besten geben. Nachdem das Login steht, weist du, wer sich da angemeldet hat, darum wäre es schön, wenn der Benutzer auch persönlich begrüßt wird. Dazu sage ich später etwas mehr. Die wichtigste Frage ist erst einmal, wie die Daten beschränkt werden, so dass der Benutzer nur auf seine eigenen Daten zugreifen kann. Dazu sind zwei Vorgehensweisen möglich. Entweder über TTable Objekte und Filter oder über SQL. Ich werde hier einmal den zweiten Ansatz etwas näher erläutern. Zunächst sollen die Daten des angemeldeten Users geholt werden. Dazu ziehst du ein Tquery Komponente auf das Formular und setzt DataBaseName auf den Alias, der auf deine Tabellen zeigt. Der SQL Eigenschaft weist du folgenden Code zu:
Code:
Das mit dem Parameter kennst du ja schon. Setze seinen Typ auf String.
SELECT * FROM Arbeitszeit WHERE
PersonalNummer = :Pnr Die Query habe ich qrySelData genannt. Beim Activieren des Formulars soll dann folgender Code ausgeführt werden:
Delphi-Quellcode:
Jetzt wird der Nutzer schon einmal begrüßt (in der Caption) und seine Daten stehen zur Verfügung.
procedure TForm1.FormActivate(Sender: TObject);
begin if Not qrySelData.Active then begin qrySelData.ParamByName('PNr').AsString := frmLogin.PNr; qrySelData.Open; end; Caption := 'Arbeitszeiterfassung für ' +frmLogin.cbUser.Text; end; Sag Bescheid, wenn du so weit bist. |
Hi,
Zitat:
Es funktioniert soweit alles da habe die Datenbänke im gleichen Ordner gespeichert, wo auch das Programm ist. (Da ich ja keine Alias habe) Mir wäre aber sehr recht, wenn ich die Datenbänke in einem anderen Ordner habe. Wie kann ich denn diese nachträglich angeben (sofern ich dass muss)? Wenn ich eine Alias angebe, soll ich dann für alle DBs eine angeben? Anstonsten können wir mit dem Programm weitermachen. |
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo mwerk,
zunächst einmal zu der Frage des Alias. Du kannst jederzeit einen Alias anlegen, wenn du die Tabellen gerne in einem anderen Verzeichnis ablegen willst, ist das auch kein Problem. Verschiebe dann alle Dateien mit der Endung .DB und .PX in das neue Verzeichnis. Dann rufst du den Datenbank – Explorer auf und wählst dort Object|Neu akzeptierst „standard Treiber“ mit OK und gibst den neuen Alias einen Namen z.B. AZeit. Unter Definition und dann Pfad wählst du den Pfad zu deinen Daten. Das Ganze speicherst du noch ab und fertig. Du könntest sogar den Programmpfad als Datenpfad benutzen, ist aber nicht zu empfehlen, weil es unübersichtlich wird. So, wenn das erledigt ist, solltest du eine Tabelle noch einmal umstrukturieren, und zwar die Tabelle Arbeitszeit, die sollte wie folgt nach der Änderung aussehen: PersonalNummer A 10 * (Schlüssel) Datum D * (Schlüssel) Start T Ende T Pause S Nutze am besten die Datenbankoberfläche dazu. Wenn du soweit bist, sag Bescheid. Übrigens habe ich schon mal das Hauptformular angehängt, wie es aussehen könnte, nach dem nächsten oder übernächsten Schritt. Also hau rein. |
Hi, ich hab jetzt alles geändert. Auch alle Alias-Adressen hab ich angelegt. (Funktioniert super)
Die Arbeitszeit-DB ist auch schon geändert. Ich habe mir dein Hauptformular angesehen. So hab ich es mir auch ca. vorgestellt. Von mir aus kanns jetzt weitergehen...... |
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo m-werk,
also gut... Wie du in dem Bild sehen kannst, benutze ich dort eine Freeware - Kalenderkomponente. Das Tolle an dieser ist, dass man Tage markieren kann. Ich habe z.B. alle Tage, für die bereits eine Eintragung zur Arbeitszeiterfassung stattgefunden haben blau markiert. Außerdem kann man Feiertage markieren, was du ja auch wolltest. Die Kompo ist also für deine Anwendung maßgeschneidert. Ich habe den Quellcode angehängt. Installiere mal die Komponente und melde dich, wenn du fertig bist. |
Hallo m-werk,
ich gehe mal davon aus, dass du die Kalenderkomponente installiert hast. Wenn alles glatt gegangen ist, befindet sich die Komponente jetzt in der Rubrik Beispiele. Jetzt geht es an das Formular: Zunächst solltest du ein Panel einfügen: Name: pnlBottom Align: alBottom Dazu ein DBGrid: Align: alClient Ein MainMenu: Mit dem Eintrag: Datei | Beenden Die neue Kalenderkompo kommt auf Panel pnlBottom. Name: cal ColHoliday: clGreen ColMarked: clBlue GermanDate: True UseLongDate: True ShowDate: True TabOrder: 2 Ein TButton: Name: btnEingabe Caption: Eingabe Ein weiterer Button: Name: btnPost Caption: Übernahme Ein BitBtn: Kind: bkClose Eine Query Komponente: Name: qrySelData DataBaseName: Dein ALIAS SQL: SELECT * FROM Arbeitszeit WHERE PersonalNummer = :Pnr Params: Pnr: Typ: ftString Nach Doppelklick auf die Query Komponente kannst du erst alle Fellder hinzufügen und die 3 Felder Start, Ende und Pause in das Formular ziehen. Namen: dbeStart, dbeEnde, dbePause Für die Felder PersonalNummer und Datum bitte die Eigenschaft Visible auf False. Jetzt noch eine DataSource Komponente: DataSet: qrySelData Im DBGrid noch: DataSource: DataSource1 ReadOnly: True Leider bin ich morgen Abend nicht da, so dass es erst übermorgen weitegehen kann. |
Hi MrSpock, danke für die ausführliche beschreibung.
Ich bin leider gestern nicht dazugekommen die Kompo zu installieren. Das ist aber kein problem. werd ich entweder heute oder morgen machen. Ich habe diese Woche noch ein wenig stress, da kann es schon sein, dass ich 2, 3 Tage nicht bei meinem Programm arbeiten kann. Sobald ich alle deine Schritte habe, melde ich mich wieder |
Hi, ich habe jetzt den Kalender installiert, und auch alles so gemacht wie du dannach geschrieben hast.
Ich hab nur ein kleines Problem: Ich finde kenen Panel, wo ich dann den Kalender hineinstelle. Ich habe den Kalender normal ins programm gestellt. Wo kann ich denn den Panel finden? Sonst hab ich mal alles. Wie gehts weiter? |
Hallo mwerk,
die Komponente Panel befindet sich auf der Seite "Standard". Wenn du eine Komponente mal nicht findest, kannst du Ansicht|Komponentenliste anklicken. Dort die Komponente z.B. TPanel eingeben und "Hinzufügen" anklicken. |
Hallo m-werk,
schnell noch ein paar Infos: Ich habe, wie schon einmal in einem anderen Thread beschrieben, im privat Bereich des Hauptformulars die Variable FirstTime deklariert:
Delphi-Quellcode:
Diese wird in FormCreate initialisiert:
TForm1 = class(TForm)
... private { Private-Deklarationen } FirstTime : Boolean; ... public { Public-Deklarationen } end;
Delphi-Quellcode:
und in FormActivate benutzt:
procedure TForm1.FormCreate(Sender: TObject);
begin FirstTime := True; end;
Delphi-Quellcode:
Hier habe ich eine Procedure UpdateCalMark aufgerufen, die du ebenfalls im Privat Bereich deklarieren solltest. Sie dient dazu, die Tage im Kalender zu markieren, für die bereits ein Eintrag existiert.
procedure TForm1.FormActivate(Sender: TObject);
begin if FirstTime then begin FirstTime := False; if Not qrySelData.Active then begin qrySelData.ParamByName('PNr').AsString := frmLogin.PNr; qrySelData.Open; end; Caption := 'Arbeitszeiterfassung für ' +frmLogin.cbUser.Text; UpdateCalMark; end end;
Delphi-Quellcode:
So, da hast du wieder was zu tun. Aber nicht nur abtippen :mrgreen:, sonst hilft dir das für zukünftige Probleme gar nicht. Versuche genau zu verstehen, was ich da vorschlage und warum. Wenn es nicht klar ist, solltest du lieber fragen.
procedure TForm1.UpdateCalMark;
var jahr, monat, tag : Word; merken : TBookmark; begin qrySelData.DisableControls; merken := qrySelData.GetBookmark; qrySelData.First; cal.Markdays.Clear; while Not qrySelData.Eof do begin DecodeDate(qrySelDataDatum.Value, jahr, monat, tag); if (jahr = cal.Year) and (monat = cal.Month) then if tag < 10 then cal.Markdays.Add(FormatDateTime('d.mm.',qrySelDataDatum.Value)) else cal.Markdays.Add(FormatDateTime('dd.mm.',qrySelDataDatum.Value)); qrySelData.Next; end; cal.Invalidate; qrySelData.GotoBookmark(merken); qrySelData.EnableControls; end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:55 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz