Avatar billede kare Nybegynder
21. juni 2005 - 09:41 Der er 6 kommentarer og
1 løsning

Variabelt antal inputfelter i prompt

Concorde C5, v3. XAL-kørsel.
Jeg har tre arrays, hvor det ene indeholder et variabelt antal elementer:

STR &Medlemmer[10]
ENUM NejJa &Tilmeldt[10]
ENUM NejJa &Betalt[10]

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.

Hvad kan jeg gøre?
Avatar billede jasman Nybegynder
21. juni 2005 - 09:48 #1
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.

Det var bare et lille forslag.
Avatar billede kare Nybegynder
21. juni 2005 - 11:43 #2
Det er jo et skodprogram så.. ;)

Men tak for svaret - om end det var negativt.
Avatar billede Broholm Novice
21. juni 2005 - 13:21 #3
Du kan godt lave det i en promptbox - men så skal du lave kode-der-skriver-kode...
Avatar billede mariaf Juniormester
21. juni 2005 - 19:08 #4
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
Avatar billede Broholm Novice
29. juni 2005 - 23:22 #5
P.s. Jasman: Hastighed på Arrays vs. TMP-kartoteker. Jeg testede det engang og i visse tilfælde var TMP faktisk hurtigere end arrays...
Avatar billede Broholm Novice
29. juni 2005 - 23:50 #6
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:

#MacroLoad(SYSTEM_INFORMATION)
#MacroLoad(TMP_FILE)
#MacroLoad(C_UTIL)

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
Avatar billede jasman Nybegynder
30. juni 2005 - 11:14 #7
Tjaeh.

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.
Avatar billede Ny bruger Nybegynder

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.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester