Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Unendlichschleife? (https://www.delphipraxis.net/7454-unendlichschleife.html)

Taladan 12. Aug 2003 18:30


Unendlichschleife?
 
Eigendlich kein Problem, aber irgendwie klappt es nicht. Ich habe drei Tabellen (eigendlich sind es mehr)
Tabelle 6 wird jedes mal neu geschrieben, wo die gesamtgehälter
zusammen gerechnet werden sollen
Tabelle 4 beinhaltet die daten, wo die jeweiligen einzelnen gehälter
drin stehen
Tabelle 1 beinhaltet die Daten der mitarbeiter
(Jede Tabelle hat Berechnete-, Daten- und Lookupfelder)

Mein Code lautet wie unten. Ich nutzte die Tabelle 1 als Abgrenzung. Das heißt je datensatz in tabelle 1 soll folgende anweisung ausgeführt werden. je nach personennummer aus tabelle 1 sollen aus den daten der tabelle 4 die datensätze herausgesucht werden, welche die selbe personennummer abgespeichert haben. von den datensatz soll der betrag, also das gehalt zu einer variable solange hinzuaddiert werden, bis die tabelle 4 keine daten mehr beinhaltet, also bis zum ende. als letzter schritt soll dann ein datensatz bestehend aus der personennummer und dem zusammengerechneten gesamtbetrag in tabelle 6 gespeichert werden. dann soll die schleife mit dem nächsten mitarbeiter von vorn beginnen.

PS: Die Filter der Tabellen werden bereits genutzt, an sonnsten würd ich das nicht mit einer if-Schleife machen.

Mein Problem ist nur, das er jetzt unentweg die daten in die tabelle schreibt und gar nicht mehr aufhört. zudem er immer nur die daten von EINEN mitarbeiter hineinschreibt (bei meinen tests hab ich drei mitarbeiter eingeflegt, und er schreibt nur bei den mitleren die daten).

Seht ihr einen fehler? oder habt ihr einen besseren vorschlag, wie ich obriges problem lösen kann?

Delphi-Quellcode:
procedure TFormGehaltsliste.berechnen;
var sum : currency;
    nummer : integer;
begin
  with hauptform do begin
   table6.disablecontrols; //gehaltsliste
   table4.disablecontrols; //verteilungsdaten
   table1.disablecontrols; //personendaten
   table6.first;
   table1.first;
   while not table6.eof do table6.delete;
   while not table1.eof do begin
      table4.first;
      nummer := table1.fieldbyname('zähler').value;
      sum := 0;
      table6.append;
      table6verteiler.value := nummer;
      while not table4.Eof do begin
        if (table4verteiler.value = nummer) then begin
          sum := sum + table4betrag.ascurrency;
        end;
        table4.next;
      end;
      table6gehalt.ascurrency := sum;
      table6.post;
      table1.next;
   end;
   table6.enablecontrols;
   table4.enablecontrols;
   table1.enablecontrols;
  end;
end;

MrSpock 12. Aug 2003 20:33

Re: Unendlichschleife?
 
Hallo Taladan,

ich kann keine Endlosschleife erkennen.

Das Löschen aller Datensätze aus Tabelle6 geht mit Table6.EmptyTable;

Ansonsten sieht mir das Ganze sehr danach aus, dass es relativ einfach mit einer Query zu lösen ist, was wohl auch deutlich schneller geht. Hab leider keine Zeit, gehe nämlich in 2 Minuten ins Kino und schau mir den zukünftigen Gouverneur von Kalifornien an. :mrgreen:

Morgen guck ich mir dein Problem noch einmal an.

Albi 12. Aug 2003 20:46

Re: Unendlichschleife?
 
Hast Du mal versucht einen Haltepunkt zu setzen und geschaut was die Procedure macht? Daran kannst Du sehen wo er sich dann in einer Schleife aufhängt.

Ansonsten würde ich es auch wie MrSpock schon geschrieben hat über die Query lösen, das geht wesentlich einfacher.

Taladan 13. Aug 2003 10:25

Re: Unendlichschleife?
 
wenn ich bei table6 den exclusivmodus einschalte, bekomme ich eine fehlermeldung bei dem start. wenn ich ihn aus lasse, bekomme ich eine fehlermedlung bei der ausfühlung table6.emptytable.

oki 13. Aug 2003 10:42

Re: Unendlichschleife?
 
Hallo,

EmptyTable erfordert definitiv Exclusivrechte. Exclusiv bedeutet immer, dass ausschließlich ein Zugriff auf die Tabelle erlaubt ist.

Wenn du beim Öffnen diese Rechte nicht bekommst, dann gibt es nur folgende Möglichkeiten: Die Tabelle ist anderweitig schon geöffnet(vielleicht auch aus deinem eigenen Programm heraus?) oder du darfst sie nicht exclusiv öffnen (Datenbank-Server?).

Das EmtyTable dann fehl schlägt ist wie oben gesagt logisch.

Gruß oki

Taladan 13. Aug 2003 14:55

Re: Unendlichschleife?
 
Ich greif nur einmal auf die Tabelle zu. Es funktioniert trotzdem nicht. Da bleib ich lieber bei der herkömmlichen methode.

Obwohl ich selbiges jetzt mit einen Query gelöst habe, bleibt das problem das ich eine unedlichschleife hab.

Delphi-Quellcode:
procedure TFormGehaltsliste.berechnen;
var sum : currency;
    nummer : integer;
begin
   hauptform.table1.autocalcfields := false;
   hauptform.table6.First;
   while not hauptform.table6.eof do hauptform.table6.delete; //wenn ich diese zeile
   hauptform.table1.first;
   while not hauptform.table1.eof do begin
    //in diese schleife packe, bekomme ich keine endlosschleife. Leider ist dann aber auch nur der letzte datensatz drin :cry:
      sum := 0;
      while not hauptform.query2.eof do begin
        sum := hauptform.query2.fieldbyname('betrag').ascurrency + sum;
        hauptform.query2.next;
      end;
      hauptform.table6.append;
      hauptform.table6verteiler.value := hauptform.query2verteiler.value;
      hauptform.table6gehalt.value := sum;
      hauptform.table6.post;
      hauptform.table1.next;
      showmessage(hauptform.table1zhler.asstring);
   end;
   hauptform.table1.autocalcfields := true;
end;
Ich vermute, das das Problem in den autocalcfields liegt. Deshalb hier der Code. Denn wenn ich diese Anweisungen in {} setze also nicht ausführen lasse, funktioniert es, wie es soll. Warum führt er überhaupt noch diese anweisungen aus, obwohl ich autocalcfields auf false gesetzt habe?

Delphi-Quellcode:
procedure THauptform.Table6CalcFields(DataSet: TDataSet);
var i : integer;
begin
     if not (table6verteiler.value = 0) then begin
      i := table6verteiler.value;
      table1.setkey;
      table1.fieldbyname('Zähler').asInteger := i;
      table1.gotokey;
      table6verteilername.value := table1name.value +  ', ' + table1vorname.value;
      table6strasse.value := table1.fieldbyname('straße').value +  ' ' +table1hausnummer.value;
      table6strasse.value
     end;
end;

MrSpock 13. Aug 2003 15:45

Re: Unendlichschleife?
 
Hallo Taladan,

dass mit dem exklusiven Zugriff schlägt häufig fehl, weil man in Delphi bereits Active auf True setzt und dann beim Starten des Programmes aus der IDE eine weitere Zugriffsinstanz erzeugt. Du solltest deshalb Active auf False lassen und beim Programmstart, oder auch später, die Tabelle mit Open aus dem Programm heraus öffnen.

In deinem CalcFields versetzt du ja die aktuelle Position in Tabelle 1, dadurch erzeugst du eine Endlosschleife. Du kannst einfach eine weiter Instanz auf Tabelle 1 anlegen(z.B. SuchTabelle) und diese in Calcfields benutzen. Die Position in Tabelle1 bleibt dann unverändert.

MrSpock 13. Aug 2003 15:53

Re: Unendlichschleife?
 
Hallo Taladan,

hier mal ein Versuch, das Ganze mit SQL zu lösen.

Tabelle 1 heiße Personen, Tabelle 4 Gehalt und Tabelle 6 SummeGehalt:

SQL-Code:
INSERT INTO SummeGehalt
SELECT P.Name, SUM(G.Gehalt)
  FROM Personen P, Gehalt G
WHERE P.ID = G.ID
GROUP BY G.ID

Taladan 13. Aug 2003 17:29

Re: Unendlichschleife?
 
der fehler lag wirklich in dem autocalcfield. ich hab einfach eine if then daraus gemacht. also
Delphi-Quellcode:
if table6.autocalcfield = true then begin
//anweisungen zum autocalcfield
end;
Jetzt läuft es ohne probleme. Und dir auch noch mal danke Mr. Spock, aber deine SQL sieht mir (noch) ein wenig zu sehr nach unbekannten aus, als das ich es integriere. zu mal mir einige dinge drin noch fehlen. trotzdem danke. jetzt läuft es.


Alle Zeitangaben in WEZ +1. Es ist jetzt 07:57 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 by Thomas Breitkreuz