laasmooi Geplaatst: 16 januari 2017 Delen Geplaatst: 16 januari 2017 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. Quote Link naar reactie
Banach Geplaatst: 16 januari 2017 Delen Geplaatst: 16 januari 2017 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 Quote Link naar reactie
laasmooi Geplaatst: 16 januari 2017 Auteur Delen Geplaatst: 16 januari 2017 Wederom bedankt, banach. Ik ben er mee bezig en denk/hoop/geloof dat ik 't begin te snappen. Laat je uiteraard weten als ik 't werkend heb. Quote Link naar reactie
laasmooi Geplaatst: 18 januari 2017 Auteur Delen Geplaatst: 18 januari 2017 "... op je layout in een layout (summary) part ..." Ik kreeg het maar niet aan de gang dus besloot ik om jouw voorbeeld na te bouwen. Toen werd 't duidelijk. Inderdaad, wat je al stelde, de layout is juist het cruciale deel. Part "summary" toegevoegd aan de layout en jahoor, 't werkt! Bedankt... Quote Link naar reactie
laasmooi Geplaatst: 26 februari 2017 Auteur Delen Geplaatst: 26 februari 2017 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 Quote Link naar reactie
Infomatics Geplaatst: 26 februari 2017 Delen Geplaatst: 26 februari 2017 Als je de developer versie van FileMaker hebt, dan kun je ook custom functies gebruiken. In bijgaand voorbeeld heb ik de GetFieldList functie gebruikt om de waardes uit de huidige records op te halen, en de Distribution functie om een lijst te krijgen van de totalen. Groet, Ruben totalen.fmp12 Quote Link naar reactie
laasmooi Geplaatst: 26 februari 2017 Auteur Delen Geplaatst: 26 februari 2017 Ik ga aan de gang. Zeer bedankt Ruben, vooral ook voor het maken van het voorbeeld! Quote Link naar reactie
menno Geplaatst: 26 februari 2017 Delen Geplaatst: 26 februari 2017 (aangepast) 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 26 februari 2017 aangepast door Gast Quote Link naar reactie
laasmooi Geplaatst: 26 februari 2017 Auteur Delen Geplaatst: 26 februari 2017 Menno, er is iets mis met je totalen_aangepast.fmp12, denk ik. Er is 1 veld en dat heet _internetShortcut_ Quote Link naar reactie
menno Geplaatst: 26 februari 2017 Delen Geplaatst: 26 februari 2017 Ik heb hetzelfde bestand even gezipt en nogmaals geüpload. Kijk maar even of het nu wel werkt. Quote Link naar reactie
laasmooi Geplaatst: 26 februari 2017 Auteur Delen Geplaatst: 26 februari 2017 Je hebt 't opgelost... Quote Link naar reactie
Infomatics Geplaatst: 26 februari 2017 Delen Geplaatst: 26 februari 2017 @Menno, coole functie! Een verschil met mijn oplossing is dat jouw functie is dat mijn functie ook werkt op een selectie van records. Groet, Ruben Quote Link naar reactie
menno Geplaatst: 26 februari 2017 Delen Geplaatst: 26 februari 2017 @Ruben, dat klopt, maar is simpel op te lossen door in de sql van de CF een WHERE-clausule toe te voegen. Quote Link naar reactie
laasmooi Geplaatst: 28 februari 2017 Auteur Delen Geplaatst: 28 februari 2017 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. Quote Link naar reactie
menno Geplaatst: 28 februari 2017 Delen Geplaatst: 28 februari 2017 Dag Laas, ik stuur je wat gegevens met een PB om je appje even te uploaden, dan kijk ik er graag naar. mvg, Menno Quote Link naar reactie
laasmooi Geplaatst: 28 februari 2017 Auteur Delen Geplaatst: 28 februari 2017 Menno, je bent mijn held! Quote Link naar reactie
Infomatics Geplaatst: 28 februari 2017 Delen Geplaatst: 28 februari 2017 Als het nodig is wil ik ook best mijn steentje bijdragen. Groet, Ruben Quote Link naar reactie
laasmooi Geplaatst: 28 februari 2017 Auteur Delen Geplaatst: 28 februari 2017 Dank je Ruben, Dat laat ik nu over aan Menno. Misschien dat jullie wat van elkaar kunnen leren (en ik ook). Nogmaals mijn dank! Quote Link naar reactie
laasmooi Geplaatst: 28 februari 2017 Auteur Delen Geplaatst: 28 februari 2017 Beste Menno, Je oplossing ziet er perfect uit. En compacter dan ik had durven hopen. Zeer bedankt! Quote Link naar reactie
menno Geplaatst: 28 februari 2017 Delen Geplaatst: 28 februari 2017 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 Quote Link naar reactie
Aanbevolen berichten
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.