<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/atom10full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" xml:lang="en-US">
  <id>tag:buzz.beezwax.net,2005:/articles</id>
  <link type="text/html" href="http://buzz.beezwax.net" rel="alternate" />
  
  <title>the beezwax buzz : the beezwax buzz | beezwax.net</title>
  <subtitle type="html">beezwax.net</subtitle>
  <updated>2012-04-21T03:17:19Z</updated>
  <generator uri="http://www.typosphere.org" version="6.0.9">Typo</generator>
  <atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/atom+xml" href="http://feeds.feedburner.com/beezwax/BUZZ" /><feedburner:info uri="beezwax/buzz" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><feedburner:browserFriendly></feedburner:browserFriendly><entry>
    <id>urn:uuid:78ece24a-4761-4eda-8b17-445c3552068c</id>
    <published>2012-04-17T18:25:11Z</published>
    <updated>2012-04-21T03:17:19Z</updated>
    <link type="text/html" href="http://buzz.beezwax.net/2012/04/21/native-web-2-0-controls-in-filemaker-12-layouts" rel="alternate" />
    <author>
      <name>Brian</name>
      <email>brian_s@beezwax.net</email>
    </author>
    <title type="html">Native Web 2.0 Controls in FileMaker 12 Layouts </title>
    <category scheme="http://buzz.beezwax.net/category/filemaker" label="filemaker" term="filemaker" />
    <category scheme="http://buzz.beezwax.net/category/web-2-0" label="web 2.0" term="web-2-0" />
    <category scheme="http://buzz.beezwax.net/category/filemaker-add-ons" label="filemaker add-ons" term="filemaker-add-ons" />
    <category scheme="http://buzz.beezwax.net/category/filemaker-tips" label="filemaker tips" term="filemaker-tips" />
    <category scheme="http://buzz.beezwax.net/category/custom-functions" label="custom functions" term="custom-functions" />
    <content type="html">&lt;p&gt;
    One of the most exciting aspects of the newly-released FileMaker 12 product line upgrade is a major redesign to the product&amp;rsquo;s UI. A new &lt;a href="http://www.filemaker.com/products/filemaker-pro/whats-new.html?homepage=1-filemaker-pro" target="_blank"&gt;Design Surface&lt;/a&gt;&amp;nbsp;modernizes FileMaker Pro layouts and updates every built-in control, giving developers and designers powerful new tools for designing better interfaces.&amp;nbsp;&lt;/p&gt;


&lt;p&gt;
    But as great as Design Surface is, why just stay on the surface?&lt;/p&gt;


&lt;p&gt;
Here&amp;#39;s how to take advantage of a hidden key in&amp;nbsp;FileMaker Pro 12&amp;nbsp;to go far beyond the limits of the default set of layout controls. This article will demonstrate how to incorporate virtually any UI control you see on the web directly into your FileMaker 12 Pro &amp;mdash; and FileMaker Go &amp;mdash; &amp;nbsp;layouts.&lt;/p&gt;


&lt;p&gt;
    Web 2.0 controls and widgets can now be full citizens of FileMaker solutions. They can display FileMaker data as it updates in real time. They can make&amp;nbsp;real-time changes to FileMaker data &amp;mdash; &lt;em&gt;natively, without plugins&lt;/em&gt;. In short, with FileMaker 12, you can integrate Web 2.0 controls deeply and transparently into your solutions.&amp;nbsp;&lt;/p&gt;


&lt;h2&gt;HTML5, jQuery, MooTools, ExtJS and more&lt;/h2&gt;


&lt;p&gt;
    This new capability opens a door wide to creative possibility. Developers and designers can now expand the palette of available layout controls. If you can find a JavaScript control or an HTML5 design pattern on the web that meets your needs, you can potentially implement it in FileMaker. For example, check out the JavaScript widgets, toolbars and effects available via &lt;a href="http://jqueryui.com/demos/"&gt;jQuery&lt;/a&gt;, &lt;a href="http://mootools.net/demos/"&gt;MooTools&lt;/a&gt;, or &lt;a href="http://www.sencha.com/products/extjs/examples/"&gt;ExtJS&lt;/a&gt;. These typically work perfectly in modern browsers. And this technique leverages industry-standard HTML5, JavaScript, and CSS3 - so now you can involve those web designers who might otherwise feel left out of the FileMaker 12 development party.&lt;/p&gt;


&lt;h2&gt;
    A Sneak Preview&lt;/h2&gt;


&lt;p&gt;
    So, what does a FileMaker 12 layout look like with native Web controls? Here&amp;#39;s an example of the end result:&lt;/p&gt;


&lt;br/&gt;


&lt;p&gt;
    &lt;img src="http://buzz.beezwax.net/files/web_conrols__00_the_goal3.png" style="-webkit-user-select: none" /&gt;&lt;/p&gt;


&lt;p&gt;
    Two native web controls (a single and a dual range slider), plus several standard FileMaker edit box controls (first and last name fields, as well as live text values,) work together to create a simple interactive layout.&lt;/p&gt;


&lt;p&gt;
    A quick note: See the end of this blog post for the demo file. And for now, this technique only works with a solution hosted on FileMaker Server 12, which I&amp;#39;ll explain shortly&amp;#8230;&lt;/p&gt;


&lt;h2 id="somequickbackground"&gt;
    Web Viewers that Talk Back&lt;/h2&gt;


&lt;p&gt;
    Our ability to fully integrate live web controls into layouts uses FileMaker 12&amp;#39;s new&lt;span class="Apple-style-span"&gt;&amp;nbsp;&amp;ldquo;fmp://&amp;rdquo;&lt;/span&gt; protocol. I&amp;#39;ll cover the details later in the article. For now, here&amp;#39;s the bit we care about: Objects &lt;em&gt;within&lt;/em&gt; a Web Viewer can use this new protocol to send messages directly to our FileMaker 12 databases. They can directly call FileMaker scripts and pass parameters to them in real time.&lt;/p&gt;


&lt;p&gt;
    This means that a Web Viewer in our solution can make a round trip cycle and communicate any changes about its state to our solution, just like built-in layout controls always have done. In effect, this turns Web Viewers from display-only portals into full citizens of our FileMaker world. Anything we could see in FileMaker 11&amp;#39;s Web Viewer can now potentially talk &lt;em&gt;directly&lt;/em&gt; to our FileMaker 12 solutions.&lt;/p&gt;


&lt;p&gt;
    This technique works well in both FM Pro 12 and FM Go 12, with one quirk. As of this writing, this technique using the fmp:// protocol doesn&amp;#8217;t work with standalone FileMaker &lt;em&gt;Pro&lt;/em&gt; databases, although it works fine with standalone FileMaker &lt;em&gt;Go&lt;/em&gt; databases.  (So, you may want to make sure you have a FileMaker Server or an iPad handy). Hopefully, this limitation will be addressed with a future release of FileMaker Pro.&lt;/p&gt;


&lt;h2 id="asimpleexample"&gt;
    Setting Up a Demo Project&lt;/h2&gt;


&lt;p&gt;
    Let&amp;rsquo;s start with a simple FileMaker solution. We&amp;rsquo;ll track some very basic information about employees and their commutes: daily commute miles, and the minimum &amp;amp; maximum number of minutes their commute can take (say, depending on traffic conditions). Here&amp;#39;s our FileMaker Pro 12 layout using standard native controls:&lt;/p&gt;


&lt;p&gt;
    &lt;img src="http://buzz.beezwax.net/files/web_controls__1_native_controls1.png" style="-webkit-user-select: none;border:1px solid #ccc;-webkit-border-radius:2px;margin:10px 0;" /&gt;&lt;/p&gt;


&lt;p&gt;
    There&amp;#39;s certainly nothing wrong with this, especially given the FM 12 Design Surface&amp;#39;s new abilities to provide CSS styling and web-like object hover and focus styling. Still, let&amp;rsquo;s imagine that we want to provide range sliders on our layouts, just like users would see on the web. We want a simple slider for daily commute miles, and a dual/range slider for the daily commute fields.&amp;nbsp;&lt;/p&gt;


&lt;h2 id="selectingawebsliderwidget"&gt;
    Choosing from a Vast Menu&lt;/h2&gt;


&lt;p&gt;
    When the whole web is our UI oyster, we face a smorgasbord of options. So, let&amp;#39;s go pick some Web 2.0 slider controls. For now, we&amp;#39;ll limit our world to native HTML5 or JavaScript controls. Also note that Web Viewer in FileMaker 12 for &lt;em&gt;Windows&lt;/em&gt; does not support most HTML5 objects (this is expected to change when Internet Explorer 10 is released). Therefore, we&amp;#39;ll further limit our search to widgets from widely-used JavaScript libraries we mentioned earlier. One suggestion: If you find a web control you&amp;#39;d like to use in your FileMaker Pro 12 solution, test it in both in Safari (Mac) and IE (Windows) to make sure it works as expected in both browsers.&lt;/p&gt;


&lt;h2 id="settingupthebasics"&gt;
    Setting Up the Basics&lt;/h2&gt;


&lt;p&gt;
    Whenever we want to bring a web widget into a FileMaker solution, our first task will be to extract the HTML, CSS and JavaScript required for this control to work. In our case, we&amp;rsquo;ll start by downloading the code for some range sliders via the excellent &lt;a href="http://jqueryui.com/demos/slider/" target="_blank"&gt;jQuery demo site&lt;/a&gt;. We&amp;#39;ll extract the code, and we&amp;#39;ll change any relative paths to be made absolute. We may want to place JavaScript, stylesheets, and other assets into local objects within our solution or onto servers we control and update references to match. Then, we&amp;#39;ll package our widget up into a Custom Function which will enable us to easily deploy it in any solution we&amp;#39;d like.&lt;/p&gt;


&lt;p&gt;
    The starting version of our jQuery slider&amp;nbsp;Custom Function is shown below. The code is really quite simple: we invoke some standard jQuery script libraries, add a standard jQuery stylesheet and a bit of inline CSS, and create the jQuery scripting needed to configure a slider for the slider function and a skeletal body structure:&lt;/p&gt;


&lt;div style="line-height:1em; font-family: Consolas,'Andale Mono WT',Courier,monospace; overflow:scroll; background:#F5F3EB; border:1px dotted #aaa;"&gt;
        &amp;quot;data:text/html,&lt;br&gt;
        &amp;lt;!DOCTYPE HTML&amp;gt;&lt;br&gt;
        &amp;lt;html&amp;gt;&lt;br&gt;
        &amp;lt;head&amp;gt;&lt;br&gt;
        &amp;lt;link rel=&amp;#39;stylesheet&amp;#39; href=&amp;#39;http://ajax.googleapis.com/ajax/libs/jqueryui/1.8.16/themes/base/jquery-ui.css&amp;#39; type=&amp;#39;text/css&amp;#39; media=&amp;#39;all&amp;#39;&amp;gt;&lt;br&gt;
        &amp;lt;style type=&amp;#39;text/css&amp;#39;&amp;gt;html, body {height:100%;width:100%;border:0;padding:0;overflow:hidden;}#slider-range {position:absolute;width:80%;left:10%;}&amp;lt;/style&amp;gt;&lt;br&gt;
        &amp;lt;script src=&amp;#39;http://ajax.googleapis.com/ajax/libs/jquery/1.6.2/jquery.min.js&amp;#39; type=&amp;#39;text/javascript&amp;#39;&amp;gt;&amp;lt;/script&amp;gt;&lt;br&gt;
        &amp;lt;script src=&amp;#39;http://ajax.googleapis.com/ajax/libs/jqueryui/1.8.16/jquery-ui.min.js&amp;#39; type=&amp;#39;text/javascript&amp;#39;&amp;gt;&amp;lt;/script&amp;gt;&lt;br&gt;
        &amp;lt;script src=&amp;#39;http://jquery-ui.googlecode.com/svn/tags/latest/external/jquery.bgiframe-2.1.2.js&amp;#39; type=&amp;#39;text/javascript&amp;#39;&amp;gt;&amp;lt;/script&amp;gt;&lt;br&gt;
        &amp;lt;script src=&amp;#39;http://ajax.googleapis.com/ajax/libs/jqueryui/1.8.16/i18n/jquery-ui-i18n.min.js&amp;#39; type=&amp;#39;text/javascript&amp;#39;&amp;gt;&amp;lt;/script&amp;gt;&lt;br&gt;
        &amp;lt;script type=&amp;#39;text/javascript&amp;#39;&amp;gt;&lt;br&gt;
        $(function() {&lt;br&gt;
        &amp;nbsp; $( &amp;#39;#slider-range&amp;#39; ).slider({&lt;br&gt;
        &amp;nbsp; &amp;nbsp; min:0,&lt;br&gt;
        &amp;nbsp; &amp;nbsp; max:100,&lt;br&gt;
        &amp;nbsp; &amp;nbsp; step:1,&lt;br&gt;
        &amp;nbsp; &amp;nbsp; value:5 &amp;nbsp;});&lt;br&gt;
        });&lt;br&gt;
        &amp;lt;/script&amp;gt;&lt;br&gt;
        &amp;lt;/head&amp;gt;&lt;br&gt;
        &amp;lt;body&amp;gt;&amp;lt;div id=&amp;#39;slider-range&amp;#39;&amp;gt;&amp;lt;/div&amp;gt;&amp;lt;/body&amp;gt;&lt;br&gt;
        &amp;lt;/html&amp;gt;&amp;quot;&lt;br&gt;
&lt;/div&gt;


&lt;h2 id="thisisgroundcontroltomajortom"&gt;
    This is Ground Control to Major Tom&amp;hellip;&lt;/h2&gt;


&lt;p&gt;
    On our layout, we&amp;#39;ll add a Web Viewer set to get its data URL from our Custom Function. This is an important first step where we confirm that our web control acts like it should - in this case, sliding back and forth like a slider. But we haven&amp;#39;t yet told our widget how to communicate with our FileMaker solution, so we won&amp;#39;t expect any interactivity yet.&lt;/p&gt;


&lt;p&gt;
    Our next step will be to wire up our widget to consume live FileMaker data. We&amp;#39;ll begin by adding some script parameters to our Custom Function to give us conduits for passing bits of data to our widget. Then we&amp;#39;ll modify our static Web Viewer code so that the data passed through our script parameters will be dynamically injected directly into the widget itself. The new additions to our custom function look like this:
&lt;/p&gt;


&lt;div style="line-height:1em; font-family: Consolas,'Andale Mono WT',Courier,monospace; overflow:scroll; background:#F5F3EB; border:1px dotted #aaa;"&gt;
    $(function() {&lt;br /&gt;
    &amp;nbsp; $(&amp;#39;#slider-range&amp;#39;).slider({&lt;br /&gt;
    &amp;nbsp; &amp;nbsp; min:&amp;quot; &amp;amp; vmin &amp;amp; &amp;quot;,&lt;br /&gt;
    &amp;nbsp; &amp;nbsp; max:&amp;quot; &amp;amp; vmax &amp;amp; &amp;quot;,&lt;br /&gt;
    &amp;nbsp; &amp;nbsp; step:&amp;quot; &amp;amp; step &amp;amp; &amp;quot;,&lt;br /&gt;
    &amp;nbsp; &amp;nbsp; value:&amp;quot; &amp;amp; value &amp;amp; &amp;quot;,&lt;br /&gt;
    &amp;nbsp; }&lt;br /&gt;
    });&lt;/div&gt;


&lt;h2&gt;
    &amp;#8230;This is Major Tom to Ground Control&lt;/h2&gt;


&lt;p&gt;
    At this point, our Web Viewer will be able to see FileMaker data and will immediately respond as we change the linked field data. Now let&amp;#39;s teach our Web Viewer to talk to our solution. To do this, we&amp;rsquo;ll add two more script parameters to our Custom Function: These will let us pass the name of the FileMaker script we&amp;rsquo;d like our web control to call when it&amp;rsquo;s been modified, and the name of the field we&amp;rsquo;re binding the control to.&lt;/p&gt;


&lt;p&gt;
    Within our JavaScript code, we&amp;#39;ll also make a few changes. First, we&amp;rsquo;ll attach an anonymous function to our jQuery slider&amp;rsquo;s &amp;ldquo;stop&amp;rdquo; event, which efficiently fires only when we release our slider. When this event fires, we&amp;#39;ll do something unexpected: We&amp;#39;ll set the location of the Web Viewer itself to a special URL that&amp;#39;s nested in that nifty FileMaker 12 fmp:// protocol. This combination of invoking the fmp:// protocol and placing it in the web viewer&amp;#39;s location hash is FileMaker 12&amp;#39;s secret sauce that will let our web viewers talk directly to FileMaker. This is the most important bit - and perhaps the trickiest as well - so let&amp;#39;s break this down a bit:&lt;/p&gt;




&lt;p&gt;
    Within our jQuery code&amp;#39;s stop event, we set the Web Viewer&amp;#39;s self.location property. The value we use is assembled from a combination of static text and dynamic FileMaker-calculated data. You may wonder where the advertised &amp;quot;fmp://&amp;quot; protocol is. In this case, it&amp;#39;s wrapped in a simple Custom Function, whose job is to dynamically create a valid set of arguments regardless of the file&amp;#39;s location or platform. We create a Custom Function, &amp;quot;url.fm&amp;quot;. It accepts 2 script parameters, &amp;quot;&lt;em&gt;script&lt;/em&gt;&amp;quot; (the name of the FileMaker script our web viewer will talk to) and &amp;quot;&lt;em&gt;parameters&lt;/em&gt;&amp;quot; (any hard-coded parameters we want to pass to that script):&lt;/p&gt;


&lt;br/&gt;


&lt;div style="line-height: 1em; overflow-x: scroll; overflow-y: scroll; font-family: Consolas, 'Andale Mono WT', Courier, monospace; background-image: initial; background-attachment: initial; background-origin: initial; background-clip: initial; background-color: rgb(240, 242, 236); background-position: initial initial; background-repeat: initial initial; "&gt;
    &lt;insert&gt;&lt;/insert&gt;&lt;/div&gt;


&lt;p&gt;&lt;/p&gt;


&lt;div style="line-height:1em;  overflow:scroll; font-family: Consolas,'Andale Mono WT',Courier,monospace;background:#F5F3EB;"&gt;
        Let (&amp;nbsp;&lt;br&gt;
        [&lt;br&gt;
        path = Get ( FilePath ) ;&lt;br&gt;
        path_pro = Right ( path ; Length ( path ) - 7 ) ;&lt;br&gt;
        start_go = Position ( path ; &amp;quot;/&amp;quot; ; 1 ; 2 ) + 1 ;&lt;br&gt;
        path_go = &amp;quot;$/&amp;quot; &amp;amp; Middle ( path ; start_go ; 9999 ) ;&lt;br&gt;
        path = If ( isGo ; path_go ; path_pro )&lt;br&gt;
        ] ;&lt;br&gt;
        &amp;nbsp;&lt;br&gt;
        &amp;quot;fmp://&amp;quot; &amp;amp; path &amp;amp; &amp;quot;?script=&amp;quot; &amp;amp; script &amp;amp; &amp;quot;&amp;amp;param=&amp;quot; &amp;amp; parameters&lt;br&gt;
        &amp;nbsp;&lt;br&gt;
        )&lt;br&gt;
&lt;/div&gt;


&lt;br/&gt;




&lt;p&gt;
    This Custom Function does a few tasks for us. Most importantly, it determines our platform and the location of the file we&amp;#39;re using, and constructs the matching fmp:// URL for us. So in FileMaker 12 Pro, our fmp:// URL will look something like this :&lt;/p&gt;


&lt;div style="line-height:1em;  overflow:scroll; font-family: Consolas,'Andale Mono WT',Courier,monospace;background:#F5F3EB;"&gt;
    fmp://10.1.10.100/Integrating_Web_Controls.fmp12?script=my_script&amp;amp;param=my_parameters&lt;/div&gt;


&lt;br/&gt;




&lt;p&gt;
    While in FileMaker 12 Go, our URL will look like this:&lt;/p&gt;


&lt;div style="line-height:1em;  overflow:scroll; font-family: Consolas,'Andale Mono WT',Courier,monospace;background:#F5F3EB;"&gt;
    fmp://$/Integrating_Web_Controls.fmp12?script=my_script&amp;amp;param=my_parameters&lt;/div&gt;


&lt;br/&gt;




&lt;p&gt;
    Returning to our slider Custom Function, we can now reference url.fm as we&amp;#39;re setting the Web Viewer&amp;#39;s location property. After invoking url.fm, we&amp;#39;ll concatenate code that will append the current value of our slider at the moment the event is fired:&lt;/p&gt;


&lt;div style="line-height:1em;  overflow:scroll; font-family: Consolas,'Andale Mono WT',Courier,monospace;background:#F5F3EB;"&gt;
        $( &amp;#39;#slider-range&amp;#39; ).slider({&lt;br&gt;
        &amp;nbsp; min:&amp;quot; &amp;amp; vmin &amp;amp; &amp;quot;,&lt;br&gt;
        &amp;nbsp; max:&amp;quot; &amp;amp; vmax &amp;amp; &amp;quot;,&lt;br&gt;
        &amp;nbsp; step:&amp;quot; &amp;amp; step &amp;amp; &amp;quot;,&lt;br&gt;
        &amp;nbsp; value:&amp;quot; &amp;amp; value &amp;amp; &amp;quot;,&lt;br&gt;
        &amp;nbsp; stop: function( event, ui ) {&lt;br&gt;
        &amp;nbsp; &amp;nbsp; $( self.location = &amp;quot; &amp;amp;&amp;nbsp;&lt;br&gt;
        &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; sQuote ( url.fm ( script ; target_field &amp;amp; &amp;quot;|&amp;quot; ) ) &amp;amp; &amp;quot;&lt;br&gt;
        &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; + $( &amp;#39;#slider-range&amp;#39; ).slider( &amp;#39;values&amp;#39;, 0 )&lt;br&gt;
        &amp;nbsp; &amp;nbsp; &amp;nbsp;);&lt;br&gt;
        &amp;nbsp; }&lt;br&gt;
        });&lt;br&gt;
&lt;/div&gt;


&lt;br/&gt;




&lt;p&gt;
    With this in place, our web widget will now look for the FileMaker script we direct it to via our &lt;em&gt;script&lt;/em&gt; parameter, and if it&amp;#39;s able to connect, it will pass the live parameters we&amp;#39;ve set up. We&amp;#39;re almost there.&lt;/p&gt;


&lt;p&gt;
    The last thing we need to do is set up the FileMaker handler script our web widget will be looking for. The handler script&amp;#39;s task is to take the parameters our web widget hands it and perform whatever action we want. in our case, the action is to update the targeted FileMaker field. Let&amp;#39;s set up a script to do this, remembering that our Web Viewer will be returning the name of the field it wants to update as well as the value (and that our upcoming dual slider widget will return pairs of each). Here&amp;#39;s how our script looks:&lt;/p&gt;


&lt;div style="line-height:1em;  overflow:scroll; font-family: Consolas,'Andale Mono WT',Courier,monospace;background:#F5F3EB;"&gt;
        Set Variable [ $_params; Value:Substitute ( Get ( ScriptParameter ) ; &amp;quot;|&amp;quot; ; &amp;quot;&amp;para;&amp;quot;) ]&lt;br&gt;
        Set Variable [ $_fields_passed; Value:Case ( ValueCount ( $_params ) = 2 ; 1 ; ValueCount ( $_params ) = 4 ; 2 ; 0 ) ]&lt;br&gt;
        If [ $_fields_passed = 1 ]&lt;br&gt;
        &amp;nbsp; Set Variable [ $_target_field; Value:GetValue ( $_params ; 1 ) ]&amp;nbsp;&lt;br&gt;
        &amp;nbsp; Set Variable [ $_value; Value:GetValue ( $_params ; 2 ) ]&lt;br&gt;
        Else If [ $_fields_passed = 2 ]&lt;br&gt;
        &amp;nbsp; Set Variable [ $_target_field; Value:GetValue ( $_params ; 1 ) ]&amp;nbsp;&lt;br&gt;
        &amp;nbsp; Set Variable [ $_target_field_2; Value:GetValue ( $_params ; 2 ) ]&amp;nbsp;&lt;br&gt;
        &amp;nbsp; Set Variable [ $_value; Value:GetValue ( $_params ; 3 ) ]&lt;br&gt;
        &amp;nbsp; Set Variable [ $_value_2; Value:GetValue ( $_params ; 4 ) ]&lt;br&gt;
        End If&lt;br&gt;
        Set Field By Name [ $_target_field; $_value ]&amp;nbsp;&lt;br&gt;
        If [ $_fields_passed = 2 ]&lt;br&gt;
        &amp;nbsp; Set Field By Name [ $_target_field_2; $_value_2 ]&amp;nbsp;&lt;br&gt;
        End If&lt;br&gt;
&lt;/div&gt;


&lt;h2 id="houstonwehavecontact"&gt;
    Houston, We Have Contact!&lt;/h2&gt;


&lt;p&gt;
    OK. We&amp;#39;ve done all the hard work! But, really, this wasn&amp;#39;t too hard, right? And remember, this is a one-time setup; once we have the pieces in place, things get nice and easy. Now let&amp;#39;s take our web widget out for a spin. Back in our layout, we&amp;#39;ll add a Web Viewer and configure it with a data URL that points to our Custom Function like this:&amp;nbsp;&lt;/p&gt;


&lt;div style="line-height:1em;  overflow:scroll; font-family: Consolas,'Andale Mono WT',Courier,monospace;background:#F5F3EB;"&gt;
        rangeJQ (&amp;nbsp;&lt;br&gt;
        &amp;nbsp; DemoValues::miles ;&amp;nbsp;&lt;br&gt;
        &amp;nbsp; GetFieldName ( DemoValues::miles ) ;&lt;br&gt;
        &amp;nbsp; DemoValues::miles_min ;&lt;br&gt;
        &amp;nbsp; DemoValues::miles_max ;&amp;nbsp;&lt;br&gt;
        &amp;nbsp; 1 ;&lt;br&gt;
        &amp;nbsp; &amp;quot;webHandler&amp;quot;&amp;nbsp;&lt;br&gt;
        )&lt;br&gt;
&lt;/div&gt;


&lt;br/&gt;




&lt;p&gt;
    And, just like that, we have a live jQuery&amp;nbsp;slider on our layout! It&amp;#39;s attached to our miles field as desired. If we update the FileMaker field data, the slider will update instantly to reflect the change. If we move our slider, our underlying FileMaker field data will immediately update as well. Both objects understand and enforce the same data constraints (minimum, maximum, and even step values). From a user&amp;#39;s perspective, there&amp;#39;s little if any noticeable difference between stock FileMaker layout controls and our new jQuery slider. Everything &amp;quot;just works&amp;quot;&amp;#8230;Sweet!&lt;/p&gt;


&lt;p&gt;
    &lt;img src="http://buzz.beezwax.net/files/web_controls__6_ugly_control1.png" style="-webkit-user-select: none;border:1px solid #ccc;-webkit-border-radius:2px;margin:10px 0;" /&gt;&lt;/p&gt;


&lt;h2 id="givingourcreationsomestyle"&gt;
    Giving our Web Slider some Style&lt;/h2&gt;


&lt;p&gt;
    There is still one complaint from the audience. (Tough crowd!) Our newborn web control is, well, kind of boxy - maybe even, dare we say, ugly. The great news is that just like native FileMaker 12 Design Surface elements, we can simply style our new web widget with a bit of standard CSS, which we&amp;#39;ll add in our Custom Function:&lt;/p&gt;




&lt;div style="line-height:1em; font-family: Consolas,'Andale Mono WT',Courier,monospace; overflow:scroll; background:#F5F3EB; border:1px dotted #aaa;"&gt;
        &amp;lt;style type=&amp;#8221;text/css&amp;#8221;&amp;gt; &lt;br&gt;
          html, body {height:100%;width:100%;border:0;padding:0;overflow:hidden;}&lt;br&gt;
          #slider-range {position:absolute;width:80%;left:10px;}&lt;br&gt;
          .ui-slider .ui-slider-handle {font-size:.1em; width:1.2em; height:1.2em;-webkit-border-radius:20px;border-radius:20px;background:#eee;}&lt;br&gt;
          .ui-slider .ui-slider-range {font-size:.1em;background:#85BAFA;}&lt;br&gt;
          .ui-slider-horizontal {height:4px;background:#ddd;border-color:#bbb;}&lt;br&gt;
          .ui-slider-horizontal .ui-slider-handle {height:14px;width:14px;font-size:.5em;top:-.7em;}&lt;br&gt;
          .ui-slider-vertical {width:4px;background:#ddd;border-color:#bbb;}&lt;br&gt;
          .ui-slider-vertical .ui-slider-handle {height:14px;width:14px;font-size:.5em;left:-.7em;}&lt;br&gt;
        &amp;lt;/style&amp;gt;&lt;br&gt;
&lt;/div&gt;


&lt;p&gt;
    Now our web control looks much nicer:&lt;/p&gt;


&lt;p&gt;
    &lt;img src="http://buzz.beezwax.net/files/web_controls__8_controls_with_style2.png" style="-webkit-user-select: none;border:1px solid #ccc;-webkit-border-radius:2px;margin:10px 0;" /&gt;&lt;/p&gt;


&lt;h2 id="fleshingthingsout"&gt;
    Completing the Picture&lt;/h2&gt;


&lt;p&gt;
    With that under our belt, let&amp;rsquo;s tackle the second part of this job, and add a multi-range slider. This will go quickly now that we understand the basic steps.&lt;/p&gt;


&lt;p&gt;
    First, duplicate and rename the slider Custom Function, and give it a new name (like &amp;quot;dual slider&amp;quot;). In our dual slider Custom Function, we&amp;rsquo;ll add a couple of new parameters to our existing slider code, so we can pass in and later return two data values and field names instead of just one. We&amp;rsquo;ll also lightly modify the jQuery code, so our code will accept and return these 2 added parameters. We won&amp;#39;t need to modify our CSS or HTML - they&amp;#39;ll work just fine.&amp;nbsp;Back in our layout, we&amp;#39;ll add a second Web Viewer and point it to our dual slider Custom Function. Here&amp;rsquo;s how things now look:&amp;nbsp;&lt;/p&gt;


&lt;p&gt;
    &lt;img src="http://buzz.beezwax.net/files/web_controls__8b_dual_contols2.png" style="-webkit-user-select: none;border:1px solid #ccc;-webkit-border-radius:2px;margin:10px 0;" /&gt;&lt;/p&gt;


&lt;p&gt;
    Everything&amp;#39;s working great, and our imaginary users are thrilled! But now they&amp;#39;d like the sliders to be vertical, and they&amp;#39;d like to see live, editable FileMaker native controls interact with our jQuery sliders. No problem!&amp;nbsp;We just lightly modify the JavaScript in our Custom Functions, and fine tune the inline CSS a bit. Easy peezy. Back in our layout, we just resize our Web Viewers for vertical orientation, do a bit of layout adjustment, and we&amp;#39;re done:&lt;/p&gt;


&lt;p&gt;
    &lt;img src="http://buzz.beezwax.net/files/web_controls__9_vertical_controls2.png" style="-webkit-user-select: none;border:1px solid #ccc;-webkit-border-radius:2px;margin:10px 0;" /&gt;&lt;/p&gt;


&lt;h2 id="whatdoesthismean"&gt;
    Where to Go from Here&lt;/h2&gt;


&lt;p&gt;
    Once the initial path is paved, Web 2.0 controls and widgets are simple, expressive, and fun to use in FileMaker 12. You&amp;#39;ll certainly want to do some prep and planning when you&amp;#39;re selecting and setting up a new web control. But once you&amp;#39;ve configured a control as a custom function, you&amp;#39;ll be able to simply drop this web control directly into any Filemaker 12 solution.&lt;/p&gt;


&lt;p&gt;
    This technique opens a doorway to a world of possibilities previously unavailable to the FileMaker development and design communities. For those of us who&amp;#39;ve long been limited to a handful of possible Ui controls, the ability to simply locate, adapt, and integrate virtually any control we can find on Web 2.0 world can be quite a revelation. We suddenly have the ability to implement sophisticated controls and rich design patterns that have until now been beyond our reach. Exciting stuff!&lt;/p&gt;


&lt;p&gt;
    Please check out this &lt;strong&gt;demo file&lt;/strong&gt;:&amp;nbsp;&lt;a href="http://buzz.beezwax.net/files/Integrating_Web_Controls.fmp12.zip"&gt;Integrating_Web_Controls.fmp12.zip&lt;/a&gt;. Remember that at this time, this technique requires a hosted or shared solution for FileMaker Pro users; the round trip functionality will NOT work if you open locally in FileMaker Pro. It will work with a standalone or hosted file in FileMaker Go (and if you made it this far, you deserve to buy yourself a brand new iPad!)&lt;/p&gt;


&lt;p&gt;
    If you have any feedback, questions, or ideas, I look forward to hearing from you.&lt;/p&gt;


&lt;p&gt;
    - Brian&lt;/p&gt;


</content>
  </entry>
  <entry>
    <id>urn:uuid:bea5b67c-b947-46f2-96c5-b02da8d21245</id>
    <published>2012-04-04T18:48:27Z</published>
    <updated>2012-04-05T20:53:52Z</updated>
    <link type="text/html" href="http://buzz.beezwax.net/2012/04/05/filemaker-12-exciting-new-possibilities" rel="alternate" />
    <author>
      <name>donovan</name>
      <email>donovan_c@beezwax.net</email>
    </author>
    <title type="html">FileMaker 12: Exciting New Possibilities</title>
    <category scheme="http://buzz.beezwax.net/category/filemaker" label="filemaker" term="filemaker" />
    <category scheme="http://buzz.beezwax.net/category/filemaker-news" label="filemaker news" term="filemaker-news" />
    <content type="html">&lt;p&gt;
	FileMaker, Inc. introduced the next generation of their database platform today with the release of FileMaker 12. This is a major upgrade to every part of the FileMaker product line. There are new versions of FileMaker Pro, FileMaker Pro Advanced, FileMaker Server, FileMaker Server Advanced, and FileMaker Go - which is now &lt;em&gt;free&lt;/em&gt; for iPhone and iPad.&lt;/p&gt;
&lt;p&gt;
	With a powerful new file format and a broad range of major improvements, FileMaker 12 offers a whole new set of possibilities to developers and users alike. FileMaker 12&amp;#39;s exciting new features will enable your solutions to be faster, more powerful, more robust, more extensible and more enjoyable to use.&lt;/p&gt;
&lt;h2&gt;
	First, Some Thoughtful Consideration&lt;/h2&gt;
&lt;p&gt;
	As upgrades go, this one is fairly smooth, though not completely without some technical considerations. FileMaker 12 has a new file format, and converting a raw database from FileMaker v7 through v11 can be done automatically. However, to implement FileMaker 12, you&amp;#39;ll need to upgrade FileMaker Server and all FileMaker clients at the same time that you convert your older files. Also, existing plug-ins may not work without updating by their developers.&lt;/p&gt;
&lt;p&gt;
	And of course, you may want some help with custom development to take advantage of many of the new features. If you feel it&amp;#39;s a good time to take a deep look at what your current databases are doing, and how they can take advantage of FileMaker 12, please &lt;a href="http://www.beezwax.net/contact"&gt;get in touch with us&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;
	Now, The Exciting New Possibilities&lt;/h2&gt;
&lt;p&gt;
	Not sure if it&amp;#39;s time to make the jump to the new version? We offer this perspective - a list of the top new features we&amp;#39;ve found the most exciting in FileMaker 12:&lt;/p&gt;
&lt;h3&gt;
	A Better Foundation: FileMaker Server 12&lt;/h3&gt;
&lt;p&gt;
	Most shared FileMaker solutions are deployed using FileMaker Server.&amp;nbsp;We&amp;#39;re thrilled that FileMaker Server 12 features several core enhancements that make it significantly faster and more reliable. Most notably, it&amp;nbsp;has been re-architected so that functionalities like serving data, web publishing and backup run in separate, independent processes. Now you can have more peace of mind knowing that&amp;nbsp;mission-critical solutions will be less susceptible to slowdowns, hangs, or whatever else technology throws at you.&amp;nbsp;&lt;/p&gt;
&lt;h3&gt;
	More Speed? Yes, Please!&lt;/h3&gt;
&lt;p&gt;
	FileMaker Server is now a 64-bit application. &lt;span style="text-decoration:line-through;"&gt;FileMaker Pro and Server are now 64-bit applications.&lt;/span&gt; This means that it can leverage much more of your hardware&amp;#39;s available resources. FileMaker Server will also perform backups incrementally, which leaves more of those resources available to users. Key operations like finding and sorting records have been optimized to minimize network traffic.&amp;nbsp;You&amp;#39;ll notice that functions like finds and dynamic value lists are much snappier over the network in FileMaker 12.&lt;/p&gt;
&lt;p&gt;
	Those of you looking at web front-ends to your FileMaker solutions will be encouraged to know that FileMaker 12 re-architected the web publishing engine. Our tests thus far have been very encouraging, especially improving speed when multiple users are involved.&lt;/p&gt;
&lt;p&gt;
	Developers can garner further speed gains using new features like the light-weight CSS-like interfaces, SQL queries (see below), and the new container storage and file management features.&lt;/p&gt;
&lt;h3&gt;
	FileMaker Now Understands SQL Queries&lt;/h3&gt;
&lt;p&gt;
	FileMaker now natively exposes its tables to queries using Structured Query Language (SQL). Even if you don&amp;#39;t know SQL, you&amp;#39;ll appreciate the major boosts in power and speed that it this can bring to a solution. Developers will be even happier to find that SQL can make FileMaker-based systems much more compact and robust under the hood. The beauty for the users is that less code generally results in systems that are faster, more dependable and easier to maintain.&lt;/p&gt;
&lt;h3&gt;
	Making Your Media Safe and Accessible&lt;/h3&gt;
&lt;p&gt;
	This is a tremendous update for anyone dealing with images, videos or documents. FileMaker 12 will let you view light-weight thumbnails and even stream your content for fast viewing. It also allows you to store &amp;quot;container field&amp;quot; data in linked files, optionally encrypted, on the hard drive. This can drastically reduce the size of your database and decrease load times. Just drag your file into a container (yes, drag-and-drop was added too) and let FileMaker do the rest!&lt;/p&gt;
&lt;h3&gt;
	In Style With CSS&lt;/h3&gt;
&lt;p&gt;
	Good designers will tell you that aesthetics are an integral component of function. FileMaker 12 provides an entirely new layout design surface that brings a modern, Web 2.0 feel to layouts. Under the hood, layouts are now being styled with Cascading Style Sheets (CSS) &amp;ndash; the visual language of the web. Layout objects are still configured with graphical tools, but this web-like design approach provides developers with the tools to create much more polished and interactive user interfaces. You&amp;#39;ll notice new details like rounded corners, gradients and on-hover effects becoming a natural part of your solutions.&lt;/p&gt;
&lt;h3&gt;
	More Charts, At Your Fingertips&lt;/h3&gt;
&lt;p&gt;
	Decision-makers love charts. Charts have a way of distilling large sets of data into something compact and easily digestible. FileMaker 12 provides an all-new Chart Wizard, complete with previews and brand new chart formats (Stacked Bar, Positive/Negative Column, Scatter, Bubble). Users will be pleased to discover that they can even create ad hoc charts by right-clicking in a field in Table View.&lt;/p&gt;
&lt;h3&gt;
	Going Mobile Has Never Been Easier&lt;/h3&gt;
&lt;p&gt;
	The speed gains in FileMaker 12 are very pronounced in FileMaker Go on the iPhone and iPad. We&amp;#39;ve tested iPad solutions that, as they are being deployed, can shave hours of work off of workflows in the field. FileMaker Go 12 improves how security, multitasking and other native iOS functions can be used. And to top it all off, you can download FileMaker Go for free on iPhone or iPad!&lt;/p&gt;
&lt;h2&gt;
	The Bottom Line&lt;/h2&gt;
&lt;p&gt;
	The FileMaker 12 family brings many new features that can make your systems more robust and more enjoyable to use. It&amp;#39;s an exciting release, particularly for anyone looking for better media management, mobile support, network performance or simply a more stunning-looking solution.&lt;/p&gt;
&lt;p&gt;
	As much as we still love FileMaker Pro 11, this is a major improvement all around. We&amp;#39;re particularly excited that the result of FileMaker 12&amp;#39;s new power, speed, and reliability isn&amp;#39;t just databases that can do more, but databases that are even more exciting to develop, and more enjoyable for users to use every day.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;
	Enjoy the new possibilities of FileMaker 12!&lt;/p&gt;
&lt;p&gt;
	- The Beezwax Team&lt;/p&gt;


</content>
  </entry>
  <entry>
    <id>urn:uuid:19aa0a58-bc9a-49b3-991b-05b9df8492be</id>
    <published>2012-02-23T01:29:01Z</published>
    <updated>2012-02-23T17:16:10Z</updated>
    <link type="text/html" href="http://buzz.beezwax.net/2012/02/23/open-a-remote-file-with-applescript" rel="alternate" />
    <author>
      <name>simon</name>
      <email>simon_b@beezwax.net</email>
    </author>
    <title type="html">Open a remote FileMaker file with AppleScript</title>
    <category scheme="http://buzz.beezwax.net/category/filemaker" label="filemaker" term="filemaker" />
    <category scheme="http://buzz.beezwax.net/tag/applescript" term="applescript" />
    <category scheme="http://buzz.beezwax.net/tag/filemaker" term="filemaker" />
    <content type="html">&lt;p&gt;I needed to run some FileMaker scripts on a regular basis. For a few reasons, but mainly because the scripts create PDF files, I couldn&amp;#8217;t run these using a scheduled script on the server.&lt;/p&gt;

&lt;p&gt;This at first seems like a pretty trivial task. But the file is hosted remotely, and accessed over a VPN connection. Coupled with the fact that the system is quite large, and the &amp;#8216;bot only being modestly powered, I was getting some very slow load times. Among the issues were the time outs I was getting from operations taking longer than the 60 seconds given by default for an application to respond to a AppleScript request.&lt;/p&gt;

&lt;p&gt;In retrospect, I would&amp;#8217;ve been better off using an AppleScript that simply opened a .fp7 launcher file (a local FileMaker file that opens a remote file). But as I said, I at first thought this was going to be pretty trivial. And there is one advantage to this approach &amp;#8211; I could attempt to handle some situations where a dialog pops up (e.g., &amp;#8220;You have been disconnected from the server&amp;#8230;&amp;#8221;) that locks FileMaker into a modal dialog until someone clicks through them.&lt;/p&gt;

&lt;p&gt;Below is my resulting script. Consider it a work in progress, and I may update it later. It is tested to work with FileMaker 11, but should work with FileMaker 10 despite some subtle differences between how (or when) the two version return their results.&lt;/p&gt;

&lt;pre&gt;
set errorFlag to false
set dbName to "your_db_name" -- name of your database file here.
set hostName to "server.example.int" -- host name of your FileMaker Server here
set msgLog to ""
set maxOpenTime to 80 -- Max time to to get the file open (but before running file's initial scripts)
set maxInitTime to 20 -- Max time required after opening for FMP to become idle.

--
--   l o g _ m e s s a g e
--

on log_message(msg)
    if my msgLog ≠ "" then
        set my msgLog to my msgLog &amp; return &amp; (time string of (current date)) &amp; ": " &amp; msg
    else
        set my msgLog to (time string of (current date)) &amp; ": " &amp; (msg as text)
    end if
end log_message

--
--   o p e n _ f i l e
--

on open_db(hostName, dbName)
    global maxOpenTime, maxInitTime
    
    with timeout of my maxOpenTime seconds
        tell application id "com.filemaker.client.advanced"
            try
                getURL "FMP7://" &amp; hostName &amp; "/" &amp; dbName
                delay maxInitTime -- Give FMP lots of time to finish opening file
            on error msg
                -- if file is already open but busy we may get a "Data is being accessed..." error
                my log_message("open_db: " &amp; msg)
                delay 5
            end try
        end tell
    end timeout
end open_db

--
--   c h e c k _ f o r _ d b
--

on db_is_open(dbName)
    global maxOpenTime
    
    with timeout of maxOpenTime seconds
        -- Change to "com.filemaker.client.pro" if not using Advanced.
        tell application id "com.filemaker.client.advanced"
            
            -- one or more databases are open, but can we actually see ours?
            try
                -- Try something really simple.
                get version
                
                -- Now see if we can get what we really want.
                set dbList to name of every database
                
                -- This may just return a string if only one DB is open, so we need two seperate tests.
                return (class of dbList = list and dbList contains dbName) or (class of dbList = text and dbList = dbName)
            on error msg
                -- May end up here because there are no databases open, or by a "Data is being accessed..." error.
                my log_message("db_is_open: " &amp; msg)
                return false
            end try
        end tell
        
    end timeout
end db_is_open


--
--  click_thru_dlog
--

on click_thru_dlog()
    tell application "System Events"
        tell (first process whose creator type is "FMP7")
            set frontmost to true
            click button 1 of window 1
        end tell
    end tell
    delay 0.5
end click_thru_dlog

--
--   o p e n _ f i l e m a k e r
--

-- Launch and activate the FileMaker client application.

on open_filemaker()
    
    try
        -- This is our first whack at getting FMP started.
        tell application id "com.filemaker.client.advanced"
            activate
        end tell
    on error msg
        -- Didn't work out, log our error.
        log_message("open_filemaker: " &amp; msg)
        
        -- Check that we aren't stuck on a dialog.
        click_thru_dlog()
        
        try
            -- Second try to get it running
            tell application id "com.filemaker.client.advanced"
                activate
            end tell
        on error msg
            log_message("open_filemaker: " &amp; msg)
            return 1
        end try
    end try
    
    log_message("open_filemaker: Filemaker now open")
    return 0 -- success
end open_filemaker


------------------------------------------------------

--
--   m a i n
--

if open_filemaker() = 0 then
    -- Is the database already open?
    if not db_is_open(dbName) then
        -- Try opening the first time.
        open_db(hostName, dbName)
        
        -- Still not open?
        if not db_is_open(dbName) then
            -- One more try at opening the file.
            open_db(hostName, dbName)
            -- If file still not open then we set error flag.
            set errorFlag to not db_is_open(dbName)
        end if
    end if
else
    -- Couldn't even get the FMP client open.
    set errorFlag to true
end if

if errorFlag then
    display alert "Error communicating with " &amp; dbName message "While testing for " &amp; dbName &amp; " access got the following error message:" &amp; return &amp; return &amp; msgLog as critical giving up after 300
end if
&lt;/pre&gt;


</content>
  </entry>
  <entry>
    <id>urn:uuid:91308353-a171-43fa-9126-40150625b088</id>
    <published>2012-01-25T00:17:02Z</published>
    <updated>2012-01-25T16:46:50Z</updated>
    <link type="text/html" href="http://buzz.beezwax.net/2012/01/25/recipe-for-testing-jdbc-connection-to-filemaker-server" rel="alternate" />
    <author>
      <name>simon</name>
      <email>simon_b@beezwax.net</email>
    </author>
    <title type="html">Recipe for testing JDBC connection to FileMaker Server</title>
    <category scheme="http://buzz.beezwax.net/category/filemaker" label="filemaker" term="filemaker" />
    <category scheme="http://buzz.beezwax.net/category/filemaker-tips" label="filemaker tips" term="filemaker-tips" />
    <category scheme="http://buzz.beezwax.net/tag/filemaker" term="filemaker" />
    <category scheme="http://buzz.beezwax.net/tag/java" term="java" />
    <category scheme="http://buzz.beezwax.net/tag/jdbc" term="jdbc" />
    <content type="html">&lt;p&gt;FileMaker Server Advanced allows external systems to connect to its hosted database files via ODBC and JDBC. The remote systems can then run SQL commands against the hosted databases. Often the hard part is getting all the infrastructure ready for this. That includes the correct extended permissions on the FileMaker database file, needed drivers, firewall settings, etc.&lt;/p&gt;

&lt;p&gt;FileMaker provides a test program you can use to check if a JDBC connection is working. It is a bit buried on their site, but can be found at: &lt;a href="http://help.filemaker.com/app/answers/detail/a_id/7794/~/jdbc-test-application"&gt;JDBC Test Application&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;However, it has come up several times that I needed to provide some working Java code that shows how to set up the connection. FileMaker has also provided us with a code fragment showing how this is done on page 31 of their &lt;b&gt;ODBC and JDBC Guide&lt;/b&gt;. However, it doesn&amp;#8217;t copy and paste cleanly, and it isn&amp;#8217;t immediately obvious what needs to be changed to configure it for your system.&lt;/p&gt;

&lt;p&gt;While I&amp;#8217;m at it, we would really like a step-by-step list of what needs to be done to get this working. So here we go&amp;#8230;&lt;/p&gt;

&lt;p&gt;• Download the latest JDBC driver for Filemaker, currently at &lt;a href="http://help.filemaker.com/app/answers/detail/a_id/7865/related/1/session/L2F2LzEvdGltZS8xMzI3NDQ0Mzk2L3NpZC9LVDJJT1pPaw%3D%3D"&gt;Software Update: FileMaker 11.3.76 xDBC Client Drivers&lt;/a&gt;&lt;/li&gt;&lt;/p&gt;

&lt;p&gt;• For Mac OS X, it is recommended to copy the fmjdbc.jar file into the /Library/Java/Extensions folder. For Windows, there is no prescribed place for this, it just has to be somewhere in your Java classpath. See &lt;a href="http://en.wikipedia.org/wiki/Classpath_(Java)"&gt;Wikipedia&lt;/a&gt; for more details on Java&amp;#8217;s classpath, but simply putting it in the same directory as your Java could should suffice.&lt;/p&gt;

&lt;p&gt;• Download the test program&amp;#8217;s source code here: &lt;a href="http://buzz.beezwax.net/files/FilemakerJDBCTest.java"&gt;FilemakerJDBCTest.java&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;• Edit the file to use the correct hostname or IP address for your FileMaker Server, as well as the database, user account, and password.&lt;/p&gt;

&lt;p&gt;• In the Terminal or DOS prompt, cd to the directory containing the FilemakerJDBCTEst.java file.&lt;/p&gt;

&lt;p&gt;• Type &lt;b&gt;javac FilemakerJDBCTEst.java&lt;/b&gt; to compile the test program.&lt;/p&gt;

&lt;p&gt;• Type &lt;b&gt;java FilemakerJDBCTest&lt;/b&gt; to finally run the program.&lt;/p&gt;

&lt;p&gt;If you&amp;#8217;ve made it this far without problems, there&amp;#8217;s a fair chance you should now see the &lt;b&gt;No warnings&lt;/b&gt; message from the connection attempt.&lt;/p&gt;

&lt;p&gt;Simon.&lt;/p&gt;</content>
  </entry>
  <entry>
    <id>urn:uuid:a5611882-3d40-4e72-a481-cda07a28347b</id>
    <published>2011-12-09T19:23:14Z</published>
    <updated>2012-01-11T21:58:50Z</updated>
    <link type="text/html" href="http://buzz.beezwax.net/2011/12/09/99-bottles-of-beer-challenge" rel="alternate" />
    <author>
      <name>donovan</name>
      <email>donovan_c@beezwax.net</email>
    </author>
    <title type="html">99 Bottles of Beer Challenge</title>
    <category scheme="http://buzz.beezwax.net/category/filemaker" label="filemaker" term="filemaker" />
    <category scheme="http://buzz.beezwax.net/category/filemaker-resources" label="filemaker resources" term="filemaker-resources" />
    <category scheme="http://buzz.beezwax.net/category/filemaker-utilities" label="filemaker utilities" term="filemaker-utilities" />
    <category scheme="http://buzz.beezwax.net/category/filemaker-tips" label="filemaker tips" term="filemaker-tips" />
    <category scheme="http://buzz.beezwax.net/tag/beer" term="beer" />
    <category scheme="http://buzz.beezwax.net/tag/filemaker" term="filemaker" />
    <content type="html">&lt;p&gt;
	Here&amp;#39;s a fun little challenge for your Friday afternoon. You can do it at home, in a bar, or hopefully even at work. Best of all, it&amp;#39;s technical &lt;em&gt;and&lt;/em&gt; creative. Your task, should you choose to accept it, is to produce the lyrics to 99 Bottles of Beer in your favorite programming language. I chose to do the solution below in FileMaker. See &lt;a href="http://99-bottles-of-beer.net/" target="_blank"&gt;99-bottles-of-beer.net&lt;/a&gt; for the official challenge details.&lt;/p&gt;
&lt;h2&gt;
	The Joy of Diversity&lt;/h2&gt;
&lt;p&gt;
	The diversity of what you can do given the same constraints is fascinating.&amp;nbsp;Variations within the same language can be very revealing. In fact, some people use basic problems like this to evaluate the proficiency of programming candidates. But there&amp;#39;s much more discovery to be had! Studying other languages is a great way to expand your perspective and capabilities. There are 1436 different programming languages and variations represented on the challenge site, including solutions in&amp;nbsp;&lt;a href="http://99-bottles-of-beer.net/language-apple-script-32.html" target="_blank"&gt;AppleScript&lt;/a&gt;,&amp;nbsp;&lt;a href="http://99-bottles-of-beer.net/language-ruby-1272.html"&gt;Ruby&lt;/a&gt;,&amp;nbsp;&lt;a href="http://99-bottles-of-beer.net/language-malbolge-995.html" target="_blank"&gt;Malbolge&lt;/a&gt;&amp;nbsp;(give me an aspirin!)&amp;nbsp;and even&amp;nbsp;&lt;a href="http://99-bottles-of-beer.net/language-piet-1269.html" target="_blank"&gt;Piet&lt;/a&gt;&amp;nbsp;(what!?). My personal favorite is this solution in&amp;nbsp;&lt;a href="http://99-bottles-of-beer.net/language-perl-737.html" target="_blank"&gt;Perl&lt;/a&gt;&amp;nbsp;(believe it or not, it works!).&lt;/p&gt;
&lt;h2&gt;
	99 Bottles of Beer, the FileMaker Version&lt;/h2&gt;
&lt;p&gt;
	Jon Rosen submitted a &lt;a href="http://99-bottles-of-beer.net/language-filemaker-pro-3.0-256.html" target="_blank"&gt;solution&lt;/a&gt; using FileMaker 3 back in 1996. FileMaker has come a long way since then, although text handling is a fairly static feature set. I couldn&amp;#39;t help but throw together my own version (see below). This attempt strives for a standard balance between reliability, extandability, conciseness and readability.&lt;/p&gt;
&lt;p&gt;
	So how would you do it? We&amp;#39;d love to see more examples. The guys at 99-bottles-of-beer.net sound pretty backlogged, but hopefully you can post a link below in the comments. I&amp;#39;ve also attached a demo file for you to play with.&lt;/p&gt;
&lt;p&gt;
	-Donovan&lt;/p&gt;
&lt;p&gt;
	&lt;a href="http://buzz.beezwax.net/files/99BottlesOfBeer.zip"&gt;FileMaker demo file&lt;br /&gt;
	&lt;/a&gt;&lt;/p&gt;
&lt;pre&gt;# PURPOSE: Generates lyrics to 99 Bottles of Beer. See http://99-bottles-of-beer.net.
# HISTORY: Created 2011-Dec-08 by Donovan Chandler
# NOTES:
# 	Displays how FileMaker is relatively intuitive and foolproof
# 	This is actually a textual approximation of a graphical-based UI
# 	Original number of bottles can easily be adjusted in $_total
#
Set Variable [ $_total; Value: 99 ]
Set Variable [ $_rep; Value: $_total ]
Loop
	Exit Loop If [ $_rep &amp;lt; 1 ]
	Set Variable [ $_status; Value:
		Let ( [
			status = $_rep &amp;amp; &amp;quot; bottle&amp;quot; &amp;amp; If ( $_rep &amp;ne; 1 ; &amp;quot;s&amp;quot; )
			];
			status &amp;amp; &amp;quot; of beer on the wall, &amp;quot; &amp;amp; status &amp;amp; &amp;quot; of beer.&amp;quot;
		)
	]
	Set Variable [ $_action; Value:
		Let ( [
			num = $_rep - 1 ;
			status = If ( num = 0 ; &amp;quot;no more bottles&amp;quot; ; num &amp;amp; &amp;quot; bottle&amp;quot; &amp;amp; If ( num &amp;ne; 1 ; &amp;quot;s&amp;quot; ) )
			];
			&amp;quot;Take one down and pass it around, &amp;quot; &amp;amp; status &amp;amp; &amp;quot; of beer on the wall.&amp;quot;
		)
	]
	Set Variable [ $_lyric; Value:
		List (
			$_lyric ;
			$_status ;
			$_action &amp;amp; &amp;para;
		)
	]
	Set Variable [ $_rep; Value: $_rep - 1 ]
End Loop
Set Variable [ $_lyric; Value:
	List (
		$_lyric ;
		&amp;quot;No more bottles of beer on the wall, no more bottles of beer.&amp;quot; ;
		&amp;quot;Go to the store and buy some more, &amp;quot; &amp;amp; $_total &amp;amp; &amp;quot; bottles of beer on the wall.&amp;quot;
	)
]
#
Set Field [ Table::lyrics; $_lyric ]
&lt;/pre&gt;

</content>
  </entry>
  <entry>
    <id>urn:uuid:1ba1e2dc-3c7b-404d-baca-d81643eb91ba</id>
    <published>2011-10-29T18:19:58Z</published>
    <updated>2012-01-11T21:58:50Z</updated>
    <link type="text/html" href="http://buzz.beezwax.net/2011/10/29/working-with-repeating-fields" rel="alternate" />
    <author>
      <name>Will M. Baker</name>
      <email>will_b@beezwax.net</email>
    </author>
    <title type="html">Working with Repeating Fields</title>
    <category scheme="http://buzz.beezwax.net/category/filemaker" label="filemaker" term="filemaker" />
    <content type="html">&lt;p&gt;
	&lt;a href="http://buzz.beezwax.net/files/RepeatingFieldFunctions.fp7.zip"&gt;FileMaker file (click to download)&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;
	I began using FileMaker at the spry old age of FileMaker Pro 8, so I&amp;#39;ve never been through the trenches of using repeating fields to accomplish what can now be done with portals. However, repeating fields still have a variety of uses, and I&amp;#39;m happy to have them in my toolkit.&lt;/p&gt;
&lt;p&gt;
	When I&amp;#39;m working with a repeating field, there are several questions I might ask of it, depending on the task at hand.&lt;/p&gt;
&lt;ul&gt;
	&lt;li&gt;
		What is the nth value?&lt;/li&gt;
	&lt;li&gt;
		How many total repetitions does the field have?&lt;/li&gt;
	&lt;li&gt;
		How many repetitions contain values?&lt;/li&gt;
	&lt;li&gt;
		How many repetitions are empty?&lt;/li&gt;
	&lt;li&gt;
		What is the first non-null value?&lt;/li&gt;
	&lt;li&gt;
		What is the first repetition number that contains a value?&lt;/li&gt;
	&lt;li&gt;
		What is the first null repetition number?&lt;/li&gt;
	&lt;li&gt;
		What is the last non-null value?&lt;/li&gt;
	&lt;li&gt;
		What is the last repetition number that contains a value?&lt;/li&gt;
	&lt;li&gt;
		What is the last null repetition number?&lt;/li&gt;
	&lt;li&gt;
		What is the nth non-null value?&lt;/li&gt;
	&lt;li&gt;
		What is the list of all values, excluding nulls?&lt;/li&gt;
	&lt;li&gt;
		What is the list of all values, including nulls?&lt;/li&gt;
	&lt;li&gt;
		What is the list of all values, including only nulls that precede the last non-null value?&lt;/li&gt;
	&lt;li&gt;
		What is the list of repetition numbers containing a non-null value?&lt;/li&gt;
	&lt;li&gt;
		What is the list of repetition numbers containing a null value?&lt;/li&gt;
	&lt;li&gt;
		What is the list of repetition numbers containing a specific value?&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
	That&amp;#39;s a lot of questions. And FileMaker only provides us with three repetition-savvy functions to help in answering them. Many of our answers to these questions will be similar to (if not identical to) the answer if we asked the same question of a list, because a repeating field is a type of list. However, as a special class of list, a repeating field cannot always be interrogated in exactly the same way.&lt;/p&gt;
&lt;p&gt;
	Let&amp;#39;s tackle each question one at a time. I&amp;#39;m going to hop around a bit, answering the easy questions first. For all questions, we&amp;#39;ll be looking at TABLE::FIELD, partitioned into 10 repetitions, and with the following values.&lt;/p&gt;
&lt;p&gt;
	&lt;img alt="Sample Data" height="182" src="/files/SampleData2.png" width="146" /&gt;&lt;/p&gt;
&lt;p&gt;
	&amp;nbsp;&lt;/p&gt;
&lt;p&gt;
	&lt;strong&gt;1. What is the nth value?&lt;br /&gt;
	&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;
	Simple. We use the native function:&lt;/p&gt;
&lt;pre&gt;	GetRepetition ( TABLE::FIELD ; 3 )&lt;/pre&gt;
&lt;p&gt;
	returns&lt;/p&gt;
&lt;pre&gt;	green&lt;/pre&gt;
&lt;p&gt;
	&amp;nbsp;&lt;/p&gt;
&lt;p&gt;
	&lt;strong&gt;2. What is the list of all values, excluding nulls?&lt;br /&gt;
	&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;
	Also simple, as List operates on a single repeating field much as it operates on related data.&lt;/p&gt;
&lt;pre&gt;	List ( TABLE::FIELD )&lt;/pre&gt;
&lt;p&gt;
	returns&lt;/p&gt;
&lt;pre&gt;	blue
	green
	red
	yellow
	yellow
	pink&lt;/pre&gt;
&lt;p&gt;
	Now that we&amp;#39;ve turned the repeating field into a simple list, we can easily answer the next few questions.&lt;/p&gt;
&lt;p&gt;
	&amp;nbsp;&lt;/p&gt;
&lt;p&gt;
	&lt;strong&gt;3. How many repetitions contain values?&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;	ValueCount ( List ( TABLE::FIELD ) )&lt;/pre&gt;
&lt;p&gt;
	returns&lt;/p&gt;
&lt;pre&gt;	6&lt;/pre&gt;
&lt;p&gt;
	But even better:&lt;/p&gt;
&lt;pre&gt;	Count ( TABLE::FIELD )&lt;/pre&gt;
&lt;p&gt;
	returns&lt;/p&gt;
&lt;pre&gt;	6&lt;/pre&gt;
&lt;p&gt;
	&amp;nbsp;&lt;/p&gt;
&lt;p&gt;
	&lt;strong&gt;4. What is the first non-null value?&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;	GetValue ( List ( TABLE::FIELD ) ; 1 )&lt;/pre&gt;
&lt;p&gt;
	returns&lt;/p&gt;
&lt;pre&gt;	blue&lt;/pre&gt;
&lt;p&gt;
	&amp;nbsp;&lt;/p&gt;
&lt;p&gt;
	&lt;strong&gt;5. What is the nth non-null value?&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;	GetValue ( List ( TABLE::FIELD ) ; 3 )&lt;/pre&gt;
&lt;p&gt;
	returns&lt;/p&gt;
&lt;pre&gt;	red&lt;/pre&gt;
&lt;p&gt;
	&amp;nbsp;&lt;/p&gt;
&lt;p&gt;
	&lt;strong&gt;6. What is the last non-null value?&lt;br /&gt;
	&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;
	We could continue to leverage our previous solutions, to come up with something like this:&lt;/p&gt;
&lt;pre&gt;	GetValue ( List ( TABLE::FIELD ) ; ValueCount ( List ( TABLE::FIELD ) ) )&lt;/pre&gt;
&lt;p&gt;
	returns&lt;/p&gt;
&lt;pre&gt;	pink&lt;/pre&gt;
&lt;p&gt;
	But better to use the second of FileMaker&amp;#39;s native repetition functions.&lt;/p&gt;
&lt;pre&gt;	Last ( TABLE::FIELD )&lt;/pre&gt;
&lt;p&gt;
	returns&lt;/p&gt;
&lt;pre&gt;	pink&lt;/pre&gt;
&lt;p&gt;
	Okay, that&amp;#39;s it for the easy ones. The rest we&amp;#39;ll need to work for. This next question will ultimately result in our most important function. As we get into more complicated questions, we&amp;#39;re going to use recursion to traverse the list; and we can&amp;#39;t use recursion unless we have an upper limit to describe our exit condition.&lt;/p&gt;
&lt;p&gt;
	&amp;nbsp;&lt;/p&gt;
&lt;p&gt;
	&lt;strong&gt;7. How many total repetitions does the field have?&lt;br /&gt;
	&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;
	There are several ways to attack this question. First, we could just hardcode the value, since this is a schematic configuration and can&amp;#39;t change at runtime. Second, we could put the fully extended field on a layout somewhere, then detect its repetitions using FieldRepetitions. But let&amp;#39;s find something more elegant.&lt;/p&gt;
&lt;pre&gt;	FieldType ( Get ( FileName ) ; GetFieldName ( TABLE::FIELD ) )&lt;/pre&gt;
&lt;p&gt;
	returns&lt;/p&gt;
&lt;pre&gt;	Standard Text Unindexed 10&lt;/pre&gt;
&lt;p&gt;
	So we&amp;#39;re in luck. This design function suffixes the field description with the maximum defined repetitions.&lt;/p&gt;
&lt;pre&gt;	GetAsNumber ( FieldType ( Get ( FileName ) ; GetFieldName ( TABLE::FIELD ) ) )&lt;/pre&gt;
&lt;p&gt;
	returns&lt;/p&gt;
&lt;pre&gt;	10&lt;/pre&gt;
&lt;p&gt;
	Not only does this work on calculated and summary fields, but it also works on fields with only one repetition. This formula is useful enough that we&amp;#39;ll store it in a custom function, FieldReps ( field ).&lt;/p&gt;
&lt;p&gt;
	&amp;nbsp;&lt;/p&gt;
&lt;p&gt;
	&lt;strong&gt;8. How many repetitions are empty?&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;	FieldReps ( TABLE::FIELD ) - Count ( TABLE::FIELD )&lt;/pre&gt;
&lt;p&gt;
	returns&lt;/p&gt;
&lt;pre&gt;	4&lt;/pre&gt;
&lt;p&gt;
	&amp;nbsp;&lt;/p&gt;
&lt;p&gt;
	&lt;strong&gt;9. What is the list of all values, including nulls?&lt;br /&gt;
	&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;
	List is useful for non-null values, because it automatically strips out the nulls. But this can be problematic if we&amp;#39;re trying to compare two lists side-by-side; we don&amp;#39;t want values shifting vertically. When I was first getting started in FileMaker, I heavily used a function adapted from John Mark Osborne&amp;#39;s ListSet. It uses GetNthRecord to traverse a found set, scooping up values, effectively using List on a found set. We&amp;#39;ll use a similar approach here. Beginning with the first repetition, and continuing until we have considered each repetition, return the value of that repetition (inserting a carriage return between values).&lt;/p&gt;
&lt;p&gt;
	We&amp;#39;ll start with a shell function: RepList ( field )&lt;/p&gt;
&lt;pre&gt;	RepListLoop ( field ; FieldReps ( field ) ; 1 )&lt;/pre&gt;
&lt;p&gt;
	Which in turn calls a sub-function: RepListLoop ( field ; repMax ; rep )&lt;/p&gt;
&lt;pre&gt;	Case (
		rep &amp;gt; repMax ; &amp;quot;&amp;quot;
		;	Case ( rep = 1 ; &amp;quot;&amp;quot; ; &amp;para; )
		&amp;amp;	GetRepetition ( field ; rep )
		&amp;amp;	RepListLoop ( field ; repMax ; rep + 1 )
	)&lt;/pre&gt;
&lt;p&gt;
	&amp;nbsp;&lt;/p&gt;
&lt;p&gt;
	&lt;strong&gt;10. What is the list of all values, including only nulls that precede the last non-null value?&lt;br /&gt;
	&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;
	There might be any number of reasons why we want to stop building the list when we hit the last non-null value, but let&amp;#39;s look at the problem purely from a performance perspective. Assuming we don&amp;#39;t care about trailing nulls, we&amp;#39;re only wasting cycles by gathering them. And since a repeating field may contain up to 32,000 repetitions, we&amp;#39;re potentially saving on tens of thousands of unnecessary recursions.&lt;/p&gt;
&lt;p&gt;
	RepList does most of the work for us, but the problem is detecting an early exit point. I&amp;#39;ve seen a solution that counts backward from the end until it hits a non-null value, but this approach guarantees one recursion per repetition. Instead we&amp;#39;ll incorporate our solution from #3 as a decreasing counter. Every time we process a non-null value, we know we are one step closer to completion; no need to continue interrogating thousands of repetitions if we know we&amp;#39;ve already gathered all the values we came for.&lt;/p&gt;
&lt;p&gt;
	RepListOmitTrailingNulls ( field )&lt;/p&gt;
&lt;pre&gt;	RepListOmitTrailingNullsLoop ( field ; FieldReps ( field ) ; 1 ; Count ( field ) )&lt;/pre&gt;
&lt;p&gt;
	RepListOmitTrailingNullsLoop ( field ; repMax ; rep ; maxValues )&lt;/p&gt;
&lt;pre&gt;Case (
	rep &amp;gt; repMax or maxValues = 0 ; &amp;quot;&amp;quot; ;
	Let ( [
		value = GetRepetition ( field ; rep )
	;	maxValues = Case ( IsEmpty ( value ) ; maxValues ; maxValues - 1 )
	] ;
		Case ( rep = 1 ; &amp;quot;&amp;quot; ; &amp;para; )
	&amp;amp;	value
	&amp;amp;	RepListOmitTrailingNullsLoop ( field ; repMax ; rep + 1 ; maxValues )
	) // end Let
) // end outer Case&lt;/pre&gt;
&lt;p&gt;
	So far most of these questions have dealt with extracting values from the repeating field. But if we want to interact more fully with the field, we might instead want to know about the repetition number that corresponds to specific values. This could be useful for exchanging values (e.g. find &amp;#39;red&amp;#39; and replace with &amp;#39;brown&amp;#39;), or perhaps for filling in gaps.&lt;/p&gt;
&lt;p&gt;
	The best approach I know to solve these problems is to use recursion. However, recursion can be costly, especially as the number of repetitions grows. So we need to be as efficient as possible. The two main strategies I employ for recursion efficiency are:&lt;/p&gt;
&lt;ul&gt;
	&lt;li&gt;
		Wrapper functions, as we&amp;#39;ve already seen in the examples above. These are responsible for initializing counters (to make the function easier to use) and any constants (so we never recalculate a constant twice)&lt;/li&gt;
	&lt;li&gt;
		Intelligent upper limits, so that we don&amp;#39;t continue to interrogate the field even though we&amp;#39;ve found everything we&amp;#39;re looking for.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
	Consider each of the following questions:&lt;/p&gt;
&lt;p&gt;
	&lt;strong&gt;11. What is the first repetition number that contains a value?&lt;br /&gt;
	&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;
	&lt;strong&gt;12. What is the first null repetition number?&lt;br /&gt;
	&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;
	&lt;strong&gt;13. What is the last repetition number that contains a value?&lt;br /&gt;
	&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;
	&lt;strong&gt;14. What is the last null repetition number?&lt;br /&gt;
	&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;
	&lt;strong&gt;15. What is the list of repetition numbers containing a non-null value?&lt;br /&gt;
	&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;
	&lt;strong&gt;16. What is the list of repetition numbers containing a null value?&lt;br /&gt;
	&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;
	&lt;strong&gt;17. What is the list of repetition numbers containing a specific value?&lt;br /&gt;
	&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;
	These can all be abstracted (sort of) into the following question: find n repetition numbers matching value x. Using a little syntactical wizardry, we can decide that in the context of n, &amp;quot;*&amp;quot; means find all repetitions, and &amp;quot;&amp;quot; (null) means find the last repetition; and in the context of x, we can decide that &amp;quot;*&amp;quot; means find any non-null, and &amp;quot;&amp;quot; (null) means find any null.&lt;/p&gt;
&lt;p&gt;
	As my custom functions grow in complexity, I find that the biggest challenge is naming my function parameters and Let variables intelligently, so that the code makes sense. In this case, depending on the parameters passed, we need to keep track of the following:&lt;/p&gt;
&lt;ul&gt;
	&lt;li&gt;
		value. What is the user looking for?&lt;/li&gt;
	&lt;li&gt;
		matchTarget. How many matches does the user want? Just the first? The nth? The last? All?&lt;/li&gt;
	&lt;li&gt;
		matchMax. How many values in the list match the target value? We must re-adjust matchTarget accordingly, because we don&amp;#39;t want to look for the 100th match if we already know there aren&amp;#39;t any, or are only a few.&lt;/li&gt;
	&lt;li&gt;
		matchCount. How many matches have we found so far?&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
	Armed with those parameters, we can quickly traverse the list, looking for matches, and returning one or more repetition numbers, as appropriate.&lt;/p&gt;
&lt;p&gt;
	RepNumber ( field ; value ; matchTarget )&lt;/p&gt;
&lt;pre&gt;	Let ( [
		matchMax = Case (
			IsEmpty ( value ) ; FieldReps ( field ) - Count ( field ) // Syntax: Null values.
		;	value = &amp;quot;*&amp;quot; ; Count ( field ) // Syntax: Non-null values.
		;	ValueCount ( FilterValues ( List ( field ) ; value ) ) // Specific value.
		) ;
		matchTarget = Case (
			IsEmpty ( matchTarget ) ; matchMax // Syntax: Return last match.
		;	matchTarget = &amp;quot;*&amp;quot; ; matchTarget // Syntax: Return all matches.
		;	matchTarget &amp;gt; matchMax ; &amp;quot;&amp;quot; // If there are fewer matches than sought by targetMatch, return nothing.
		;	matchTarget
		)
	] ;
		Case (
			matchMax and not IsEmpty ( matchTarget ) ; RepNumberLoop ( field ; value ; matchTarget ; matchMax ; 0 ; 1 )
		;	&amp;quot;&amp;quot; // If the target value is not in the list, or there are too few matches, don&amp;#39;t waste time searching the list.
		) // end Case
	) // end Let
&lt;/pre&gt;
&lt;p&gt;
	RepNumberLoop ( field ; value ; matchTarget ; matchMax ; matchCount ; rep )&lt;/p&gt;
&lt;pre&gt;	Let ( [
		repValue = GetRepetition ( field ; rep )
	;	match = Case (
			IsEmpty ( value ) and IsEmpty ( repValue ) ; True
		;	value = &amp;quot;*&amp;quot; and not IsEmpty ( repValue ) ; True
		;	value = repValue ; True
		;	False
		) ;
		matchCount = matchCount + match
	] ;
		Case (
			match and matchTarget = &amp;quot;*&amp;quot; ; rep // Syntax: we found a value, but should continue to look for more.
		&amp;amp;	Case (
			matchCount = matchMax ; &amp;quot;&amp;quot;
			;	&amp;para; &amp;amp; RepNumberLoop ( field ; value ; matchTarget ; matchMax ; matchCount ; rep + 1 )
		) // end inner Case
		;	matchCount = matchTarget ; rep // We found the value we&amp;#39;re looking for.
		;	RepNumberLoop ( field ; value ; matchTarget ; matchMax ; matchCount ; rep + 1 )
		) // end outer Case
	) // end Let
&lt;/pre&gt;
&lt;p&gt;
	In the sample file at the top of this article, click each of the questions to see the result.&lt;/p&gt;


</content>
  </entry>
  <entry>
    <id>urn:uuid:e52db525-a365-42df-89f7-e0163b862782</id>
    <published>2011-10-06T23:55:35Z</published>
    <updated>2012-01-11T21:58:50Z</updated>
    <link type="text/html" href="http://buzz.beezwax.net/2011/10/07/good-sir-williams-heirs" rel="alternate" />
    <author>
      <name>Will M. Baker</name>
      <email>will_b@beezwax.net</email>
    </author>
    <title type="html">Good Sir William's Heirs</title>
    <category scheme="http://buzz.beezwax.net/category/filemaker" label="filemaker" term="filemaker" />
    <content type="html">&lt;p&gt;
	&lt;a href="http://buzz.beezwax.net/files/Sir_Williams_Heirs_fp7.zip"&gt;FileMaker file (click to download)&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;
	That old Bard, good Sir William, is nearing the end of his life. Having already provided well for his five children, he now seeks to divide his literary empire among his eleven grandchildren:&lt;/p&gt;
&lt;p&gt;
	&lt;img alt="Family Tree" src="/files/FamilyTree.png" /&gt;&lt;/p&gt;
&lt;p&gt;
	But Sir William is a mischevious fellow, and wants only to reward grandchildren who meet certain criteria:&lt;/p&gt;
&lt;ul&gt;
	&lt;li&gt;
		Eldest (among all the grandchildren)&lt;/li&gt;
	&lt;li&gt;
		Youngest (among all the grandchildren)&lt;/li&gt;
	&lt;li&gt;
		Eldest (among the children of the eldest child)&lt;/li&gt;
	&lt;li&gt;
		Youngest (among the children of the eldest child)&lt;/li&gt;
	&lt;li&gt;
		Eldest (among the children of the youngest child)&lt;/li&gt;
	&lt;li&gt;
		Youngest (among the children of the youngest child)&lt;/li&gt;
	&lt;li&gt;
		Middle (among all the grandchildren)&lt;/li&gt;
	&lt;li&gt;
		Middle (among the children of the middle child)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
	How will he sort it out, and have some fun in the process? Luckily, Sir William has a copy of FileMaker Pro 11 Advanced on hand. But how should he go about it? Should he script it? No, he&amp;#39;s written enough scripts in his lifetime, and he&amp;#39;s grown weary of them. Should he construct a web of conditional relationships on the relationship graph? Also a tiresome prospect, as he&amp;#39;s woven together so many complex relationships in his time that it will take scholars centuries to unravel the mess.&lt;/p&gt;
&lt;p&gt;
	Okay, then. How about a portal filter? Yes, a portal filter, that clever addition to FileMaker Pro 11 that moves all the idiosyncratic, one-off relationship logic up to the presentation layer. Within short order, Sir William has built a beautiful FileMaker layout to display which grandchildren shall be favored:&lt;/p&gt;
&lt;p&gt;
	&lt;img alt="Portal Filters" src="/files/Problems.png" /&gt;&lt;/p&gt;
&lt;p&gt;
	But how did he do it? First, he created a table structure to match his family tree:&lt;/p&gt;
&lt;p&gt;
	&lt;img alt="Relationship Graph" src="/files/Graph.png" /&gt;&lt;/p&gt;
&lt;p&gt;
	Both the CHILD and GRANDCHILD tables are sorted ascending by birth year. That should take care of any issue with family being added to the database in an inconvenient order.&lt;/p&gt;
&lt;p&gt;
	&lt;img alt="Sort Order" src="/files/SortOrder.png" /&gt;&lt;/p&gt;
&lt;p&gt;
	&lt;strong&gt;The primary problem to be overcome is that when traversing the relationship graph, FileMaker only respects the last sort order in its path.&lt;/strong&gt; Thus when moving from PARENT directly to GRANDCHILD, FileMaker will respect the sort on GRANDCHILD, but ignore the sort on CHILD. So, it&amp;#39;s up to&amp;nbsp;portal filters to identify the favored grandchild.&lt;/p&gt;
&lt;p&gt;
	1. &lt;strong&gt;Eldest Grandchild&lt;/strong&gt;. This one is easy. Because of the sorted relationship, Sir William doesn&amp;#39;t even need a portal. He can put the GRANDCHILD::NAME field directly on the layout, and it will display the eldest grandchild.&lt;/p&gt;
&lt;p&gt;
	2. &lt;strong&gt;Youngest Grandchild&lt;/strong&gt;. Sir William needs a portal for this, but not a portal filter. He uses a descending sort on the portal to override the relationship&amp;#39;s sort, and presto magico, the youngest grandchild floats to the top.&lt;/p&gt;
&lt;p&gt;
	3. &lt;strong&gt;Eldest Grandchild of the Eldest Child&lt;/strong&gt;. Okay, enough easy stuff; if Sir William wanted easy, he would have stuck to writing tragedies (they practically write themselves!). Time for a portal filter. The calculation below leverages the solution to problem #1 by constraining the list to just those grandchildren who descend from the eldest child. From there, the relationship&amp;#39;s built-in sort order floats the eldest to the top.&lt;/p&gt;
&lt;p style="margin-left: 40px; "&gt;
	&lt;span style="font-family:courier new, courier, monospace;"&gt;GRANDCHILD::ID_CHILD = CHILD::ID&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;
	4. &lt;strong&gt;Youngest Grandchild of the Eldest Child&lt;/strong&gt;. Same as above, but we apply an overriding descending sort to the portal, as in problem #2.&lt;/p&gt;
&lt;p&gt;
	5. &lt;strong&gt;Eldest Grandchild of the Youngest Child&lt;/strong&gt;. Things are getting a bit trickier. We can use the same logic as in problem #3, but only if we can identify the youngest child. Sir William has been playing around with repeating functions, though, and happens to know that &lt;span style="font-family:courier new, courier, monospace;"&gt;Last ( repeatingField )&lt;/span&gt; works on more than just repeating fields!&lt;/p&gt;
&lt;p style="margin-left: 40px; "&gt;
	&lt;span style="font-family:courier new, courier, monospace;"&gt;GRANDCHILD:ID_CHILD = Last (CHILD:ID )&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;
	6. &lt;strong&gt;Youngest Grandchild of the Yougest Child&lt;/strong&gt;. Same as above, but we apply an overriding descending sort to the portal, just like in problem #4, which is just like problem #2. What a breeze! Why didn&amp;#39;t Sir William write all his plays using FileMaker syntax?&lt;/p&gt;
&lt;p&gt;
	7. &lt;strong&gt;Middle Grandchild&lt;/strong&gt;. Okay, finally, a problem worth solving. The pre-sorted relationship takes care of putting all of Sir William&amp;#39;s grandchildren into the correct order, so all that remains is to grab the middle value out of the list. The two nuances here are to recast the retrieved value as a number, since it was converted to text by &lt;span style="font-family:courier new, courier, monospace;"&gt;List ( )&lt;/span&gt;; and to devise a method for dealing with odd/even numbers of grandchildren (more could be born before his will is executed, after all!).&lt;/p&gt;
&lt;p style="margin-left: 40px; "&gt;
	&lt;span style="font-family:courier new, courier, monospace;"&gt;GRANDCHILD::ID = GetAsNumber ( GetValue ( List ( GRANDCHILD::ID ) ; Ceiling ( ValueCount ( List ( GRANDCHILD::ID ) ) / 2 ) ) )&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;
	8. &lt;strong&gt;Middle Grandchild of the Middle Child&lt;/strong&gt;. Now Sir William is scratching his skull cap. It&amp;#39;s easy enough to identify the middle child, using the same technique as in problem #7. But then how does he constrain the list of grandchildren to just that child before performing an additional operation on the list? Sure he could create some fields to pass blobs of text around, but the whole idea is to use portal filters! What about one of those fancy SQL plug-ins, so he can just employ a schmancy Select statement? Oh, wait, this is the 1600s; plug-ins haven&amp;#39;t been invented yet; it&amp;#39;s going to need to be a purely FileMaker solution.&lt;/p&gt;
&lt;p&gt;
	Finally Sir William settles on a custom function to help him massage the two lists of data (one of children, one of grandchildren). He&amp;#39;s disappointed that he couldn&amp;#39;t fit all the logic into the portal filter, but at least the solution exists solely in the calculation engine. First, his custom function: &lt;span style="font-family:courier new, courier, monospace;"&gt;ParallelLists ( list1 ; list2 ; list1Value )&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin-left: 40px; "&gt;
	&lt;span style="font-family:courier new, courier, monospace;"&gt;Case (&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin-left: 40px; "&gt;
	&lt;span style="font-family:courier new, courier, monospace;"&gt;IsEmpty ( list1 ) ; &amp;quot;&amp;quot; ;&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin-left: 40px; "&gt;
	&lt;span style="font-family:courier new, courier, monospace;"&gt;List (&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin-left: 40px; "&gt;
	&lt;span style="font-family:courier new, courier, monospace;"&gt;Case ( GetValue ( list1 ; 1 ) = list1Value ; GetValue ( list2 ; 1 ) ; &amp;quot;&amp;quot; ) ;&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin-left: 40px; "&gt;
	&lt;span style="font-family:courier new, courier, monospace;"&gt;ParallelLists ( RightValues ( list1 ; ValueCount ( list1 ) - 1 ) ; RightValues ( list2 ; ValueCount ( list2 ) - 1 ) ; list1Value )&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin-left: 40px; "&gt;
	&lt;span style="font-family:courier new, courier, monospace;"&gt;)&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin-left: 40px; "&gt;
	&lt;span style="font-family:courier new, courier, monospace;"&gt;)&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;
	Then his portal filter calculation:&lt;/p&gt;
&lt;p style="margin-left: 40px; "&gt;
	&lt;span style="font-family:courier new, courier, monospace;"&gt;Let ( [&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin-left: 40px; "&gt;
	&lt;span style="font-family:courier new, courier, monospace;"&gt;childIDList = List ( CHILD::ID ) ;&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin-left: 40px; "&gt;
	&lt;span style="font-family:courier new, courier, monospace;"&gt;childID = GetValue ( childIDList ; Ceiling ( ValueCount ( childIDList ) / 2 ) ) ;&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin-left: 40px; "&gt;
	&lt;span style="font-family:courier new, courier, monospace;"&gt;grandchildIDList = ParallelLists ( List ( GRANDCHILD::ID_CHILD ) ; List ( GRANDCHILD::ID ) ; childID ) ;&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin-left: 40px; "&gt;
	&lt;span style="font-family:courier new, courier, monospace;"&gt;grandchildID = GetValue ( grandchildIDList ; Ceiling ( ValueCount ( grandchildIDList ) / 2 ) )&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin-left: 40px; "&gt;
	&lt;span style="font-family:courier new, courier, monospace;"&gt;] ;&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin-left: 40px; "&gt;
	&lt;span style="font-family:courier new, courier, monospace;"&gt;GRANDCHILD::ID = grandchildID&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin-left: 40px; "&gt;
	&lt;span style="font-family:courier new, courier, monospace;"&gt;)&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;
	And with that, Sir William may rest easier, knowing that his FileMaker portal filters are ready to adapt to any changes in his family tree. May his grandchildren grow up to be as nefarious as he!&lt;/p&gt;
&lt;p&gt;
	Here&amp;#39;s a quick summary of the techniques employed for each problem:&lt;/p&gt;
&lt;p&gt;
	&lt;img alt="Favored Grandchildren" height="285" src="/files/Solution.png" width="437" /&gt;&lt;/p&gt;


</content>
  </entry>
  <entry>
    <id>urn:uuid:217dc386-17ab-438c-91c6-4309f129f282</id>
    <published>2011-10-07T22:30:13Z</published>
    <updated>2012-01-11T21:58:50Z</updated>
    <link type="text/html" href="http://buzz.beezwax.net/2011/10/06/version-0-50-of-bbox-now-available" rel="alternate" />
    <author>
      <name>Jay G</name>
      <email>jay_g@beezwax.net</email>
    </author>
    <title type="html">Version 0.50 of bBox Now Available</title>
    <category scheme="http://buzz.beezwax.net/category/filemaker" label="filemaker" term="filemaker" />
    <category scheme="http://buzz.beezwax.net/category/filemaker-add-ons" label="filemaker add-ons" term="filemaker-add-ons" />
    <category scheme="http://buzz.beezwax.net/category/filemaker-resources" label="filemaker resources" term="filemaker-resources" />
    <category scheme="http://buzz.beezwax.net/category/filemaker-utilities" label="filemaker utilities" term="filemaker-utilities" />
    <category scheme="http://buzz.beezwax.net/tag/applescript" term="applescript" />
    <category scheme="http://buzz.beezwax.net/tag/bbox" term="bbox" />
    <category scheme="http://buzz.beezwax.net/tag/filemaker" term="filemaker" />
    <category scheme="http://buzz.beezwax.net/tag/in" term="in" />
    <category scheme="http://buzz.beezwax.net/tag/mac" term="mac" />
    <category scheme="http://buzz.beezwax.net/tag/macos" term="macOS" />
    <category scheme="http://buzz.beezwax.net/tag/plug" term="plug" />
    <category scheme="http://buzz.beezwax.net/tag/python" term="python" />
    <category scheme="http://buzz.beezwax.net/tag/ruby" term="ruby" />
    <category scheme="http://buzz.beezwax.net/tag/scripting" term="scripting" />
    <category scheme="http://buzz.beezwax.net/tag/shell" term="shell" />
    <content type="html">&lt;p&gt;
	A new version of our &lt;a href="http://www.beezwax.net/bbox"&gt;free bBox FileMaker plug-in&lt;/a&gt; is now available.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;
	Perhaps the most interesting addition for this version is the bBox_EvaluateList function, which is defined like so:&lt;/p&gt;
&lt;pre&gt;bBox_EvaluateList (values; expression {; delimiter} )&lt;/pre&gt;
&lt;p&gt;
	This syntactic construct is also available in Python and JavaScript, and is a convenient way of processing items in a list. As the function iterates through each item of the list, two variables are set. $i will contain the current item index (i.e., which item number in the list of values), and $v will be the value itself. The results for every item are concatenated to form the the function&amp;#39;s result. Here is a trivial example:&lt;/p&gt;
&lt;pre&gt;bBox_EvaluateList (&amp;quot;a&amp;para;b&amp;para;c&amp;quot;; &amp;quot;$v&amp;quot;)&lt;/pre&gt;
&lt;p&gt;
	That would give us the result of:&lt;/p&gt;
&lt;pre&gt;&amp;quot;abc&amp;quot;&lt;/pre&gt;
&lt;p&gt;
	The fact that $v is in quotes may seem weird, but remember that the function is getting passed a string expression to be evaluated for each item in the list. Essentially, it is calling FileMaker&amp;#39;s built-in Evaluate function. There are of course other ways of doing this sort of thing using recursive custom function calls, but they are slow and limited in the number of values you can process. The case where the data contains quotes has also been handled, but the escaping of such things as quotes can still get a little tricky. Take this slightly more elaborate version of our previous example:&lt;/p&gt;
&lt;pre&gt;bBox_EvaluateList (&amp;quot;a&amp;para;b&amp;para;c&amp;quot;; &amp;quot;$i &amp;amp; \\\&amp;quot;: \\\&amp;quot; &amp;amp; &amp;amp; $v &amp;amp; &amp;para;&amp;quot;)&lt;/pre&gt;
&lt;p&gt;
	returns the following:&lt;/p&gt;
&lt;pre&gt;	1: a
	2: b
	3: c&lt;/pre&gt;
&lt;p&gt;
	The elaborate escaping sequences were needed in order to get FileMaker to compile the expression with the quotes inside the string. However, it is hopefully evident that it was worth the trouble to get the result.&lt;/p&gt;
&lt;p&gt;
	Also new are the &lt;strong&gt;bBox_ListFields&lt;/strong&gt; and &lt;strong&gt;bBox_ListTables&lt;/strong&gt; functions. These are convenience functions that give schema information in a MySQL format. The detail however is somewhat limited when run on FileMaker version 10 or less. Especially of interest is that the table function finally gives us a way to find the base table name for a TO.&lt;/p&gt;
&lt;p&gt;
	You can download the latest version of bBox at&amp;nbsp;&lt;a href="http://www.beezwax.net/download/bbox"&gt;http://www.beezwax.net/download/bbox&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;
	Learn more about the bBox plug-in at&amp;nbsp;&lt;a href="http://www.beezwax.net/bbox"&gt;http://www.beezwax.net/bbox&lt;/a&gt;.&lt;/p&gt;


</content>
  </entry>
  <entry>
    <id>urn:uuid:8cf48525-e617-414f-835b-a6fc27dc4898</id>
    <published>2011-08-14T22:01:24Z</published>
    <updated>2012-04-02T17:14:46Z</updated>
    <link type="text/html" href="http://buzz.beezwax.net/2011/09/06/filemaker-read-only-fields-lighter-smarter-friendlier" rel="alternate" />
    <author>
      <name>Brian</name>
      <email>brian_s@beezwax.net</email>
    </author>
    <title type="html">FileMaker Read-only Fields: Lighter, Smarter, Friendlier.</title>
    <category scheme="http://buzz.beezwax.net/category/filemaker" label="filemaker" term="filemaker" />
    <category scheme="http://buzz.beezwax.net/category/filemaker-resources" label="filemaker resources" term="filemaker-resources" />
    <category scheme="http://buzz.beezwax.net/category/filemaker-tips" label="filemaker tips" term="filemaker-tips" />
    <category scheme="http://buzz.beezwax.net/tag/ui" term="UI" />
    <category scheme="http://buzz.beezwax.net/tag/filemaker" term="filemaker" />
    <category scheme="http://buzz.beezwax.net/tag/tips" term="tips" />
    <link type="application/octet-stream" length="176128" title="FileMaker Read-only Fields: Lighter, Smarter, Friendlier." rel="enclosure" href="http://buzz.beezwax.net/files/Improved_Read-Only_Fields.fp7" />
    <content type="html">&lt;p&gt;
	Here&amp;#39;s an interesting interface challenge we recently faced: A client needed to place text fields on a layout and fluidly choose which fields would be editable or read-only&amp;mdash;the same field might exist in both editable and read-only state on the same layout.&lt;/p&gt;
&lt;p&gt;
	Now, here&amp;rsquo;s the challenging bit:&lt;em&gt;&amp;nbsp;Each read-only field must have all the same capabilities of its editable cousins&amp;mdash;users must be able to scroll, select, and copy text, and the field control must display all rich text formatting entered&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;
	We added one last requirement of our own: Our technique must be lightweight, easily extensible, and must not add meaningless fields to our data tables.&amp;nbsp;&lt;/p&gt;
&lt;h3 id="thecandidates"&gt;
	The Candidates&lt;/h3&gt;
&lt;p&gt;
	We started out with 4 possibilities&amp;mdash;all common techniques in the FileMaker world:&lt;/p&gt;
&lt;ul&gt;
	&lt;li&gt;
		Limiting access using UI field entry controls&lt;/li&gt;
	&lt;li&gt;
		Limiting access using FileMaker Security&lt;/li&gt;
	&lt;li&gt;
		Presentation using Proxy Calculated Fields&lt;/li&gt;
	&lt;li&gt;
		Presentation using Web Viewers&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
	None of these standard techniques met our client&amp;rsquo;s needs. We had an interesting problem on our hands! In the end we found two solutions that worked. Our path to each of these is described below. But, if you really hate suspense, you can&amp;nbsp;&lt;a href="#skip-to-end"&gt;click here to skip directly to our solutions&amp;hellip;&lt;/a&gt;&lt;/p&gt;
&lt;p style="margin-left: 40px; "&gt;
	&lt;img alt="Our Text Fields" height="123" src="http://buzz.beezwax.net//files/starting point.png" width="500" /&gt;&lt;/p&gt;
&lt;h5 id="ourtextfields:waitingforatechniquetokeepthemsecure." style="margin-left: 40px; "&gt;
	Our text fields: Waiting for a technique to make them secure yet friendly.&lt;/h5&gt;
&lt;h3 id="exitstageleft"&gt;
	Exit Stage Left&lt;/h3&gt;
&lt;p&gt;
	Putting our heads together, we quickly ruled out two techniques:&lt;/p&gt;
&lt;ul&gt;
	&lt;li&gt;
		Disabling &lt;strong&gt;Field entry: Browse mode&lt;/strong&gt;&amp;nbsp;(via the Inspector palette) worked too well. It prevented users from interacting with a field at all - no scrolling, selection, or copying its contents.&lt;/li&gt;
	&lt;li&gt;
		Using &lt;strong&gt;Filemaker&amp;rsquo;s native Security&lt;/strong&gt; layer to make a field read-only also was too coarse an approach. If a field was read-only, users couldn&amp;#39;t edit it elsewhere on that layout.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="calculatedproxyfields"&gt;
	Calculated Proxy Fields&lt;/h3&gt;
&lt;p&gt;
	We considered a widely-used approach: the time-honored technique of using &lt;strong&gt;proxy calculated fields&lt;/strong&gt; for each field to be read-only. For each field to be read-only, you create an unstored calculated text field, and set its calculated value to the desired field. Out of the box, proxy calculation fields are read-only, scrollable, selectable, and they faithfully preserve any text formatting.&lt;/p&gt;
&lt;p&gt;
	So what&amp;rsquo;s not to love? The problem lies under the hood. This technique solves a UI problem by creating meaningless data fields, cluttering data tables with entities whose only purpose is presentational. This technique might work well at first, but would create clutter and code management issues as a solution grew.&lt;/p&gt;
&lt;h3 id="webviewers"&gt;
	Web Viewers&lt;/h3&gt;
&lt;p&gt;
	We also considered using a &lt;strong&gt;Web Viewer&lt;/strong&gt; to display the field. We set the Web Viewer&amp;rsquo;s source to:&lt;/p&gt;
&lt;pre style="margin-left: 40px; "&gt;&lt;code&gt;&amp;quot;data:text/html,&amp;quot; &amp;amp; [ fieldname ]&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;
	This gave us a read-only, scrollable, selectable display of our field data, didn&amp;rsquo;t require any additional data fields, &lt;em&gt;and&lt;/em&gt; was bullet-proof against editing. But the Web Viewer couldn&amp;#39;t display rich text formatting, which was a basic client requirement. Close, but no cigarello.&lt;/p&gt;
&lt;p style="margin-left: 40px; "&gt;
	&lt;img alt="Web Viewers, 1" height="92" src="http://buzz.beezwax.net//files/web viewers 1.png" width="500" /&gt;&lt;/p&gt;
&lt;h5 id="webviewers:tantalizing.butnoformatting" style="margin-left: 40px; "&gt;
	Web Viewers: Tantalizing. But no formatting&amp;hellip;&lt;/h5&gt;
&lt;h3 id="scripttriggers"&gt;
	Script Triggers&lt;/h3&gt;
&lt;p&gt;
	Beezwax developer &lt;a href="http://www.beezwax.net/who/100"&gt;Will Baker&lt;/a&gt; suggested a simple, elegant script trigger solution: By triggering a simple script that returned false whenever a field&amp;rsquo;s &lt;strong&gt;onObjectKeystroke&lt;/strong&gt; and &lt;strong&gt;onObjectModify&lt;/strong&gt; events fired, we could prevent any keyboard edits, and allow scrolling, selection, copying, and even format preservation. We liked this technique a lot&amp;mdash;it&amp;rsquo;s elegant, lightweight, requires only 1 trigger script, and would keep our data tables completely clean.&lt;/p&gt;
&lt;p&gt;
	Unfortunately, this technique had an Achilles heel: Users could still edit field data using cut/paste and drag and drop.&lt;/p&gt;
&lt;h3 id="asingleproxyfield"&gt;
	A Single Proxy Field&lt;/h3&gt;
&lt;p&gt;
	Returning to the idea of proxy calculated fields resulted in a mini brainstorm: We found we could remove most of this technique&amp;#39;s usual clutter by creating a single, repeating presentational calculated field able to present any number of fields. We defined our single proxy field like this:&lt;/p&gt;
&lt;pre style="margin-left: 40px; "&gt;&lt;code&gt;Choose ( Get ( CalculationRepetitionNumber ) ; &amp;quot;&amp;quot; ;
  Extend ( [ field_1 ] ) ;
  Extend ( [ field_2 ] ) ;
  Extend ( [ field_3 ] ) // and so on&amp;hellip;
)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;
	This technique would let us keep data tables clean, even as a solution grew. Our read-only field controls could be scrolled, selected, copied, preserve all formatting, and be edit-proof. This could work.&lt;/p&gt;
&lt;p&gt;
	There was just one annoying fly buzzing in our ointment: If users tried to modify the field, a pesky FileMaker warning would pop up every time. The warning message was technically correct; but users would find it unecessarily jarring and confusing.&lt;/p&gt;
&lt;p style="margin-left: 40px; "&gt;
	&lt;img alt="hand slap" height="153" src="http://buzz.beezwax.net//files/Hand Slap.png" width="410" /&gt;&lt;/p&gt;
&lt;h5 style="margin-left: 40px; "&gt;
	The dreaded warning dialog. &amp;ldquo;Stop slapping my hands!&amp;rdquo;&lt;/h5&gt;
&lt;h3 id="skip-to-end"&gt;
	Hey! You Got Chocolate in my Peanut Butter!&lt;/h3&gt;
&lt;p&gt;
	Our &lt;strong&gt;Reese&amp;rsquo;s Peanut Butter Cup&lt;/strong&gt; moment came when our two best ideas bumped into each other. We combined the &lt;strong&gt;trigger script technique&lt;/strong&gt; with the &lt;strong&gt;single proxy field technique&lt;/strong&gt;, getting the best of both: No more pesky dialogs if a user typed into a field (the script trigger intercepted attempted changes), and no more sneaky mouse or menu edits (the calculated field prevented these).&lt;/p&gt;
&lt;p&gt;
	This solution is elegant, lean (just 1 trigger script per database, and 1 additional field per table), and robust (it won&amp;rsquo;t break if field names change). And from a user&amp;rsquo;s perspective, it &amp;ldquo;just works&amp;rdquo;.&lt;/p&gt;
&lt;p style="margin-left: 40px; "&gt;
	&lt;img alt="The Winner, 1" height="104" src="http://buzz.beezwax.net//files/winner1.png" width="500" /&gt;&lt;/p&gt;
&lt;h5 style="margin-left: 40px; "&gt;
	Integrated Proxy Field with Triggers: Bullet-proof, pixel perfect.&lt;/h5&gt;
&lt;h3&gt;
	Web Viewer Redux&lt;/h3&gt;
&lt;p&gt;
	As this article was being written, I had an unexpected &amp;ldquo;aha&amp;rdquo; moment: Realizing that our discarded Web Viewer had more tricks up its sleeve, I tried wrapping a field in a GetAsCSS() function, defining the Web Viewer&amp;rsquo;s source like this:&lt;/p&gt;
&lt;pre style="margin-left: 40px; "&gt;&lt;code&gt; &amp;ldquo;data:text/html,&amp;rdquo; &amp;amp; GetAsCSS ( [ fieldname ] )&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;
	And just this simply, the Web Viewer technique was transformed from a discard into an ideal solution &amp;mdash; arguably the simplest and most elegant we&amp;rsquo;d found. With no additional scripts, no additional fields, and no script triggers, this technique preserves all formatting, allows full scrolling, selection, copying, and is bulletproof against edits.&lt;/p&gt;
&lt;p style="margin-left: 40px; "&gt;
	&lt;img alt="The Winner, 2" height="105" src="http://buzz.beezwax.net//files/winner2.png" width="500" /&gt;&lt;/p&gt;
&lt;h5 style="margin-left: 40px; "&gt;
	Improved Web Viewers: Lean, Elegant, OS-native.&lt;/h5&gt;
&lt;h3&gt;
	So Who&amp;rsquo;s the Real Winner?&lt;/h3&gt;
&lt;p&gt;
	We&amp;rsquo;re calling this a tie. Here are the advantages we see for each technique:&lt;/p&gt;
&lt;p&gt;
	&lt;strong&gt;Single Presentation Field with Triggers&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
	&lt;li&gt;
		Can display non-white backgrounds (Web Viewers always display a white background unless css/html styling is applied separately).&lt;/li&gt;
	&lt;li&gt;
		Complex text will exactly match original field (in Web Viewer, CSS-rendered text may vary slightly from that in native FileMaker controls).&lt;/li&gt;
	&lt;li&gt;
		Control exactly matches other native FileMaker controls (scroll bars match native FileMaker edit box look and feel).&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
	&lt;strong&gt;Web Viewer&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
	&lt;li&gt;
		Simplest. Most lightweight. Least overhead.&lt;/li&gt;
	&lt;li&gt;
		Provides complete separation between data and presentation layers (no additional data or scripting are created).&lt;/li&gt;
	&lt;li&gt;
		Provides an OS-native look. For example, a FileMaker Web Viewer on OS X Lion displays the new hiding scrollbar look and feel.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
	Both these techniques earn a well-deserved place in our toolbox. Which we choose will likely depend on specific project needs and the preferences of a given developer. Which technique do you like best? Please feel free to comment on which you&amp;#39;d prefer, or if you have a different approach to this problem.&lt;/p&gt;
&lt;p&gt;
	Enjoy!&lt;/p&gt;
&lt;p&gt;
	- Brian&lt;br /&gt;
	&amp;nbsp;&lt;/p&gt;
&lt;p&gt;
	Update: To my chagrin, I realied the demo file was never included with this post. Here it is, long overdue:&amp;nbsp;&lt;/p&gt;
&lt;p&gt;
	&lt;a href="http://buzz.beezwax.net/files/Improved_Read-Only_Fields.fp7.zip"&gt;http://buzz.beezwax.net/files/Improved_Read-Only_Fields.fp7.zip&lt;br /&gt;
	&lt;/a&gt;&lt;/p&gt;

</content>
  </entry>
  <entry>
    <id>urn:uuid:d34d9079-4681-4013-89df-61715c6f4856</id>
    <published>2011-08-15T16:06:48Z</published>
    <updated>2012-01-11T21:58:50Z</updated>
    <link type="text/html" href="http://buzz.beezwax.net/2011/08/17/devcon-2011-recap-design-goes-farther" rel="alternate" />
    <author>
      <name>Brian</name>
      <email>brian_s@beezwax.net</email>
    </author>
    <title type="html">DevCon 2011 Recap - Design Goes Farther</title>
    <category scheme="http://buzz.beezwax.net/category/filemaker" label="filemaker" term="filemaker" />
    <category scheme="http://buzz.beezwax.net/category/filemaker-news" label="filemaker news" term="filemaker-news" />
    <category scheme="http://buzz.beezwax.net/category/filemaker-resources" label="filemaker resources" term="filemaker-resources" />
    <category scheme="http://buzz.beezwax.net/tag/filemaker" term="filemaker" />
    <category scheme="http://buzz.beezwax.net/tag/design" term="design" />
    <category scheme="http://buzz.beezwax.net/tag/ui" term="UI" />
    <category scheme="http://buzz.beezwax.net/tag/devcon" term="devcon" />
    <content type="html">&lt;p&gt;
	One of the most valuable aspects of 2011&amp;rsquo;s &lt;a href="http://www.filemaker.com/developers/devcon/"&gt;FileMaker Developers Conference&lt;/a&gt; in San Diego was a far-reaching discussion about the role of design in the FileMaker world. Design wasn&amp;rsquo;t the official theme of this year&amp;rsquo;s conference; but it was certainly among the most popular topics. A large number of sessions focused exclusively on design issues:&lt;/p&gt;
&lt;ul&gt;
	&lt;li&gt;
		&lt;strong&gt;Ernest Koe&lt;/strong&gt; of The Proof Group offered two sessions on &lt;strong&gt;Interface Design Patterns in FileMaker&lt;/strong&gt; (Go and Pro), providing numerous examples of innovative, inspiring real-world FileMaker interface design.&lt;/li&gt;
	&lt;li&gt;
		&lt;strong&gt;Don Levan&lt;/strong&gt; of Vanguard Solutions presented a detailed session evaluating form design, and a groundbreaking session, &lt;strong&gt;&amp;ldquo;The Fundamentals of Exceptional Interface Design&amp;rdquo;&lt;/strong&gt;, an overview of formal design-centered development methodology.&lt;/li&gt;
	&lt;li&gt;
		&lt;strong&gt;Heather Winkle&lt;/strong&gt; and &lt;strong&gt;Ryan Shelby&lt;/strong&gt; of FileMaker Inc. led a hands-on &lt;strong&gt;&amp;ldquo;Guerrilla User Research Session&amp;rdquo;&lt;/strong&gt; demonstrating real-world techniques for testing user responses to design.&lt;/li&gt;
	&lt;li&gt;
		Heather and Ryan also moderated the &lt;strong&gt;&amp;ldquo;Panel of Design Enthusiasts&amp;rdquo;&lt;/strong&gt;, offering a lively round table discussion of design issues from the standpoint of 7 accomplished FileMaker developers.&lt;/li&gt;
	&lt;li&gt;
		11 additional sessions in the Design track explored an ambitious array of design issues across the FileMaker platform.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt; These sessions presented valuable techniques from a broad range of perspectives. Even better, by the end of DevCon the discussion coalesced into a new, inclusive view of design that opens this essential aspect of our craft to all of us, developers and users alike. Echoing the official DevCon tagline: How can we "Go Farther" with design?&lt;/p&gt;

&lt;p&gt;
&lt;figure&gt;
	&lt;a href="http://www.flickr.com//photos/filemakerpr/sets/72157627218624955/show/with/6004734786/"&gt;&lt;img alt="Filemaker DevCon 2011 Keynote" height="234" src="http://buzz.beezwax.net//files/keynote.jpg" style="cursor: default; " width="500" /&gt;&lt;/a&gt;

&lt;figcaption&gt;
&lt;em&gt;FileMaker DevCon 2011 Keynote - via &lt;a href="http://twitter.com/filemakerpr"&gt;@FilemakerPR&lt;/a&gt; on &lt;a href="http://www.flickr.com//photos/filemakerpr/sets/72157627218624955/show/with/6004734786/"&gt;Flickr&lt;/a&gt;&lt;/em&gt;
&lt;/figcaption&gt;
&lt;/figure&gt;


&lt;/p&gt;

&lt;h3 id="variedapproachbroadagreement"&gt;
	Varied Approach, Broad Agreement&lt;/h3&gt;
&lt;p&gt;
 At DevCon, there were clear differences in how the session speakers articulated their approach to design. Some developers focused more on &amp;ldquo;philosophical&amp;rdquo; meta questions of design&amp;rsquo;s goals, purpose, and even meaning; others took a more pragmatic, business- and results-oriented path, explaining how good design is simply good business, benefitting their costs, profitability, and ensuring long-term client satisfaction.&lt;/p&gt;
&lt;p&gt;
	But it was interesting to see these surface differences give way to a deeper sense of agreement. The more I listened, the clearer it became that these speakers share a deep belief that good design is central to their development practice and their business.&lt;/p&gt;


&lt;h3 id="designascentral"&gt;
	Design as Central&lt;/h3&gt;
&lt;p&gt;
	Amidst this consensus was a shared sense that design lies at the very heart of our work as developers. For example, &lt;strong&gt;Don Levan&amp;rsquo;s&lt;/strong&gt; session &amp;ldquo;The Fundamentals of Exceptional Interface Design&amp;rdquo; described a formal development process in which design is present from the very outset of the process &amp;mdash; from initial client conversations and early and ongoing sketches of design possibilities shared with clients &amp;mdash; all the way to the final delivered product. This approach was reiterated by a broad range of developers.&lt;/p&gt;
&lt;p&gt;
	Design was also seen as essential to how solutions are conceived, refined, and communicated.&lt;/p&gt;
&lt;blockquote&gt;
	&lt;p&gt;
		&amp;ldquo;Design is so closely wrapped up in every solution I build that it is not a separate conversation.&amp;rdquo; &amp;mdash; &lt;strong&gt;Bob Shockey&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;
	Design was again at the heart of how we create satisfying solutions our users will love to use. Even profitability was directly tied to design.&lt;/p&gt;
&lt;blockquote&gt;
	&lt;p&gt;
		&amp;ldquo;Design is a differentiator. It shows well. It leads to user success. It attracts more business. Every company in Silicon Valley has seen a strongly positive ROI on hiring designers and improving their design.&amp;rdquo; &amp;mdash; &lt;strong&gt;Heather Winkle&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;

&lt;figure&gt;
	&lt;img alt="Sunrise on San Diego Harbor" height="218" src="http://buzz.beezwax.net//files/SanDiego1.jpg" style="cursor: default; " width="500" /&gt;

&lt;figcaption&gt;&lt;em&gt;&lt;a href="http://www.pdphoto.org/PictureDetail.php?mat=&amp;pg=5859"&gt;Sunrise on San Diego Harbor&lt;/a&gt; - via &lt;a href="http://twitter.com/pdphotocom"&gt;@PDPhotocom&lt;/a&gt; &lt;/em&gt;&lt;/figcaption&gt;
&lt;/figure&gt;

&lt;/p&gt;


&lt;h3&gt;
	A Polarizing Issue?&lt;/h3&gt;
&lt;p&gt;
	The audacity of these developers&amp;rsquo; claims was initially surprising. Design, after all, can be a contentious subject, and has often been cast as expensive eye candy or simply unnecessary &amp;ldquo;fluff&amp;rdquo;. This raised some interesting questions:&lt;/p&gt;
&lt;ul&gt;
	&lt;li&gt;
		Are these speakers elevating design-oriented developers above &amp;ldquo;serious&amp;rdquo; developers (i.e., coders)?&lt;/li&gt;
	&lt;li&gt;
		Are they suggesting that every solution needs an &amp;ldquo;additional&amp;rdquo; overlay of design to make it &amp;ldquo;prettier&amp;rdquo;?&lt;/li&gt;
	&lt;li&gt;
		Are they placing surface beauty ahead of &amp;ldquo;real&amp;rdquo; programmatic issues, like performance, speed, or data integrity?&lt;/li&gt;
	&lt;li&gt;
		Are we expected to spend all our time worrying about pixels, colors, and fonts?&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="allwearesaying"&gt;
	All We Are Saying&amp;hellip;&lt;/h3&gt;
&lt;p&gt;
	The more I reflected on these sessions, the more confident I became that the old battle lines don&amp;rsquo;t apply to this new conception of design. In some ways, this is because the industry itself has changed, and many of the old &amp;ldquo;rules&amp;rdquo; have changed with the ascendency of web and mobile technologies.&lt;/p&gt;
&lt;blockquote&gt;
	&lt;p&gt;
		&amp;ldquo;A minimum level of design used to be enough &amp;hellip; The overwhelming success of iOS, the growing acceptance of web standards, and the sophistication of the user base has significantly raised what is considered acceptable. Indeed, applications and websites that look amateurish or are broken are viewed with contempt and distrust.&amp;rdquo; &amp;mdash;&amp;nbsp;&lt;strong&gt;Don Levan&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;
	On a deeper level, the old battle lines between &amp;ldquo;design&amp;rdquo; and &amp;ldquo;code&amp;rdquo; may no longer apply because these speakers are in fact suggesting something more profound than at first meets the eye. Yes, design is now brought into the heart of our process. But at the same time, design itself is fundamentally changed in the process.&amp;nbsp;&lt;em&gt;The &amp;ldquo;design&amp;rdquo; at the heart of this new process is not the same design we thought we knew.&lt;/em&gt;&lt;/p&gt;

&lt;!--
&lt;p&gt;
&lt;img alt="FileMaker DevCon 2011 Go Farther" height="163" src="http://buzz.beezwax.net//files/goFarther1.png" style="cursor: default; " width="500" /&gt;
&lt;/p&gt;
--&gt;

&lt;h3 id="allwearesaying"&gt;
	Redefining Design&lt;/h3&gt;
&lt;p&gt;
	Listening to these speakers, I heard several good examples of what this new conception of design is not. Design is no longer:&lt;/p&gt;
&lt;ul&gt;
	&lt;li&gt;
		A solitary activity based primarily on a &amp;ldquo;designer&amp;rsquo;s&amp;rdquo; individual inspirations, likes, and tastes&lt;/li&gt;
	&lt;li&gt;
		A product to be &amp;ldquo;presented&amp;rdquo; to users as finished and complete at the end of a development cycle&lt;/li&gt;
	&lt;li&gt;
		An optional &amp;ldquo;nicety&amp;rdquo; that can be &amp;ldquo;added onto&amp;rdquo; a project a la carte&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
	Instead, the new definition of design points towards something much more conversational, informal, a shared process of exploration between developers and users. A new kind of process was described that is:&lt;/p&gt;
&lt;ul&gt;
	&lt;li&gt;
		Flexible and adaptable&lt;/li&gt;
	&lt;li&gt;
		Inexpensive and &amp;ldquo;lo fi&amp;rdquo;, with drawings providing &amp;ldquo;only as much detail as we have certainty&amp;rdquo;&lt;/li&gt;
	&lt;li&gt;
		Based directly on established design patterns&lt;/li&gt;
	&lt;li&gt;
		Aimed directly at well-defined user personas, scenarios, and requirements&lt;/li&gt;
	&lt;li&gt;
		Encouraging refinement, changes of direction, until we arrive at exactly what meets our users&amp;rsquo; needs&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
	&lt;p&gt;
		&amp;ldquo;Design is the business of creating an optimal user experience within a set of constraints.&amp;rdquo; &amp;mdash; &lt;strong&gt;Ernest Koe&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;FileMaker as a Craft&lt;/h3&gt;
&lt;p&gt;
	It was particularly intriguing to hear FileMaker design described as a craft. This wasn&amp;rsquo;t a mere figure of speech: As described by &lt;strong&gt;Don Levan&lt;/strong&gt; and &lt;strong&gt;Ernest Koe&lt;/strong&gt;, FileMaker design is a genuine craft. FileMaker development can &amp;mdash; and should &amp;mdash; be conducted through a formal methodology, using defined tools and a known, repeatable process. This vision of formalized craft offers several benefits:&lt;/p&gt;
&lt;ul&gt;
	&lt;li&gt;
		A repeatable way for a developer to design satisfying, effective solutions&lt;/li&gt;
	&lt;li&gt;
		A known process that removes the mystery from the design process&lt;/li&gt;
	&lt;li&gt;
		A means of recasting design from a product into a process and conversation with users&lt;/li&gt;
	&lt;li&gt;
		&lt;p&gt;
			A core discipline offering developers and users a common language and a framework for achieving success&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
		&lt;blockquote&gt;
			&lt;p&gt;
				&amp;ldquo;If a potential client doesn&amp;rsquo;t want time spent on the design of the project, it&amp;rsquo;s not just that we don&amp;rsquo;t do the project, it&amp;rsquo;s that we wouldn&amp;rsquo;t know how to do the project.&amp;rdquo; &amp;mdash; &lt;strong&gt;Doug Gardner&lt;/strong&gt;&lt;/p&gt;
		&lt;/blockquote&gt;
	
&lt;h3 id="wearedesigners"&gt;
	We Are Designers&lt;/h3&gt;
&lt;p&gt;
	One final aspect I particularly liked about this vision is how it seeks to democratize design. In DevCon sessions, there were constant, explicit reminders that design is all around us &amp;mdash; in our architecture, our food, in print, in the natural world. And, of course, design is present in the computing tools we use and build daily.&lt;/p&gt;
&lt;blockquote&gt;
	&lt;p&gt;
		&amp;ldquo;Design is everywhere. Good, excellent, bad, horrifyingly bad. I can learn from any of these.&amp;rdquo; &amp;mdash; &lt;strong&gt;Bob Shockey&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;
	The most revolutionary claim of these speakers may be that, as developers, we cannot avoid this simple fact: Whether we acknowledge it or not, we &lt;em&gt;are&lt;/em&gt; designers. Every solution we create is already a design. The question is:&lt;/p&gt;
&lt;p&gt;
	Will our designs create beauty and solve our users&amp;rsquo; problems beautifully and elegantly? Or will we develop solutions based on our own long-established preferences and habits, expecting our users to just &amp;ldquo;get it&amp;rdquo;?&lt;/p&gt;
&lt;p&gt;
	This vision removes the capital &amp;ldquo;D&amp;rdquo; from &amp;ldquo;Design&amp;rdquo;. Design ceases to be a product, and becomes a process shared by developers and users alike. And the result of this transformation, as several DevCon speakers frequently reminded us, is &lt;em&gt;empathy for our users&lt;/em&gt;: The pursuit of design excellence becomes a pursuit of creating solutions that fit our users&amp;rsquo; real-world needs as closely and simply as possible.&lt;/p&gt;
&lt;blockquote&gt;
	&lt;p&gt;
		&amp;ldquo;Design is an intentional process in which you elicit, derive, decide, clarify, and plan the solution to a given problem. Sketches, prototypes, technical plans, and finished solutions are the artifacts that result from a design process.&amp;rdquo; &amp;mdash; &lt;strong&gt;Don Levan&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;
	
&lt;figure&gt;
	&lt;img alt="San Diego Harbor" height="258" src="http://buzz.beezwax.net//files/sandiego2.jpg" style="cursor: default;" width="500" /&gt;&lt;br/&gt;
&lt;figcaption&gt;
&lt;em&gt;&lt;a href="http://www.pdphoto.org/PictureDetail.php?mat=pdef&amp;pg=6294"&gt;San Diego Harbor&lt;/a&gt; - via &lt;a href="http://twitter.com/pdphotocom"&gt;@PDPhotocom&lt;/a&gt;&lt;/em&gt;
&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;

&lt;h3&gt;
	The Road Ahead&lt;/h3&gt;
&lt;p&gt;
	The conversation about design begun at this year&amp;rsquo;s DevCon was exciting and full of inspiring possibilities. I left with several questions to ponder:&lt;/p&gt;
&lt;ul&gt;
	&lt;li&gt;
		How will this vision help us develop solutions that are more transparent, intuitive, and effective to our users?&lt;/li&gt;
	&lt;li&gt;
		How can we merge FileMaker&amp;rsquo;s strengths and the insights of the wider design and web communities?&lt;/li&gt;
	&lt;li&gt;
		How will the application of these principles affect the evolution of the FileMaker product line itself?&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
	In the weeks and months ahead, I anticipate that my fellow developers at Beezwax and the broader FileMaker community will continue to explore many of these ideas about design and ask how we can integrate them into our development process to "Go Farther" with FileMaker. What do you think?&lt;/p&gt;

&lt;p&gt;&lt;em&gt;- Brian&lt;/em&gt;&lt;/p&gt;
&lt;h5&gt;
	&lt;em&gt;Special thanks to Don Levan for kindly providing detailed speaker notes from the Panel of Design Enthusiasts session.&lt;/em&gt;&lt;/h5&gt;


</content>
  </entry>
  <entry>
    <id>urn:uuid:7bf83516-a09b-44c0-9af8-8bbbd3c264b4</id>
    <published>2011-07-18T03:16:43Z</published>
    <updated>2012-01-11T21:58:49Z</updated>
    <link type="text/html" href="http://buzz.beezwax.net/2011/08/13/inspired-by-address-book-part-i-hiding-portal-scroll-bars" rel="alternate" />
    <author>
      <name>DavidS</name>
      <email>david_s@beezwax.net</email>
    </author>
    <title type="html">Inspired by Address Book - Part I: Hiding portal scroll bars</title>
    <category scheme="http://buzz.beezwax.net/category/filemaker" label="filemaker" term="filemaker" />
    <category scheme="http://buzz.beezwax.net/category/filemaker-tips" label="filemaker tips" term="filemaker-tips" />
    <category scheme="http://buzz.beezwax.net/category/custom-functions" label="custom functions" term="custom-functions" />
    <category scheme="http://buzz.beezwax.net/tag/intermediate" term="intermediate" />
    <category scheme="http://buzz.beezwax.net/tag/advanced" term="advanced" />
    <category scheme="http://buzz.beezwax.net/tag/filemaker" term="filemaker" />
    <category scheme="http://buzz.beezwax.net/tag/custom" term="Custom" />
    <category scheme="http://buzz.beezwax.net/tag/functions" term="functions" />
    <category scheme="http://buzz.beezwax.net/tag/mac" term="mac" />
    <category scheme="http://buzz.beezwax.net/tag/os" term="OS" />
    <category scheme="http://buzz.beezwax.net/tag/x" term="X" />
    <content type="html">&lt;p&gt;
	&lt;span class="Apple-style-span" style="color: rgb(125, 125, 125); font-family: Arial; line-height: 18px; "&gt;On vacation, waking up to a dreary Pennsylvania morning...&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;
	&lt;span class="Apple-style-span" style="color: rgb(125, 125, 125); font-family: Arial; line-height: 18px; "&gt;I found myself staring at the OS X Address Book and wondering, &amp;quot;how did they do this?&amp;quot; I couldn&amp;#39;t help compare this little application to the many&amp;nbsp;FileMaker-based contact management solutions I have seen, and concluding, a bit sadly, Apple&amp;#39;s is nicer.&lt;/span&gt;&lt;/p&gt;
&lt;div&gt;
	&lt;span class="Apple-style-span" style="color: rgb(125, 125, 125); font-family: Arial; line-height: 18px; "&gt;Now, comparisons between OS X-native code and FileMaker Pro are not always fair to begin with. However, I felt the Address Book presented some useful ideas and perhaps a starting point for a different kind of FM-based contact management solution&amp;mdash;one that looks and behaves more like Address Book!&amp;nbsp;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
	&lt;font class="Apple-style-span" color="#7D7D7D" face="Arial"&gt;&lt;span class="Apple-style-span" style="line-height: 18px;"&gt;&lt;br /&gt;
	&lt;/span&gt;&lt;/font&gt;&lt;/div&gt;
&lt;div&gt;
	&lt;span class="Apple-style-span" style="color: rgb(125, 125, 125); font-family: Arial; line-height: 18px; "&gt;So the journey began...&lt;/span&gt;&lt;/div&gt;
&lt;h3&gt;
	&lt;span class="Apple-style-span" style="color: rgb(125, 125, 125); font-family: Arial; line-height: 18px; "&gt;Got white space? Hiding the portal scroll bar...&lt;/span&gt;&lt;/h3&gt;
&lt;div&gt;
	&lt;span class="Apple-style-span" style="color: rgb(125, 125, 125); font-family: Arial; line-height: 18px; "&gt;Once I got started, I realized I would need to work on making FileMaker Pro feel different. Because I really like all the white space of Address Book, one of the first items I tackled was &lt;em&gt;how&lt;/em&gt; to make the portal scroll bar disappear if there were no additional records to display. &lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
	&amp;nbsp;&lt;/div&gt;
&lt;div&gt;
	&lt;img alt="Image: Portal scroll bar - showing (left) and hidden (right)" height="480" src="http://buzz.beezwax.net//files/PortalHidingBuzzJ1.jpg" width="581" /&gt;&lt;/div&gt;
&lt;div&gt;
	Image:&amp;nbsp;&lt;span class="Apple-style-span" style="font-weight: bold; "&gt;Portal scroll bar - showing (left) and hidden (right)&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
	&amp;nbsp;&lt;/div&gt;
&lt;div&gt;
	&lt;span class="Apple-style-span" style="color: rgb(125, 125, 125); font-family: Arial; line-height: 18px; "&gt;Assuming the portal position is set to enlarge vertically and show additional portal rows, here&amp;#39;s a custom function I came up with:&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
	&lt;pre&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt;cf_HidePortalScroll ( dph; dprc; dwch; id_portalRecord )&lt;/span&gt;

&lt;span class="Apple-style-span" style="font-size: medium;"&gt;/* &lt;/span&gt;

&lt;span class="Apple-style-span" style="font-size: medium;"&gt;cf_HidePortalScroll ( dph; dprc; dwch; id_portalRecord )&lt;/span&gt;

&lt;span class="Apple-style-span" style="font-size: medium;"&gt;Use in Conditional Formatting on transparent object
 placed over portal scroll bar, so if Result is &amp;quot;1&amp;quot; make
 the object Fill = White (hides portal scroll bar)&lt;/span&gt;

&lt;span class="Apple-style-span" style="font-size: medium;"&gt;Assumes portal is set to enlarge vertically while
 maintaining original row height - i.e. display
 additional portal rows when it grows vertically. &lt;/span&gt;

&lt;span class="Apple-style-span" style="font-size: medium;"&gt; Dependencies: &lt;/span&gt;

&lt;span class="Apple-style-span" style="font-size: medium;"&gt;   Portal Layout Object Size&lt;/span&gt;

&lt;span class="Apple-style-span" style="font-size: medium;"&gt;   Default # of Portal Rows Displayed&lt;/span&gt;

&lt;span class="Apple-style-span" style="font-size: medium;"&gt;   Default WindowContentHeight&lt;/span&gt;

&lt;span class="Apple-style-span" style="font-size: medium;"&gt; Road Map:&lt;/span&gt;

&lt;span class="Apple-style-span" style="font-size: medium;"&gt;   dph = default portal height as layout object&lt;/span&gt;

&lt;span class="Apple-style-span" style="font-size: medium;"&gt;   dprc = default portal row count&lt;/span&gt;

&lt;span class="Apple-style-span" style="font-size: medium;"&gt;   dwch = default window content height&lt;/span&gt;

&lt;span class="Apple-style-span" style="font-size: medium;"&gt;   id_portalRecord = ID_Field in Related Portal Table&lt;/span&gt;

&lt;span class="Apple-style-span" style="font-size: medium;"&gt;*/&lt;/span&gt;

&lt;span class="Apple-style-span" style="font-size: medium;"&gt;Let ( [&lt;/span&gt;

&lt;span class="Apple-style-span" style="font-size: medium;"&gt; hpr = dph/dprc ;
 // height per portal row&lt;/span&gt;

&lt;span class="Apple-style-span" style="font-size: medium;"&gt; tdr = Count ( id_portalRecord ) ;
 // total portal rows with data&lt;/span&gt;

&lt;span class="Apple-style-span" style="font-size: medium;"&gt; cwch = Get ( WindowContentHeight ) ;
 // current window content height&lt;/span&gt;

&lt;span class="Apple-style-span" style="font-size: medium;"&gt; diff = cwch - dwch ;
 // has window content height changed from default?&lt;/span&gt;

&lt;span class="Apple-style-span" style="font-size: medium;"&gt; tvr = If ( diff &amp;ge; hpr ; ( diff / hpr ) + dprc ; 0 ) ;
 // total visible rows, has content grown &amp;gt; one row&amp;#39;s height?&lt;/span&gt;

&lt;span class="Apple-style-span" style="font-size: medium;"&gt; hr = tdr - tvr
 // if hidden rows exist, don&amp;#39;t hide portal &lt;/span&gt;

&lt;span class="Apple-style-span" style="font-size: medium;"&gt;] ; If ( hr &amp;gt; 0 and tdr &amp;gt; dprc ; &amp;quot;&amp;quot; ; 1 )&lt;/span&gt;

&lt;span class="Apple-style-span" style="font-size: medium;"&gt;) // end let
 
&lt;/span&gt;&lt;/pre&gt;
	&lt;div&gt;
		&lt;span class="Apple-style-span" style="color: rgb(125, 125, 125); font-family: Arial; line-height: 18px; "&gt;Afterwards, I found that others had tackled this particular problem before me, but I still like my custom function best&amp;mdash;easy to grok, very quick to implement, and doesn&amp;#39;t rely on object names. It doesn&amp;#39;t work with filtered portals, and it does rely on the physical size of portal object, and number of rows displayed in layout. It also depends on the default WindowContentHeight, so please adjust the sizing to fit your needs.&lt;/span&gt;&lt;/div&gt;
	&lt;div&gt;
		&amp;nbsp;&lt;/div&gt;
	&lt;div&gt;
		&lt;span class="Apple-style-span" style="color: rgb(125, 125, 125); font-family: Arial; line-height: 18px; "&gt;Next post: Getting records from FileMaker Pro into and out of OS X Address Book&amp;nbsp;&lt;em&gt;without&lt;/em&gt;&amp;nbsp;plug-ins, or 3rd party-ware.&amp;nbsp;&lt;/span&gt;&lt;/div&gt;
	&lt;div&gt;
		&lt;span class="Apple-style-span" style="color: rgb(125, 125, 125); font-family: Arial; line-height: 18px; "&gt;&lt;span class="Apple-style-span" style="color: rgb(0, 0, 0); font-family: monospace; font-size: medium; white-space: pre; "&gt;&lt;span class="Apple-style-span" style="font-family: Arial; white-space: normal; color: rgb(125, 125, 125); font-size: 12px; "&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
	&lt;div&gt;
		&lt;span class="Apple-style-span" style="color: rgb(125, 125, 125); font-family: Arial; line-height: 18px; "&gt;&lt;span class="Apple-style-span" style="color: rgb(0, 0, 0); font-family: monospace; font-size: medium; white-space: pre; "&gt;&lt;span class="Apple-style-span" style="font-family: Arial; white-space: normal; color: rgb(125, 125, 125); font-size: 12px; "&gt;Cheers!&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
	&lt;div&gt;
		&lt;span class="Apple-style-span" style="color: rgb(125, 125, 125); font-family: Arial; line-height: 18px; "&gt;&lt;span class="Apple-style-span" style="color: rgb(0, 0, 0); font-family: monospace; font-size: medium; white-space: pre; "&gt;&lt;span class="Apple-style-span" style="font-family: Arial; white-space: normal; color: rgb(125, 125, 125); font-size: 12px; "&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
	&lt;div&gt;
		&lt;span class="Apple-style-span" style="color: rgb(125, 125, 125); font-family: Arial; line-height: 18px; "&gt;&lt;span class="Apple-style-span" style="color: rgb(0, 0, 0); font-family: monospace; font-size: medium; white-space: pre; "&gt;&lt;span class="Apple-style-span" style="font-family: Arial; white-space: normal; color: rgb(125, 125, 125); font-size: 12px; "&gt;-David&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;


</content>
  </entry>
  <entry>
    <id>urn:uuid:d5a43bfb-4762-4c48-9c5b-6e7601a8648e</id>
    <published>2011-07-27T19:34:11Z</published>
    <updated>2012-01-11T21:58:49Z</updated>
    <link type="text/html" href="http://buzz.beezwax.net/2011/07/30/the-filemaker-ninjas-toolbelt-textmate-bundle" rel="alternate" />
    <author>
      <name>donovan</name>
      <email>donovan_c@beezwax.net</email>
    </author>
    <title type="html">The FileMaker Ninja's Toolbelt: TextMate Bundle</title>
    <category scheme="http://buzz.beezwax.net/category/filemaker" label="filemaker" term="filemaker" />
    <category scheme="http://buzz.beezwax.net/category/filemaker-utilities" label="filemaker utilities" term="filemaker-utilities" />
    <category scheme="http://buzz.beezwax.net/category/filemaker-tips" label="filemaker tips" term="filemaker-tips" />
    <category scheme="http://buzz.beezwax.net/category/custom-functions" label="custom functions" term="custom-functions" />
    <category scheme="http://buzz.beezwax.net/tag/custom" term="Custom" />
    <category scheme="http://buzz.beezwax.net/tag/development" term="development" />
    <category scheme="http://buzz.beezwax.net/tag/filemaker" term="filemaker" />
    <category scheme="http://buzz.beezwax.net/tag/functions" term="functions" />
    <category scheme="http://buzz.beezwax.net/tag/ninja" term="ninja" />
    <category scheme="http://buzz.beezwax.net/tag/toolbelt" term="toolbelt" />
    <category scheme="http://buzz.beezwax.net/tag/utilities" term="utilities" />
    <content type="html">&lt;p&gt;
	Welcome to the first installment of &lt;em&gt;The FileMaker Ninja&amp;#39;s Toolbelt&lt;/em&gt;, an occasional series on various tools and techniques for taking your development in FileMaker to the next level.&lt;/p&gt;
&lt;p&gt;
	&lt;span class="Apple-style-span" style="font-size: 18px; font-weight: bold; "&gt;Beyond the Calculation Dialog&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;
	The calculation dialog in FileMaker Pro is great for many things. It provides easy access to all of your fields, operators and functions. The Data Viewer in FileMaker Pro Advanced even shows you the calculation results.&lt;/p&gt;
&lt;p&gt;
	Here&amp;#39;s a screenshot of a custom function being defined in FileMaker Pro&amp;#39;s native dialog:&lt;/p&gt;
&lt;p&gt;
	&lt;img align="middle" alt="Custom function being defined in FileMaker calculation dialot" height="585" src="http://buzz.beezwax.net//files/screenshot_functionInFM.png" width="600" /&gt;&lt;/p&gt;
&lt;p&gt;
	But sometimes this can be cumbersome. The calculation dialog doesn&amp;#39;t help format your functions and can be difficult to scroll through. Those of you who work in text editors know what I&amp;#39;m talking about. Text editors commonly provide users with a host of powerful features: syntax highlighting, code folding, easy indendation, code snippets, find and replace (even with regular expressions), and so on.&amp;nbsp;That&amp;#39;s why I develop my custom functions in a text editor whenever I can.&lt;/p&gt;
&lt;h2&gt;
	A Text Editor that supports FileMaker Pro?&lt;/h2&gt;
&lt;p&gt;
	The problem is that there aren&amp;#39;t any text editors that support FileMaker calculations. Or are there? Those of you who already use &lt;a href="http://macromates.com/" target="_blank"&gt;TextMate&lt;/a&gt; might be a step ahead here. TextMate is a very popular text editor for Mac OS X. Best of all, you can easily teach it how to work with FileMaker calculations by installing a FileMaker &amp;quot;bundle&amp;quot; (similar to a plug-in).&lt;/p&gt;
&lt;p&gt;
	There has been at least one bundle available that supports FileMaker. Charles Ross posted one to &lt;a href="http://code.google.com/p/filemaker-textmate-bundle/" target="_blank"&gt;Google Code&lt;/a&gt; back in 2009. At some point Jonathan Stark added some snippets. Matt Petrowsky later posted a &lt;a href="https://github.com/petrowsky/filemaker.tmbundle" target="_blank"&gt;trimmed-down version&lt;/a&gt; of that to github. Those versions provided some helpful features:&lt;/p&gt;
&lt;ul&gt;
	&lt;li&gt;
		Syntax highlighting&lt;/li&gt;
	&lt;li&gt;
		Code snippets&lt;/li&gt;
	&lt;li&gt;
		Command for viewing function documentation&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
	Very useful! I forked a copy of Matt Petrowsky&amp;#39;s bundle back in March of 2010. I found it so useful that I have been gradually adding to it ever since. Here&amp;#39;s a list of the current features:&lt;/p&gt;
&lt;ul&gt;
	&lt;li&gt;
		Tab triggers for FileMaker functions&lt;/li&gt;
	&lt;li&gt;
		Documentation for functions, script steps and error codes&lt;/li&gt;
	&lt;li&gt;
		Commands&lt;br /&gt;
		&lt;ul&gt;
			&lt;li&gt;
				Manipulating/generating calculations&lt;/li&gt;
			&lt;li&gt;
				Manipulating/generating FileMaker clipboard XML&lt;/li&gt;
			&lt;li&gt;
				Extracting data from the DDR&lt;/li&gt;
			&lt;li&gt;
				Extracting data from import.log files&lt;/li&gt;
		&lt;/ul&gt;
	&lt;/li&gt;
	&lt;li&gt;
		Syntax highlighting&lt;br /&gt;
		&lt;ul&gt;
			&lt;li&gt;
				FileMaker&lt;/li&gt;
			&lt;li&gt;
				FileMaker Clipboard&lt;/li&gt;
			&lt;li&gt;
				FileMaker Log&lt;/li&gt;
			&lt;li&gt;
				FileMaker Hash (Generated using #( ) custom function from &lt;a href="http://sixfriedrice.com/wp/filemaker-dictionary-functions/" target="_blank"&gt;six.fried.rice&lt;/a&gt;)&lt;/li&gt;
		&lt;/ul&gt;
	&lt;/li&gt;
	&lt;li&gt;
		Code folding&lt;/li&gt;
	&lt;li&gt;
		Help section&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
	This is what it could look like when working with the same custom function, but in TextMate!&lt;/p&gt;
&lt;p&gt;
	&lt;img align="middle" alt="Custom function being defined in TextMate" height="655" src="http://buzz.beezwax.net//files/screenshot_fileSetPathInTextMate.png" width="600" /&gt;&lt;/p&gt;
&lt;p&gt;
	Much more readable, isn&amp;#39;t it? You can even change and customize the theme of this window to your exact color preferences. But that&amp;#39;s just the start.&lt;/p&gt;
&lt;p&gt;
	You can &lt;strong&gt;see it in action&lt;/strong&gt; by watching this video: &lt;a href="http://www.youtube.com/watch?v=3YbmE_46fKs" target="_blank"&gt;TextMate Bundle for FileMaker 01: Basics&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;
	&amp;nbsp;&lt;/p&gt;
&lt;h2&gt;
	Getting It For Yourself&lt;/h2&gt;
&lt;p&gt;
	Interested yet? Pretty powerful stuff! The bundle is available to anyone. All you need is a copy of &lt;a href="http://macromates.com/" target="_blank"&gt;TextMate&lt;/a&gt; and to download the files. TextMate even offers a free 30-day trial. You can download the current files and view installation instructions &lt;a href="http://donovanchan.github.com/filemaker.tmbundle/" target="_blank"&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;
	Alternatively, you can just download a recent copy of the bundle below. Just extract the filemaker.tmbundle package from the .zip file and double-click on it. TextMate will take care of the rest!&lt;/p&gt;
&lt;p&gt;
	&lt;a href="http://buzz.beezwax.net/files/TextMate_Bundle_for_FileMaker_2012.01.09.zip"&gt;TextMate_Bundle_for_FileMaker_2012.01.09.zip&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;
	Have you tried this bundle or something similar? Let me know on github or in the comments here. I&amp;#39;d love to make this an even richer community effort and resource!&lt;/p&gt;
&lt;p&gt;
	- &lt;a href="http://twitter.com/donovanchan"&gt;Donovan&lt;/a&gt;&lt;/p&gt;


</content>
  </entry>
  <entry>
    <id>urn:uuid:af15c21d-07ed-4824-be48-504dfcd875df</id>
    <published>2011-07-28T00:06:38Z</published>
    <updated>2012-01-11T21:58:50Z</updated>
    <link type="text/html" href="http://buzz.beezwax.net/2011/07/28/top-11-tips-for-devcon-11" rel="alternate" />
    <author>
      <name>donovan</name>
      <email>donovan_c@beezwax.net</email>
    </author>
    <title type="html">11 Tips for #FileMakerDevCon '11</title>
    <category scheme="http://buzz.beezwax.net/category/filemaker" label="filemaker" term="filemaker" />
    <category scheme="http://buzz.beezwax.net/category/filemaker-news" label="filemaker news" term="filemaker-news" />
    <category scheme="http://buzz.beezwax.net/category/filemaker-resources" label="filemaker resources" term="filemaker-resources" />
    <category scheme="http://buzz.beezwax.net/category/filemaker-tips" label="filemaker tips" term="filemaker-tips" />
    <category scheme="http://buzz.beezwax.net/tag/filemaker" term="filemaker" />
    <category scheme="http://buzz.beezwax.net/tag/devcon" term="devcon" />
    <content type="html">&lt;p&gt;
	As you may know FileMaker DevCon 2011 is just around the corner. In honor of 2011...and FileMaker Pro 11, here&amp;#39;s our list of&amp;nbsp;&lt;em&gt;Top 11 Tips for DevCon &amp;#39;11&lt;/em&gt;:&lt;/p&gt;
&lt;h4&gt;
	1. Bring a sweater&lt;/h4&gt;
&lt;p&gt;
	Those hotels are known for cranking up the A/C. Take a comfortable layer that you can slip on and off easily to ward off the shivers as you&amp;#39;re sitting all morning.&lt;/p&gt;
&lt;h4&gt;
	2. Don&amp;#39;t expect to find any outlets in the conference rooms&lt;/h4&gt;
&lt;p&gt;
	If you&amp;#39;re lucky enough to have a second battery, bring it! Maybe you&amp;#39;re thinking of bringing an extension cord. I&amp;#39;m not going to discourage you, but don&amp;#39;t tell the fire marshall it was my idea.&lt;/p&gt;
&lt;h4&gt;
	3. Get a schedule&lt;/h4&gt;
&lt;p&gt;
	You can get a copy of the schedule in several forms. There&amp;#39;s the conference binder, of course. But, c&amp;#39;mon ... this is a technology conference! Try downloading the schedule in iCal format from &lt;a href="http://www.seedcode.com/next/" target="_blank"&gt;SeedCode&lt;/a&gt;&amp;nbsp;or download FileMaker&amp;#39;s official &lt;a href="http://www.filemaker.com/developers/devcon/2011/getdevcon2go.html" target="_blank"&gt;DevCon2Go Scheduler&lt;/a&gt; for, you guessed it, FileMaker Go or FileMaker Pro. DevCon2Go boasts schedule filters, presenter-based views, in-system evaluation forms and even Twitter integration!&lt;/p&gt;
&lt;h4&gt;
	4. Tackle one or two big questions&lt;/h4&gt;
&lt;p&gt;
	It&amp;#39;s easy to leave a conference with way too much information and nothing to do with it. Determine ahead of time what you&amp;#39;re going to tackle &amp;mdash; something important or exciting to you &lt;em&gt;right now&lt;/em&gt; &amp;mdash; and learn everything you can about that topic. You&amp;#39;re also likely to find a vendor or fellow developer who has encountered the same issue you&amp;#39;re mulling over. Have your questions and ideas ready!&lt;/p&gt;
&lt;h4&gt;
	5. Don&amp;#39;t feel like you have to go to every session&lt;/h4&gt;
&lt;p&gt;
	There&amp;#39;s so many exciting ideas being presented at DevCon, it can be tempting to pack your schedule with session after session. Don&amp;#39;t do it! You&amp;#39;re not likely to remember half of what you hear. You&amp;#39;re much better off focusing on a few primary themes and building relationships. Those relationships may carry on long after you&amp;#39;ve forgotten what you heard in the last session. Plus, you&amp;#39;re likely to learn even more from one great discussion than you are from a generic presentation.&lt;/p&gt;
&lt;h4&gt;
	6. Find out who the popular speakers are&lt;/h4&gt;
&lt;p&gt;
	You may still be interested in particular topics, which is great. But make a point to find some speakers that interest you as well. Some people have enough knowledge and/or teaching ability that the topic is irrelevant; you&amp;#39;re sure to learn either way. Ask around if you&amp;#39;re not sure who those people might be for you.&lt;/p&gt;
&lt;h4&gt;
	7. Seek conversations&lt;/h4&gt;
&lt;p&gt;
	The FileMaker community is incredibly friendly. Don&amp;#39;t be afraid to say &amp;quot;Hi&amp;quot;, even to the people who appear to be the big shots. This conference is as much about establishing relationships as it is about sharing information. And remember your business cards.&lt;/p&gt;
&lt;p&gt;
	Another great resource is the topic tables. Sometimes they&amp;#39;ll have signs posted on the tables indicating that everyone who sits there is interested in a given topic. They&amp;#39;re a great way to meet people with common interests.&lt;/p&gt;
&lt;h4&gt;
	8. Embrace the &lt;em&gt;Law of Two Feet&lt;/em&gt;&lt;/h4&gt;
&lt;p&gt;
	&lt;a href="http://en.wikipedia.org/wiki/Open_Space_Technology" target="_blank"&gt;Wikipedia&lt;/a&gt;&amp;nbsp;defines the &lt;em&gt;Law of Two Feet:&lt;/em&gt;&lt;/p&gt;
&lt;p style="margin-left: 40px; "&gt;
	&lt;em&gt;If at any time you find yourself in any situation where you are neither learning nor contributing: Give greetings, use your two feet and go do something useful. Responsibility resides with you.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;
	That isn&amp;#39;t intended to imply that it&amp;#39;s not worth sticking around through difficult situations and awkward conversations. The point is that we all bear personal responsibility for making the most out of this conference. If you find yourself in a session that isn&amp;#39;t exactly what you expected, politely walk out and find something else to do.&lt;/p&gt;
&lt;p&gt;
	This may be a controversial idea, but it&amp;#39;s not a new one. In all fairness to the presenters, please sit near the back if you&amp;#39;re not sure that you&amp;#39;ll be staying. And fill out an evaluation to provide proper feedback, even if it&amp;#39;s just to clarify why they saw someone walking out on them (e.g., was the session description misleading?).&lt;/p&gt;
&lt;h4&gt;
	9. Fill out your evaluations&lt;/h4&gt;
&lt;p&gt;
	This is a great way to say &lt;em&gt;thank you&lt;/em&gt;&amp;nbsp;to your presenters and help make the conference better. Be sure to fill out the survey &lt;em&gt;before the session ends&lt;/em&gt; and it&amp;#39;s time to dash out to the next session. If the session is timed well, the right time to evaluate will be just as the presentation moves into Q&amp;amp;A.&lt;/p&gt;
&lt;h4&gt;
	10. Use Twitter to keep up on current happenings&lt;/h4&gt;
&lt;p&gt;
	FileMaker&amp;#39;s official hashtag is #FileMakerDevCon. You&amp;#39;ll see people sharing cool ideas, sparking informal sessions and announcing meetups at local restaurants. You can even use DevCon2Go to track Twitter hashtags. Jump in and join the conversation, and tweet what you learn. When the conference is done and everyone has gone home, &lt;a href="http://twitter.com"&gt;Twitter&lt;/a&gt; will still be there connecting you!&lt;/p&gt;
&lt;h4&gt;
	11. Exhibitors are your friends&lt;/h4&gt;
&lt;p&gt;
	Let&amp;#39;s be honest, exhibitors are trying to make money ... naturally. But you&amp;#39;ll find that many of their products are designed to &lt;em&gt;solve your problems&lt;/em&gt;. And almost all of them are at DevCon because they love FileMaker and its community. So find someone that could help you and strike up a conversation. @HOnza24U has some great tips below for how to get the most out of exhibitors.&lt;/p&gt;
&lt;p&gt;
	Our beez would love to see you at the Beezwax booth. You might be interested to see what&amp;#39;s cooking in the next release of &lt;a href="http://www.beezwax.net/solutions/inspectorPro"&gt;Inspector&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;
	&amp;nbsp;&lt;/p&gt;
&lt;p&gt;
	---&lt;/p&gt;
&lt;p&gt;
	There you go. Hopefully we&amp;#39;ll see you at the Beezwax booth at DevCon. As always, drop a line in the comments (or via &lt;a href="http://twitter.com/beezwaxteam"&gt;Twitter&lt;/a&gt;), especially if you have a tip of your own.&lt;/p&gt;
&lt;p&gt;
	See you at DevCon!&lt;/p&gt;
&lt;p&gt;
	- &lt;a href="http://twitter.com/beezwaxteam"&gt;@BeezwaxTeam&lt;/a&gt;&lt;/p&gt;


</content>
  </entry>
  <entry>
    <id>urn:uuid:59eefd08-468a-4206-ac1a-b8814041df7c</id>
    <published>2011-07-10T15:19:24Z</published>
    <updated>2012-02-20T22:48:53Z</updated>
    <link type="text/html" href="http://buzz.beezwax.net/2011/07/10/managing-files-with-applescript" rel="alternate" />
    <author>
      <name>donovan</name>
      <email>donovan_c@beezwax.net</email>
    </author>
    <title type="html">Managing Files with AppleScript</title>
    <category scheme="http://buzz.beezwax.net/category/filemaker" label="filemaker" term="filemaker" />
    <category scheme="http://buzz.beezwax.net/tag/custom" term="Custom" />
    <category scheme="http://buzz.beezwax.net/tag/applescript" term="applescript" />
    <category scheme="http://buzz.beezwax.net/tag/filemaker" term="filemaker" />
    <category scheme="http://buzz.beezwax.net/tag/functions" term="functions" />
    <category scheme="http://buzz.beezwax.net/tag/tips" term="tips" />
    <link type="application/zip" length="82480" title="Managing Files with AppleScript" rel="enclosure" href="http://buzz.beezwax.net/files/Demo_ManagingFilesWithAppleScript.zip" />
    <content type="html">&lt;p&gt;
	If you're like most power FileMaker users, you've discovered that it's a great tool for managing collections of things or for gathering disparate data sources for reporting. So you've probably wanted at some point to do one or more of these actions:&lt;/p&gt;
&lt;ul&gt;
	&lt;li&gt;
		Get a list of files on your computer&lt;/li&gt;
	&lt;li&gt;
		Import a batch of files&lt;/li&gt;
	&lt;li&gt;
		Move files on your computer&lt;/li&gt;
	&lt;li&gt;
		Read the text of a file that doesn't import correctly (e.g., HTML)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
	Does that sound familiar? Unfortunately, FileMaker provides limited functionality for these operations. Here's a few handy custom functions for you Mac OS users to help you access the power of interacting with files on your computer. Each generates AppleScript that you can then run from a script using the Perform AppleScript command. Here are the core functions included:&lt;/p&gt;
&lt;ul&gt;
	&lt;li&gt;
		AppleScriptDirPath&lt;/li&gt;
	&lt;li&gt;
		AppleScriptFilePaths&lt;/li&gt;
	&lt;li&gt;
		AppleScriptFilePathsInDir&lt;/li&gt;
	&lt;li&gt;
		AppleScriptMoveFiles&lt;/li&gt;
	&lt;li&gt;
		AppleScriptReadFile&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
	Each function presents the user with an &lt;em&gt;OS-native dialog&lt;/em&gt; and returns a list of paths to the files selected or moved. No plug-ins required!&lt;/p&gt;
&lt;p&gt;
	Yes, this is another Mac-only demo (sorry Windows users!). But that's only because this technique arose out of a Mac-only situation. You could do something similar on Windows using the Send Event script step. You Windows users out there are more than welcome to post your versions of the functions. We'd love to make the demo cross-platform compatible.&lt;/p&gt;
&lt;p&gt;
	FileMaker Pro users, don't despair. You can use these functions too. Each command shows you the AppleScript that it runs. So just copy and repurpose that text to have a fully functional AppleScript that you can paste into your scripts.&lt;/p&gt;
&lt;p&gt;
	Have you done something similar or tweaked these functions for other purposes? Tell us about it in the comments!&lt;/p&gt;
&lt;p&gt;
	&lt;a href="/files/Demo_ManagingFilesWithAppleScript_2012.02.20.zip"&gt;Download demo file&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;
	Demo History:&lt;br /&gt;
	&lt;strong&gt;Nov 11, 2011&lt;/strong&gt;: added function for reading file contents; now accepts multiple resuts from AppleScript&lt;br /&gt;
	&lt;strong&gt;Aug 12, 2011&lt;/strong&gt;: enhanced error handling and function readability; moving files now returns list of destination paths&lt;br /&gt;
	&lt;strong&gt;Feb 20, 2012&lt;/strong&gt;: fixed bug with copying moved files; added support for FileMaker Pro; enhanced handling of files with "." in their name&lt;/p&gt;


</content>
  </entry>
  <entry>
    <id>urn:uuid:8ff40215-68c8-4bd6-8ac4-2706a884e9d8</id>
    <published>2011-06-24T18:30:04Z</published>
    <updated>2012-01-11T21:58:49Z</updated>
    <link type="text/html" href="http://buzz.beezwax.net/2011/06/25/gozync-offline-framework-for-filemaker-go" rel="alternate" />
    <author>
      <name>donovan</name>
      <email>donovan_c@beezwax.net</email>
    </author>
    <title type="html">Does your FileMaker Go offline? (Previewing the new GoZync framework)</title>
    <category scheme="http://buzz.beezwax.net/category/filemaker" label="filemaker" term="filemaker" />
    <category scheme="http://buzz.beezwax.net/category/filemaker-add-ons" label="filemaker add-ons" term="filemaker-add-ons" />
    <category scheme="http://buzz.beezwax.net/category/filemaker-resources" label="filemaker resources" term="filemaker-resources" />
    <category scheme="http://buzz.beezwax.net/category/iphone" label="iPhone" term="iphone" />
    <category scheme="http://buzz.beezwax.net/tag/filemaker" term="filemaker" />
    <category scheme="http://buzz.beezwax.net/tag/digfm" term="DIGFM" />
    <category scheme="http://buzz.beezwax.net/tag/fmgo" term="FMGo" />
    <category scheme="http://buzz.beezwax.net/tag/mobile" term="mobile" />
    <category scheme="http://buzz.beezwax.net/tag/products" term="products" />
    <category scheme="http://buzz.beezwax.net/tag/filemaker" term="filemaker" />
    <category scheme="http://buzz.beezwax.net/tag/go" term="Go" />
    <category scheme="http://buzz.beezwax.net/tag/ipad" term="iPad" />
    <category scheme="http://buzz.beezwax.net/tag/iphone" term="iphone" />
    <content type="html">&lt;p&gt;
	&lt;span class="Apple-style-span" style="color: rgb(35, 35, 35); font-family: Arial; "&gt;Some of us on the Beezwax team had the pleasure of watching &lt;a href="http://twitter.com/seedcode"&gt;John Sindelar&lt;/a&gt; and &lt;a href="http://twitter.com/toddgeist"&gt;Todd Geist&lt;/a&gt; present their new &lt;a href="http://www.seedcode.com/gozync"&gt;GoZync framework&lt;/a&gt; at June&amp;#39;s DIGFM developer meetup. If you know anything about either of these fellows, you know that they are both very sharp and visionary developers. Now they&amp;#39;ve thrown their collective brain power at the problem of &amp;quot;How do mobile users work with their databases offline?&amp;quot;&amp;nbsp;&lt;/span&gt;&lt;span class="Apple-style-span" style="color: rgb(35, 35, 35); font-family: Arial; "&gt;The GoZync framework is designed to answer this question for FileMaker Go users on iPad and iPhone. For developers, it&amp;#39;s potentially a way to face the challenges of syncing and connectivity.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;
	&lt;span class="Apple-style-span" style="color: rgb(35, 35, 35); font-family: Arial; "&gt;The presenters and audience at DIGFM had an easy time providing examples of &amp;quot;offline database users&amp;quot;:&lt;/span&gt;&lt;/p&gt;
&lt;ul&gt;
	&lt;li&gt;
		Plumber working onsite at client offices&lt;/li&gt;
	&lt;li&gt;
		Legal clerk working in a secure (Internet-free) courtroom&lt;/li&gt;
	&lt;li&gt;
		Equipment-delivery driver&lt;/li&gt;
	&lt;li&gt;
		Education tutors visiting students&lt;/li&gt;
	&lt;li&gt;
		Survey-taker visiting villages in Africa&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
	&lt;span class="Apple-style-span" style="color: rgb(35, 35, 35); font-family: Arial; "&gt;And the list goes on. Even an office worker walking between WiFi connectivity points, or starting and stopping FileMaker Go might face the &amp;quot;offline&amp;quot; issue.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;
	&lt;span class="Apple-style-span" style="color: rgb(35, 35, 35); font-family: Arial; "&gt;For those of you who missed out on John and Todd&amp;#39;s &amp;quot;GoZync Demo Tour&amp;quot;, here&amp;#39;s a quick recap:&lt;/span&gt;&lt;/p&gt;
&lt;h2&gt;
	&lt;b&gt;Solving The Mobile &amp;quot;Offline&amp;quot; Problem&lt;/b&gt;&lt;/h2&gt;
&lt;p&gt;
	&lt;span class="Apple-style-span" style="color: rgb(35, 35, 35); font-family: Arial; "&gt;In a nutshell, GoZync provides a framework for transactional transfer of data between FileMaker Go apps and your server. This solves a host of problems that otherwise make deployment to mobile devices unfeasible or unprofitable on FileMaker Go. Instead of worrying about clients losing their internet connection, GoZync enables them to work offline and push their data to the server later.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;
	&lt;span class="Apple-style-span" style="color: rgb(35, 35, 35); font-family: Arial; "&gt;&lt;span class="Apple-style-span" style="color: rgb(35, 35, 35); font-family: Arial; "&gt;Have the challenges of offline database use limited your deployment of mobile solutions (via FileMaker Go) for your company or a client? GoZync promises to change that.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;h2&gt;
	&lt;b&gt;How It Works&lt;/b&gt;&lt;/h2&gt;
&lt;p&gt;
	&lt;span class="Apple-style-span" style="color: rgb(35, 35, 35); font-family: Arial; "&gt;The common GoZync deployment will involve at least three FileMaker files:&lt;/span&gt;&lt;/p&gt;
&lt;ul&gt;
	&lt;li&gt;
		Central hosted database, typically FileMaker Server&lt;/li&gt;
	&lt;li&gt;
		Mobile front-end deployed with FileMaker Go*&lt;/li&gt;
	&lt;li&gt;
		Intermediary hosted database containing core of GoZync logic&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
	&lt;span class="Apple-style-span" style="color: rgb(35, 35, 35); font-family: Arial; "&gt;This is all FileMaker-native stuff. &amp;quot;No plug-ins required&amp;quot;. To be clear, we&amp;#39;re not talking about two-way syncing. (Really, that&amp;#39;s super difficult to accomplish!) GoZync is a push-pull framework. It moves data between your mobile device running FileMaker Go and your central hosted database. It&amp;#39;s up to a FileMaker developer to merge incoming data beyond the basic &amp;quot;last commit wins&amp;quot;. But there&amp;#39;s nothing stopping you from customizing the process.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;
	&lt;span class="Apple-style-span" style="color: rgb(35, 35, 35); font-family: Arial; "&gt;* FileMaker Go supports iPad, iPhone, and iPod touch. But in theory the GoZync approach works with FileMaker Pro on a laptop, with the same benefits for offline database use.&lt;/span&gt;&lt;/p&gt;
&lt;h2&gt;
	&lt;span class="Apple-style-span" style="color: rgb(35, 35, 35); font-family: Arial; "&gt;&lt;span class="Apple-style-span" style="color: rgb(35, 35, 35); font-family: Arial; "&gt;&lt;span class="Apple-style-span" style="color: rgb(35, 35, 35); font-family: Arial; "&gt;&lt;b&gt;What GoZync Does&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;
	&lt;span class="Apple-style-span" style="color: rgb(35, 35, 35); font-family: Arial; "&gt;Here&amp;#39;s a rundown on some of the primary challenges addressed by GoZync:&lt;/span&gt;&lt;/p&gt;
&lt;h3&gt;
	&lt;span class="Apple-style-span" style="color: rgb(35, 35, 35); font-family: Arial; "&gt;&lt;b&gt;Makes transaction as fast and reliable as possible&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;
	&lt;span class="Apple-style-span" style="color: rgb(35, 35, 35); font-family: Arial; "&gt;The biggest challenge with deploying hosted solutions to mobile devices is ensuring that data isn&amp;#39;t getting lost or corrupted when the user quits their app or loses their connection. In GoZync, each set of records (parent and children) being pushed is sent as a single document to ensure that you never have orphans. Either the entire document gets transferred or the entire set of records is saved for transferring later. This &amp;quot;GoZync document&amp;quot; has a custom markup to ensure that it is also lightweight, readable and easily parsed in FileMaker. (Don&amp;#39;t worry, container field data is also supported.)&lt;/span&gt;&lt;/p&gt;
&lt;h3&gt;
	&lt;span class="Apple-style-span" style="color: rgb(35, 35, 35); font-family: Arial; "&gt;&lt;b&gt;Makes mapping of data between mobile and server files easy&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;
	&lt;span class="Apple-style-span" style="color: rgb(35, 35, 35); font-family: Arial; "&gt;Your success with a framework or extension like GoZync depends largely on how easily you can set up and configure it. Todd and John have made setup super easy in GoZync. Here&amp;#39;s a rough run-through of configuring the push process (as I understand it from the presentation):&lt;/span&gt;&lt;/p&gt;
&lt;ol&gt;
	&lt;li&gt;
		Open your GoZync file and add your hosted database as an external data source&lt;/li&gt;
	&lt;li&gt;
		Go to a configuration layout&lt;/li&gt;
	&lt;li&gt;
		Add a tab for your table and drop your desired fields onto the tab
		&lt;ul&gt;
			&lt;li&gt;
				Data from each field will be posted to a variable named after the field&lt;/li&gt;
		&lt;/ul&gt;
	&lt;/li&gt;
	&lt;li&gt;
		Export and open customized setup instructions (yes, &lt;i&gt;customized&lt;/i&gt;!)&lt;/li&gt;
	&lt;li&gt;
		Add some Set Field steps to map the data variables to the receiving file&amp;nbsp;&lt;/li&gt;
&lt;/ol&gt;
&lt;p style="margin: 0.0px 0.0px 12.0px 0.0px; font: 12.0px Arial; color: #232323"&gt;
	&lt;span class="Apple-style-span" style="color: rgb(35, 35, 35); font-family: Arial; "&gt;The data parsing and mapping is all unlocked so you can customize it easily. You have room to add your custom data validation or syncing logic if you wish. GoZync also includes some robust error handling to ensure you get the variable names right.&lt;/span&gt;&lt;/p&gt;
&lt;h3&gt;
	&lt;span class="Apple-style-span" style="color: rgb(35, 35, 35); font-family: Arial; "&gt;&lt;b&gt;Keeps dependencies to a minimum&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;
	&lt;span class="Apple-style-span" style="color: rgb(35, 35, 35); font-family: Arial; "&gt;Using an intermediary file means that GoZync can be bolted onto an existing solution with very few modifications to the existing files. You don&amp;#39;t even need to create accounts for the mobile users because they only interact with the intermediary file. There aren&amp;#39;t even any plug-ins involved.&lt;/span&gt;&lt;/p&gt;
&lt;h3&gt;
	&lt;span class="Apple-style-span" style="color: rgb(35, 35, 35); font-family: Arial; "&gt;&lt;b&gt;Handles smooth delivery of new mobile files&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;
	&lt;span class="Apple-style-span" style="color: rgb(35, 35, 35); font-family: Arial; "&gt;I missed some of the nuances here, but the bottom line is that developers can release new mobile databases with minimal hassle for all involved. Users click a button, get a database version update, and land back on the same layout when they&amp;#39;re done &amp;mdash; new file, data set preserved, no fuss. End users never have to worry about finding the new file or determining which file is current. You can also deliver new &amp;mdash; even customized &amp;mdash; data sets with your updates if you choose.&lt;/span&gt;&lt;/p&gt;
&lt;h2&gt;
	&lt;span class="Apple-style-span" style="color: rgb(35, 35, 35); font-family: Arial; "&gt;&lt;b&gt;What does this mean for FileMaker and your business?&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;
	&lt;span class="Apple-style-span" style="color: rgb(35, 35, 35); font-family: Arial; "&gt;Mobile is a not just about new devices, but potentially about new markets for FileMaker. Mobile users offer FileMaker developers an opportunity to build new &lt;em&gt;types&lt;/em&gt; of solutions.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;
	&lt;span class="Apple-style-span" style="color: rgb(35, 35, 35); font-family: Arial; "&gt;John expressed it well in his presentation. And you may hear him say it again, because it&amp;#39;s an important point (paraphrased here):&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin: 0.0px 0.0px 12.0px 40.0px; font: 12.0px Arial; color: #232323"&gt;
	&lt;span class="Apple-style-span" style="color: rgb(35, 35, 35); font-family: Arial; "&gt;&lt;i&gt;FileMaker has worked well for us in office settings. If we&amp;#39;ve looked to help a business, it&amp;#39;s been in the office where we&amp;#39;re used to working. We never thought to look at the delivery trucks in the parking lot. Now we have a high ROI product to sell to all those trucks!&lt;/i&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;
	&lt;span class="Apple-style-span" style="color: rgb(35, 35, 35); font-family: Arial; "&gt;GoZync isn&amp;#39;t the Holy Grail to solve all syncing and connectivity problems, but it does provide an elegant means of storing and sending data. Now every time I see a clipboard, I can envision replacing it with an iPad with a FileMaker Go and GoZync integration running on it.&lt;/span&gt;&lt;/p&gt;


</content>
  </entry>
  <entry>
    <id>urn:uuid:adb0f484-d153-484e-816f-a6eb40a8ea15</id>
    <published>2011-03-21T02:01:46Z</published>
    <updated>2012-01-11T21:58:49Z</updated>
    <link type="text/html" href="http://buzz.beezwax.net/2011/06/17/unleashing-mac-os-xs-color-picker-in-filemaker" rel="alternate" />
    <author>
      <name>donovan</name>
      <email>donovan_c@beezwax.net</email>
    </author>
    <title type="html">Unleashing Mac OS X's Color Picker in FileMaker</title>
    <category scheme="http://buzz.beezwax.net/category/filemaker" label="filemaker" term="filemaker" />
    <category scheme="http://buzz.beezwax.net/category/filemaker-tips" label="filemaker tips" term="filemaker-tips" />
    <category scheme="http://buzz.beezwax.net/category/custom-functions" label="custom functions" term="custom-functions" />
    <category scheme="http://buzz.beezwax.net/tag/color" term="Color" />
    <category scheme="http://buzz.beezwax.net/tag/interface" term="Interface" />
    <category scheme="http://buzz.beezwax.net/tag/os" term="OS" />
    <category scheme="http://buzz.beezwax.net/tag/picker" term="Picker" />
    <category scheme="http://buzz.beezwax.net/tag/user" term="User" />
    <category scheme="http://buzz.beezwax.net/tag/x" term="X" />
    <category scheme="http://buzz.beezwax.net/tag/applescript" term="applescript" />
    <category scheme="http://buzz.beezwax.net/tag/filemaker" term="filemaker" />
    <category scheme="http://buzz.beezwax.net/tag/mac" term="mac" />
    <link type="application/zip" length="199287" title="Unleashing Mac OS X's Color Picker in FileMaker" rel="enclosure" href="http://buzz.beezwax.net/files/Demo_ColorPicker.zip" />
    <content type="html">&lt;p&gt;
	Color is one of the most important tools available to you when designing user interfaces. Using a little color can turn a drab wall of text into something attractive and readable.&lt;/p&gt;
&lt;p&gt;
	The human eye is tuned to perceive color. This makes it a key tool for helping users quickly sort through complex information. This isn&amp;#39;t to say that your layout should be a tacky rainbow of hues. All it takes is a little deliberate and tasteful formatting here and there to increase usability for your users. This post presents a technique that allows users on Mac OS (sorry Windows users!) to harness the power of color by unleashing the Color Picker in their solution. It&amp;#39;s pretty simple really; all you need is a global field and one custom function!&lt;/p&gt;
&lt;h2 id="color_to_the_rescue"&gt;
	Color to the rescue&lt;/h2&gt;
&lt;p&gt;
	Color helped with a recent FIleMaker system we built for a client to handle project management. The users were very visually-oriented, but they also had a good deal of complex data to sort through. They were viewing multiple projects, each of which were progressing through various stages. Our challenge was to reduce the apparent complexity of this data so that someone could find what they were looking for at a glance.&lt;/p&gt;
&lt;p&gt;
	Color is a great way to help users identify groups and trends. Since configurations were going to be ever changing and growing in this database, we decided to let the &lt;em&gt;users&lt;/em&gt; choose the colors. Herein lies the problem: In FileMaker, how do you allow users to dynamically select and view colors of layout elements?&lt;/p&gt;
&lt;h2 id="dynamic_color_assignment_in_filemaker"&gt;
	Dynamic Color Assignment in FileMaker Pro&lt;/h2&gt;
&lt;p&gt;
	FileMaker is very limited in the area of dynamic color assignment. The only way to dynamically set a color, outside of the Web Viewer, is to color text via the TextColor() function; otherwise, you are stuck hard-coding the color. With layout objects, your closest option is to use conditional formatting. This is useful, but the only way to account for multiple possibilities is to code conditions for them upfront.&lt;/p&gt;
&lt;p&gt;
	Allowing the user to set a color is also tricky. Who wants to type in a RGB value? You could alternatively paste in some colored text and extract a color from there (hint: use the GetAsCSS function), but that isn&amp;#39;t much easier.&lt;/p&gt;
&lt;h2 id="the_os_x_color_picker"&gt;
	The Mac OS X Color Picker&lt;/h2&gt;
&lt;p&gt;
	We were fortunate in that this client is exclusively using Mac OS X. One of the great things about working with Apple&amp;rsquo;s desktop OS is the availability of system resources for FileMaker to call via AppleScript. You can access these from FileMaker using the Perform AppleScript script step. In our case, the golden resource is AppleScript&amp;#39;s &amp;quot;Choose Color&amp;quot; command, which presents Mac OS X&amp;#39;s default Color Picker and returns the user&amp;rsquo;s selection. The Color Picker is plenty robust for our needs, so all we need to do is parse the results and send them back to FileMaker.&lt;/p&gt;
&lt;p&gt;
	&lt;img align="middle" alt="http://buzz.beezwax.net/files/ColorPicker.png" class="tumb" height="637" src="http://buzz.beezwax.net/files/ColorPicker.png" width="320" /&gt;&lt;/p&gt;
&lt;p&gt;
	Some other features of the Mac OS X color picker worth noting:&amp;nbsp;&lt;/p&gt;
&lt;ul&gt;
	&lt;li&gt;
		Multiple slider options (Grayscale, RGB, CMYK, HSB)&lt;/li&gt;
	&lt;li&gt;
		Color wheel&lt;/li&gt;
	&lt;li&gt;
		Eye dropper (looks like a magnifying glass)&lt;/li&gt;
	&lt;li&gt;
		Configurable palettes (they can even be transferred as files)&lt;/li&gt;
	&lt;li&gt;
		Extensible (you can download and install free plug-ins)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
	You can also find quick Color Picker guides, like&amp;nbsp;&lt;a href="http://smokingapples.com/software/tutorials/deconstructing-macosx-color-picker/"&gt;this one&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id="using_the_color_picker_in_filemaker"&gt;
	Using Mac OS X&amp;#39;s Color Picker in FileMaker&lt;/h2&gt;
&lt;p&gt;
	The technique presented here will give you (on Mac OS X) a polished and robust Color Picker with no requirements other than a custom function and a global field. You can even set the default color displayed on the Color Picker. Here&amp;#39;s how:&lt;/p&gt;
&lt;p&gt;
	First, create a script that does the following:&lt;/p&gt;
&lt;ol&gt;
	&lt;li&gt;
		&lt;p&gt;
			Generate AppleScript using a custom function&lt;/p&gt;
		&lt;ul&gt;
			&lt;li&gt;
				&lt;p&gt;
					This function allows you to specify the default color and which global field will receive the result:&lt;/p&gt;
				&lt;p&gt;
					&lt;code&gt;AppleScriptChooseColor ( fullFieldName ; defaultColor )&lt;/code&gt;&lt;/p&gt;
				&lt;p&gt;
					The following calculation will open a Color Picker defaulting to red and return the user&amp;rsquo;s selection in the field FOCUS::TEMP_TEXT_GT.&lt;/p&gt;
				&lt;p&gt;
					&lt;code&gt;AppleScriptChooseColor ( GetFieldName ( FOCUS::TEMP_TEXT_GT ) ; &amp;quot;RGB ( 255 ; 0 ; 0 )&amp;quot; )&lt;/code&gt;&lt;/p&gt;
			&lt;/li&gt;
		&lt;/ul&gt;
	&lt;/li&gt;
	&lt;li&gt;
		&lt;p&gt;
			Retrieve the resulting RGB() statement from the global field&lt;/p&gt;
	&lt;/li&gt;
	&lt;li&gt;
		Store RGB statement or value wherever it is appropriate
		&lt;ul&gt;
			&lt;li&gt;
				You can use a field in the database record being colored&lt;/li&gt;
		&lt;/ul&gt;
	&lt;/li&gt;
	&lt;li&gt;
		Use the RGB value within a TextColor() statement&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;
	Pretty simple, right? What you do with the result is up to you.&lt;/p&gt;
&lt;p&gt;
	In the attached demo, I used Webdings (available by default on Mac and Windows) to format a square text object with the color. Check it out and let me know what you think.&lt;/p&gt;
&lt;p&gt;
	&lt;a href="http://buzz.beezwax.net//files/Demo_ColorPicker_2011.11.15.zip"&gt;Download the demo&lt;br /&gt;
	&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;
	Demo updated Nov 16, 2011. Enhanced error handling and AppleScript compatibility. Note, this demo may not be compatible with versions of FileMaker Pro prior to version 11.&lt;/p&gt;


</content>
  </entry>
  <entry>
    <id>urn:uuid:2ead05e5-9abc-4002-9164-1b2e9f61e4d7</id>
    <published>2011-04-29T21:27:50Z</published>
    <updated>2012-01-11T21:58:49Z</updated>
    <link type="text/html" href="http://buzz.beezwax.net/2011/04/29/beezwax-team-wins-speed-developer-challenge-at-dig-fm" rel="alternate" />
    <author>
      <name>robert_w</name>
      <email>robert_w@beezwax.net</email>
    </author>
    <title type="html">Beezwax Team Completes Speed-Developer Challenge at DIG-FM</title>
    <category scheme="http://buzz.beezwax.net/category/filemaker" label="filemaker" term="filemaker" />
    <category scheme="http://buzz.beezwax.net/tag/speed" term="speed" />
    <category scheme="http://buzz.beezwax.net/tag/challenge" term="challenge" />
    <category scheme="http://buzz.beezwax.net/tag/digfm" term="DIGFM" />
    <category scheme="http://buzz.beezwax.net/tag/dig" term="DIG" />
    <category scheme="http://buzz.beezwax.net/tag/fm" term="FM" />
    <category scheme="http://buzz.beezwax.net/tag/filemaker" term="filemaker" />
    <link type="video/quicktime" length="43435910" title="Beezwax Team Completes Speed-Developer Challenge at DIG-FM" rel="enclosure" href="http://buzz.beezwax.net/files/DIG_FM_Challenge_Part_2.mov" />
    <content type="html">&lt;p&gt;
	Can you build an Assets Management database in FileMaker Pro in 80 minutes?&lt;/p&gt;
&lt;p&gt;
	Thursday night we completed that challenge!&lt;/p&gt;
&lt;h3&gt;
	DIG-FM Speed-Developer Challenge&lt;/h3&gt;
&lt;p&gt;
	Team Beezwax (Vincenzo Menanno, Rennie Innis, Robert Ward and Jay Gonzales) were at DIG-FM last night, and entered the Speed-Developer Challenge. Here was the task:&lt;/p&gt;

&lt;blockquote&gt;Your mission, should you decide to accept it, would be to create a database that tracks University departmental assets like computers, laptops, monitors, and any office equipment of value. They would also like to be able to look up employees and quickly see what assets those employees have checked out or have been assigned to them ... and it would be great if the customer could track the history of asset assignments and locations, and an employee's equipment history ... and asset detail should include a place to put pictures of assets, and employee detail should have a place to put pictures of employees ... and you have 80 minutes...and there is &lt;em&gt;no talking&lt;/em&gt; because you are working while the meeting presenter is presenting...etc.&lt;/blockquote&gt;
&lt;p&gt;
	The &amp;quot;no talking&amp;quot; rule made things very interesting. Most of the collaboration was using iChat, pen + paper, and vigorous finger pointing at laptop screens. We worked together on the database via a remote FileMaker Server, too.&lt;/p&gt;

&lt;p&gt;While we worked, Eric Matthews demonstrated some solutions he's built at San Jose State, and how FileMaker has enabled University departments to quickly implement some complex solutions for ID card readers, document management, et. al.
&lt;h3&gt;
	And The Winner Is...&lt;/h3&gt;
&lt;p&gt;
	We completed the Speed-Developer Challenge! Our resulting database was not quite feature complete (no picture support), but it was the only solution that was uploaded to the Challenge server, looking functional. Just give us another 10 minutes and I'll bet we could have had SuperContainer implemented for photos!&lt;/p&gt;
&lt;p&gt;
	The prize (courtesy of FileMaker, Inc.) was a copy of FileMaker Advanced, which was donated back to DIG-FM as a raffle prize for the meeting.&lt;/p&gt;

&lt;p&gt;
	&lt;a href="http://twitter.com/#!/beezwaxnews/statuses/63816813334638593"&gt;Here is a picture of Vince getting up to present the winning solution&lt;/a&gt;, which was also a nice moment to mention the Beezwax FOCUS toolkit as the starting point for our solution.&lt;/p&gt;

&lt;p&gt;And, finally, here is a time-lapse screen capture of Vince's screen (courtesy of the Mac application &lt;a href="http://www.getscreenninja.com"&gt;ScreenNinja&lt;/a&gt;) during the challenge. 80 minutes of an intense multi-developer FileMaker project collapsed to 90 seconds. Enjoy!&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;
&lt;iframe width="425" height="349" src="http://www.youtube.com/embed/5vWd9386qPY" frameborder="0" allowfullscreen&gt;&lt;/iframe&gt;

&lt;p&gt;
&lt;/p&gt;

</content>
  </entry>
  <entry>
    <id>urn:uuid:b7674f88-08c8-455b-add5-c470b84a3e8c</id>
    <published>2011-03-21T22:19:24Z</published>
    <updated>2012-01-11T21:58:49Z</updated>
    <link type="text/html" href="http://buzz.beezwax.net/2011/04/22/filemaker-instant-web-publishing-part-ii-five-top-tips-for-success" rel="alternate" />
    <author>
      <name>donovan</name>
      <email>donovan_c@beezwax.net</email>
    </author>
    <title type="html">FileMaker Instant Web Publishing, Part II: Five Top Tips for Success</title>
    <category scheme="http://buzz.beezwax.net/category/filemaker" label="filemaker" term="filemaker" />
    <category scheme="http://buzz.beezwax.net/category/filemaker-tips" label="filemaker tips" term="filemaker-tips" />
    <category scheme="http://buzz.beezwax.net/tag/development" term="development" />
    <category scheme="http://buzz.beezwax.net/tag/filemaker" term="filemaker" />
    <category scheme="http://buzz.beezwax.net/tag/instant" term="instant" />
    <category scheme="http://buzz.beezwax.net/tag/iwp" term="iwp" />
    <category scheme="http://buzz.beezwax.net/tag/publishing" term="publishing" />
    <category scheme="http://buzz.beezwax.net/tag/tips" term="tips" />
    <category scheme="http://buzz.beezwax.net/tag/web" term="web" />
    <content type="html">&lt;p&gt;
	&amp;nbsp;&lt;/p&gt;
&lt;p&gt;
	Part I of this series introduced Instant Web Publishing (IWP) as an alternative to the traditional client-server deployment (FileMaker Server to FileMaker Pro). We noted that it is very easy to get started with IWP, and also very easy to get hung up on its limitations. But you can use IWP successfully if you learn to work within its constraints. Here are my top 5 tips for successfully implementing IWP:&lt;/p&gt;
&lt;h3 id="use_minimal_layouts"&gt;
	1. Use minimalistic layouts&lt;/h3&gt;
&lt;p&gt;
	It is almost certain that you will need separate versions of your layouts for IWP. These should have straight lines, no extraneous graphics, and white backgrounds. The white background is helpful to help reduce the impact of the white flash your browser is going to give you every time the screen redraws (which will be often). Screen redraws are also distracting when the user doesn&amp;#39;t expect them to occur. Tabs are are a primary culprit of this, so they are best avoided in IWP.&lt;/p&gt;
&lt;p&gt;
	I have found the workflow to be much smoother on IWP when using simpler, more narrow-purpose layouts that render once. This way a redraw only occurs when the user is specifically requesting (and expecting) a transition.&lt;/p&gt;
&lt;p&gt;
	The following images (taken from rough prototypes) illustrate the difference between a more typical FileMaker multi-purpose layout (top) and a minimalistic single-purpose layout (bottom).&amp;nbsp;&lt;/p&gt;
&lt;p&gt;
	&lt;img align="middle" alt="Traditional FileMaker Pro Layout in IWP" class="tumb" height="275" onclick="edInsertImageFromCarousel('article_body_and_extended', 'http://buzz.beezwax.net/files/IWP_traditional.png');" src="../../../files/IWP_traditional.png" width="354" /&gt;&lt;/p&gt;
&lt;p&gt;
	Multi-purpose layout. Designed for FileMaker Pro client.&lt;/p&gt;
&lt;p&gt;
	&amp;nbsp;&lt;/p&gt;
&lt;p&gt;
	&lt;img alt="IWP Minimal List Layout" class="tumb" height="275" src="http://buzz.beezwax.net/files/IWP_minimal_list.png" width="240" /&gt;&lt;img alt="IWP Minimalistic Detail Layout" class="tumb" height="275" src="http://buzz.beezwax.net/files/IWP_minimal_detail.png" width="240" /&gt;&lt;/p&gt;
&lt;p&gt;
	Single-purpose layouts in FileMaker Pro. Optimized for Instant Web Publishing.&lt;/p&gt;
&lt;p&gt;
	&amp;nbsp;&lt;/p&gt;
&lt;h3 id="create_a_transactional_interaction_model"&gt;
	2. Create a transactional interaction model&lt;/h3&gt;
&lt;p&gt;
	One aspect of IWP that users may find confusing is managing the record state, i.e. whether record data has been committed to the actual database. FileMaker Pro makes this a non-issue, but IWP users must explicitly open and close records using the &amp;quot;Edit&amp;quot; and &amp;quot;Submit&amp;quot; buttons in the status area. This is likely going to be inconvenient and unfamiliar to most users.&lt;/p&gt;
&lt;p&gt;
	A polished solution will not require its users to view the IWP status area or to learn how it works. The most polished option is to remove the status area altogether, but that requires you to script all the functionality you just hid from your user! You may not want to go that far, but you should at the very least relieve your users of worrying about the state of a record being edited.&lt;/p&gt;
&lt;p&gt;
	This doesn&amp;rsquo;t mean you need to have a giant &amp;ldquo;Commit&amp;rdquo; button on every layout, but you will need to have some explicit action that the user understands must be done before their data is saved. Narrowly-focused layouts, as mentioned above, can help with this because each layout transition is an opportunity to clearly indicate a change to your users. For example, you could have a layout that each user only sees when entering data, thus indicating to the user that a record is not committed.&lt;/p&gt;
&lt;h3 id="check_for_incompatible_script_steps"&gt;
	3. Check for incompatible script steps&lt;/h3&gt;
&lt;p&gt;
	This is important, because IWP gives you almost no feedback here. By default, IWP will abort a script when it encounters an incompatible script step. Once you set the &lt;em&gt;Allow User Abort&lt;/em&gt; script step to &amp;quot;Off&amp;quot;, the script will skip right over incompatible steps. This doesn&amp;#39;t solve your problems, however, because&amp;nbsp;your script might be missing something important when it skips that incompatible script step. And, if those scripts are being run in FileMaker Pro, it&amp;rsquo;s risky to have your errors suppressed automatically; it could be hiding important problems from you. My best recommendation is to include a subscript at the opening of each relevant script that will turn &lt;em&gt;Allow User Abort&lt;/em&gt; off only if it is being run in IWP.&lt;/p&gt;
&lt;h3 id="include_a_button_to_log_out"&gt;
	4. Include a &amp;quot;Log out&amp;quot; button&lt;/h3&gt;
&lt;p&gt;
	Logging out is another functionality that is provided by the status area but will be pesky for your users to learn. If you don&amp;rsquo;t provide an explicit and prominent way for the user to log out, his or her session will persist after they close the browser window. This could cause you unnecessary performance and security concerns.&lt;/p&gt;
&lt;h3 id="test_early"&gt;
	5. Test early!&lt;/h3&gt;
&lt;p&gt;
	Each web browser will render your layouts differently, so be sure you try them out as early as possible in the design process. This could save you much heartache later on! For example, you may not expect that your scroll position is reset when you enter a record in list view (it will be!). You may also be surprised after switching to portals that they don&amp;rsquo;t work in Safari on iOS!&lt;/p&gt;
&lt;p&gt;
	Another important aspect to testing is performance. If you expect to have 5 users online at a time, be sure to test with 5 concurrent users so you know how responsive the system will be.&lt;/p&gt;
&lt;h2&gt;
	Conclusion&lt;/h2&gt;
&lt;p&gt;
	There are other tricks you can use to master IWP, but following these guidelines should get you started off on the right foot. Or maybe you have some tips of your own we didn&amp;#39;t cover? We&amp;#39;d love to hear them in the Comments.&lt;/p&gt;
&lt;h2 id="other_resources"&gt;
	Other Resources&lt;/h2&gt;
&lt;p&gt;
	&lt;a href="http://www.filemaker.com/support/technologies/iwp.html"&gt;FileMaker IWP Overview&lt;/a&gt;&amp;nbsp;(includes comparison with FileMaker Pro, links to related knowledge base articles)&lt;/p&gt;
&lt;p&gt;
	&lt;a href="http://www.filemaker.com/support/product/docs/fms/fm11_instant_web_publish_en.pdf"&gt;FileMaker 11 IWP Guide&lt;/a&gt; (official white paper, contains implementation details)&lt;/p&gt;
&lt;p&gt;
	&lt;a href="https://store.filemaker.com/US/ENG/RTL/product/view/group/TSM/"&gt;FileMaker Professional Training Series&lt;/a&gt; (helpful for comparing web publishing options)&lt;/p&gt;


</content>
  </entry>
  <entry>
    <id>urn:uuid:59ae765a-ab13-45fa-b8a5-58f8b1dc3967</id>
    <published>2011-03-19T20:07:33Z</published>
    <updated>2012-01-11T21:58:49Z</updated>
    <link type="text/html" href="http://buzz.beezwax.net/2011/04/15/filemaker-instant-web-publishing-part-i-is-iwp-right-for-you" rel="alternate" />
    <author>
      <name>donovan</name>
      <email>donovan_c@beezwax.net</email>
    </author>
    <title type="html">FileMaker Instant Web Publishing, Part I: Is IWP Right For You?</title>
    <category scheme="http://buzz.beezwax.net/category/filemaker" label="filemaker" term="filemaker" />
    <category scheme="http://buzz.beezwax.net/category/filemaker-tips" label="filemaker tips" term="filemaker-tips" />
    <category scheme="http://buzz.beezwax.net/tag/filemaker" term="filemaker" />
    <category scheme="http://buzz.beezwax.net/tag/web" term="web" />
    <category scheme="http://buzz.beezwax.net/tag/publishing" term="publishing" />
    <category scheme="http://buzz.beezwax.net/tag/instant" term="instant" />
    <category scheme="http://buzz.beezwax.net/tag/iwp" term="iwp" />
    <category scheme="http://buzz.beezwax.net/tag/development" term="development" />
    <category scheme="http://buzz.beezwax.net/tag/tips" term="tips" />
    <content type="html">&lt;p&gt;
	FileMaker&amp;#39;s Instant Web Publishing, a.k.a. &amp;quot;IWP&amp;quot;, essentially converts your FileMaker layouts into basic web pages and forms. Yes, your FileMaker database could be accessible through a web browser!&lt;/p&gt;
&lt;p&gt;
	This post is the first in a two-part series designed tol guide you through the process of choosing and implementing FileMaker Instant Web Publishing. Here, in Part I, I&amp;#39;ll cover why and when to consider using IWP. &amp;nbsp;Stay tuned for Part II, which will dig deeper into IWP implementation.&lt;/p&gt;
&lt;h2&gt;
	FileMaker on The Web: Beyond Traditional Deployment&lt;/h2&gt;
&lt;p&gt;
	For workgroup database users, traditional FileMaker deployment is &amp;quot;client-server&amp;quot;. In this setup, each user in a workgroup uses a FileMaker Pro client to connect to FileMaker Server, which hosts the database files. You get FileMaker&amp;#39;s desktop interface, with the full functionality of layout objects, scripts, etc.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;
	However, there are situations where this traditional deployment may not be the best solution. Here are some of those cases:&lt;/p&gt;
&lt;ul&gt;
	&lt;li&gt;
		Not every user has FileMaker Pro software (e.g. users outside your organization)&lt;/li&gt;
	&lt;li&gt;
		Users are far away (e.g. overseas), causing slow connection speeds&lt;/li&gt;
	&lt;li&gt;
		Users have limited bandwidth (again, causing slow connection speeds.)&lt;/li&gt;
	&lt;li&gt;
		Users are accessing via mobile device&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
	Web deployment is one of the primary options for these situations because it allows you to view your database through a web browser instead of the FileMaker client. &amp;nbsp;Web browsers are great because they are now ubiquitous and can be very efficient at transferring data.&lt;/p&gt;
&lt;p&gt;
	[Note, web browsers are not the &lt;em&gt;only&lt;/em&gt; option. Some notable alternatives include terminal services, FileMaker Go, or even an &amp;quot;offline&amp;quot; client that syncs data with the server. But these are also topics for another day.]&lt;/p&gt;
&lt;h2&gt;
	Common Web-Based Interfaces To FileMaker&lt;/h2&gt;
&lt;p&gt;
	FileMaker provides several options for web deployment:&lt;/p&gt;
&lt;ul&gt;
	&lt;li&gt;
		Static Web Pages
		&lt;ul&gt;
			&lt;li&gt;
				Save FileMaker records as HTML pages, then host them from the FileMaker Server web folder, or on another web server&lt;/li&gt;
		&lt;/ul&gt;
	&lt;/li&gt;
	&lt;li&gt;
		Instant Web Publishing
		&lt;ul&gt;
			&lt;li&gt;
				Provides interaction with FileMaker Server* though static web pages and simple forms generated by FileMaker Pro&lt;/li&gt;
		&lt;/ul&gt;
	&lt;/li&gt;
	&lt;li&gt;
		Custom Web Publishing&lt;br /&gt;
		&lt;ul&gt;
			&lt;li&gt;
				Serves data to dynamic web pages via XSLT (being deprecated) or PHP&lt;/li&gt;
			&lt;li&gt;
				FileMaker 11 provides a Site Assistant for both XSLT and PHP to help you generate your pages&lt;/li&gt;
		&lt;/ul&gt;
	&lt;/li&gt;
	&lt;li&gt;
		Using FileMaker as an ODBC data source&lt;/li&gt;
	&lt;li&gt;
		Using FileMaker as an XML data source&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
	You can view FileMaker&amp;#39;s documentation on these options &lt;a href="http://www.filemaker.com/support/technologies/web.html" target="_blank"&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;
	* IWP also works from a single-user copy of FileMaker Pro. Serving your database this way really limits your use of the database, so this article will focus on Server-based solutions.&lt;/p&gt;
&lt;h2&gt;
	Instant Web Publishing&lt;/h2&gt;
&lt;p&gt;
	Instant Web Publishing is often touted as a &amp;ldquo;plug-and-go&amp;rdquo; option of database publishing. In fact, IWP can be turned on with just a few clicks. This ease of deployment is its primary strength.&lt;/p&gt;
&lt;p&gt;
	But with IWP&amp;#39;s ease comes several caveats. It doesn&amp;#39;t give you fully interactive web pages like you may expect; we&amp;#39;re talking about static pages and forms. Your layouts will also&amp;nbsp;need considerable tweaking before you can achieve any polish and ease of use in IWP.&lt;/p&gt;
&lt;p&gt;
	Be aware of the following benefits, costs, limitations and considerations before committing to an IWP deployment.&lt;/p&gt;
&lt;h3&gt;
	Benefits&lt;/h3&gt;
&lt;p&gt;
	FileMaker Pro clients may not be cost-effective or responsive enough when used by users who are distributed geographically. This is especially true over long distances, and when users only need occasional access. Offering users access to your database via Instant Web Publishing allows you to reach more people without the overhead of purchasing dozens of FileMaker clients.&lt;/p&gt;
&lt;p&gt;
	Instant Web Publishing also helps you speed up the user experience by limiting the amount of data that needs to be transferred between the user and your server. IWP is particularly beneficial over other web deployment options in that it gives you all this functionality at a fraction of the price of building a web front-end by scratch.&lt;/p&gt;
&lt;h3&gt;
	Costs&lt;/h3&gt;
&lt;p&gt;
	The primary cost for IWP is the development required to achieve your expected level of polish and usability. While this will likely be less than the cost of a full-scale web development project, it is not negligible. You can easily see the limitations of IWP by enabling IWP in one of your databases.** The first thing you&amp;#39;ll notice is probably that the layouts don&amp;#39;t look quite the same. Accomodating these limitations involves work in the following areas:&lt;/p&gt;
&lt;ul&gt;
	&lt;li&gt;
		Heavily customized layouts (to accomodate different page renderings in IWP)&lt;/li&gt;
	&lt;li&gt;
		Rebuilding UI flow (to work around page refreshes)&lt;/li&gt;
	&lt;li&gt;
		Modified scripts (to address steps incompatible with IWP)&lt;/li&gt;
	&lt;li&gt;
		New scripts (e.g. to support status area functionality)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
	Instant Web Publishing via server also requires FileMaker Server Advanced (as opposed to FileMaker Server). This is&amp;nbsp;not a negligible cost.&lt;/p&gt;
&lt;p&gt;
	** See FileMaker&amp;#39;s &lt;a href="http://www.filemaker.com/support/product/docs/fms/fm11_instant_web_publish_en.pdf" target="_blank"&gt;Instant Web Publishing Guide&lt;/a&gt; for information on how to enable IWP&lt;/p&gt;
&lt;h3&gt;
	Limitations&lt;/h3&gt;
&lt;p&gt;
	Some limitations of Instant Web Publishing:&lt;/p&gt;
&lt;ul&gt;
	&lt;li&gt;
		Performance degradation for multiple users
		&lt;ul&gt;
			&lt;li&gt;
				You may notice the system become less responsive with even a couple of simultaneous users.&lt;/li&gt;
		&lt;/ul&gt;
	&lt;/li&gt;
	&lt;li&gt;
		Fewer UI options&lt;/li&gt;
	&lt;li&gt;
		Minimal or clunky workflows&lt;/li&gt;
	&lt;li&gt;
		Requires FileMaker Server Advanced&lt;br /&gt;
		&lt;ul&gt;
			&lt;li&gt;
				Yes, as previously noted, IWP requires FileMaker Server &lt;em&gt;Advanced &lt;/em&gt;for server deployment;&amp;nbsp;it won&amp;#39;t run with plain-old FileMaker Server.&lt;/li&gt;
		&lt;/ul&gt;
	&lt;/li&gt;
	&lt;li&gt;
		Requires &lt;a href="http://en.wikipedia.org/wiki/Internet_Information_Services" target="_blank"&gt;Internet Information Services&lt;/a&gt; (IIS) to be installed when deployed on Windows&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
	Considerations&lt;/h3&gt;
&lt;p&gt;
	Getting a FileMaker database to appear as functional, well-polished web pages requires some effort. Web pages served through IWP do not behave like a FileMaker Pro client in many respects. FileMaker&amp;#39;s documentation emphasizes the ease of IWP and provides some tips on implementation, but leaves the reader to infer many of the considerations.&lt;/p&gt;
&lt;p&gt;
	Here are some of the challenges you will want to be familiar with before attempting the IWP option. This is not to criticize FileMaker or IWP; think of it rather as a friendly list of cautions.&lt;/p&gt;
&lt;ul&gt;
	&lt;li&gt;
		Pages will be &lt;em&gt;static&lt;/em&gt;&lt;br /&gt;
		&lt;ul&gt;
			&lt;li&gt;
				The entire layout will need to be redrawn pretty much any time the user clicks on something or when first entering a field on the page.&lt;/li&gt;
		&lt;/ul&gt;
	&lt;/li&gt;
	&lt;li&gt;
		Fields and text objects do not look the same in IWP as in FileMaker Pro (client)&lt;br /&gt;
		&lt;ul&gt;
			&lt;li&gt;
				Drop-down menus are treated as pop-up menus (which, honestly, I think are ugly).&lt;/li&gt;
			&lt;li&gt;
				Field sizes will differ from FileMaker. They will likely need to be bigger.&lt;/li&gt;
			&lt;li&gt;
				Appearance and behavior of pages on an iOS device are especially different from the desktop browser.&lt;/li&gt;
		&lt;/ul&gt;
	&lt;/li&gt;
	&lt;li&gt;
		Conditional formatting does not work
		&lt;ul&gt;
			&lt;li&gt;
				This will negate the handy portal row highlighting technique many of us use today.&lt;/li&gt;
		&lt;/ul&gt;
	&lt;/li&gt;
	&lt;li&gt;
		Buttons cannot be placed beneath other layout objects
		&lt;ul&gt;
			&lt;li&gt;
				This means that those buttons you like to place on a portal row will need to be above the fields or include the fields, which can be a real pain.&lt;/li&gt;
		&lt;/ul&gt;
	&lt;/li&gt;
	&lt;li&gt;
		Record commits are handled differently
		&lt;ul&gt;
			&lt;li&gt;
				Any data entry (even when filtering) requires the user to (whether manually or via script) enter &amp;ldquo;Edit Mode&amp;rdquo;, then explicitly commit their changes when finished. Clicking outside a field does not commit the record.&lt;/li&gt;
		&lt;/ul&gt;
	&lt;/li&gt;
	&lt;li&gt;
		You may want to hide the Status Area&lt;br /&gt;
		&lt;ul&gt;
			&lt;li&gt;
				IWP produces a Status Area (much like in FileMaker Pro) at the top of the web page, which might not match your desired aesthetic.&lt;/li&gt;
			&lt;li&gt;
				Removing the Status Area requires you to script all of the functionality for the user.&lt;/li&gt;
		&lt;/ul&gt;
	&lt;/li&gt;
	&lt;li&gt;
		Rendering is very limited
		&lt;ul&gt;
			&lt;li&gt;
				Curved shapes and angled lines do not display properly.&lt;/li&gt;
			&lt;li&gt;
				Icons will display differently. Transparency may be ignored.&lt;/li&gt;
			&lt;li&gt;
				Sizing of objects is not 100% faithful to FileMaker layouts, primarily because of additional weight given to the borders of enterable fields.&lt;/li&gt;
			&lt;li&gt;
				You&amp;#39;ll get best results with very minimalistic layouts.&lt;/li&gt;
		&lt;/ul&gt;
	&lt;/li&gt;
	&lt;li&gt;
		Some scripts steps are not compatible with IWP
		&lt;ul&gt;
			&lt;li&gt;
				When IWP comes across an incompatible script step, it simply halts the script, unless Allow User Abort is set to OFF.&lt;/li&gt;
			&lt;li&gt;
				Notable incompatible script steps include anything adjusting windows or exporting data: Freeze Window, Show Custom Dialog, Print, Enter Preview Mode, etc.&lt;/li&gt;
		&lt;/ul&gt;
	&lt;/li&gt;
	&lt;li&gt;
		Single-window interfaces only&lt;br /&gt;
		&lt;ul&gt;
			&lt;li&gt;
				New windows will appear to replace the current page.&lt;/li&gt;
		&lt;/ul&gt;
	&lt;/li&gt;
	&lt;li&gt;
		Users need to log out&lt;br /&gt;
		&lt;ul&gt;
			&lt;li&gt;
				User sessions will persist unless they press &amp;ldquo;Log Out&amp;rdquo; or a script runs the Exit Application step.&lt;/li&gt;
			&lt;li&gt;
				This is an example of a Status Area feature that needs to be scripted if the Status Area is hidden.&lt;/li&gt;
			&lt;li&gt;
				You may want to devise a process or button that ensures users log out successfully.&lt;/li&gt;
		&lt;/ul&gt;
	&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
	Below are some screenshots that compare the FileMaker and IWP renderings of a simple FileMaker layout. You will see some of the following considerations listed above in play: object transparency loss, rounded FileMaker objects become square, text looks different, conditional formatting lost, etc. Click on the image to see full-sized version.&lt;/p&gt;
&lt;h4&gt;
	Layout rendered in FileMaker (click to expand image)&lt;/h4&gt;
&lt;p&gt;
	&lt;a href="http://buzz.beezwax.net//files/layout_in_filemaker.png"&gt;&lt;img alt="Layout rendered in FileMaker" height="381" src="http://buzz.beezwax.net//files/layout_in_filemaker.png" width="501" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h4&gt;
	Layout rendered in Safari via IWP (click to expand image)&lt;/h4&gt;
&lt;p&gt;
	This is in Edit Mode, which occurs when the user clicks to edit the record. &amp;nbsp;I&amp;#39;ve added some comments to highlight the differences.&lt;/p&gt;
&lt;div&gt;
	&lt;a href="http://buzz.beezwax.net//files/layout_in_iwp_commented.png"&gt;&lt;img alt="Layout rendered in IWP with comments" height="393" src="http://buzz.beezwax.net//files/layout_in_iwp_commented.png" width="500" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;h2 id="tips"&gt;
	Tips&lt;/h2&gt;
&lt;p&gt;
	That&amp;#39;s quite a list, but don&amp;rsquo;t let Instant Web Publishing scare you. It can still be a quick and cost-effective option when the use case is basic data entry or browsing simple lists of records. The layouts in FileMaker&amp;#39;s starter solutions, for example, manage to render quite well in IWP.&amp;nbsp;With some work you can support more complex database functionality, or at least account for how the IWP interface will affect how users interact with your FileMaker database. &amp;nbsp;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;
	Part II of this series will give you some useful tips to ensure you start your next IWP project on the right foot.&lt;/p&gt;


</content>
  </entry>
  <entry>
    <id>urn:uuid:057a0f9e-0c58-411f-a867-091602c13a5b</id>
    <published>2011-03-14T20:35:58Z</published>
    <updated>2012-01-11T21:58:49Z</updated>
    <link type="text/html" href="http://buzz.beezwax.net/2011/03/14/inspector-pro-3-0v2-adds-filemaker-server-and-filemaker-go-support" rel="alternate" />
    <author>
      <name>Jay G</name>
      <email>jay_g@beezwax.net</email>
    </author>
    <title type="html">Inspector Pro 3.0v2 Adds FileMaker Server and FileMaker Go Support </title>
    <content type="html">&lt;p&gt;
	We just made available Inspector Pro 3.0v2, a new version of our tool for analyzing and debugging FileMaker databases. The new functionality in 3.0v2 includes support for FileMaker Server and FileMaker Go.&lt;/p&gt;
&lt;p&gt;
	This update also fixes a few known issues, like digesting large FileMaker Database Design Reports (DDRs).&lt;/p&gt;
&lt;p&gt;
	Here are details about the update:&lt;/p&gt;
&lt;ul&gt;
	&lt;li&gt;
		FileMaker Go Support: Inspector Pro 3.0v2 files can be viewed on iPad using FileMaker Go. (An iPhone would work too, but an iPad is highly recommended for viewing Inspector Pro report layouts).&lt;/li&gt;
	&lt;li&gt;
		Support for FileMaker Server: The report files generated by Inspector Pro are, of course, FileMaker Pro databases. So, this new functionality allows these files to be hosted on FileMaker Server and accessed by multiple developers who each have a copy of Inspector Pro. It&amp;#39;s perfect for the common scenario of a team of developers working on optimizing a large &amp;amp; complex database.&lt;/li&gt;
	&lt;li&gt;
		A fix to allow very large DDR files to be processed. We&amp;#39;re using code libraries for parsing XML that are optimized specifically for each platform: Mac or Windows.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
	If you already own Inspector Pro 3.0 or 3.0v1, you can use the &lt;a href="http://www.beezwax.net/download/inspectorPro"&gt;Download/Demo page&lt;/a&gt; to get the update.&lt;/p&gt;
&lt;p&gt;
	If you want to know more about Inspector Pro 3, &lt;a href="http://www.beezwax.net/solutions/inspectorPro"&gt;here&amp;#39;s the product page&lt;/a&gt; to get you started with info, or a demo.&lt;/p&gt;
&lt;p&gt;
	For a comprehensive &lt;a href="http://inspector.beezwax.net/groups/inspector/wiki/c4ce7/New_in_Inspector_Pro_30v2.html"&gt;list of additions and fixes&lt;/a&gt; in Inspector Pro 3.0v2, check out &lt;a href="http://inspector.beezwax.net/groups/inspector/"&gt;the Wiki&lt;/a&gt;.&lt;/p&gt;


</content>
  </entry>
  <entry>
    <id>urn:uuid:76a93fb5-a6e4-4fb4-9fb2-5a95f4c621dc</id>
    <published>2011-03-14T08:41:34Z</published>
    <updated>2012-01-11T21:58:49Z</updated>
    <link type="text/html" href="http://buzz.beezwax.net/2011/03/14/filemaker-ux-for-developers-pauseonerror" rel="alternate" />
    <author>
      <name>Jay G</name>
      <email>jay_g@beezwax.net</email>
    </author>
    <title type="html">FileMaker UX for Developers at PauseOnError</title>
    <category scheme="http://buzz.beezwax.net/category/filemaker" label="filemaker" term="filemaker" />
    <category scheme="http://buzz.beezwax.net/category/filemaker-resources" label="filemaker resources" term="filemaker-resources" />
    <category scheme="http://buzz.beezwax.net/category/filemaker-tips" label="filemaker tips" term="filemaker-tips" />
    <category scheme="http://buzz.beezwax.net/tag/filemaker" term="filemaker" />
    <category scheme="http://buzz.beezwax.net/tag/user" term="User" />
    <category scheme="http://buzz.beezwax.net/tag/experience" term="Experience" />
    <category scheme="http://buzz.beezwax.net/tag/ux" term="UX" />
    <category scheme="http://buzz.beezwax.net/tag/pauseonerror" term="PauseOnError" />
    <category scheme="http://buzz.beezwax.net/tag/scriptmaker" term="ScriptMaker" />
    <category scheme="http://buzz.beezwax.net/tag/developer" term="developer" />
    <category scheme="http://buzz.beezwax.net/tag/tools" term="tools" />
    <content type="html">&lt;p&gt;
	At PauseOnError, Vincenzo Menanno led the session on FileMaker User Experience (UX) for Developers, brainstorming how to improve the tools we use as FileMaker developers. There were a couple dozen participants, including Heather Winkle, Product Manager for User Experience at FileMaker Inc.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;
	The slides from this presentation are &lt;a href="http://pauseonerror.wikispaces.com/FileMaker+User+experience+for+Developers"&gt;available on the &lt;/a&gt;&lt;a href="http://pauseonerror.wikispaces.com/FileMaker+User+experience+for+Developers"&gt;PauseOnError Wiki&lt;/a&gt;. Vincenzo shared these notes summarizing the session:&lt;/p&gt;
&lt;div style="font-family: Arial, Verdana, sans-serif; font-size: 12px; color: rgb(34, 34, 34); background-color: rgb(255, 255, 255); "&gt;
	&lt;div style="font-family: Arial, Verdana, sans-serif; font-size: 12px; color: rgb(34, 34, 34); background-color: rgb(255, 255, 255); "&gt;
		&lt;div&gt;
			&amp;quot;&lt;em&gt;I tried to frame the FileMaker UX discussion with this notion of little things make a big difference. Two key aspect to any UI -- for end users or developers -- are the notions of finesse and refinement. These links to UX/UI resources and examples were provided to get people inspired:&lt;/em&gt;&lt;/div&gt;
		&lt;div&gt;
			&lt;em&gt;&lt;br /&gt;
			&lt;/em&gt;&lt;/div&gt;
		&lt;div style="margin-left: 40px; "&gt;
			&lt;a href="http://littlebigdetails.com/"&gt;Little Big Details&lt;/a&gt;&lt;/div&gt;
		&lt;div style="margin-left: 40px; "&gt;
			&lt;a href="http://www.ted.com/talks/lang/eng/john_underkoffler_drive_3d_data_with_a_gesture.html"&gt;John Underkoffler @ TED -- on the future of UI&lt;/a&gt; &lt;span class="Apple-style-span" style="color: rgb(83, 1, 0); font-family: Helvetica; "&gt;(around the 8:00 minute mark is 30 second clip that was shown)&lt;/span&gt;&lt;/div&gt;
		&lt;div style="margin-left: 40px; "&gt;
			&lt;span class="Apple-style-span" style="color: rgb(83, 1, 0); "&gt;&lt;a href="http://www.onextrapixel.com/2010/05/21/huge-infographics-design-resources-overview-principles-tips-and-examples/"&gt;Huge Infographics Design Resources&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;
		&lt;div&gt;
			&amp;nbsp;&lt;/div&gt;
		&lt;div&gt;
			&lt;em&gt;The effort to inspire worked, because there were a number of great requests and suggestions which I captured...&lt;/em&gt;&lt;/div&gt;
		&lt;ul&gt;
			&lt;li&gt;
				&lt;div&gt;
					More data visualization tools for developers.&lt;/div&gt;
			&lt;/li&gt;
			&lt;li&gt;
				&lt;div&gt;
					A filtered Relationship Graph where you can locate a table occurence by selecting it in a filter (&lt;span class="Apple-style-span" style="color: rgb(83, 1, 0); font-family: Helvetica; "&gt;Courtesy of Bruce Robertson).&lt;/span&gt;&lt;/div&gt;
			&lt;/li&gt;
			&lt;li&gt;
				&lt;div&gt;
					Mini-graphs attached to layouts to show relationships.&lt;/div&gt;
			&lt;/li&gt;
			&lt;li&gt;
				&lt;div&gt;
					A calculation dialog with a splitter, to be able to see a wider list of functions.&amp;nbsp;&lt;/div&gt;
			&lt;/li&gt;
			&lt;li&gt;
				&lt;div&gt;
					Security perspectives, such as a way to select a privilege and see what kinds of permissions each field has -- without having to dive 4 levels deep into security dialog&lt;/div&gt;
			&lt;/li&gt;
			&lt;li&gt;
				&lt;div&gt;
					Enhancing ScriptMaker as a development environment:&lt;/div&gt;
				&lt;ul&gt;
					&lt;li&gt;
						&lt;div&gt;
							Code folding&lt;/div&gt;
					&lt;/li&gt;
					&lt;li&gt;
						&lt;div&gt;
							Gray out disabled steps&lt;/div&gt;
					&lt;/li&gt;
					&lt;li&gt;
						&lt;div&gt;
							Color code certain steps&lt;/div&gt;
					&lt;/li&gt;
					&lt;li&gt;
						&lt;div&gt;
							&lt;div&gt;
								Find things like variables (anybody remember the tool mentioned that does this?)&lt;/div&gt;
						&lt;/div&gt;
					&lt;/li&gt;
					&lt;li&gt;
						&lt;div&gt;
							&lt;div&gt;
								Calculated break points&lt;/div&gt;
						&lt;/div&gt;
					&lt;/li&gt;
					&lt;li&gt;
						&lt;div&gt;
							Security perspective in ScriptMaker&lt;/div&gt;
					&lt;/li&gt;
					&lt;li&gt;
						&lt;div&gt;
							Write scripts instead of clicking&lt;/div&gt;
					&lt;/li&gt;
				&lt;/ul&gt;
			&lt;/li&gt;
			&lt;li&gt;
				&lt;div&gt;
					Layout development&lt;/div&gt;
			&lt;/li&gt;
			&lt;li&gt;
				&lt;div&gt;
					Ways to deal with multitouch environments.&lt;/div&gt;
			&lt;/li&gt;
			&lt;li&gt;
				&lt;div&gt;
					Transparent layouts - and a way to build augmented reality systems&lt;/div&gt;
			&lt;/li&gt;
		&lt;/ul&gt;
	&lt;/div&gt;
&lt;/div&gt;
&lt;div style="font-family: Arial, Verdana, sans-serif; font-size: 12px; color: rgb(34, 34, 34); background-color: rgb(255, 255, 255); "&gt;
	&lt;div&gt;
		&lt;em&gt;There were many other great ideas -- Script Debugging improvements, color coding and formatting, et. al.. &lt;/em&gt;&lt;em&gt;We only scratched the surface of FileMaker UX possibilities. I encourage developers to spread the discussion, and continue with these ideas on the&amp;nbsp;&lt;a href="http://pauseonerror.wikispaces.com/message/list/FileMaker+User+experience+for+Developers"&gt;PauseOnError discussion board&lt;/a&gt;&amp;nbsp;and other places where we can discuss FileMaker UX for developers. &amp;nbsp;&amp;ndash;Vincenzo&amp;quot;&lt;/em&gt;&lt;/div&gt;
&lt;/div&gt;


</content>
  </entry>
  <entry>
    <id>urn:uuid:f202abe1-0b3f-4a4d-adf7-c624ab11f6f3</id>
    <published>2011-03-08T00:42:00Z</published>
    <updated>2012-01-11T21:58:49Z</updated>
    <link type="text/html" href="http://buzz.beezwax.net/2011/03/08/pauseonerror-the-filemaker-developer-unconference" rel="alternate" />
    <author>
      <name>Jay G</name>
      <email>jay_g@beezwax.net</email>
    </author>
    <title type="html">PauseOnError - the FileMaker developer "Unconference"</title>
    <category scheme="http://buzz.beezwax.net/category/filemaker" label="filemaker" term="filemaker" />
    <category scheme="http://buzz.beezwax.net/category/filemaker-news" label="filemaker news" term="filemaker-news" />
    <category scheme="http://buzz.beezwax.net/category/filemaker-tips" label="filemaker tips" term="filemaker-tips" />
    <category scheme="http://buzz.beezwax.net/tag/pauseonerror" term="PauseOnError" />
    <category scheme="http://buzz.beezwax.net/tag/events" term="events" />
    <category scheme="http://buzz.beezwax.net/tag/community" term="community" />
    <category scheme="http://buzz.beezwax.net/tag/filemaker" term="filemaker" />
    <content type="html">&lt;p&gt;
    In February, four Beez traveled to New York for &lt;a href="http://www.pauseonerror.com"&gt;PauseOnError&lt;/a&gt;, the annual winter gathering of FileMaker developers. PauseOnError runs as an &amp;quot;Unconference&amp;quot;; attendees organize the entire agenda, and work together to support presentations and ad-hoc discussions. This makes for a highly-relevant and participatory experience.&lt;/p&gt;


&lt;p&gt;
    In the third year of PauseOnError, we saw the deepest &lt;a href="http://http://pauseonerror.wikispaces.com/Sessions"&gt;range of discussion topics&lt;/a&gt; related to FileMaker development and consulting: agile, data modeling, testing, FileMaker Go, User Experience, recruiting, business marketing, the FOCUS framework, Web and SQL integration, and more.&lt;/p&gt;


&lt;p&gt;
    Fortunately, there were plenty of the best, brightest and most generous FileMaker experts in attendance. Participants shared their time and tips, not only with other attendees, but also with the world &amp;#8211; via &lt;a href="http://twitter.com/#!/search/%23pauseonerror"&gt;Twitter&lt;/a&gt;, reports to FM User Groups, blog posts, &lt;a href="http://pauseonerror.wikispaces.com/"&gt;the conference Wiki&lt;/a&gt; and other channels.&lt;/p&gt;


&lt;p&gt;
    &lt;object height="300" width="400"&gt; &lt;param name="flashvars" value="offsite=true&amp;amp;lang=en-us&amp;amp;page_show_url=%2Fgroups%2Fpauseonerror%2Fpool%2Fshow%2Fwith%2F3728791078%2F&amp;amp;page_show_back_url=%2Fgroups%2Fpauseonerror%2Fpool%2Fwith%2F3728791078%2F&amp;amp;group_id=1192180@N22&amp;amp;jump_to=3728791078&amp;amp;start_index=" /&gt; &lt;param name="movie" value="http://www.flickr.com/apps/slideshow/show.swf?v=104087" /&gt; &lt;param name="allowFullScreen" value="true" /&gt;&lt;embed allowfullscreen="true" flashvars="offsite=true&amp;amp;lang=en-us&amp;amp;page_show_url=%2Fgroups%2Fpauseonerror%2Fpool%2Fshow%2Fwith%2F3728791078%2F&amp;amp;page_show_back_url=%2Fgroups%2Fpauseonerror%2Fpool%2Fwith%2F3728791078%2F&amp;amp;group_id=1192180@N22&amp;amp;jump_to=3728791078&amp;amp;start_index=" height="300" src="http://www.flickr.com/apps/slideshow/show.swf?v=104087" type="application/x-shockwave-flash" width="400"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;/p&gt;


&lt;p&gt;
    PauseOnError has turned into a much needed late-winter opportunity to connect with our peers in the FileMaker developer community. Our biggest industry conference, &lt;a href="http://www.filemaker.com/developers/devcon/"&gt;FileMaker DevCon&lt;/a&gt;, is always in late summer. Yet, as fast as technology moves, a year between major meetings with the FileMaker world would otherwise be an eternity without PauseOnError.&lt;/p&gt;


&lt;p&gt;
    This year&amp;#39;s PauseOnError event even &amp;quot;sold out&amp;quot; &amp;#8211; or rather, &amp;quot;ran out of space&amp;quot; since it&amp;#39;s a &lt;strong&gt;free&lt;/strong&gt; event. That kind of crowd is a healthy sign for the FileMaker community. The biggest challenge might be accommodating the growth of interest in such a gathering.&lt;/p&gt;


&lt;p&gt;
    Finally, even though PauseOnError is attendee-driven, there is a steering committee that worked hard to bring everyone together. Here&amp;#39;s a big &amp;quot;Thank You&amp;quot; to Molly Connolly, Ernest Koe, Andy Gaunt and John Sindelar. Can&amp;#39;t wait until next year&amp;#39;s event!&lt;/p&gt;


</content>
  </entry>
  <entry>
    <id>urn:uuid:4d27efb3-3031-4d79-919f-6d67d0de7527</id>
    <published>2011-02-25T20:43:18Z</published>
    <updated>2012-01-11T21:58:49Z</updated>
    <link type="text/html" href="http://buzz.beezwax.net/2011/02/25/charting-from-the-active-field" rel="alternate" />
    <author>
      <name>Will M. Baker</name>
      <email>will_b@beezwax.net</email>
    </author>
    <title type="html">Charting from the Active Field</title>
    <category scheme="http://buzz.beezwax.net/category/filemaker" label="filemaker" term="filemaker" />
    <content type="html">&lt;p&gt;
	Neither I nor my client can anticipate every chart that the solution&amp;#39;s users might want to see. A user&amp;#39;s desire to view a high-level visual representation of their data can be spontaneous and idiosyncratic. This technique allows for the user to create an ad hoc chart, albeit within narrow parameters (i.e. the chart is simple, presents only counts of values, and is pre-formatted).&lt;/p&gt;
&lt;p&gt;
	&amp;nbsp;&lt;/p&gt;
&lt;p&gt;
	&lt;a href="http://buzz.beezwax.net/files/ChartActiveField.m4v"&gt;Movie (click to download)&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;
	&lt;a href="http://buzz.beezwax.net/files/ChartActiveField.fp7.zip"&gt;FileMaker File (click to download)&lt;/a&gt;&lt;/p&gt;&lt;p&gt;
	&amp;nbsp;&lt;/p&gt;
&lt;p&gt;
	&lt;strong&gt;Components&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
	&lt;li&gt;
		Summary field. Each table needs a field called TABLE::SUMMARY to allow its data to be summarized.&lt;/li&gt;
	&lt;li&gt;
		Chart object. Displaying delimited data from global variables.&lt;/li&gt;
	&lt;li&gt;
		Script. Sorts the found set by the active field, then gathers counts of the records in each sub-summarized group. By using the GetSummary function, we avoid needing sub-summarized parts on the layout. (Credit to Bob Bowers of Soliant Consulting for bringing this summary-gathering technique to my attention.)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
	&amp;nbsp;&lt;/p&gt;
&lt;p&gt;
	&lt;strong&gt;Gotchas&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
	&lt;li&gt;
		Mac OS only. Uses an AppleScript to sort the records. Because we&amp;#39;re leveraging the active field, we have built-in assurance that the sort field is on the layout.&lt;/li&gt;
	&lt;li&gt;
		The script assumes the summary field is called SUMMARY.&lt;/li&gt;
	&lt;li&gt;
		As is, the script only supports charting a field whose table occurrence matches that of the layout&amp;#39;s context. The script must be enhanced to support charting data from a related field (and there would be further behavior considerations).&lt;/li&gt;
	&lt;li&gt;
		Multiple instances of the chart, charting different data, cannot be viewed simultaneously. Running the script on a new field will stomp the values visible in any open chart.&lt;/li&gt;
	&lt;li&gt;
		As the found count increases, the sort requires more time to execute. With 1,000,000 records on a local file, the sort requires 32.7 microseconds to complete.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
	&lt;img alt="" height="918" src="http://buzz.beezwax.net//files/ChartActiveField.png" width="895" /&gt;&lt;/p&gt;


</content>
  </entry>
  <entry>
    <id>urn:uuid:a02d5b43-03ce-4851-8648-2e47716beb38</id>
    <published>2011-02-25T18:57:42Z</published>
    <updated>2012-01-11T21:58:49Z</updated>
    <link type="text/html" href="http://buzz.beezwax.net/2011/02/25/area-disclosure-in-filemaker-using-sub-summary-parts" rel="alternate" />
    <author>
      <name>Will M. Baker</name>
      <email>will_b@beezwax.net</email>
    </author>
    <title type="html">Area Disclosure in FileMaker Using Sub-Summary Parts</title>
    <category scheme="http://buzz.beezwax.net/category/filemaker" label="filemaker" term="filemaker" />
    <link type="video/x-m4v" length="2436727" title="Area Disclosure in FileMaker Using Sub-Summary Parts" rel="enclosure" href="http://buzz.beezwax.net/files/DisclosureAreas2_-_Computer.m4v" />
    <link type="application/octet-stream" length="163840" title="Area Disclosure in FileMaker Using Sub-Summary Parts" rel="enclosure" href="http://buzz.beezwax.net/files/DisclosureAreas2.fp7" />
    <content type="html">&lt;p&gt;
    The attached file demonstrates a technique for opening/closing areas of a record, allowing a user to hide the information they don&amp;#39;t want to see.&lt;/p&gt;


&lt;p&gt;
    &amp;nbsp;&lt;/p&gt;


&lt;p&gt;
    &lt;a href="http://buzz.beezwax.net/files/DisclosureAreas2_-_Computer.m4v"&gt;Movie (click to download)&lt;/a&gt;&lt;/p&gt;


&lt;p&gt;
    &lt;a href="http://buzz.beezwax.net/files/DisclosureAreas2.fp7.zip"&gt;FileMaker File (click to download)&lt;/a&gt;&lt;/p&gt;


&lt;p&gt;
    &amp;nbsp;&lt;/p&gt;


&lt;p&gt;
    &lt;strong&gt;Key Components&lt;/strong&gt;:&lt;/p&gt;


&lt;ul&gt;
    &lt;li&gt;
        Sub-summary parts. This is the essential ingredient. FileMaker conditionally shows and hides these parts depending on the current sort criteria, doing the heavy lifting for us.&lt;/li&gt;
    &lt;li&gt;
        Sort fields. Each sub-summary part must be sorted by a unique field. We don&amp;#39;t really care what the value of the field is, so I&amp;#39;ve leveraged the spacer fields that we typically have hanging around anyway (to separate different types of fields in the field list). Renaming these with a number component helps make the button parameters more readable.&lt;/li&gt;
    &lt;li&gt;
        Sort script. FileMaker doesn&amp;#39;t allow us to sort by indirection, which can make for a convoluted conditional branching statement to effect our desired sort. Luckily, on the Mac OS we can employ AppleScripting to build more dynamic sort statements.&lt;/li&gt;
    &lt;li&gt;
        Drag-and-drop. This technique has been evolving in the community since the introduction of script triggers. The nuance here is that we&amp;#39;re dragging from one part to another, rather than from one record to another.&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;
    &amp;nbsp;&lt;/p&gt;


&lt;p&gt;
    &lt;strong&gt;Gotchas&lt;/strong&gt;:&lt;/p&gt;


&lt;ul&gt;
    &lt;li&gt;
        Mac OS only, since the solution employs AppleScripting.&lt;/li&gt;
    &lt;li&gt;
        The sort fields must be on the layout for the AppleScript to work. I&amp;#39;ve stacked these together in the top-right corner of the layout.&lt;/li&gt;
    &lt;li&gt;
        The sub-summary parts need to either be all leading, or all trailing, otherwise the drag-and-drop won&amp;#39;t work when dragging from leading to trailing, and vice versa.&lt;/li&gt;
    &lt;li&gt;
        Sub-summaries only work in List and Table views. Since what we really want is Form view, I&amp;#39;ve isolated a single record with the opening script, and displayed it in List view. A custom menu prevents the user from toggling views. The next step (not present in this solution) would be to override the record navigation, allowing the user to quickly hop from record to record, but without having more than one record in the found set.&lt;/li&gt;
    &lt;li&gt;
        I&amp;#39;ve used Substitute as my function of choice to quickly swap field names in and out of the list of sort fields. This means the field names cannot be pattern matches of each other (e.g. MY_FIELD_1 and MY_FIELD_11 would pose a problem). My leading and trailing underscores in the field name solves this issue.&lt;/li&gt;
    &lt;li&gt;
        The drag-and-drop container sits behind the disclosure buttons. If the user clicks on the container and then tries to click the overlaying disclosure button, nothing will happen. An OnTimer script helps to ensure that the user&amp;#39;s cursor doesn&amp;#39;t linger in the enterable container field.&lt;/li&gt;
    &lt;li&gt;
        Custom functions are great! Much of the utility functionality has been abstracted into custom functions, such as the parameter passing (courtesy of SixFriedRice), so be careful when you copy and paste elements, as you&amp;#39;ll need to copy the functions first.&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;
    &lt;img alt="" height="787" src="http://buzz.beezwax.net//files/DisclosureAreas2.png" width="795" /&gt;&lt;/p&gt;


</content>
  </entry>
  <entry>
    <id>urn:uuid:a1de3ea7-e2a8-4155-b7c9-02f928bb21a1</id>
    <published>2011-02-04T01:35:36Z</published>
    <updated>2012-01-11T21:58:49Z</updated>
    <link type="text/html" href="http://buzz.beezwax.net/2011/02/04/port-forward-for-a-cisco-asa-using-asdm" rel="alternate" />
    <author>
      <name>simon</name>
      <email>simon_b@beezwax.net</email>
    </author>
    <title type="html">Port forward for a Cisco ASA using ASDM</title>
    <content type="html">&lt;p&gt;
	I wanted to quickly create a firewall port forward (AKA NAT rule) for the Terminal Services port on a Cisco ASA 5505. Since it had initially been setup using ASDM, it seemed natural to also create the port forward this way.&lt;/p&gt;
&lt;p&gt;
	Unfortunately, my first few attempts didn&amp;#39;t work. Some searching only turned up examples using an older method that no longer works with newer software. In the end, I think the mistake I was making was in the very first step -- the originating interface should be &lt;strong&gt;inside&lt;/strong&gt;, not the&amp;nbsp;&lt;strong&gt;outside&lt;/strong&gt; interface. Here&amp;#39;s the exact steps I took to create this.&lt;/p&gt;
&lt;p&gt;
	&amp;nbsp;&lt;/p&gt;
&lt;h4&gt;
	Create NAT Rule&lt;/h4&gt;
&lt;ul&gt;
	&lt;li&gt;
		Click &lt;strong&gt;Configuration&lt;/strong&gt; (top)&lt;/li&gt;
	&lt;li&gt;
		Click &lt;strong&gt;Firewall&lt;/strong&gt; (bottom-left)&lt;/li&gt;
	&lt;li&gt;
		Click &lt;strong&gt;NAT Rules&lt;/strong&gt; (middle-left)&lt;/li&gt;
	&lt;li&gt;
		Select &lt;strong&gt;Add-&amp;gt;Static NAT Rule&lt;/strong&gt;&lt;/li&gt;
	&lt;li&gt;
		Original&lt;br /&gt;
		&lt;ul&gt;
			&lt;li&gt;
				Interface: &lt;strong&gt;inside&lt;/strong&gt;&lt;/li&gt;
			&lt;li&gt;
				Source: &lt;strong&gt;192.168.0.99&lt;/strong&gt;&lt;/li&gt;
		&lt;/ul&gt;
	&lt;/li&gt;
	&lt;li&gt;
		Translated&lt;br /&gt;
		&lt;ul&gt;
			&lt;li&gt;
				Interface: &lt;strong&gt;Outside&lt;/strong&gt;&lt;/li&gt;
			&lt;li&gt;
				Select &lt;strong&gt;Use Interface IP Address&lt;/strong&gt;&lt;/li&gt;
		&lt;/ul&gt;
	&lt;/li&gt;
	&lt;li&gt;
		Port Address Translation (PAT)&lt;br /&gt;
		&lt;ul&gt;
			&lt;li&gt;
				Check &lt;strong&gt;Enable Port Address Translation (PAT)&lt;/strong&gt;&lt;/li&gt;
			&lt;li&gt;
				Protocol: &lt;strong&gt;TCP&lt;/strong&gt;&lt;/li&gt;
			&lt;li&gt;
				Original Port: &lt;strong&gt;3389&lt;/strong&gt;&lt;/li&gt;
			&lt;li&gt;
				Translated Port: &lt;strong&gt;3389&lt;/strong&gt;&lt;/li&gt;
		&lt;/ul&gt;
	&lt;/li&gt;
	&lt;li&gt;
		Click OK&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;
	Create Access Rule&lt;/h4&gt;
&lt;ul&gt;
	&lt;li&gt;
		Click &lt;strong&gt;Access Rules&lt;/strong&gt;&lt;/li&gt;
	&lt;li&gt;
		Select &lt;strong&gt;Add-&amp;gt;Add Access Rule&lt;/strong&gt;&lt;br /&gt;
		&lt;ul&gt;
			&lt;li&gt;
				Interface: &lt;strong&gt;outside&lt;/strong&gt;&lt;/li&gt;
			&lt;li&gt;
				Action: &lt;strong&gt;Permit&lt;/strong&gt;&lt;/li&gt;
			&lt;li&gt;
				Source: &lt;strong&gt;any&lt;/strong&gt;&lt;/li&gt;
			&lt;li&gt;
				Destination: &lt;strong&gt;111.111.111.111&lt;/strong&gt;&amp;nbsp;&amp;nbsp; &amp;lt;- the address of your WAN interface&lt;/li&gt;
			&lt;li&gt;
				Service: &lt;strong&gt;tcp/3389&lt;/strong&gt;&lt;/li&gt;
			&lt;li&gt;
				Enable Logging: &lt;strong&gt;unchecked&lt;/strong&gt;&lt;/li&gt;
		&lt;/ul&gt;
	&lt;/li&gt;
&lt;/ul&gt;


</content>
  </entry>
</feed>

