Popular Content

Showing most liked content since 03/29/2016 in all areas

  1. 4 likes
    Hi All, I am happy to present the FmDynamix project, including cfCall () and #load (), my new 2 custom functions .... In an interest to further test FileMaker more and more ... I tried to give you a presentation of this new method, as explicit as possible, I hope to have succeeded ! You have the description and the presentation here, and take before the file demo : fmx_FmDynamix_Presentation.fmp12 I hope that this file will give you the urge to see this method, I do not think I have view of similar thing I hope that this "modularity" will please you and will give some ideas, feel free to test and give me your comments ! Thanks for your interest Agnès ( and thank you to Google Translate too )
  2. 4 likes
    Security Vulnerabilities of FileMaker Platform API’s: An Update January 9th 2017 In an April 2016 entry on this BLOG titled The FileMaker Platform API’s Are Your Friends, Right? [http://fmforums.com/blogs/entry/1535-the-filemaker-platform-api’s-are-your-friends-right/] I discussed a number of FileMaker Platform security issues centered on the uncontrolled use of a number of external Application Program Interfaces (API’s). There are at least nine of these API, possibly more, if ExecuteSQL is included. The central thesis of that article was that these API’s provide unexpected attack vectors to compromise FileMaker Platform files. As noted at the time: Many FileMaker developers are not aware, however, that these API’s have the capability to access customer or client solutions in unexpected ways and to extract or insert data, to manipulate business processes developers embedded into these solutions, and to compromise the integrity of these solutions. Unfortunately, in the intervening nine-month time span, we continue to see cases where several of these API have been used for malicious purposes to compromise FileMaker Platform files’ business process integrity, to manipulate data, and to extract data. And many in the developer community remain unaware of this problem. In this BLOG entry, I will describe two of these API’s in greater specificity and detail, including describing a variety of attacks they can facilitate. This article will not discuss the ActiveX API that is available on Windows OS; however, developers should give similar attention to that approach. Developers need to be aware of these items in order to protect their files and those of their clients. The two API at the center of this focus are Apple Events and the FMPURL process. In the earlier article, I noted several elements about these that bear repeating here: [These API] cause particular concern because of their breadth and relative ease of use…. The Apple Events Suite has an extensive set of commands that can read and write data, read metadata, manipulate the UI, and trigger scripts. In addition, they can work outside the normal constraints found on layouts in a file. [http://thefmkb.com/5671] The FMPURL…can open a file and run a script in it. If the file is already open, then the script will still run. [http://thefmkb.com/5560] A few general comments about both of these API’s: · They are not platform-specific in the sense that just because a client organization is an all Windows OS environment that it is immune from an Apple Event attack. It’s the OS of the attacker that controls whether the API can be used. · There are some ways within Privilege Sets to constrain behavior of these API commands when they are applied on a file. The Export privilege bit can control the ability of Apple Events to extract data from a file. The Layout Access privilege bits can also constrain the ability to see contents of a layout. Likewise, Script Access privilege bits can control the availability of a script to either of these API. · These API often perform actions in unexpected fashions that fall outside the normal, traditional, and familiar FileMaker Pro User Interface behavior. This is part of what catches developers by surprise. —Apple Events— When a file is open, whether standalone or hosted by FileMaker Server, an attacker can send Apple Event commands to it causing it to perform a variety of actions, including: · Run any script to which the user has access, irrespective of whether that script is in the list of Scripts or whether it is attached to some UI element, such as a button. · Navigate to any Layout irrespective of whether that Layout’s name is in the list of Layouts or not. If the user’s Privilege Set has access to see that Layout, then its contents are visible whether the developer ever intended for the user to view the Layout or not. · Return various metadata about the file, including such items as Script Names, Value List Items, Layout Names, Field Names, etc. If a user’s Privilege Set does not allow access to the item, its name does not appear in the list returned. · Put data into any field in the database or extract data from any field, irrespective of whether that field is on the active Layout or is on any Layout for that matter. Here are several examples of these scripts, all working on a file named Our_Secret_Information.fmp12. tell application "FileMaker Pro Advanced" activate go to first layout end tell tell application "FileMaker Pro Advanced" activate do script FileMaker script "Relog_as_Admin" end tell tell application "FileMaker Pro Advanced" activate set somevar to name of every layout end tell tell application "FileMaker Pro Advanced" activate set somevar to name of every field end tell tell application "FileMaker Pro Advanced" activate set somevar to get data field "CreditCardNumber" end tell —FMPURL— The FMPURL command’s principal attack vector is that it can be used to run any Script in a file to which a user’s privileges has access. Similar to Apple Events, this occurs irrespective of whether that script is in the list of Scripts or whether it is attached to some UI element, such as a button. If the file is closed, the command first opens the file with supplied credentials, then runs any OnFirstWindowOpen script, and then runs the designated script from the FMPURL command. As a result of this behavior, a Halt Script step at the end of the opening script has the effect of blocking the running of the FMPURL designated script. Some developers have utilized this technique to block FMPURL calls to scripts in a file. However, if the file is already opened or if there is no opening script, then the designated script does run. Here is an example of calling a script, again in our file Our_Secret_Information.fmp12 being hosted at a server at IP address fmp:// Relog_as_Admin —What Is the Significance Of This and How Do We Address This?— One of the many reasons we caution developers against embedding security elements such as Identity and Access Management controls into the data layer of FileMaker Pro databases is precisely because such elements are vulnerable to these API attacks. Think for a minute about that Relog_as_Admin script that presumably relogs into the file with a [Full Access] Account. If an Attacker can trigger that script and cause it to run, irrespective of what the developer might have intended, then the Attacker has full access to the file. This has actually happened. Or, suppose that a developer has made a “Developer_Only” layout in the file, removed it from the list of layouts, and left sensitive information on it. If the Attacker can navigate to that layout, and if it is not protected by settings in the Privilege Set, then the Attacker can learn the contents of the information on it. This has actually happened in numerous instances, including unbelievably, the appearance of [Full Access] level credentials left exposed on the layout! Likewise, suppose that a developer has made a so-called “Privileges Table” with various fields that purport to control whether a user can do such things as create records. Using the Apple Event Set Data command, an Attacker could likely change the values in these fields if they do not enjoy additional protection. More likely even, the Attacker could simply issue a Make New Record command and create the record. That is a process frequently used to thwart developer-imposed limitations on the number of records in a demonstration version of a vertical market solution. So, what can be done to manage this situation and to prevent these type attacks? In FileMaker® Pro 15, FileMaker, Inc. added a new Extended Privilege option in the Privilege Set called fmscriptdisabled. Developers must explicitly invoke this option; it is not a default option. What it does is to prevent Apple Events (Macintosh OS) and ActiveX commands (Windows OS) from activating scripts, just as the name implies. It has no impact on FMPURL or on other Apple Event commands that do not involve triggering of scripts. Some of the other items in a Privilege Set, notably Export and data layer modification elements, can control Get Data and Set Data Apple Events. If Export is disabled, then Get Data will not return data from the selected field. In tables where the editing privileges are restricted, likewise, Set Data will not add data to a field. Creation and deletion privileges behave in similar fashion. Remember, we are talking here only about Apple Events. Other processes may behave differently. Controlling API behavior is important; however, it is not the only security feature that developers must invoke to assure Confidentiality, Availability, and Integrity of their database systems. So, clearly what we need here is a way to block these API from interacting with FileMaker Pro files. FileMaker, Inc. is aware of these issues and has been working on new ways to address them. In the Product Road Map Webinar presented on November 30th 2016, FileMaker, Inc. noted that the next version of the FileMaker Platform will contain a number of additional security enhancements. I am authorized to say that one of those enhancements will be a new process for more closely and granularly controlling several of these API’s. At such time as there is any new version of the FileMaker Platform, I will have additional comments and analyses of the issues related to these API’s.
  3. 4 likes
  4. 3 likes
    For the most part people come to FM Forums seeking advice or assistance. If given a little thought, your topic can really engage the reader to want to assist you in finding the best answer or solution. Step 1: Choose Wisely! By first looking at the topical nature of the forums you can see there are many different forums that cover a wide range of discussions. By way of self-curating the site, try to choose a forum that covers the intent of your topic. We realize that some items cross boundaries and that is ok, just choose a forum that fits the spirit of your topic. If it's wrong a moderator will move it to a forum that best suits the conversation. Step 2: Titles, Names, & Tags Be terse but informative. With your topic title, encourage your reader to want to read your topic. Don't be needy or demanding with "please help" post titles. We realize you've hit a brick wall or may be very frustrated or have a demanding boss. But take a breath - it will be ok. Then compose a topic title that draws them in. Add a tag or two, they will appear next to the topic, it can just be a simple word or phrase that tags the post to some FileMaker-centric topic. Step 3: No Need for Apologies It is not necessary to start your post with an apology to the reader regarding where you are posting or your current understanding of a topic. We are pretty nice here and won't fault you for trying. Step 4: Prerequisite In order for your reader to provide the best response, make sure your profile has been updated with the platform and version of FileMaker that you are using. Otherwise we will assume you are using the most current versions, and the advice given may not work in older versions. If your post is specific to a version / platform / deployment please inform the reader — we don't necessarily need your computer specs, just enough background so that the reader can envision your environment. Step 5: Goals Stating your desired goals, and what you are attempting to achieve in a simple statement will aid the reader as they read further in to the details of your conversation. Step 6: What have you tried? Outline your process and steps you have taken, to get to you the point you are at. It doesn't have to be overly verbose, an essay isn't necessary. Step 7: Format for Emphasis Use the WYSIWYG editor to format text as needed to provide details. You can reference generic terms such as table::field or use your own nomenclature but if the context dictates provide the reader clarity what things may mean if they would not be apparent to someone outside your organization, or industry. this is code from a calculation bullets lists Step 8: Pictures & Sample Files Admit it, you know you miss Show & Tell from kindergarten. Re-live a past life by providing a screen image of your solution. Provide the reader information and context. Use third party tools to draw arrows on your image if needed. Can you send a clone of your solution? - If you do please make sure confidential data is removed, and your boss says it is ok. If you are modifying a commercial version of software that you have purchased — we request that you not do post a clone of these files; as that would be most likely against your terms of service. In that case you can make and post a sample file that recreates the issue you are having. Step 9: A Sense of Humor Keep your sense of humor, and don't forget to smile. The site is visited by members of all skill levels, many are full time developers and consultants and generously volunteer their time and energy to the site. When the occasion calls for it give them your gratitude . A little levity never hurts. Also keep in mind that American English is not everyone's native language -- some things may not translate. If English is not your first language, just do your best. We really appreciate this! It gives us a little spring in our step.
  5. 2 likes
    Here is a trick I use on popovers, since its difficult to place an object edge to edge on them without activating the scroll bars. select the object set fill to gradation pull the left and right gradation handles tight towards each other
  6. 2 likes
    if you change layouts while in find mode, the OnLayoutEnter will fire. But it has to be enabled for Find mode of course. If you want to trap the user switching modes on the same layout then the OnModeExit will do. OnRecordLoad fires after the Layout change but if you only want to capture the layout or mode change then RecordLoad is overkill since it fires on all record changes. Soliant has a big blog post with a triggers playground demo file that has all possible triggers enabled to make it easy to see the exact firings and sequences.
  7. 2 likes
    One way to do it is with conditional formatting. Based on the results of a calculation, you can change the color of the text to match the layout background; or, you can change the size of the text to a very large number so that it's pushed outside the boundaries of the field or text box.
  8. 2 likes
    One could turn your argument around: suppose you are editing the script, and you want to make a change to the Set Field[] step; you would have to leave the script workspace and look for the calculation field in order to make the change there. I believe that if an action is scripted, it's good practice to place all the necessary logic within the script. And if you divide your scripts into logical parts and take care to comment each part, you should not have to look very hard in order to find what you're looking for.
  9. 2 likes
    Hello Everyone, I've written a PowerShell script to allow you to get a free SSL certificate from Let's Encrypt to use with FileMaker Server. You can schedule this to run every few months and renew your certificate automatically. Now there's no reason to keep using that default certificate. Check out the post for instructions! How to Use Let’s Encrypt SSL Certificates with FileMaker Server | Blue Feather - FileMaker Developer, Android, Web EDIT: One compatibility note for everyone - While it looks like it's all compatible with FileMaker Pro 13-15, only FileMaker Go 15 is compatible. FileMaker Go 14 is unable to connect with these certificates installed. I'd recommend using FM Go 15 anyway, but it's something to be aware of if you're still using FM Go 14.
  10. 2 likes
    You can also use Export Field Contents and skip specifying the field. There are a few more ways as well, such as exporting 0 records using same path file name. All similar principle so it's which you like best. I like Export Field Contents; picked up from Comment, I suspect.
  11. 2 likes
    Yet another option: sort the found records by the DeliveryRemaining field, ascending (or descending) and check the value of the last (or first) record.
  12. 2 likes
    Good points, well-taken; but I can't shake the feeling that you're thinking like salesmen rather than like customers. Many people are "penny wise and pound foolish", whether we like it or not, and I used to make my living getting hired to cater to that and then guiding them to better decisions — but only if their decision to use FileMaker allowed me to get my foot in the door. It's nice if you can say, "Well, I really don't know if I want those people as clients" but I made a decent living off them, once, and now I'm not anymore. I agree FileMaker Cloud is a step in the right direction (taking your calculations at face value - I have a cold right now and can't really think through the figures myself at the moment.) Thinking back to when my clients were mostly small mom & pop businesses and nonprofits (and I was much busier as a consultant than I am today) I'm sure about half of them would have seen your reasoning. But for half of them, the appeal was that they could host FM on the old mac mini they had sitting in the corner and never have to think about it. The conceptual hurdle of dealing with AWS & EC2, for the non-computer-literate clients that it used to seem to me were FileMaker's bread and butter, is much more immense than it is to you and me. For the same reason that clients still insist on onsite visits even after TeamViewer and Skype have made physical presence 99.9% unnecessary, mom & pop operations also aren't going to cotton to offsite virtual servers with complicated administrative interfaces that they have to learn (when they can just barely figure out how to use word.) It makes them feel like they're now dependent on more things outside their control, and they don't like that. I can't imagine selling a virtual-server-based 5-seat-minimum system with monthly licensing to a lot of the people who I used to survive off of. They just wouldn't bite. Even if it was free they'd still think it was too complicated for them, it's too weird and abstract, and they'd be too worried about perpetual dependence on me keeping the server running. Whether it was true or not. The whole point was the FileMaker used to be for people who didn't want to have to become technically-adept computer geeks. AWS is precisely for technically-adept computer geeks, and it's a very beautiful thing for them, but that's who its for. The thing that sucks, to me, is, FileMaker doesn't necessarily have to be one or the other. There can be both a monthly cloud-based licensing model for teams AND a FileMaker-Go-for-desktop-type "thin client". Also, I know I've seen people cringe when I mention the software subscription model. I know it's worth it, and you know it's worth it, but Mr. McGintee whose little heath food store could improve its narrow margins running much more efficiently on on FMP only hears "I want you to keep paying forever and ever for something you used to only have to pay for once". Yes, I know the flaws in that reasoning. But that's what people hear. And I, for one, would really just rather be developing databases than trying to sell Mr. McGintee on whatever licensing model FMI has decided to adopt this year. Sucks dealing with human quirks, but until I can reliably score consulting gigs on planet Vulcan, these are the things we have to think about. If FM could find a way to increase their penetration in the enterprise realm, and I could get steady enough corporate gigs not to miss the small businesses who used to call me all the time, I'd have no complaint. And the funny thing is, I still get a fair number of calls for help from solitary users using one-person databases. It's that small business, the 3-5 person companies that used to be a rich vein for me, are where the demand seems to have completely been hollowed out. I hope to be pleasantly surprised, but I just don't see FileMaker Cloud bringing those kind of people back to the platform. And there used to be a lot of them. I've posted this elsewhere, but look at this Google Trends graph for search interest in FileMaker: Despite vast improvements in the program, interest (as expressed in google searches for information ) has dropped by 50% every 4 years. It's now declined to about 1/10th of its peak. That should scare the bejeezus out of anyone who makes their living this way, and I just don't think that decline was because of lack of a technically abstruse (to non-IT-professionals) monthly cloud-based licensing option. I firmly believe, based solely on my own experience then and now, that 10 years ago there was a huge, solid base of very small, funky business users that just aren't there anymore, and I would really like FMI to try to find a way to get them back. Not a way that sounds good to you or to me, but to THEM, something simple and uncomplicated yet still powerful under the hood (just like FileMaker used to be.) AWS support isn't that, regardless of price. And, again, it doesn't have to come at the expense of other options. They could offer thin clients on the bottom and all kinds of fancy licensing at the top, broaden their appeal on both ends. Oops, looks like I've ranted again. Apologies, I didn't mean to harangue you. But that graph above is what it all comes down to for me, and I find it very frustrating, because FMI's product marketing strategy seems to be alienating a formerly lucrative segment of their former user base, as if they must be sacrificed to attract a new segment - one which isn't proving itself at the same rate. It baffles me. I just think "FileMaker Go For Desktop" is a good step towards getting those lost customers back in the fold.
  13. 2 likes
    There are some nuances worth mentioning here. For example, the default Filemaker find looks for words that begin with the search phrase. Highlighting the search phrase as pattern is more inclusive. Say you searched for "little" and the found record contains "Doctor Doolittle belittled his little friend". Highlighting the pattern "little" will result in "Doctor Doolittle belittled his little friend" - but the first two highlighted occurrences played no part in the search.
  14. 2 likes
    This cannot be done by using find alone. Filemaker will find records that contain something. It will not do calculations or comparisons during the find. Now, there are two ways to accomplish what you want: a slow one, and a fast one: The slow method requires that you find the records that will participate in this (if you want to see the latest revision of all products, then do Show All Records at this stage) and sort them by the field in question, ascending. Then go to the first record and loop: If the product-code part in the current record matches the product-code part of the next record, omit the current record. Otherwise go to next record. Note: if you only want to see the latest revision of a single product, then it can be simpler (and much faster). Find the records of the wanted product, sort them, go to first record and omit multiple records using Get ( FoundCount ) - 1 as the number of records to omit. The fast method would require a structural change. At minimum, you need to split the field in question into two separate fields (that's always good practice, embodied by the maxim "one fact per field") . This would enable you to use the Fast Summaries method and omit an entire group of records (except the last record in the group) at once. You would also have to add a summary field that counts the records. Even better solution would have a table of Products, where each product-code would be unique, and a related table of Revisions. Then you could get the latest revision of each product by using a calculation getting the Max() or Last() revision number. Or show it directly from the Revisions table using a sorted portal/relationship.
  15. 2 likes
    I'll echo the recommendation for the scripted approach - but with a caution about not overdoing the script triggers. Where possible roll the field updates into the normal scripted flow. Script triggers have a tendency to fire even when you really wish they wouldn't and the extra maintenance can be a hassle.
  16. 2 likes
    Okay, then. The first thing that needs to be clear here is this: if you want your report to show every day of the selected month, even if you have no records for that day, you will need a reporting table with 31 permanent records numbered serially and global fields for the month and year to report on. The relationship between this table (Days) and your existing table (Records) will be: Days:cDate ≥ Records::DateAdmitted AND Days::cDate ≤ RecordsDateDismissed where cDate is of course a calculation field = Date ( gMonth ; SerialNumber ; gYear ) Then you can count the related checkbox field in order to get the number of events that should be shown in each day's record. Your reporting script needs to look at gMonth and gYear and omit the appropriate number of records from the report (e.g. the last 3 records if it's February in a non-leap year).
  17. 2 likes
    Hi John, One thing you can do is go to Manage > Themes and duplicate the Classic theme. YOu'll need to also then change all layouts to point to this new theme. You can then modify the new custom theme all you wish. Keep in mind that you may lose some of your fields' formats if you've set them 'outside' of the defined style and have probably even used 'format painter' on many fields (which can greatly impact your layout loads). You will find that a newer theme will lighten your solution's footprint but there might be some cleanup to do. Once done, you should be good to go. Hi Barbara!!
  18. 2 likes
    In a true transaction model you never delete a transaction, you compensate by making another if an adjustment is needed... Think accounting.
  19. 2 likes
    Hey again. In a previous thread I suggested using javascript in a webviewer to return the difference between the server and client UUID lists in order to increase the sync check speed. It was much faster, but the code I used included an algorithm with quadratic time complexity, meaning that as the size of the lists increased the time that sync check took would grow exponentially. @GisMo helped test confirm that this solution would not scale well. However I think I've found a bit of javascript that solves this issue and will scale linearly. I've changed the script from the previous thread to use this new code instead. If you are using this javascript method for list comparison I highly recommend you change the sync check script to use this code. Simply open the new file, copy the calculation from set variable[ $url ] in "Sync Check Client", and paste it into your Set Variable[ $url ] step. Otherwise if you're using EasySync and struggling with sync check, give my solution a try! I've attached the new file below and linked to the old thread for continuity. Best, Josh EDIT: For anyone interested in a demonstration of just the algorithms' performance difference before updating sync check, I've uploaded a raw concept file. EasySync_JWH_SyncCheckMod_LINEAR.zip Linear_Array_Comparison.fmp12.zip
  20. 2 likes
    I would start by defining the Recruiting Event field to validate as Unique. Then make your script: Freeze Window Set Variable [$Source; Value: Person::Source] Go to Layout ["RecruitingList" (Recruiting)] Set Error Capture [ On ] New Record/Request Set Field [Recruiting::Recruiting Event; $Source] Commit Records/Requests If [ Get ( LastError ) = 504 ] Revert Record/Request [ No dialog ] End If Go to Layout [original layout]
  21. 2 likes
    Try: Set Variable [ $txt; Value:AnyTable::gTextfield ] # # OUTER LOOP Go to Layout [ “Questions” (Questions) ] Set Variable [ $i; Value:1 ] Loop Exit Loop If [ $i > ValueCount ( $txt ) ] New Record/Request Set Field [ Questions::Question; GetValue ( $txt ; $i ) ] Set Variable [ $qID; Value:Questions::QuestionID ] # # INNER LOOP Go to Layout [ “Options” (Options) ] Loop Set Variable [ $j; Value:$j + 1 ] Exit Loop If [ $j > 5 ] # Set Variable [ $option; Value:GetValue ( $txt ; $i + $j ) ] Set Variable [ $correct; Value:Left ( $option ; 4 ) = "[X] " ] # New Record/Request Set Field [ Options::QuestionID; $qID ] Set Field [ Options::Option; If ( $correct ; Right ( $option ; Length ( $option ) - 4 ) ; $option ) ] Set Field [ Options::IsCorrect; $correct ] End Loop # Go to Layout [ “Questions” (Questions) ] Set Variable [ $i; Value:$i + 7 ] Set Variable [ $j; Value:"" ] End Loop Note that this assumes more than one option can be correct. Otherwise it would be better to store the correct option's ID in the parent question's record.
  22. 2 likes
    I am not aware of any system that can summarize millions of records on demand. The general idea is to denormalize some aspects of the solution. For example, you could pre-summarize the transactions from previous years, and supplement this by a "live" summary of this year's records. Hopefully, the reason why "sadly the stored values occasionally become inaccurate" is not modification of history records - otherwise you will need more help than any human can provide.
  23. 2 likes
    For years, I have used Case() exclusively, because it does everything that If() does and more. In fact, I viewed If() as a legacy function, provided only for backward compatibility. Recently, however, under the influence of other programming languages, I have decided that the better practice is to use Case() only when there are multiple tests. This makes it easier for anyone reading the formula. I've never understood the "I may need to add more tests later" thing; how long does it take to double-click "If" and type "Case" over it? I am not aware of any differences in performance.
  24. 2 likes
    The Brooms they "swap away crazy styling of the text". LOL So if you have copied and pasted some test in from an email or another source...and it has some weird styling... cleaning it can be a pain in the butt. I know this personally. I eat my own dog food. So I put in the broom!!! Yay baby!!! - Richard Carlton
  25. 2 likes
    No, it's not a bug at all. The result of the Round() function is a number. A number does not have trailing (or leading) zeros. If you want to format the number to always display one decimal digit, you can use: Let ( r = Round ( final grade ; 1 ) ; Int ( r ) & SerialIncrement ( ".0" ; 10 * Mod ( r ; 1 ) ) ) which calculates a text result.
  26. 2 likes
    The fields that you need to have in the Attendance table: • StaffID • Branch_Code • Hours_Worked (Number) • Hourly_Rate (Number) • cWage (Calculation = Hours_Worked * Hourly_Rate) • sTotal_Hours (Summary, Total of HoursWorked) • sTotal_Wage (Summary, Total of cWage) Once you have that in place, produce your report using a layout of the Attendance table, with three sub-summary parts: a leading sub-summary when sorted by StaffID; a leading sub-summary when sorted by Branch_Code; a trailing sub-summary when sorted by StaffID; and no body part. Place the staff name field/s from the Staff table In the leading sub-summary by StaffID part. Place the Branch_Code, sTotal_Hours and sTotal_Wage in the sub-summary by Branch_Code part. Place the sTotal_Wage field in the trailing sub-summary by StaffID part. Note: Rates can change over time. This is why you should have an individual Hourly_Rate value for every record in the Attendance table (you would probably look this up from the related record in the Staff table). The way you have described this - calculating a sub-total of hours for each branch and multiplying it by the hourly rate - would produce incorrect result when the rate has changed during the course of the period being reported or since.
  27. 2 likes
    What you are suggesting is often referred to as a 'thin client'. To some extent FMI is trying to address the licensing aspect of this with their FLT (FileMaker Licensing for Teams). Under that licensing you get an FMS and a # of connections that you can consume with either Pro, Go or WebD. Not quite at the 50-100 USD range that you are suggesting, more like closer to 200 per user at that lower range of 5 users. But FMS is part of that. I must admit that I don't really get the "$299 x 4" is big bucks for a small business. The cost is never a standalone factor; it is compared to the value of your solution. Either the solution provides value over and beyond the total cost (your fee + licensing) or it doesn't. The size of the company does not really matter; it is the value that they think they can get out of it. It is not an expense but an investment, calculating the ROI is important before buying any system. Perhaps the conversation would go easier if you present it as a total cost without breaking it down into your fee and "oh, here's an additional cost"? Or help them calculate the ROI?
  28. 2 likes
    I would think that if you issue unique IDs, you would keep track of them. Anyway, if you want to build a "secure" system, you need to learn some basic rules of security first. I don't need to guess. All I need is to read one of your IDs and I can generate close to 500 others that will pass your verification. For example, given your "937N493X814R" I can generate: 919N493X814R 928N493X814R 946N493X814R 955N493X814R 964N493X814R 973N493X814R 982N493X814R 991N493X814R 919N439X814R 919N448X814R .. and so on.
  29. 2 likes
    To select a random number between 1 and 20 (inclusive), use = Int ( Random * 20 ) + 1 Very likely so. Hard to be sure without knowing the purpose (what happens after the selection).
  30. 2 likes
    See if the attached demo helps: GenerateItems.fp7
  31. 2 likes
    Just as an informational point. Our office moved from an older Mac Pro to the new model, and reports were that there was a noticeable drop in overall performance. It simply did not handle the constant bashing of 60 users very well. We are in the process of getting things ready to be deployed on a server grade server running Windows.
  32. 2 likes
    Bruce was not being sarcastic, he was pointing out that you failed to provide us with enough information to help. Lose your anger, we are all volunteers and don’t deserve it. There are many ways to share your script. Here is the Help information on how http://fmhelp.filemaker.com/fmphelp_12/en/html/preview_print.6.6.html Please read this topic by Ocean West Anatomy of a Good Topic
  33. 2 likes
    Substitute() is one of the few functions that's case-sensitive, so Substitute ( "filename.jpg" ; ".JPG" ; "" ) will not do anything. That's not necessary. You can nest multiple substitutes within a single Substitute() function call: Substitute ( Filename ; [ "-" ; "/" ] ; [ ".jpg" ; "" ] ) will return "SLT/098/00034" when Filename contains "SLT-098-00034.jpg". If all your file names have the same length, then: Left ( Substitute ( Filename ; "-" ; "/" ) ; 13 ) would do the same thing. If they're not, then you could use: Left ( Substitute ( Filename ; "-" ; "/" ) ; Length ( Filename ) - 4 ) to remove the last 4 characters, no matter what the length is.
  34. 2 likes
    Better security = +10 Better WAN/network performance = +10 Adjusted file caching ( fast open times ) = 5 I suppose it's all use-case stuff. But the release seems stable and fast so far. Not to be understated.
  35. 2 likes
    I don't think you're doing the update justice. The scripting undo alone will make you smile many times over. I've used it for the a few months now even in beta and I could never go back to not having that. The ESS adapter too should be scored higher because it will allow FMI to deliver updates to ESS features without having to rev the whole product. And you are missing significant pieces of functionality from your list: - significantly improved script workspace: it's subtle but once you worked in it for a few weeks you'll never want to go back to 14 - wildcard and SAN SSL certificates - full admin console support for creating the SSL CSR and importing the cert - top call logging on FMS --> this is a MAJOR sleeper bit of functionality - improved network performance - touch ID for Go and iBeacons
  36. 2 likes
    I agree with LaRetta: you clearly have a structural flaw. It seems you need three tables here, let's say: Students -< Assessments >- Deficiencies In the Deficiencies table you would have fields for both a threshold and the phrase to return when the threshold is reached or exceeded. In the Assessments table, you would have a field for the individual numerical assessment and a calculation field to return the corresponding phrase if the assessment is equal to or greater than the corresponding threshold. And in the Students table you would use the List() function to collect all the returned phrases from Assessments. Thus you would avoid the need to hardcode data into field names and calculation formulas. Still, as quick fix for your current structure, try the following calculation: Let ( phrases = List ( If ( Functional math deficits >=1 ; "functional math" ) ; If ( Functional reading deficits >=1 ; "functional reading" ) ; If ( Functional written language deficits >=1 ; "functional written language" ) ; If ( Impaired Theory of Mind >= 1 ; "theory of mind" ) ; If ( Difficulty reading social cues >=1 ; "social skills" ) ; If ( Difficulty sitting attending >= 1 ; "learning behaviors" ) ; If ( Lacks functional living skills >= 1 ; "functional living skills" ) ; If ( Lacks functional play skills >= 1 ; "play skills" ) ; If ( Lacks independent leisure skills >= 1 ; "independent leisure" ) ; If ( Is over 14 lacking vocational skills >= 1 ; "vocational skills" ) ; If ( Student has challenges with expressive language >= 1 ; "expressive language" ) ; If ( Student has significant delays in receptive language >= 1 ; "receptive language" ) ; If ( Gross motor deficits >= 1 ; "gross motor skills" ) ; If ( Fine motor deficits >= 1 ; "fine motor skills" ) ; If ( Need for schedule >= 7 ; "use of visual schedule" ) ; If ( Need for work systems >=7 ; "using work systems and task strips for independent routines") ) ; Substitute ( phrases ; ¶ ; ", " ) ) This will return a comma-separated list of all the phrases whose corresponding field has passes the listed threshold. The problem with your approach, using nested Ifs, is that the calculation exits at the first test that return true. Thus it would have never returned more than one phrase.
  37. 2 likes
    Hi Kathryn, welcome to FMForums! None of this should be necessary if you are properly structured. Can you attach your file or provide us a copy of your relational graph? It seems you have questions as FIELDS when questions should be records. If questions were records then one field in the Questions table could handle this translation for you. So until we know what we are working with, we can't really assist you. In general, your calculation should be using Case() instead of If() so it can handle multiple tests. However, that truly is not the best direction ... the best direction is restructuring. We can help you with it. :-)
  38. 1 like
    No, I don't think so. This is the second time you report a behavior that I cannot reproduce. Are you sure you're using Filemaker?
  39. 1 like
    Author’s note: I’d like to offer a big thank you to Christian Schmitz of Monkeybread Software, not only for creating and continually improving a fantastic plug-in, but also for promptly and patiently answering my many questions. A few weeks ago we looked at creating a table of contents for a PDF containing nine individual reports. […] View the full article
  40. 1 like
    Hi There The new FileMaker Licensing for Teams model is not really suitable for 'anonymous' logins via WebDirect since you have a fixed number of licenses. That licensing model is designed for teams who have a known number of members. The 'legacy' licensing model (previously known as AVLA or VLA) is not much better for your use-case, since you still have to stipulate a number of users. I would suggest that if you want to use FileMaker (and who wouldn't!) you could use custom web publishing & PHP to access and manipulate your data. It can be tricky to debug when you first start using it, but it is very straightforward so long as you have someone who can design the HTML for you. It does not rely on the number of licenses you have, and so long as your server is fast enough there is no practical limit on the number of simultaneous users. FileMaker 16 will bring new API access to your server data according to their roadmap, and I'm sure CWP using PHP will be deprecated at some point in the future, so you may want to wait for that version and see if it suits you better. You could call your local FileMaker sales team and run your scenario past them, as they sometimes have ideas on how to fit their license model to suit your needs. Hope that helps.
  41. 1 like
    Try the following stylesheet: <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/> <xsl:template match="/PubmedArticleSet"> <FMPXMLRESULT xmlns="http://www.filemaker.com/fmpxmlresult"> <METADATA> <FIELD NAME="PubmedID"/> <FIELD NAME="PiiID"/> <FIELD NAME="DoiID"/> <FIELD NAME="PmcID"/> </METADATA> <RESULTSET> <xsl:for-each select="PubmedArticle"> <ROW> <COL><DATA><xsl:value-of select="PubmedData/ArticleIdList/ArticleId[@IdType='pubmed']"/></DATA></COL> <COL><DATA><xsl:value-of select="PubmedData/ArticleIdList/ArticleId[@IdType='pii']"/></DATA></COL> <COL><DATA><xsl:value-of select="PubmedData/ArticleIdList/ArticleId[@IdType='doi']"/></DATA></COL> <COL><DATA><xsl:value-of select="PubmedData/ArticleIdList/ArticleId[@IdType='pmc']"/></DATA></COL> </ROW> </xsl:for-each> </RESULTSET> </FMPXMLRESULT> </xsl:template> </xsl:stylesheet> This will present four source fields to the Filemaker's import dialog. Of course, you will also need to have four corresponding target fields in your solution, so that you can map the imported data to them. Indeed, the DOCTYPE declaration is causing a problem. I am not quite sure why - I suspect it's an OS permissions issue that comes up when the XSLT engine tries to access the online DTD document.
  42. 1 like
    Or store the policy_id in the parent record in a field, primary_policy_id.
  43. 1 like
    A field formatted as checkboxes contains a list of the checked values - so basically you are asking how to create a request for each item in a return-separated list. See an example here: http://fmforums.com/topic/99419-find-from-a-list/#comment-452506 Note that the checkbox field needs to be a global field - otherwise you may have a conflict between two users searching for different values.
  44. 1 like
    Using the example code on the page I referenced, I got a pretty good match like this: Copy the web viewer code and paste it into bbedit or other editor. Using the magnifying glass in the color picker, choose the color of the background at the top of the web viewer (use a temporary graphics block for this) . Find and replace the first hex number in the Gradient() statements with the hex number in the color picker. Repeat with the color at the bottom of the web viewer and the second hex number in the Gradient() statements. Copy and paste the code into the web viewer.
  45. 1 like
    Feel free to post questions (or answers).. this is my area of some expertise..
  46. 1 like
    If you define a field in the Products table to validate as «Unique, Validate always» then import into this table, only unique values will be imported.
  47. 1 like
    I don't really know. What kind of document opens up, in what application? Excel? Word? Also, can you post a screenshot of the shortcut (right-click) menu?
  48. 1 like
    They have moved to an annual release cycle as of FileMaker 14/15.
  49. 1 like
    **I'm writing this without any testing, so please treat this as a suggestion or push in the right direction rather than final instructions. This is an old, old, old FM trick - To retrieve the last created record, you can create a self-join relationship with reverse-chronology sort order. The relationship will match on the operator ID. If you were to set a field using the time-out value through that relationship, it'll pull the value you need. If the operators are scanning these multiple times per day and the FMP session doesn't shut down often or at all, then you can perhaps capture the time-out for each operator as they submit them, and set a global variable. Then just refer to this G.V. as needed.
  50. 1 like
    Hi Devin, There might be better ways of handling it rather than performing a find. But if you simply wish for a find to achieve what you indicate, you might try this (untested): Set Error Capture [ On ] Perform Find [ order number: “=” ; Restore ] Sort Records [ orderDate ; ascending ] Go to Record/Request [ 11 ] [ No dialog ] Set Error Capture [ On ] Omit Multiple Records [ Get ( FoundCount ) - 10 ] [ No dialog ]
This leaderboard is set to Los Angeles/GMT-07:00