AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi Arbeitszeiterfassung: Die Fortsetzung
Thema durchsuchen
Ansicht
Themen-Optionen

Arbeitszeiterfassung: Die Fortsetzung

Ein Thema von MrSpock · begonnen am 22. Nov 2002 · letzter Beitrag vom 9. Dez 2002
Antwort Antwort
Seite 1 von 3  1 23      
Benutzerbild von MrSpock
MrSpock
(Co-Admin)

Registriert seit: 7. Jun 2002
Ort: Owingen
5.865 Beiträge
 
Delphi 2010 Professional
 
#1

Arbeitszeiterfassung: Die Fortsetzung

  Alt 22. Nov 2002, 20:21
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.
Albert
Live long and prosper


MrSpock
  Mit Zitat antworten Zitat
m-werk

Registriert seit: 14. Jun 2002
215 Beiträge
 
Delphi 2009 Architect
 
#2
  Alt 23. Nov 2002, 19: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.
Grüße, m-werk
  Mit Zitat antworten Zitat
Benutzerbild von MrSpock
MrSpock
(Co-Admin)

Registriert seit: 7. Jun 2002
Ort: Owingen
5.865 Beiträge
 
Delphi 2010 Professional
 
#3
  Alt 24. Nov 2002, 18:42
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.
Miniaturansicht angehängter Grafiken
12_1038159743.jpg  
Albert
Live long and prosper


MrSpock
  Mit Zitat antworten Zitat
m-werk

Registriert seit: 14. Jun 2002
215 Beiträge
 
Delphi 2009 Architect
 
#4
  Alt 24. Nov 2002, 19: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......
Grüße, m-werk
  Mit Zitat antworten Zitat
Benutzerbild von MrSpock
MrSpock
(Co-Admin)

Registriert seit: 7. Jun 2002
Ort: Owingen
5.865 Beiträge
 
Delphi 2010 Professional
 
#5
  Alt 24. Nov 2002, 20:41
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.
Angehängte Dateien
Dateityp: zip 12_1038166894.zip (11,3 KB, 53x aufgerufen)
Albert
Live long and prosper


MrSpock
  Mit Zitat antworten Zitat
Benutzerbild von MrSpock
MrSpock
(Co-Admin)

Registriert seit: 7. Jun 2002
Ort: Owingen
5.865 Beiträge
 
Delphi 2010 Professional
 
#6
  Alt 25. Nov 2002, 21: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 = nr
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.
Albert
Live long and prosper


MrSpock
  Mit Zitat antworten Zitat
m-werk

Registriert seit: 14. Jun 2002
215 Beiträge
 
Delphi 2009 Architect
 
#7
  Alt 26. Nov 2002, 08: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
Grüße, m-werk
  Mit Zitat antworten Zitat
m-werk

Registriert seit: 14. Jun 2002
215 Beiträge
 
Delphi 2009 Architect
 
#8
  Alt 27. Nov 2002, 18: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?
Grüße, m-werk
  Mit Zitat antworten Zitat
Benutzerbild von MrSpock
MrSpock
(Co-Admin)

Registriert seit: 7. Jun 2002
Ort: Owingen
5.865 Beiträge
 
Delphi 2010 Professional
 
#9
  Alt 27. Nov 2002, 20: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.
Albert
Live long and prosper


MrSpock
  Mit Zitat antworten Zitat
Benutzerbild von MrSpock
MrSpock
(Co-Admin)

Registriert seit: 7. Jun 2002
Ort: Owingen
5.865 Beiträge
 
Delphi 2010 Professional
 
#10
  Alt 27. Nov 2002, 22: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 , 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.
Albert
Live long and prosper


MrSpock
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 3  1 23      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:59 Uhr.
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