Jump to content
  • 0

Records wissen op basis van een conditie in een loop


hbrendel

Question

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.

Link to comment

12 answers to this question

Recommended Posts

  • 0

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

Link to comment
  • 0

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...

Link to comment
  • 0

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

Link to comment
  • 0

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

Link to comment
  • 0

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

Link to comment
  • 0

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.

Link to comment
  • 0

@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

Link to comment

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...