Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Stringzerlegung in Schleife (https://www.delphipraxis.net/174127-stringzerlegung-schleife.html)

frankistreich 5. Apr 2013 14:56


Stringzerlegung in Schleife
 
Hier ist mein Problem

es geht darum, dass das erste urlaubsdatum aus qbefehl in ed1 und dann in s gespeicher wird.
danach wird s in s1(tag), s2(monat) und s3(jahr) zerlegt und s1 in eds1 angezeigt.

danach wird geprüft ob s2 gleich dem vorher gewählten monat ist, wenn ja dann macht er
von s1(z.b.:5) bis s1+ urlaubsdauer(z.b. 3) dass:
y wert von stringgrid ist die mitarbeiterid
sg.cells[x2,y]:='xxxxxxxxxxxx'
dann x2 hochzählen.


soweit funktioniert das auch ohne großer schleife von count bis count2.

mein problem dabei ist nur, dass er sofort alle urlaubsdaten holt und alle tage hintereinander in s1 speichert.

wie kann man das lösen, dass er nach und nach die daten aus dem querry holt und einzeln zerlegt und speichert?
und somit jede schleifenrunde ein neues datum gezogen wird???


danke.

Delphi-Quellcode:
procedure Tfmuanzeigen.darstellen;
var x1,x2,y1,y,x,count,count2,i,t,e,f:integer;
    a,b,c,s,s1,s2,s3:string;

begin
qbefehl.Close; //querry
qbefehl.SQL.Clear;
qbefehl.SQL.Add('select ma.mid,urlaub.beginn,rtrim(urlaub.dauer),urlaub.unr from ma '+
                'inner join urlaub on ma.mid = urlaub.mid '+
                'where ma.aid = '+quotedstr(dbcbabteilung.KeyValue)+' order by ma.mid asc');
qbefehl.Open;

 qanzahl.Close;  //querry
 qanzahl.SQL.Clear;
 qanzahl.SQL.Add('select count(Urlaub.UNr) as anzahl from Urlaub '+
                'inner join ma on Urlaub.MId = ma.MId '+
                'where AId = '+quotedstr(dbcbabteilung.KeyValue));
 qanzahl.Open;

count:=1;
count2:=qanzahl.Fields.Fields[0].AsInteger+1; //anzahl der einträge der Spalte 0
f:= qbefehl.Fields.Fields[3].AsInteger;


//schleife zur eintragung im stringgrid

for count:=1 to count2 do begin

qbefehl.Next;
  ed1.Text:=qbefehl.Fields.Fields[1].AsString; //spalte1 in editfeld1
  ed2.Text:=qbefehl.Fields.Fields[2].AsString; //spalte2 in editfeld2
  t:=qbefehl.fields.fields[2].asinteger;
   
  i:=1;
  s:=ed1.Text ;

while s[i]<>'.' do
  begin
   s1:=s1+s[i];
   inc(i);
  end;
   inc(i);
while s[i]<>'.' do
  begin
   s2:=s2+s[i];
   inc(i);
  end;
   inc(i);
while s[i]<>'.' do
  begin
   s3:=s3+s[i];
   inc(i);
  end;
 eds1.Text:=s1;


 x2:=strtoint(s1);
 x1:=strtoint(s1);

  if s2 = cbmonat.Text then begin
   for x1:=strtoint(s1) to x1+strtoint(ed2.Text)-1 do begin
     y1:=qbefehl.fields.fields[0].asinteger;
     sg.Cells[x2,y1]:='XXXXXXXXXX';
     inc(x2);
   end;
  end;
 end;

RWarnecke 5. Apr 2013 15:05

AW: Dringend Hilfe gesucht!!!
 
Hallo und willkommen :dp:

sei doch bitte so nett und editiere Deinen ersten Beitrag und setze den Quelltext in die Delphi Code Tags und gebe dem Beitrag einen aussagekräftigen Titel. So ist der ganze Beitrag übersichtlicher und man kann die schneller Helfen. Ich finde hier zum Beispiel nicht durch.

p80286 5. Apr 2013 15:15

AW: Dringend Hilfe gesucht!!!
 
Delphi-Quellcode:
...
  'where ma.aid = '+quotedstr(dbcbabteilung.KeyValue)+' order by ma.mid asc');
......
So etwas solltest Du tunlichst vermeiden, dafür gibt es Parameter.
Gruß
K-H

RWarnecke 5. Apr 2013 15:25

AW: Stringzerlegung in Schleife
 
Sollten qbefehl und qanzahl Queries sein, dann würde ich hier über eine While-Schleife gehen. Denn so kannst Du schön jeden Datensatz einzeln aus dem Ergebnis der Abfrage holen und entsprechend verarbeiten. Desweiteren um dem ganzen noch mehr Übersichtlichkeit zu verschaffen, solltest Du statt
Delphi-Quellcode:
qbefehl.Fields.Fields[1].AsString;
folgenden Befehl benutzen
Delphi-Quellcode:
qbefehl.FieldByName('<Feldname>').AsString;
. Dann wird sich sicherlich Dein Problem von alleine lösen.

Edit:
In diesem Bereich :
Delphi-Quellcode:
for count:=1 to count2 do
begin
  qbefehl.Next;
  ed1.Text:=qbefehl.Fields.Fields[1].AsString;
  ed2.Text:=qbefehl.Fields.Fields[2].AsString;
  t:=qbefehl.fields.fields[2].asinteger;
  i:=1;
  s:=ed1.Text ;

{...}
Springst Du mit dem
Delphi-Quellcode:
qbefehl.next
gleich zum nächsten Datensatz, wo auch immer der ist. Wenn Du keine While-Schleife benutzen möchtest, solltest Du zumindest
Delphi-Quellcode:
qbefehl.first
und
Delphi-Quellcode:
qanzahl.first
vor die For-Schleife mit einbauen und den Befehl
Delphi-Quellcode:
qbefehl.next
ans Ende stellen. Somit ist auch sichergestellt, dass Du keinen Datensatz vergisst.

frankistreich 5. Apr 2013 15:32

AW: Stringzerlegung in Schleife
 
das Problem liegt ja wie gesagt nicht bei den querrys.
es leigt einfach dadran, dass es bereits im ersten schleifendurchgang alle daten aus der db holt und verarbeitet, obwohl pro durch lauf eine zeile geplant ist.

trotzdem schon mal danke

RWarnecke 5. Apr 2013 15:37

AW: Stringzerlegung in Schleife
 
Das Problem ist Deine For-Schleife zum Durchgehen der Datensätze. Probiere mal folgendes aus statt der FOR-Schleife: (ungetestet)
Delphi-Quellcode:
while not qbefehl.eof do
begin
  ed1.Text:=qbefehl.Fields.Fields[1].AsString;
  ed2.Text:=qbefehl.Fields.Fields[2].AsString;
  t:=qbefehl.fields.fields[2].asinteger;
  i:=1;
  s:=ed1.Text ;

  while s[i]<>'.' do
  begin
    s1:=s1+s[i];
    inc(i);
  end;
  inc(i);
  while s[i]<>'.' do
  begin
    s2:=s2+s[i];
    inc(i);
  end;
  inc(i);
  while s[i]<>'.' do
  begin
    s3:=s3+s[i];
    inc(i);
  end;
  eds1.Text:=s1;

  x2:=strtoint(s1);
  x1:=strtoint(s1);

  if s2 = cbmonat.Text then
  begin
    for x1:=strtoint(s1) to x1+strtoint(ed2.Text)-1 do
    begin
      y1:=qbefehl.fields.fields[0].asinteger;
      sg.Cells[x2,y1]:='XXXXXXXXXX';
      inc(x2);
    end;
  end;
  qbefehl.Next;
end;
Und lese bitte nochmal meinen letzten Beitrag genauer durch. Wenn Du Ihn nicht verstehst, dann frage bitte nochmal nach.

p80286 5. Apr 2013 15:43

AW: Dringend Hilfe gesucht!!!
 
So mal zu Erinnerung
Zitat:

Zitat von RWarnecke (Beitrag 1210136)
sei doch bitte so nett und editiere Deinen ersten Beitrag
und setze den Quelltext in die Delphi Code Tags
und gebe dem Beitrag einen aussagekräftigen Titel.

Der Titel hat ja schon etwas gewonnen. Wenn Du jetzt noch versuchst Deinen Quelltext ein wenig leserlicher zu machen (das Helm-Symbol) und vielleicht noch ein wenig an den Variablennamen pfeilst, ist es für uns wesentlich einfacher zu erfassen was Du willst.
Dein erster Beitrag machte übrigens einen etwas "atemlosen" Eindruck auf mich.
Da könnte etwas Überarbeitung auch nicht schaden.

Gruß
K-H

frankistreich 5. Apr 2013 15:46

AW: Stringzerlegung in Schleife
 
Fehlermeldung:
Im Projekt xxxx ist eine Exception der Klasse EAccessViolation aufgetreten. Meldung:
'Zugriffsverletzung bei Adresse 004A05CB im Modul 'XXXX.exe'. Lesen von Adresse 004F8000'. Prozeß wurde angehalten. Mit Einzelne Anweisung oder Start
fortsetzen.


soweit war ich leider schon..
trotzdem danke

RWarnecke 5. Apr 2013 15:51

AW: Stringzerlegung in Schleife
 
Zitat:

Zitat von frankistreich (Beitrag 1210157)
Fehlermeldung:
Im Projekt xxxx ist eine Exception der Klasse EAccessViolation aufgetreten. Meldung:
'Zugriffsverletzung bei Adresse 004A05CB im Modul 'XXXX.exe'. Lesen von Adresse 004F8000'. Prozeß wurde angehalten. Mit Einzelne Anweisung oder Start
fortsetzen.


soweit war ich leider schon..
trotzdem danke

Wo tritt der Fehler auf ? :glaskugel: Welche Zeile ist davon betroffen ? Bist Du die ganze Funktion mal mit der Einzel Anweisung (F7) durchgegangen und hast geschaut, wo Deine Exception auftritt ?

frankistreich 5. Apr 2013 15:54

AW: Stringzerlegung in Schleife
 
Delphi-Quellcode:
 
while s[i]<>'.' do
  begin
    s3:=s3+s[i];
    inc(i);
bei diesen zeilen bleibt er hängen und macht dort endlos weiter

RWarnecke 5. Apr 2013 15:58

AW: Stringzerlegung in Schleife
 
Von welchem Typ ist Field[1] und Field[2]? Dann haste Doch schon den Fehler bei der Übergabe an ed1.text;

Edit:
Um eine Datum zu zerlegen in Tag, Monat und Jahr, würde ich mir den Befehl DecodeDate anschauen. Dann kannste Dir die ganzen while-Schleifen sparen.

p80286 5. Apr 2013 16:13

AW: Stringzerlegung in Schleife
 
Zitat:

Zitat von frankistreich (Beitrag 1210161)
Delphi-Quellcode:
 
while s[i]<>'.' do
  begin
    s3:=s3+s[i];
    inc(i);
bei diesen zeilen bleibt er hängen und macht dort endlos weiter

Und was steht in
Delphi-Quellcode:
s
? wenn da als Datum '' oder '20120103' oder '03-03-88' steht, ist es klar das es rummst.

egal welcher Inhalt vorhanden ist, so wäre es besser:
]
Delphi-Quellcode:
 
while (i<=length(s)) and (s[i]<>'.') do
  begin
    s3:=s3+s[i];
    inc(i);
Gruß
K-H

frankistreich 5. Apr 2013 16:37

AW: Stringzerlegung in Schleife
 
mit einzelschritten läuft er ohne probleme jetzt durch.
jedoch kommt beim koplettdurchlauf die fehlermeldung: 030403040404 ist kein gültiger integerwert
-> d.h. er zerlegt immernoch alle daten aus der datenbank, bevor er den ersten eintrag im stringgrid macht.


danke tritzdem schon mal

Furtbichler 5. Apr 2013 16:52

AW: Stringzerlegung in Schleife
 
Zitat:

Zitat von p80286 (Beitrag 1210168)
egal welcher Inhalt vorhanden ist, so wäre es besser:

Jupp, aber dann lieber (Geschmackssache) so:
Delphi-Quellcode:
 
for i:=1 to length(s) do
  if s[i]='.' then
    break
  else
    s3:=s3+s[i];
Oder so:
Delphi-Quellcode:
i := pos('.',s);
if i<1 then
  i := length(s)+1;
s3 := Copy(s,1,i-1);

p80286 5. Apr 2013 17:03

AW: Stringzerlegung in Schleife
 
Zitat:

Zitat von frankistreich (Beitrag 1210178)
mit einzelschritten läuft er ohne probleme jetzt durch.

Schön
Zitat:

Zitat von frankistreich (Beitrag 1210178)
jedoch kommt beim koplettdurchlauf die fehlermeldung: 030403040404 ist kein gültiger integerwert
-> d.h. er zerlegt immernoch alle daten aus der datenbank, bevor er den ersten eintrag im stringgrid macht.

Dann funktioniert das auch nicht in Einzelschritten!

Wo tritt dieser Fehler auf (Sourcecode).

@Furtbichler
Ich denke, das kommt darauf an wie Deine kleinen Grauen Zellen ticken. "Mach solange i nicht größer als die Länge und ungleich einem Punkt ist.."
ist etwas anderes als
" hole die Position von Punkt"
"Wenn diese kleiner eins ist kopiere alles, sonst den string von Postion eins bis Position minus 1 "
:)

Gruß
K-H

Sir Rufo 5. Apr 2013 17:08

AW: Stringzerlegung in Schleife
 
Ich weiß ja nicht warum du dich mit dem Zerlegen des Strings herumschlägst (Masochist :gruebel:)

ABer ein Datum kann man sehr schön mit den Delphi-Referenz durchsuchenDateUtils in Tag, Monat, Jahr zerlegen.
Einfach den String in ein Delphi-Referenz durchsuchenTDateTime konvertieren Delphi-Referenz durchsuchenStrToDate/Delphi-Referenz durchsuchenStrToDateDef/Delphi-Referenz durchsuchenVarToDateTime und dann damit weiterarbeiten.

Delphi-Referenz durchsuchenDecodeDateDelphi-Referenz durchsuchenDayOfDelphi-Referenz durchsuchenMonthOfDelphi-Referenz durchsuchenYearOf

frankistreich 5. Apr 2013 19:50

AW: Stringzerlegung in Schleife
 
Hab es jetzt anders gelöst. Geht jetzt alles....trotzdem danke für die mühen

Delphi-Quellcode:
procedure Tfmuanzeigen.darstellen;
  var x1,x2,y1,t:integer;
      s,s1,s2,s3:string;
begin
qbefehl.Close;
  qbefehl.SQL.Clear;
  qbefehl.SQL.Add('select ma.mid,urlaub.beginn,rtrim(urlaub.dauer),urlaub.unr from ma '+
                  'inner join urlaub on ma.mid = urlaub.mid '+
                  'where ma.aid = '+quotedstr(a)+' order by ma.mid asc');
qbefehl.Open;

qanzahl.Close;
  qanzahl.SQL.Clear;
  qanzahl.SQL.Add('select count(Urlaub.UNr) as anzahl from Urlaub '+
                  'inner join ma on Urlaub.MId = ma.MId '+
                  'where AId = '+quotedstr(a));
qanzahl.Open;
qbefehl.first;

while not qbefehl.eof do
begin

  S:=qbefehl.Fields.Fields[1].AsString; //Datum
  t:=qbefehl.fields.fields[2].asinteger;//Dauer

s1 := Copy(s, 0, 2);
s2 := Copy(s, 4, 2);
s3 := Copy(s, 7, 4);

 x1:=strtoint(s1);
 x2:=strtoint(s1);

 if s2 = cbmonat.Text then begin
  for x1:=strtoint(s1) to x1+t-1 do begin
     y1:=qbefehl.fields.fields[0].asinteger;
     sg.Cells[x2,y1]:='XXXXXXXX';
     inc(x2);
   end;
  end;
  qbefehl.next;
 end;
end;

Furtbichler 5. Apr 2013 22:57

AW: Stringzerlegung in Schleife
 
Zitat:

Zitat von p80286 (Beitrag 1210183)
@Furtbichler
Ich denke, das kommt darauf an wie Deine kleinen Grauen Zellen ticken...

Gott-sei-Dank nicht. Es kommt auf Klarheit und Einfachheit an, also wie man auf das Ergebnis kommt. Und das ist in engen Grenzen auch Geschmacksache, aber in ziemlich engen Grenzen.

HiWieGehts 6. Apr 2013 07:03

AW: Stringzerlegung in Schleife
 
frankistreich gefällt mir! Stellt eine Frage, will verm. dass man ihm hilft und ignoriert alle Tipps.


Alle Zeitangaben in WEZ +1. Es ist jetzt 05:50 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