Autor |
Beitrag |
Tommy182
Hält's aus hier
Beiträge: 3
|
Verfasst: Fr 27.05.11 15:13
Hallo Leute!
Hier meine Fragen: Ich muss ein kleines Programm schreiben, welches die Summierung der Arbeitszeit von Arbeitern ermöglicht.
Mit Hilfe von zwei TDateTimePicker kann der jeweilige Zeitraum eingegrenzt werden.
Ich habe eine Textdatei erhalten, in welcher die benötigten Datensätze (ca. 300) enthalten sind. Diese Datensätze sind folgendermaßen aufgebaut:
z. B. 101.03.20086 Die erste Stelle steht für die Mitarbeiternummer (1), die darauffolgenden Stellen bilden das Datum (01.03.2008) und die letzte Stelle die Anzahl der Arbeitsstunden.
Durch einen Klick auf einen Button sollen nun diese Daten eingelesen werden, und je nach der ausgewählten Zeitspanne der TDateTimePicker sollen die Stunden nach Mitarbeitern summiert werden (Beispiel: Mitarbeiter 1: 70 Stunden).
Ich habe bereits das Layout hergestellt und verwende als Ausgabemedium ein MEMO-Feld.
Nun zu meinem Problem: Ich lade die Textdatei über den Befehl "Assignfile" in mein Programm. Mithilfe von Read gebe ich dann die Datensätze in meinem Programm aus. Zum zerlegen der Datensätze verwende ich Copy. Allerdings wird mir immer nur 1 Zeile der Textdatei reingeladen. Wie schaffe ich es, dass mir alle Zeilen reingeladen werden?
Weiters habe ich keine Idee, wie ich die Arbeitsstunden je Mitarbeiter summieren soll. Habt ihr eine Idee, wie man das am besten lösen kann?
Beim Filtern des Zeitraums habe ich bisher keine Probleme.
LG Tom
Moderiert von Narses: Titel geändert, "help!" entfernt - Hilfe braucht jeder. 
Zuletzt bearbeitet von Tommy182 am Fr 27.05.11 16:28, insgesamt 1-mal bearbeitet
|
|
jaenicke
      
Beiträge: 19315
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Fr 27.05.11 15:18
Hallo und
Tommy182 hat folgendes geschrieben : | Nun zu meinem Problem: Ich lade die Textdatei über den Befehl "Assignfile" in mein Programm. Mithilfe von Read gebe ich dann die Datensätze in meinem Programm aus. Zum zerlegen der Datensätze verwende ich Copy. Allerdings wird mir immer nur 1 Zeile der Textdatei reingeladen. Wie schaffe ich es, dass mir alle Zeilen reingeladen werden? |
Wie wäre es mit einer schleife bis das Dateiende erreicht ist und zeilenweisem Auslesen mit ReadLn?
Oder du nimmst einfach eine TStringList.
Tommy182 hat folgendes geschrieben : | Weiters habe ich keine Idee, wie ich die Arbeitsstunden je Mitarbeiter summieren soll. Habt ihr eine Idee, wie man das am besten lösen kann? |
Lies das ganze in eine eigene Liste ein, dann kannst du dort direkt mit den Daten arbeiten. 
|
|
thepaine91
      
Beiträge: 763
Erhaltene Danke: 27
Win XP, Windows 7, (Linux)
D6, D2010, C#, PHP, Java(Android), HTML/Js
|
Verfasst: Fr 27.05.11 15:25
Zitat: | Zum zerlegen der Datensätze verwende ich Copy. |
Gibt es da keine andere Möglichkeit, bzw. wo kommen die Daten her?
Finde die Datenbasis i-wie unvorteilhaft....
|
|
Tommy182 
Hält's aus hier
Beiträge: 3
|
Verfasst: Fr 27.05.11 15:34
Moderiert von Narses: Komplett-Zitat des letzten Beitrags entfernt.
Nein leider, die Datenquelle muss leider diese Textdatei sein...
--- Moderiert von Narses: Beiträge zusammengefasst---
jaenicke hat folgendes geschrieben : | Hallo und  |
Danke erstmal für die nette Begrüßung ;D
jaenicke hat folgendes geschrieben : |
Wie wäre es mit einer schleife bis das Dateiende erreicht ist und zeilenweisem Auslesen mit ReadLn?
Oder du nimmst einfach eine TStringList. |
Also, ich habe das jetzt mit einer Schleife gelöst:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13:
| procedure TForm1.ErgebnisBtnClick(Sender: TObject); var i : integer; begin
AssignFile (F, 'C:\Users\Thomas\Desktop\Arbeitsstunden.txt'); Reset (F);
for i := 0 to 678 do begin ReadLn (F, s); AusgabeMemo.Lines.add (copy (s,1,1)) end; | Dadurch wird mir jetzt logischerweise von jedem Eintrag die Erste Stelle (Sprich: Mitarbeiternummer) ausgegeben.
Jetzt wäre vermutlich ein Array Vorteilhaft, um die richtigen Daten miteinander zu addieren, oder? ^^
jaenicke hat folgendes geschrieben : | Lies das ganze in eine eigene Liste ein, dann kannst du dort direkt mit den Daten arbeiten.  |
Meinst du mit "das ganze" jeden einzelnen Teil (sprich 1 Liste für Mitarbeiter, 1 Liste für Datum, 1 Liste für Stunden)?
LG
Moderiert von Narses: Delphi-Tags hinzugefügt
|
|
Narses
      

Beiträge: 10183
Erhaltene Danke: 1256
W10ent
TP3 .. D7pro .. D10.2CE
|
Verfasst: Fr 27.05.11 16:17
Moin!
Bitte ändere den Titel des Topics, da er wenig über das eigentlich Thema verrät. Hier der entsprechende Absatz aus den Richtlinien:
1.2 Beiträge: | Bitte formuliere den Betreff Deiner Beiträge so, dass andere Mitglieder anhand dieser bereits das eigentliche Thema festmachen können. Beiträge wie etwa "Eine Anfängerfrage" oder "Weiß jemand, wie das geht?" lassen den Leser im Unklaren darüber, was das Thema der Diskussion ist.[...] |
Einfach oben bei Deinem ersten Beitrag auf  oder  klicken und den Titel ändern. Danke Dir!
cu
Narses
_________________ There are 10 types of people - those who understand binary and those who don´t.
|
|
JDKDelphi
      
Beiträge: 115
Erhaltene Danke: 22
WIN2000, XP, WIN 7 , UNIX, LINUX
Assembler für (Z8x, 68xxx,R6000,Intel), DELPHI 6 Enterprise, MAGIC eDeveloper V9+V10, C++, C#,VB, .NET, zertifizierter iBOLT-Programmierer
|
Verfasst: Fr 27.05.11 16:25
Hallo,
das geht eigentlich ganz einfach:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22:
| .... VAR MeineDaten : TSTRINGS; Saetze : INTEGER; s1,s2,s3 : STRING; BEGIN
Meinedaten := TSTRINGLIST.Create; MeineDaten.Loadfromfile('C:\eindateiname.txt');
FOR Saetze := 0 to meinedaten.count-1 DO BEGIN s1 := copy(meinedaten.strings[saetze],1,1) s2 := copy(meinedaten.strings[saetze],2,10) s3 := copy(meinedaten.strings[saetze],12,4)
END; MeineDaten.free; END; |
so in etwa geht das dann
Sortier und Verabeitungsalgorythmen must Du dir selbst ausdenken
Gruss
_________________ Wo andere aufhören, fange ich erst an..
|
|
Tommy182 
Hält's aus hier
Beiträge: 3
|
Verfasst: Fr 27.05.11 16:27
|
|
thepaine91
      
Beiträge: 763
Erhaltene Danke: 27
Win XP, Windows 7, (Linux)
D6, D2010, C#, PHP, Java(Android), HTML/Js
|
Verfasst: Fr 27.05.11 16:34
Wenn du die Daten dann trennst wäre es noch Sinnvoll die Daten auch als später benötigten Datentyp zu speichern.
|
|
jaenicke
      
Beiträge: 19315
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Fr 27.05.11 16:38
Richtig, da du mit den Daten arbeiten musst, solltest du dir eine Datenstruktur (Klasse oder Record) überlegen, in die du die Daten stecken kannst. Die packst du dann in eine Liste und kannst darüber extrem schnelle Auswertungen fahren.
|
|
Jakane
      
Beiträge: 257
|
Verfasst: Mo 06.06.11 15:20
Zitat: | Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13:
| procedure TForm1.ErgebnisBtnClick(Sender: TObject); var i : integer; begin
AssignFile (F, 'C:\Users\Thomas\Desktop\Arbeitsstunden.txt'); Reset (F);
for i := 0 to 678 do begin ReadLn (F, s); AusgabeMemo.Lines.add (copy (s,1,1)) end; |
|
Fix vorgeben wo das Ende ist kann schon sehr zu Probleme führen
1. Möglichkeit: Deine Textdatei hat eine Zeile pro Datensatz
- Nimmst eine einfache ListBox
- ListBox1.LoadFromFile('C:\Meine_Textdatei.txt');
2. Möglichkeit: Deine Textdatei ist fortlaufen mit Trennzeichen (was auch ein Leerzeichen sein kann)
- Nimmst eine einfache ListBox
- Trennst mit Copy die Datensätze auf und steckst die mit ListBox1.Items.Add(Copy(...)); in die Liste
Dann kannst du mit
- For i:= 0 to ListBox.Items.Count - 1
durch die ganze Liste marschieren und die Daten verarbeiten.
Zum zusammenrechnen der Zahlen StrToInt() um die Zahlen die noch String sind in Integer umzuwandeln
Ich hoffe damit konnte ich helfen
|
|
thepaine91
      
Beiträge: 763
Erhaltene Danke: 27
Win XP, Windows 7, (Linux)
D6, D2010, C#, PHP, Java(Android), HTML/Js
|
Verfasst: Mo 06.06.11 15:37
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13:
| procedure TForm1.ErgebnisBtnClick(Sender: TObject); var i : integer; begin
AssignFile (F, 'C:\Users\Thomas\Desktop\Arbeitsstunden.txt'); Reset (F);
for i := 0 to 678 do begin ReadLn (F, s); AusgabeMemo.Lines.add (copy (s,1,1)) end; |
Ich wäre für EOF.
|
|
|