Toon posts:

[Delphi] Waarom werkt dit niet?

Pagina: 1
Acties:
  • 284 views sinds 30-01-2008
  • Reageer

Verwijderd

Topicstarter
Hij blijft hier in een loop hangen..
weet iemand waarom?
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
Tabel1.Open;
    Tabel1.First;
    while not Tabel1.Eof do
    begin
    Tabel1.Edit;
    if Tabel1.FieldByName('Bedrag').Value = null then //kijken of er lege velden zijn
    begin
      Tabel1.FieldByName('Bedrag').Value := 0; //lege velden vullen met de waarde 0
      Tabel1.Post;
      Tabel1.Edit;
    end;
    begin
      Faktuurnr := Tabel1.FieldByName('Faktuurnr').AsString; //Faktuurnr op Faktuurnr uit tabel zetten
      FactuurState //Procedure om te controleren of Faktuur betaald is
      if Betaald = True then
      begin
        if rgCurrency.ItemIndex = 0 then //kijken of betaalde fakturen op 0 (gulden) of 1 (euro) gezet moeten worden
        begin
        Tabel1.Edit;
        Tabel1.FieldByName('Currency').Value := 'F'; //Betaalde faktuur wordt op F (gulden) gezet (veld currency, bedrag hoeft niet aangepast te worden)
        Tabel1.Post;
        Tabel1.Next;
        end
      else
      begin
        GuilderAmount := Tabel1.FieldByName('Bedrag').Value; //Var GuilderAmount wordt op de waarde Bedrag uit de tabel gezet
        EuroAmount := GuilderAmount / vEuroCourse; //Gulden wordt gedeeld door vEurocourse = 2.20371
        sEuroAmount := FloatToStr(EuroAmount); 
        sEuroAmount := FormatFloat('0.00', EuroAmount); //max 2 decimalen achter de komma
        Tabel1.FieldByName('Bedrag').Value := StrToFloat(sEuroAmount); //Veld vullen met om gerekende waarde
        Tabel1.FieldByName('Currency').Value := ''; //Het veld currency wordt op Euro () gezet
        Tabel1.Post;
        Tabel1.Next;
      end;
    end;
    end;
  end;

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 16-09 16:30

Janoz

Moderator Devschuur®

!litemod

Komop zeg... Probeer eerst eens wat debuginfo* erin te zetten zodat je ziet waar ie vastloopt...


*Debuginfo zijn print commando's waarmee je kunt zien of bijvoorbeeld waardes wel worden opgehoogd en hoevaak hij door een lus heen gaat, daarnaast kun je ook precies zien op welk punt je programma de mist in gaat.

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


  • mulder
  • Registratie: Augustus 2001
  • Laatst online: 16-09 23:21

mulder

ik spuug op het trottoir

Ik schreef:"Je hebt alleen Tabel1.Next in een If statement's staan. Als dus niet aan de voorwaarde word voldaan (waarschijnlijk al de eerste keer) Word er geen next gedaan, dus weer niet aan een voorwaarde gedaan, dus word er geen next gedaan, dus weer niet aan een voorwaarde gedaan, dus word er geen next gedaan, dus weer niet aan een voorwaarde gedaan, dus word er geen next gedaan, dus weer niet aan een voorwaarde gedaan, dus word er geen next gedaan, dus weer niet aan een voorwaarde gedaan, dus word er geen next gedaan, dus weer niet aan een voorwaarde gedaan, dus word er geen next gedaan, dus weer niet aan een voorwaarde gedaan, ..."

EDIT: Volgens mij moet ik beter lezen.......
EDIT2: Of toch niet?

oogjes open, snaveltjes dicht


Verwijderd

Je zult die tabel1.next wel verkeerd geplaatst hebben. :)

  • Tsjipmanz
  • Registratie: Oktober 2000
  • Laatst online: 13-05 14:52

Tsjipmanz

Der Rudi ist da

Op donderdag 22 november 2001 15:49 schreef DarKHunteR het volgende:
Hij blijft hier in een loop hangen..
weet iemand waarom?
Hij bereikt niet Eof, dat is het enige waarin hij kan blijven hangen

Als
code:
1
 if rgCurrency.ItemIndex = 0

NIET waar is gaat hij niet naar een volgende record. Hier moet je het dus zoeken.

There's no such thing as a mistake, just happy accidents - Bob Ross
Relaxte muziek: altijd okee!
- Soulseek rulez -


Verwijderd

Topicstarter
hij springt wel naar de volgende record, maar hij komt gewoon nooit in "end of file".

Verwijderd

Als betaald false is gaat hij niet naar de vlgde record.

Verwijderd

Ik zou je begin en ends maar eens gaan controleren..
bv:
code:
1
2
3
4
5
Tabel1.FieldByName('Bedrag').Value := 0; 
      Tabel1.Post;
      Tabel1.Edit;
    end;
    begin

wat doet die daar?

Daarnaast mis ik een puntkomma achter 'factuurstate'.

Je gebruikt nogal veel variabelen en sommige zijn niet nodig. Zo zet je eenrs EuroAmount om naar een string om 'm later weer terug te zetten naar float.

  • stekkel
  • Registratie: Augustus 2001
  • Laatst online: 12-07 11:54
Zoals reeds beantwoord:

als rgCurrency.ItemIndex <> 0 en betaald = true dan zit je in een oneindige lus.

Verwijderd

Hezik: En zo kunnen we nog wel effe doorgaan :) Lijkt wel zoek de 10 fouten, heb je misschien nog meer code DarkHunteR? :P

Verwijderd

Op donderdag 22 november 2001 16:01 schreef stekkel het volgende:
Zoals reeds beantwoord:

als rgCurrency.ItemIndex <> 0 en betaald = true dan zit je in een oneindige lus.
Ben ik nou scheel, of..? Volgens mij moet betaald toch echt False zijn om in een oneindige lus te komen.

  • stekkel
  • Registratie: Augustus 2001
  • Laatst online: 12-07 11:54
Plaats je table1.next trouwens ook ergens anders, namelijk net voor de 'end;" van de while-lus.
Dat scheelt weer 1 regel code en dat is inzichtelijker.

Verwijderd

Topicstarter
Btw: Het is niet mijn code. Er zit hier iemand en die is gebanned op tweakers, dus ik vraag het ff voor hem :)
voordat jullie een foute indruk van mij krijgen ;)

  • stekkel
  • Registratie: Augustus 2001
  • Laatst online: 12-07 11:54
Op donderdag 22 november 2001 16:06 schreef DiFool het volgende:

[..]

Ben ik nou scheel, of..? Volgens mij moet betaald toch echt False zijn om in een oneindige lus te komen.
als betaald false is dan krijg je de else statement waar een table1.next in staat.

Verwijderd

De oplossing zoals hij hier aangedragen wordt is iig niet waar:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
begin
  Tabel1.Open;
  Tabel1.First;
  while not Tabel1.Eof do
    begin
    Tabel1.Edit;
    if Tabel1.FieldByName('Bedrag').Value = null then //kijken of er lege velden zijn
      begin
        Tabel1.FieldByName('Bedrag').Value := 0; //lege velden vullen met de waarde 0
        Tabel1.Post;
        Tabel1.Edit;
      end;
    begin
      Faktuurnr := Tabel1.FieldByName('Faktuurnr').AsString; //Faktuurnr op Faktuurnr uit tabel zetten
      FactuurState //Procedure om te controleren of Faktuur betaald is
      if Betaald = True then
        begin
        if rgCurrency.ItemIndex = 0 then //kijken of betaalde fakturen op 0 (gulden) of 1 (euro) gezet moeten worden
            begin
            Tabel1.Edit;
            Tabel1.FieldByName('Currency').Value := 'F'; //Betaalde faktuur wordt op F (gulden) gezet (veld currency, bedrag hoeft niet aangepast te worden)
            Tabel1.Post;
            Tabel1.Next;
            end
          else
            begin
            GuilderAmount := Tabel1.FieldByName('Bedrag').Value; //Var GuilderAmount wordt op de waarde Bedrag uit de tabel gezet
            EuroAmount := GuilderAmount / vEuroCourse; //Gulden wordt gedeeld door vEurocourse = 2.20371
            sEuroAmount := FloatToStr(EuroAmount);
            sEuroAmount := FormatFloat('0.00', EuroAmount); //max 2 decimalen achter de komma
            Tabel1.FieldByName('Bedrag').Value := StrToFloat(sEuroAmount); //Veld vullen met om gerekende waarde
            Tabel1.FieldByName('Currency').Value := ''; //Het veld currency wordt op Euro () gezet
            Tabel1.Post;
            Tabel1.Next;
            end;
        end;
    end;
    end;
end;

Zo is het stukken duidelijker te zien imo.

Als betaald = false dan gebeurd er niets, hij voert dan geen next uit. Oftewel hij blijft hangen op de eerste onbetaalde factuur. Ik zou het zo veranderen:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
begin
  Tabel1.Open;
  Tabel1.First;
  while not Tabel1.Eof do
    begin
    Tabel1.Edit;
    if Tabel1.FieldByName('Bedrag').Value = null then //kijken of er lege velden zijn
      begin
        Tabel1.FieldByName('Bedrag').Value := 0; //lege velden vullen met de waarde 0
        Tabel1.Post;
        Tabel1.Edit;
      end;
    Faktuurnr := Tabel1.FieldByName('Faktuurnr').AsString; //Faktuurnr op Faktuurnr uit tabel zetten
    FactuurState; //Procedure om te controleren of Faktuur betaald is
    if Betaald then
      begin
        if rgCurrency.ItemIndex = 0 then //kijken of betaalde fakturen op 0 (gulden) of 1 (euro) gezet moeten worden
          begin
            Tabel1.Edit;
            Tabel1.FieldByName('Currency').Value := 'F'; //Betaalde faktuur wordt op F (gulden) gezet (veld currency, bedrag hoeft niet aangepast te worden)
            Tabel1.Post;
          end
        else
          begin
            GuilderAmount := Tabel1.FieldByName('Bedrag').Value; //Var GuilderAmount wordt op de waarde Bedrag uit de tabel gezet
            EuroAmount := GuilderAmount / vEuroCourse; //Gulden wordt gedeeld door vEurocourse = 2.20371
            sEuroAmount := FloatToStr(EuroAmount);
            sEuroAmount := FormatFloat('0.00', EuroAmount); //max 2 decimalen achter de komma
            Tabel1.FieldByName('Bedrag').Value := StrToFloat(sEuroAmount); //Veld vullen met om gerekende waarde
            Tabel1.FieldByName('Currency').Value := ''; //Het veld currency wordt op Euro () gezet
            Tabel1.Post;
          end;
      end;
    Table1.Next;
    end;
end;

Zo is het nog niet mooi allemaal, maar werkt het wel. Mijn tip: Kijk ook eens naar queries..

Oh ja, gebanned is gebanned. Dat betekend niet via anderen alsnog gebruik maken van GoT. Overigens is het dan wel een domme *** want je moet best je best doen om gebanned te worden.

Verwijderd

Topicstarter
ja,
hij is een beetje een loser..
zelf snap ik nix van Delphi(ik doe alleen php)..
maar hij zegt nu dat ie nix aan jullie code heeft...
dus laat maar ff zitten..
ik ga ook nix meer vragen voor hem..

Verwijderd

Sorry maar hier wordt ik een beetje pissig van. Hij heeft z'n oplossing en is nu te beroerd om even dankjewel te zeggen?

Zijn eigen code voert gewoon geen NEXT uit als betaald is true. Als hij beweerd dat dat wel zo is dan kan hij beter gewoon Delphi gaan wissen van z'n HD.

Verwijderd

Topicstarter
Op donderdag 22 november 2001 16:27 schreef hezik het volgende:
Sorry maar hier wordt ik een beetje pissig van. Hij heeft z'n oplossing en is nu te beroerd om even dankjewel te zeggen?

Zijn eigen code voert gewoon geen NEXT uit als betaald is true. Als hij beweerd dat dat wel zo is dan kan hij beter gewoon Delphi gaan wissen van z'n HD.
yeah,
hij denk dat zijn code beter is en hij zegt dat jullie het niet snappen...

Verwijderd

yeah,
hij denk dat zijn code beter is en hij zegt dat jullie het niet snappen...
Zit je de boel te stangen hier of denkt hij dat echt?

Iemand die denkt dat ie 2 conversies nodig heeft om z'n float met 2 getallen achter de komma te krijgen moet je zowieso niet serieus nemen imo.

Waarschuw 'm nog wel even ervoor dat als hij dit programma multi-user wil gaan toepassen dat hij binnen 2 dagen z'n database kan afschrijven >:)

Verwijderd

Topicstarter
Op donderdag 22 november 2001 16:35 schreef hezik het volgende:

[..]

Zit je de boel te stangen hier of denkt hij dat echt?

Iemand die denkt dat ie 2 conversies nodig heeft om z'n float met 2 getallen achter de komma te krijgen moet je zowieso niet serieus nemen imo.

Waarschuw 'm nog wel even ervoor dat als hij dit programma multi-user wil gaan toepassen dat hij binnen 2 dagen z'n database kan afschrijven >:)
ja,
ik weet nix van delphi dus ik weet niet waar je het over hebt..maar ik zal dit wel ff allemaal aan m laten lezen..
kan ie ff kijken hoe goed ie in delphi is :P

  • stekkel
  • Registratie: Augustus 2001
  • Laatst online: 12-07 11:54
Ja, inderdaad dat is niet zo heel slim.

En toch blijven denken dat zijn code beter is.
Tja, je hebt eigenwijs en EIGENWIJS :)
Pagina: 1