Popular Content

Showing most liked content since 02/28/2016 in all areas

  1. 6 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.
  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. 4 likes
    Emerging Trends in Information Security Affect FileMaker Platform By Steven H. Blackwell March 17th 2016 The recently concluded annual RSA Security Conference showcased a number of important emerging trends in Information Security that likely will affect FileMaker Platform developers and Administrators of FileMaker Platform systems. In this BLOG entry, I will describe some of these and offer some observations about how they might apply to the FileMaker Platform. Multi-Factor Authentication (MFA) will increasingly become a standard requirement for Identity and Access Management (I&AM) in organizations of all sizes. This is especially true for connectivity by mobile devices. And it especially true for data hosted in the Cloud. As we saw recently, efforts to create a “two-factor authentication” system inside of the FileMaker Pro client product did not work out well at all. (http://fmforums.com/blogs/blog/112-eye-on-filemaker/) A true MFA system will require coordinated integration with FileMaker Server, wherever that server resides. The data are still the key asset. Outer perimeter defenses, while important, are secondary to protecting the data from the inside out. The data are the asset we most seek to protect, wherever the data reside. For the most part, they reside inside of the database itself. That’s why finely-grained Privilege Sets, strong I&AM, Encryption At Rest, and Encryption In Transit are all so important for FileMaker Platform deployments. Insiders are the new malware. And now, everyone is an Insider. Whether by inadvertence, by curiosity, by carelessness, or by malicious intent, those persons inside organizations and inside organizational supply chains remain a principal threat vector for compromise of digital assets. Any number of major recent data breaches over the past year or so started in the organizational supply chain apparently. Context-sensitive and content-sensitive conditional authentication of identity assertions will become more and more common. What does this mean? A trusted insider accessing data from inside a corporate LAN may trigger one level of authentication requirement. That same user when attempting access from outside the LAN may trigger multiple steps (factors) of authentication requirements. Moreover, access to more sensitive data may require additional authentication factors. And when the context changes mid-session, additional authentication challenges may need to appear. This again will require close integration with FileMaker Server. The need for cyber-insurance will increase dramatically. To mitigate the liability associated with data breaches, more and more organizations of all sizes are going to need to acquire cyber-insurance. Premiums will continue to rise. Organizations of all types and sizes face liabilities such as damage to brand reputation, civil judgments in suits brought by persons whose data are compromised, business interruptions, and–dare I even say it—cyber-extortion. The underwriting process for this will require a more stringent adherence to a range of Best Practices by those seeking the insurance. Small and medium-sized businesses, a staple of the FileMaker community, are perhaps least well equipped to survive a major breach absent this insurance. Regulatory attention to security breaches will increase at both the Federal and State levels. Additionally there will be concomitant increases in scrutiny about whether organizations have employed “reasonable” security practices. What constitutes such practices is sometimes unclear; however, in any given instance, the list may be extensive. The California Attorney General’s Office recently noted that there were at least twenty specific items that any organization should presume to employ in order to meet the standard of “reasonable” security practices. (These are the Center for Internet Security’s Critical Security Controls. https://www.cisecurity.org/critical-controls.cfm) The Attorney General’s report notes that in 2015 approximately 60% of Californians were victims of a data breach of one sort or the other. And the data involved are often the most sensitive type information, including financial data and health-care records. California is often a leading-edge indicator for regulatory actions, and it is entirely to be expected that other states will follow suit here. (https://oag.ca.gov/breachreport2016) So, where does this leave the FileMaker platform and the FileMaker Developer Community? First, developers and administrators need to be sure they have properly aligned the security requirements of their systems to business requirements. This includes such items as brand reputation, customer/client data privacy, civil liability protection, regulatory compliance (State and Federal and international as applicable), and business continuity. I will be having much more to say about this is coming weeks. Second, developers need to follow Best Practices for security in FileMaker Platform files. This includes granular Privilege Sets, Encryption at Rest, and File Access Protection. Third, FileMaker Server Administrators also need to follow Best Practices for deployment, including appropriate OS for servers, a rigorous backup regimen including the tested ability to restore from backups, and Encryption in Transit. Fourth, business unit managers at FileMaker Platform customers need training in Security Best Practices from the user standpoint. Likewise, they should assure that their employees have a similar awareness. Fifth and finally, but certainly not least, we need to encourage FileMaker, Inc. to continue to improve the security schema of the Platform, most particularly the introduction of Multi-Factor Authentication (MFA) and the introduction of additional controls over the behavior of various external API’s. This includes Apple Events, Active X, Execute SQL, PHP, XML, FMPURL, and PlugIns.
  5. 3 likes
    Suppose you have a variable named $word, holding two numbers separated by a hyphen. After running: Set Variable [ $range; Value:Substitute ($word; "-"; " " ) ] Set Variable [ $rangeStart; Value:GetAsNumber ( LeftWords ( $range ; 1 ) ) ] Set Variable [ $rangeEnd; Value:GetAsNumber ( RightWords ( $range ; 1 ) ) ] Loop Exit Loop If [ $rangeStart > $rangeEnd ] Set Variable [ $enum; Value:List ( $enum ; $rangeStart ) ] Set Variable [ $rangeStart; Value:$rangeStart + 1 ] End Loop you will have a variable named $enum holding a list of all the numbers within the range.
  6. 3 likes
    Thank you, Josh, for reconstructing this important thread and for posting it. What did we learn from this episode? Here is a summary: · What we call something matters. Calling a process 2 Factor Authentication does not make it so. · Manipulating the business logic layer, i.e. scripts, of the FileMaker Platform in an attempt to create additional security features requires an in-depth and nuanced understanding of how that layer performs, particularly in relation to external API’s or under the influence of such API’s. · More likely than not, an ersatz process will introduce additional vulnerabilities into a system, while at the same time retaining all the vulnerabilities the underlying elements that comprise the process have in and of themselves. · The business logic and data layers of a FileMaker Pro file are subject to manipulation by attackers in ways that result in the defeat of the ersatz process. The Platform has tools and features that diminish these risks; however, developers frequently do not employ these tools. · To paraphrase the late Will Rogers, “It’s not what you don’t know that hurts you. It’s what you know that isn’t so.” Steven H. Blackwell
  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
    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
  26. 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.
  27. 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.
  28. 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?
  29. 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.
  30. 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).
  31. 2 likes
    See if the attached demo helps: GenerateItems.fp7
  32. 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.
  33. 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
  34. 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.
  35. 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.
  36. 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
  37. 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.
  38. 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. :-)
  39. 2 likes
  40. 2 likes
    Add the following variable definition: pad = Substitute ( 10^prec - 1 ; "9" ; "0" ) then replace this line: dec & Right ( 10^prec & y ; prec ) with: dec & Right ( pad & y ; prec )
  41. 2 likes
    This is not a matter for a calculation, but for a relationship. To make it easy, I would suggest you structure your PriceMatrix table a little differently: FromQty Price 1 $1.00 101 $0.90 201 $0.85 Then define a relationship between Lineitems and (another occurrence of) PriceMatrix as: LineItems::SKU = PriceMatrix 2::SKU AND LineItems::Quantity ≥ PriceMatrix 2::FromQty and sort the records from PriceMatrix 2 by FromQty, descending. With this in place, you can lookup the price into a field in LineItems, and then do a simple multiplication.
  42. 2 likes
    He asked about a script step in the Scripts forum. I think the question was sufficiently precise. The solution is not as simple as a script step, it's more of a project that you'll have to build or buy. It will be a bit of a challenge to build if you're a novice, but would be a great learning exercise. I'd start here: http://clickworks.be/en/trigger-script-another-client Or another tutorial here: http://filemakerinspirations.com/2011/08/instant-messaging-in-filemaker-no-plugins-or-internet-access-required/ There are a few such solutions that you can buy, such as FMChat from seedcode.com. You could also use plug-ins for this, such as Troi Activator or 360Works RemoteScripter. Or you could just use slack!
  43. 2 likes
    Since FM14 came out with the new button bars having the ability to calculate data on the fly on layouts for display purposes has been great - the fact that you can display data without a dedicated calculated field or extra relationships just to display a bit of information. So I am generating a document that prints a portal however the data is not connected to the portal in the traditional parent / child relationship - but rather it's showing related data for the given product kits. This invoice line item record is not "parent" to the portal of kit items. That presented a challenge - originally i had a convoluted way to generated this report using a virtual list but the it required a bit more effort to generate, so how to get totals to display properly in the portal row to multiply quantities - and to also show a total of items packed? One thought would be to put global fields in to the kits lookup table and then set them which would drive keys to the data tables via dedicated relatiohships just prior to generating the report, but that just felt awkward. Here is what I came up with. The row of 6 kits are what the customer ordered based on this there needs to be 108 pieces based on the piece count for each item in the kit multiplied by the quantity ordered. Example 6 x 12 = 72 as you can see by the first row in the portal. To get the value of the 72 I added a singe segment button bar to the portal and multiplied the 6 by the 12 pretty simple. This was all great but I also needed to get a total for the total items packed but that is based on yet another table not directly tied to the kit table. So by adding a second calculation button segment and this formulae I was able to get the necessary data. Hope you find this useful. Cheers.
  44. 1 like
    See also: https://community.filemaker.com/message/276855#276854
  45. 1 like
    Nothing wrong with multiple layouts so don't artificially limit yourself here. You need the layouts you need. Nothing more but also nothing less. And the layouts you use for scripting can just be blank layouts so there is virtually no maintenance on them. Absolutely agree. Security should be implemented at the data level first.
  46. 1 like
    What format do you use for the 'export field content'? That's probably a unicode character that gets in the way. See if it makes a difference if you export from a one field, one record table and use the normal export instead of 'export field content' You can make your life easier by using something like the free BaseElements plugin to do all of this...
  47. 1 like
    Actually, they can: http://fmforums.com/topic/65087-search-multiple-fields/ But they shouldn't.
  48. 1 like
    Developer Assistant v3.1 Beta for FileMaker 15 was released on April 11th, and Beta 2 is now available to fix a few minor issues. All other 2empowerFM plug-ins have been tested as FileMaker 15 ready.DA Beta 2 is available immediately at developer.2empowerfm.com. This is a free update for licenses purchased May 16, 2014 and later. Full details of fixes and changes can be found in the release notes.About 2empowerFM Plug-insOur 2empowerFM line of plug-ins save you time during FileMaker development and add powerful features to your FileMaker solutions. Our plug-ins include:2empowerFM Developer Assistant- Quickly search all scripts to find ones containing a string or pattern.- Find table names, function and script step names, field metadata, and more, without generating a DDR.- Replace text in script steps and in the multi-line text boxes of any dialog.- Debug and develop faster by evaluating highlighted expressions immediately instead of copying, closing dialogs, and pasting into FileMaker's Data Viewer.2empowerFM Hands-Free Printer- Automate printing and control printer-specific settings.- Save money by enforcing the use of double sided and toner saver modes.- Prevent costly mistakes like printing all records instead of current record.2empowerFM Menu Popper- Pop-up multi-level menus anywhere on a FileMaker layout.- Use unique dropdown menus to show type-ahead search results from multiple searches.- Make menu items bold, italic, underlined, bulleted, or add separator lines between items.2empowerFM Keyboard and Mouse- Easily link hotkeys to scripts, create image-map buttons, and change the mouse cursor.2empowerFM SQL Runner- Insert and Update data in any FileMaker table without changing layouts or creating extra table relationships.- Use an SQL query in a calculated field to generate dynamic pop-up lists.- One of our FREE plug-ins!2empowerFM Text Toolkit- Perform powerful search and replace in database text using Perl-compatible regular-expressions.- Generate a hash of data using many algorithms including SHA512, SHA256, and MD5.- Another FREE plug-in!2empowerFM Clipboard Explorer- Save and restore objects on the clipboard including stylized text, FileMaker scripts, and layout objects.- Also totally FREE!Pricing and AvailabilityPlug-in updates are available immediately at 2empowerFM.comUpdates for paid plug-ins are free for those who purchased a license within the last year, or longer if intervening plug-in releases contain only minor new features or small fixes. Check the dates posted in the release notes to see if you qualify for a free upgrade on your particular plug-in license. All older licenses may be upgraded for 50% off the price of an equivalent new license.All plug-ins can be tested for 30 days free of charge and demos are fully functional. Up to three demo extensions are available upon request.About DracoventionsDracoventions is a FileMaker Business Alliance (FBA) member located in Crestline, CA, USA. Dracoventions is focused on inventing software that empowers you to save development time, expand FileMaker's abilities, and create a better user experience.With over 25 years of software engineering experience, company-founder Chris Dragon was inspired by the business needs of a FileMaker-based non-profit to create the 2empowerFM Family of Plug-ins. These plug-ins include Developer Assistant, Hands-Free Printer, Menu Popper, SQL Runner, Text Toolkit, and more. Plug-ins are available at 2empowerFM.comContactChris DragonDracoventionsEmail: support@dracoventions.comWeb: http://www.dracoventions.com
  49. 1 like
    This thread has helped me a lot, thanks very much everyone!
  50. 1 like
    I know this is a really old post, but I also had this problem, it's more an aesthetics issue, if your input of 40 gives you 4000% not 40% your users will most likely see the problem before they leave the screen. But there is a vary easy fix I use, a short script that is triggered on object exit. Set Variable [ $Number ; YourField ] If [ $Number > 1 ] Set Field [ YourField ; $Number / 100 ] End If This assumes your never going to need any percentage over 100% and you can enter either 40, or .4, or 40% and when you exit the object it will always be 40%
This leaderboard is set to Los Angeles/GMT-08:00