AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Unendlichschleife?

Ein Thema von Taladan · begonnen am 12. Aug 2003 · letzter Beitrag vom 13. Aug 2003
Antwort Antwort
Benutzerbild von Taladan
Taladan

Registriert seit: 5. Aug 2003
Ort: Osnabrück
505 Beiträge
 
Delphi 2005 Professional
 
#1

Unendlichschleife?

  Alt 12. Aug 2003, 17:30
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;
Marco
  Mit Zitat antworten Zitat
Benutzerbild von MrSpock
MrSpock
(Co-Admin)

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

Re: Unendlichschleife?

  Alt 12. Aug 2003, 19:33
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.

Morgen guck ich mir dein Problem noch einmal an.
Albert
Live long and prosper


MrSpock
  Mit Zitat antworten Zitat
Albi

Registriert seit: 4. Mai 2003
Ort: Berlin
458 Beiträge
 
Delphi 7 Professional
 
#3

Re: Unendlichschleife?

  Alt 12. Aug 2003, 19:46
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.
  Mit Zitat antworten Zitat
Benutzerbild von Taladan
Taladan

Registriert seit: 5. Aug 2003
Ort: Osnabrück
505 Beiträge
 
Delphi 2005 Professional
 
#4

Re: Unendlichschleife?

  Alt 13. Aug 2003, 09:25
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.
Marco
  Mit Zitat antworten Zitat
oki

Registriert seit: 30. Dez 2002
Ort: Brandshagen
1.819 Beiträge
 
Delphi 2007 Professional
 
#5

Re: Unendlichschleife?

  Alt 13. Aug 2003, 09:42
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
  Mit Zitat antworten Zitat
Benutzerbild von Taladan
Taladan

Registriert seit: 5. Aug 2003
Ort: Osnabrück
505 Beiträge
 
Delphi 2005 Professional
 
#6

Re: Unendlichschleife?

  Alt 13. Aug 2003, 13:55
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;
Marco
  Mit Zitat antworten Zitat
Benutzerbild von MrSpock
MrSpock
(Co-Admin)

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

Re: Unendlichschleife?

  Alt 13. Aug 2003, 14:45
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.
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
 
#8

Re: Unendlichschleife?

  Alt 13. Aug 2003, 14:53
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
Albert
Live long and prosper


MrSpock
  Mit Zitat antworten Zitat
Benutzerbild von Taladan
Taladan

Registriert seit: 5. Aug 2003
Ort: Osnabrück
505 Beiträge
 
Delphi 2005 Professional
 
#9

Re: Unendlichschleife?

  Alt 13. Aug 2003, 16:29
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.
Marco
  Mit Zitat antworten Zitat
Antwort Antwort


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 04:18 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