Jump to content
  • 0

Records wissen op basis van een conditie in een loop


hbrendel

Question

Posted

Ik heb een FoundSet. Daar ga ik met een loop doorheen. Wanneer een bepaalde conditie waar is, dan moet het record gewist worden.

Het probleem dat ik nu heb, is dat ik niet gewoon simpel naar het volgende record kan gaan (exit after last), want wanneer een delete-actie heeft plaatsgevonden, dan is hij al op het volgende record gaan staan.

Dus wanneer het record NIET gewist wordt dan wel naar next record, bij wissen niet.

Maar als het laatste record gewist wordt, hoe weet het script dan dat hij klaar is?

Waarschijnlijk simpel, maar ik zie het even niet.

12 answers to this question

Recommended Posts

  • 0
Posted

Je kan het simpelst lussen:

loop
 If [ conditie = true ]
   Delete-record [no dialog]
 Else
   Goto next record [ exit after last ]
 End-if
End-loop

Je moet alleen niet vergeten de exit-after-last vinkbox aan te klikken. Als je geen records gevonden heb kan je met deze lus problemen krijgen wanneer je conditie bijvoorbeeld checkt of een bepaald veld leeg is, zorg dat je conditie goed in elkaar zit en anders voeg je een Exit-loop-if [ get( FoundCount ) = 0 ] toe in de lus

  • 0
Posted

Menno, mijn script was al zo, maar dit gaat dus niet goed wanneer het laatste record er een is die gewist moet worden.

 

Exit-loop-if [ get( FoundCount ) = 0 ] kan ook niet, want als er records zijn die niet gewist worden, dan wordt die conditie nooit bereikt.

 

Het idee van Felix vind ik wel aardig...

  • 0
Posted

Had je "exit after last" dan aangeklikt? Ik gebruik deze constructie regelmatig zelf en die gaat echt nooit fout (behalve wanneer "exit after last" niet is aangeklikt.) Records eerst wijzigen om ze vervolgens te zoeken en te verwijderen vind ik weer geen goede optie. Zie het voorbeeldje

RecordsWissen.fmp12

  • 0
Posted

Multi-user safe ben ik niet met je eens, want als ik een record niet kan wissen omdat iemand er mee an het werk is (lees aan het wijzigen is) kan ik er ook geen veldje in instellen om te wissen.

 

Als je dan een zoek wilt gebruiken om met een "Gevonden records verwijderen" een set in één keer te wissen, aan zou ik ook weer een lus gebruiken en de id's van de records die de voorwaarden voldoen opslaan in een variabele. Daarna voer je zoekopdracht uit met voor ieder record een zoekargument uit het stapeltje id's en dat werkt heel snel.

RecordsWissen_Anders.fmp12

  • 0
Posted

Menno, je had toch gelijk. Weliswaar stopt de loop niet na het laatste record wanneer het een even getal is, maar hij doet de loop nog één keer waarbij hij wel de 'Go-next-record [exit-after-last]' uitvoert.

 

Zoals ik al zei: mijn blik was even vertroebeld. Het testen ging in mijn db niet goed, maar dat bleek een andere oorzaak te hebben.

 

Ook weer opgelost.

 

Menno bedankt, en Felix ook

  • 0
Posted

Er zit toch nog een addertje onder het gras:

 

Wanneer van de FoundSet alle records verwijderd zijn, dan vindt de laatste loopsequence in een lege FoundSet plaats, en dan kan de conditie niet worden geëvalueerd en levert dus geen True (1) op. Hij blijft dan proberen het niet bestaande record te wissen.

 

Ik heb dit als volgt opgelost:

 

Go to Record/Request/Page [First]
Loop
   If [ and Get ( FoundCount ) ≠ 0]
       Delete Record/Request [No dialog]
   Else
       Go to Record/Request/Page [Next; Exit after last]
   End If
End Loop

  • 0
Posted

of:

 

 

Go to Record/Request/Page [First]
Loop
   Exit loop if [ Get ( Foundcount ) = 0 ]
   If [ ]
       Delete Record/Request [No dialog]
   Else
       Go to Record/Request/Page [Next; Exit after last]
   End If
End Loop

 

Zodra de Exit loop voldoet, maakt hij de overige commando's niet af en gaat direct door naar de End Loop.

De plaats van de Exit Loop kan dus grote invloed hebben op de werking.

  • 0
Posted

@hbrendel

in mijn eerste antwoord heb ik je daar al op gewezen:

 

Voorwaarden als

xxx ≠ 0 of xxx = ""

zijn ook waar wanneer er geen records zijn gevonden. Dus ofwel je conditie moet rekening houden met een gevonden set > 0 of je zorgt dat je conditie anderszins niet waar is indien de gevonden set 0 is ;-)

 

Wat wel werkt in een gevonden set van 0 records is:

xxx ≠ "" of xxx = 0

precies de inverse dus, daarom moet je ook zo goed opletten :D

  • 0
Posted

Allemaal waar. Het staat echter niet vast dat het uiteindelijk resultaat 0 records is, daarom kan Get ( FoundCount ) = 0 niet gebruikt worden.

 

Mijn functie werkt nu goed zoals beschreven in mijn post van 11:22.

 

Iedereen zeer bedankt voor het meedenken.

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...