Delphi-PRAXiS
Seite 1 von 3  1 23      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Arbeitszeiterfassung: Die Fortsetzung (https://www.delphipraxis.net/1404-arbeitszeiterfassung-die-fortsetzung.html)

MrSpock 22. Nov 2002 19:21


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:
SELECT * FROM Arbeitszeit WHERE
   PersonalNummer = :Pnr
Das mit dem Parameter kennst du ja schon. Setze seinen Typ auf String.

Die Query habe ich qrySelData genannt. Beim Activieren des Formulars soll dann folgender Code ausgeführt werden:

Delphi-Quellcode:
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;
Jetzt wird der Nutzer schon einmal begrüßt (in der Caption) und seine Daten stehen zur Verfügung.

Sag Bescheid, wenn du so weit bist.

m-werk 23. Nov 2002 18:48

Hi,

Zitat:

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.
Da entsteht bei mir schon das 1. Problem. Ich habe keine Alias bei meinen Datenbanken angegeben.

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.

MrSpock 24. Nov 2002 17:42

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.

m-werk 24. Nov 2002 18:35

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......

MrSpock 24. Nov 2002 19:41

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.

MrSpock 25. Nov 2002 20:24

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.

m-werk 26. Nov 2002 07:02

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

m-werk 27. Nov 2002 17:46

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?

MrSpock 27. Nov 2002 19:44

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.

MrSpock 27. Nov 2002 21:15

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:
TForm1 = class(TForm)
    ...
  private
   { Private-Deklarationen }
    FirstTime   : Boolean;
    ...
  public
    { Public-Deklarationen }
  end;
Diese wird in FormCreate initialisiert:
Delphi-Quellcode:
procedure TForm1.FormCreate(Sender: TObject);
begin
  FirstTime := True;
end;
und in FormActivate benutzt:
Delphi-Quellcode:
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;
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.
Delphi-Quellcode:
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;
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.


Alle Zeitangaben in WEZ +1. Es ist jetzt 06:22 Uhr.
Seite 1 von 3  1 23      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz