Delphi-PRAXiS
Seite 1 von 2  1 2      

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


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:15 Uhr.
Seite 1 von 2  1 2      

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