Ved hver afvikling af kørslen kan der være fra 0-10 'medlemmer' i array'et.
Jeg skal i en prompt-boks indsamle hhv nej eller ja for hvert 'medlem', dvs. er der tre medlemmer skal prompt-boksen have tre linier med inputfelter: -------------------------- Navn1: [&Tilmeldt[1]] [Betalt[1]] Navn2: [&Tilmeldt[2]] [Betalt[2]] Navn3: [&Tilmeldt[3]] [Betalt[3]] --------------------------
Jeg kan ikke gennemskue om/hvordan det kan lade sig gøre.
#IF-funktionen kræver vidst, at antallet er kendt på kompileringstidspunktet og en WHILE-løkke eller lign. inde i en prompt virker ikke.
Du kan ikke i XAL lave en dialog som dynamisk udvider sig desværre.
Du er nok nødt til at lave ti sæt felter og så loope i arrayet og kun gøre noget hvis et af felterne er udfyldt. Performancemæssigt er det jo ikke noget der betyder noget særligt.
Alternativt kunne du overveje at skrive dialogen om til en form, som anvender et temporært kartotek, hvor brugeren så opretter en linie, hvis der skal indtastes data. Når du så forlader formen, skal du i stedet for et array bruge den temporære tabel som listen du skal gennemløbe. Performancemæssigt er det lidt langsommere (disk-access), men på den måde sikrer du i hvertfald at der kun er de linier, som der skal være, og du kan også indtaste data for flere end 10 medlemmer, hvis det skulle blive nødvendigt.
Du kan sagtens rent teknisk lave en prompt i en Whileløkke - det er faktisk gjort i et standardelement, så det skal mere være fordi det rent kodemæssigt ikke hænger sammen. Ellers kan du da bare bruge en QT - har du en masse kode, der er for bøvlet at flytte, så kald QT'en med parametre
Det kommer an på om det er fortløbende eller tilfældige offsets. Jeg får dette output: *********** *Nulstilling* Fortløbende værdier: Ticks til &Array: 2.874,00 Ticks til TmpFrmVirtuel: 8.202,00 *Nulstilling* Tilfældige værdier: Ticks til &Array: 23.133,00 Ticks til TmpFrmVirtuel: 17.996,00 *********** Fra denne XAL-kørsel:
INT &I STR 20 &Array[,10] INT &StartTime INT &Session
#GetTempId(&Session)
PRINT "*Nulstilling*" PROCESS #Proc_DbRun 'MODE=DELETE FILE=TmpFrmVirtuel'
PRINT "Fortløbende værdier:"
SET &StartTime = #SysLoadTime() FOR &I = 1 TO 100000 SET &Array[&I] = Int2Str(&I) END PRINT " Ticks til &Array: ",#SysLoadTime-&StartTime
SET &StartTime = #SysLoadTime() TTSBEGIN TmpFrmVirtuel FOR &I = 1 TO 100000 INTRODUCE TmpFrmVirtuel[SessionFilRecIdx == &Session,&I] SET TmpFrmVirtuel.Tekst1 = Int2Str(&I) INSERT TmpFrmVirtuel END TTSCOMMIT TmpFrmVirtuel PRINT " Ticks til TmpFrmVirtuel: ",#SysLoadTime-&StartTime
PRINT "*Nulstilling*" SET &Array[0] = '' PROCESS #Proc_DbRun 'MODE=DELETE FILE=TmpFrmVirtuel' #GetTempId(&Session)
PRINT "Tilfældige værdier:" SET &StartTime = #SysLoadTime() FOR &I = 1 TO 100000 SET &Array[#SysRandom(99999)+1] = Int2Str(&I) END PRINT " Ticks til &Array: ",#SysLoadTime-&StartTime
SET &StartTime = #SysLoadTime() TTSBEGIN TmpFrmVirtuel FOR &I = 1 TO 100000 INTRODUCE TmpFrmVirtuel[SessionFilRecIdx == &Session,#SysRandom(99999)+1] SET TmpFrmVirtuel.Tekst1 = Int2Str(&I) INSERT TmpFrmVirtuel END TTSCOMMIT TmpFrmVirtuel PRINT " Ticks til TmpFrmVirtuel: ",#SysLoadTime-&StartTime #DeleteVirtuel(&Session) PAUSE
Der kan man bare se. Arrays som er for store til hukommelsen, bliver jo swappet til disk, men det kan da undre at implementationen af dette, tilsyneladende ikke er baseret på enten en hash-funktion eller en form for index.
Det temporære kartotek er jo selvfølgelig indekseret og understøtter kernemæssigt en eller anden form for read-ahead buffering, men hvis arrays (swappet til disk) ikke er det/gør det (og det er åbenbart ikke tilfældet), ja så er resultatet af din prøve indlysende.
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.