Ga naar inhoud

COUNT van diverse waardes in een FIELD


laasmooi

Aanbevolen berichten

Hallo FMers,

Zal aan mij liggen maar kan nergens de juiste info vinden hoe de functie COUNT toe te passen.

 

VOORBEELD.

In een Layout staat een Field met een nummer erin.

Het nummer komt uit een Value List en de Value List bevat de getallen 1, 2 en 3.

Stel er zijn 10 records, waarvan bijvoorbeeld 5 records met nummer 1, 4 records met nummer 2 en tenslotte 1 record met nummer 3. Samen dus 10 records.

 

Mijn vraag:

Ik wil zichtbaar maken hoe vaak nummer 1, nummer 2 en nummer 3 in Field staat, dus iets van:

Nummer 1: 5x

Nummer 2: 4x

Nummer 3: 1x

Gaat me alleen maar om hoe de COUNT functie toe te passen (of een andere als COUNT niet de juiste is). De layout is verder niet het probleem.

Hoe krijg ik dat voor elkaar?

 

 

 

...Sorry mannen, ik lees net iets over Count ( selfjoin::veld ) en ga daar mee aan de gang.

Link naar reactie

Helaas is de layout juist wél het probleem. Je moet niet de functie 'count' gebruiken maar de resumé (summary) count.

Maak een nieuw veld dat de summary functie count toepast op het veld met de nummers.Sorteer je records op het betreffende veld en plaats het op je layout in een layout (summary) part dat zichtbaar wordt bij sortering op dat veld.

Zie het bijgevoegde heel eenvoudige voorbeeldje. Bekijk de layout ook in lijst weergave. Je kunt zelfs het body part verwijderen wanneer je alleen de aantallen wilt zien.

count.fmp12

Link naar reactie
  • 1 maand later...

Wat ik wil...

 

Uitgangspunt is voorbeeldje count.fmp12 van Banach hierboven.

Ik heb niet 1 veld maar 2 velden waar identieke waarden (uit een valuelist) in voorkomen.

Wat ik wil is het aantal identieke waarden weergeven over beide velden (kolommen) als 1 resultaat.

Dus:

 

Veld1 Veld2

1 3

4 2

1

5 1

- 4

3 1

 

Resultaat:

1 4x

2 1x

3 2x

4 2x

5 1x

Link naar reactie

Ik krijg met het voorbeeldje van Ruben soms rare resultaten en bij 10 records is het snel, maar bij 1000 records wordt het al merkbaar trager en wanneer ik een ander record activeer, dan wijzigen ineens de uitkomsten. Ik weet niet exact wat er mis is, maar ik heb het bestandje van Ruben een beetje aangepast en dan treden de vreemde uitkomsten niet op en bij 1000 records is het nog steeds snel.

 

Je kan met:

ValueListItems ( Get ( FileName ) ; "waardes" )

de unieke waarden van de keuzelijst oppikken, maar dat kan ook met:

ExecuteSQL ( "SELECT veld1 FROM totalen UNION SELECT veld2 FROM totalen" ; "" ; "" )

Met die lijst kan je ook weer met ExecuteSql() gemakkelijk tellen hoe vaak een bepaalde waarde is gebruikt:

ExecuteSQL ( "SELECT SUM(1) FROM " & Quote ( Tbl ) & " WHERE " & Quote ( Fld1 ) & "=?" ; "" ; "" ; GetValue ( theValueList ; 1 ) )

Dat laatste heb ik in een CF gegoten:

// Format: CountValues ( Valuelist ; Tbl ; Fld1 ; Fld2 )
// Valuelist = lijst met de mogelijke waarden
// Tbl = de naam van de tabel
// Fld1 en Fld2 + de namen van de velden die de te tellen waarden bevatten

Let ( [ 
x = GetValue ( Valuelist ; 1 ) ; 
sql1 = ExecuteSQL ( "SELECT SUM(1) FROM " & Quote ( Tbl ) & " WHERE " & Quote ( Fld1 ) & "=?" ; "" ; "" ; x ) ; 
sql2 = ExecuteSQL ( "SELECT SUM(1) FROM " & Quote ( Tbl ) & " WHERE " & Quote ( Fld2 ) & "=?" ; "" ; "" ; x ) ; 
result = x & ": " & sql1 + sql2 & "x"
] ; 
Case ( 
	GetValue ( Valuelist ; 2 ) = "" ; result ; 
	List ( result ; CountValues ( MiddleValues ( Valuelist ; 2 ; ValueCount ( Valuelist ) - 1 ) ; Tbl ; Fld1 ; Fld2 ) ) )
)

totalen_aangepast.fmp12.zip

aangepast door Gast
Link naar reactie

LANG VERHAAL

 

Beste Menno en Ruben, het lukt mij niet.

 

Een korte inleiding:

Ik maak deze toepassing als vrijwilliger bij LannaTaDee.org.

Wij controleren de "ooggezondheid" en testen de lensafwijkingen van kansarme/papierloze mensen in het noordelijk grensgebied tussen Thailand en Birma. Inmiddels beschikken wij over vele (gedoneerde) instrumenten waaronder autorefractors, spleetlamp, oogdrukmeter en zelfs een funduscamera.

"Voorschrift brillen" moeten worden gemaakt, Hoya Bangkok doneert de lenzen en die worden in Chiang Mai ingeslepen in de monturen die de mensen hebben uitgezocht. Op een later tijdstip worden de brillen afgeleverd bij de nieuwe eigenaren.

Kant en klare "leesbrillen" (denk aan Hema, Action etc.) kunnen wij direkt meegeven aan de mensen. Wij hebben er altijd vele honderden bij ons.

Dankbaar werk wat we nu zo'n 3 jaar doen en we constateren dat de Thaise overheid ons werk zeer waardeert: We zijn nu officieel zeg maar "gedekt" door de TH overheid.

 

 

Waar het om gaat:

 

De software die ik tot zover heb gemaakt registreert bezoekers, testresultaten en eventuele gezondheidsproblemen, print lensvoorschriften uit en exporteert een excelsheet met de lenzen die moeten worden besteld bij Hoya. Komt ongesorteerd uit FM omdat de kennis mij ontbreekt hoe dat te doen in FM en ik sorteer de waarden (sterkte en cylinder) in Excel zodat Hoya als sponsor een makkelijk te lezen, keurig gesorteerd lijstje onder ogen krijgen.

 

Zelfde geldt voor de kant en klare leesbrilletjes. We willen graag weten hoeveel brillen van welke sterkte wij hebben weggegeven tijdens een sessie (meestal 2-3 dagen) ook al om te weten hoeveel wij moeten bijkopen om de voorraad op peil te houden.

Tot nu toe komt dat ook ongesorteerd uit FM en sorteer ik in Excel maar mooier is natuurlijk om het resultaat direct zichtbaar te hebben in FM.

Daar ben ik dus bijna, vooral ook door jullie hulp zover maar ik krijg het niet foutloos werkend.

De kennis en het inzicht ontbreekt me gewoon. Het gaat boven allemaal niet meer zo hard, ik ben de 70 lentes gepasseerd maar allez:

 

Hoe de toepassing werkt:

 

Op openingscherm Knop "Show Dispatched OTC"

Volgende scherm laat je begin en einddatum opgeven.

Groene knop verwijst naat script: "Find Dates and Show Dispatched OTC"

Als laatste wordt de layout "Show Dispatched OTC" getoond.

En daar wil ik het totaal aantal brillen gesorteerd op sterkte zien.

 

Als jullie denken, doe 't lekker zelf, heb ik daar alle begrip voor. Geen scheve ogen en mijn dank voor jullie meedenken tot nu toe is er zeker niet minder om.

Mochten jullie (of één van jullie) er toch tijd en energie in willen steken, stuur ik graag het fm12 bestandje naar jullie per PBtje.

Capture.thumb.JPG.6d6cc79f3a5788e2adaaa1dbdb0fd1a4.JPG

Link naar reactie

Ter informatie even de functies die Laas nu in zijn bestandje heeft:

De lijst met de waarden wordt nu gemaakt met:

// CountValues ( Valuelist ; Tabel ; Veld1 ; Veld2 ; Datumveld ; DatumStart ; DatumEinde )
// Valuelist =. De waardelijst die moet worden gebruikt om mee te tellen
// Tabel = Een willekeurig veld zodat in de SQL de juiste tabel kan worden aangeroepen
// Veld1 = Het eerste veld waar de incidentie van de valuelist-items in moeten worden geteld
// Veld2 = Het tweede veld waar de incidentie van de valuelist-items in moeten worden geteld
// Datumveld = Het datumveld waar de opgegeven datumreeks in moet worden gezocht
// DatumStart = begindatum
// DatumEinde = einddatum

Let ( [ 
Tbl = CF_GetTableName ( Tabel ) ; 
Fld1 = CF_GetFieldName ( Veld1 ) ; 
Fld2 = CF_GetFieldName ( Veld2 ) ; 
Dte = CF_GetFieldName ( Datumveld ) ; 
huidigewaarde = GetValue ( Valuelist ; 1 ) ; 
sql1 = ExecuteSQL ( "SELECT SUM(1) FROM " & Quote ( Tbl ) & " WHERE " & Quote ( Fld1 ) & "=?" & " AND " & Quote ( Dte ) & " BETWEEN ? AND ?" ; "" ; "" ; huidigewaarde ; DatumStart ; DatumEinde ) ; 
sql2 = ExecuteSQL ( "SELECT SUM(1) FROM " & Quote ( Tbl ) & " WHERE " & Quote ( Fld2 ) & "=?" & " AND " & Quote ( Dte ) & " BETWEEN ? AND ?" ; "" ; "" ; huidigewaarde ; DatumStart ; DatumEinde ) ; 
totaal = 0 + sql1 + sql2 ; 
result = If ( huidigewaarde ≠ "" and totaal > 0 ; huidigewaarde & ": " & Char ( 9 ) & totaal & "x" )
] ; 
Case ( 
	GetValue ( Valuelist ; 2 ) = "" ; result ; 
	List ( result ; CountValues ( MiddleValues ( Valuelist ; 2 ; ValueCount ( Valuelist ) - 1 ) ; Tabel ; Veld1 ; Veld2 ; Datumveld ; DatumStart ; DatumEinde ) ) )
)

Ik wilde ook dat het een beetje robuust zou zijn en daarom heb ik voor het juist invullen van de tabel en veldnamen nog twee CF's toegevoegd, die je in de vorige CF al ziet staan:

// CF_GetTableName ( Field )
Let( [ 
fqcn = GetFieldName ( Field ) ; 
end = Position ( fqcn ; "::" ; 1 ; 1 ) 
] ; 
Left ( fqcn ; end - 1 ) 
)

En

// CF_GetFieldName ( Field )
Let([ 
fqcn = GetFieldName ( Field ) ; 
ln = Length ( fqcn ) ; 
start = Position ( fqcn ; "::" ; 1 ; 1 ) 
] ; 
Middle( fqcn ; start + 2 ; ln - ( start + 1 ) )
)

 

En die levert dan in formulevorm:

CountValues ( ValueListItems(Get(FileName);"OTC") ; Clients_ID ; OTC Reader ; OTC Distance ; Date ; GlobalStartDate ; GlobalEndDate )

voor een bepaalde dag bijvoorbeeld:

+1.50: 	54x
+2.00: 	38x
+2.50: 	7x
+3.00: 	11x
+3.50: 	2x

Dankzij het gebruik van de CF_GetTableName() en CF_GetFieldName() kunnen in de formule ook gewone velden worden ingevuld ipv tekst met aanhalingstekens. Worden er veldnamen of tabelnamen gewijzigd, dan blijft dit gewoon werken

Link naar reactie

Doe mee aan dit gesprek

Je kunt dit nu plaatsen en later registreren. Indien je reeds een account hebt, log dan nu in om het bericht te plaatsen met je account.

Gast
Antwoord op deze discussie...

×   Geplakt als verrijkte tekst.   Plak in plaats daarvan als platte tekst

  Er zijn maximaal 75 emoji toegestaan.

×   Je link werd automatisch ingevoegd.   Tonen als normale link

×   Je vorige inhoud werd hersteld.   Leeg de tekstverwerker

×   Je kunt afbeeldingen niet direct plakken. Upload of voeg afbeeldingen vanaf een URL in

×
×
  • Nieuwe aanmaken...