Showing posts with label Stonefield Query. Show all posts
Showing posts with label Stonefield Query. Show all posts

Thursday, January 11, 2018

Stonefield Query for AccountMate webinars

Stonefield is presenting a webinar for AccountMate Business Partners on Stonefield Query for AccountMate and our new ClickBase competitive upgrade on Wednesday, January 17, 2018 at 1:00 Eastern. Register today on the AccountMate Business Partner web site.

We are also presenting a webinar for AccountMate users on Stonefield Query for AccountMate and our new ClickBase competitive upgrade on Wednesday, February 7, 2018 at 1:00 Eastern. Register today at https://www.accountmate.com/education/webcasts.asp

Tuesday, November 07, 2017

Issue Accessing Microsoft Excel Spreadsheets

A Windows update on October 10, 2017 caused the Microsoft Excel ODBC driver (specifically, the “Microsoft Excel Driver (*.xls)” driver) to stop working correctly. Many of our customers use the ODBC driver to report on Excel data in Stonefield Query, including combining data stored in Excel with data stored in traditional databases such as Microsoft SQL Server in a single report, something Stonefield Query can easily do.

The solution is to use the “Microsoft Excel Driver (*.xls, *.xlsx, *.xlsm, *.xlsb)” driver instead. However, this requires installing the latest Microsoft Access Database Engine components, which you can download from https://www.microsoft.com/en-ca/download/details.aspx?id=13255.

Thursday, February 12, 2015

Blog Posts on Improving Performance in Stonefield Query

I posted a couple of entries today on the Stonefield Query blog about improving the performance of calculated fields and formulas. If you’re a Stonefield Query customer, I strongly recommend checking them out as they can improve the performance of your reports by orders of magnitude for not a lot of work:

Improving the Performance of Calculated Fields and Formulas, Part 1

Improving the Performance of Calculated Fields and Formulas, Part 2

Wednesday, February 04, 2015

Making TaskScheduler More Useful

A long time ago, I blogged about a couple of classes I wrote to schedule tasks using the Windows Task Scheduler. We use these classes in Stonefield Query to schedule report runs.

Recently, I add a few methods to the VistaTaskScheduler class (so named because it works using the Task Scheduler 2.0 API, which was added starting in Windows Vista; it works in Windows 7, 8, 8.1, and I’m guessing 10 as well) to enumerate tasks (GetTask), get a specific task (GetTask), and delete a task (DeleteTask). I added these because we’re adding a Scheduled Tasks dialog in the next version of Stonefield Query that’ll allow you to see which reports you’ve scheduled, see when the last time a schedule was run and what the result was, edit the settings of a schedule, and delete a schedule, all without having to open the Windows Task Scheduler.

You can download the updated code from the Technical Papers page of my web site.

Wednesday, May 07, 2014

Stonefield Query Enterprise

Stonefield Software Inc. is excited to announce the release of Stonefield Query Enterprise, the newest version of our award-winning Stonefield Query product line.

Stonefield Query Enterprise is a complete rewrite from scratch using the C# language for the back-end engine components and ASP.NET MVC for the web front-end. The new version allows us to take advantage of the latest technologies.

Here are some of the features of this new product:

  • Web UI: the current version of Stonefield Query is a desktop application. While it works great for the over 200,000 people using Stonefield Query, many of you want reporting for your web applications. Stonefield Query Enterprise gives you that solution.
  • New reporting features: Stonefield Query Enterprise has many new features that are difficult or impossible to add to the current version. Some of these new features include:

    • Support for sub-reports
    • Displaying HTML and rich text with full formatting
    • Availability of other types of controls such as bar codes, QR codes, and check boxes
    • Sorting on group totals
    • Support for multiple column fields in cross-tab reports
    • Better localization of reports: headings appear in the language of the user running the report, not the one who created it
    • And many other great new features
  • Rich API: every aspect of Stonefield Query Enterprise is exposed through our API. This makes it dead simple to integrate with your own application. You can create and run reports programmatically, manage security, or dynamically update the data dictionary as necessary.
  • Extendible: you’ve always been able to extend and control the features of Stonefield Query through scripting. In Stonefield Query Enterprise, plugins take this to the next level. Because plugins have full access to the Stonefield Query object model, you can customize Stonefield Query Enterprise in ways you could only dream of before.
  • Support for multi-tenant applications: Stonefield Query Enterprise was designed to work in a multi-tenant environment. Whether you have one database with row-level security for all customers or one database per customer, Stonefield Query Enterprise has you covered. Users can only see the records and reports for their own company. Of course, it works just fine in a single customer environment too.
  • Updated Stonefield Query Studio: the developer part of Stonefield Query got a facelift too. It integrates with your custom plugins and functions so they’re available for expressions. Join trees give you fine control over how indirectly related tables are joined. You can now preview the contents of calculated fields and virtual tables and test joins between real and virtual tables. Value converters, either built-in or your own, change how the contents of a field appears in a report.
  • Source code: we provide the source code for the web UI, allowing you to customize it to suit your needs. Changes can be a simple as altering styles in CSS files for a different look to changing controllers and views for different workflow or implementing different security rules.

Of course, Stonefield Query Enterprise still has the features that made Stonefield Query one of the few true user reporting solutions available, including:

  • Ease-of-use: Your users don't have to know what a join is, let alone how to create a join for a particular set of tables. They don't have to know the names of tables and fields. They don't have to know how the data is stored. They simply tell Stonefield Query what they want and it figures out how to get the data they need. The simple “wizard” interface allows them to create reports in minutes, not hours.
  • Report scheduling: Create as many schedules to run as many reports at any time as you wish, making report deployment a snap.
  • Multi-database support: Stonefield Query can run reports on data stored in different databases, even if they use different engines. For example, you can create a report that shows customer information from a Microsoft SQL Server database and project information from an Oracle database. Create consolidation reports that pull, for example, invoices from different company databases onto a single report.
  • Configurable: Customize Stonefield Query for your application. The data dictionary describes what the databases Stonefield Query can access look like: the tables, fields, and relationships between the tables; captions for tables and fields; output formatting for fields; and so on. Customize the behavior of Stonefield Query by changing configuration settings, such as whether users can schedule reports.
  • Brandable: Easily create a private labeled or branded version of Stonefield Query. This allows you to distribute Stonefield Query as your own branded product, so your users won't know it's Stonefield Query from Stonefield Software; they'll think it's something you created just for them. This also allows you to sell your branded version for whatever price fits your business model.
  • Localizable: Stonefield Query is fully localizable. Every dialog caption and message displayed to the user in Stonefield Query is defined in resource files. You can easily create multi-lingual versions of Stonefield Query, with each user working in the language they're most comfortable with.

Check out Stonefield Query Enterprise today. If you want to try it with your own data, download the demo from http://stonefieldquery.com/ (choose “Web version” from the Download menu). If you’d rather try out the report designer without installing anything, click the “Try it now” button at http://stonefieldquery.com/ to run the demo on our web site against the famous Northwind sample database.

Updated Web Site

Stonefield Query isn’t a single product; rather, it’s a family of products. On one hand, we have customized versions for specific applications, such as Stonefield Query for Sage 300 and Stonefield Query for ACT!. On the other, we have the Stonefield Query SDK, which any developer or consultant can use to create a customized reporting solution for any application. (In fact, we used the SDK to create the customized versions.) Unfortunately, that made our web site a bit of a mixed bag: we had to make it useful to two different audiences, which led to some awkward navigation. As a result, we’ve split the site into two:

Links in the Solutions menu of both sites take you to the other one.

We also used this as an opportunity to revamp the site, making it more modern and responsive on mobile devices.

Check out the new sites and let us know what you think; your feedback is important to us and much appreciated.

Thursday, October 03, 2013

New Version of Stonefield Query Unveiled at Southwest Fox

At one of the Southwest Fox bonus sessions on Friday night after the dinner party, I’m going to show the new version of Stonefield Query. Over two years in development, this is a complete rewrite in C#. Although we’ll eventually have a desktop version as well, the first release will be our web front-end. If you’re interested in seeing the future of Stonefield Query, even if you’re not currently using it, and you’re going to Southwest Fox, be sure to attend this session.

Friday, December 14, 2012

When a Comma Isn’t

Stonefield Query has the ability to output reports to a CSV file. “CSV” is an abbreviation for “comma-separated values”, meaning there’s a comma between each value (which represents a field) in a row (which represents a record). Except when it’s supposed to be something else.

We recently had a customer in France report that when they output a report to CSV and then opened it in Microsoft Excel, numeric values didn’t come out right. I figured it was likely a regional setting, so I used the Control Panel Region and Language applet to change my setting to French (France) and voila (appropriate word choice, non?), was able to reproduce the problem. I thought perhaps the issue was that Excel didn’t like the fact that in France, a comma is used as a decimal separator, but changing a value like “45,25” to “45.25” didn’t fix the problem. Then I notice something I hadn’t noticed or heard of before: in the Customize Format dialog (click the Additional Settings button on the Formats tab of the Region and Language dialog), there’s a “list separator” setting. We in North America (and probably other places too) are used to having it be a comma, but for France, it’s a semi-colon.

image

Changing the CSV output to use a semi-colon instead of a comma for the separator fixed the problem. However, how to get the current value of the list separator? While VFP has functions to determine some of the user’s regional settings, such as SET(‘POINT’) (the character used for the decimal separator) and SET(‘SEPARATOR’) (the character used for the thousand separator), it doesn’t have one for this. Google turned up a few references to the Window API GetLocaleInfo function, but for some reason, that just gave me a blank rather than the expected comma or semi-colon. Fortunately, another site mentioned that it’s stored in the Windows Registry in the sList key of HKEY_CURRENT_USER\Control Panel\International.

So, now you can output a CSV file from Stonefield Query and while the “C” in “CSV” may not be accurate, the file is.

Thursday, December 06, 2012

Stonefield Query SDK Version 4.3

We are pleased to announce the release of version 4.3 of the Stonefield Query SDK. See the Stonefield Query blog for details on new features.

Monday, September 10, 2012

Use Passive FTP

Stonefield Query has a built-in automatic update feature. It basically works like this:

  • Once every X days (where X is configurable by the user), download an XML file from our web server. The file contains the update version number, a list of files to download and install, and HTML describing the changes.
  • If the update version number is newer than the current version number, display the changes to the user and ask if they want to download it.
  • If they do, download and install the files listed in the XML file.

The last step is a little complicated. First, you obviously can’t overwrite the running EXE. Second, in Windows Vista and later, you can’t even write to the program folder without elevating privileges. We take care of that as follows:

  • Download the files to the user’s temporary files folder (which is writable).
  • Using ShellExecute with the “RunAs” parameter, launch an updater EXE and display the User Account Control (UAC) dialog requesting permission to elevate.
  • Quit so the main EXE is no longer running.
  • Have the updater EXE copy the downloaded files to the program folder, unzipping or running a setup program as necessary.
  • Have the updater EXE run the main EXE and then quit itself.

This has normally worked just fine. However, recently we had reports that Stonefield Query would take a long time to start for some users. We have great diagnostics built into Stonefield Query, so we quickly determined that the update checking, which runs at startup, was taking five minutes to execute. That sounded a lot like a timeout, which we confirmed by adding additional diagnostics to the FTP process. Another clue was that the problem only seemed to happen on Windows Server 2008 systems. Once again proving that Google is my friend, I found several possible solutions. The one that seemed most promising was to use passive mode for FTP transfers. Since I use Rick Strahl’s West Wind Client Tools, implementing this was easy: set the wwFTP object’s lPassiveFTP property to .T. Since we ourselves have a Windows Server 2008 server, it was easy to reproduce the problem and confirm that this fixed it.

Once again, Google and Rick save my bacon.

Thursday, December 08, 2011

Using Google Translate from VFP

Stonefield Query is a localizable application: all strings displayed to the user are stored in a resource file and we provide a resource editor that allows a developer to translate the strings into other languages. This means that someone has to do the translation into a particular language and keep it update to date when we release a new version, which as you can guess is a lot of work.

Inspired by Christof Wollenhaupt’s Googlefy Your Apps session at Southwest Fox 2011, I looked at using the Google Translate API to automate the translation process and allow us to translate into more languages than have currently been done. It actually turned out to be pretty easy.

First, you have to sign up for a Google account. The Translate API isn’t free but it isn’t very expensive: $20 for 1 million characters. After you’ve enabled the API, you’re assigned a key that has to be passed to the API on every call.

The API uses REST, which is a fancy of way of saying that the parameters are passed as part of a URL. Here’s an example:

https://www.googleapis.com/language/translate/v2?key=INSERT-YOUR-KEY&q=hello%20world&source=en&target=de

This tells the API to translate “hello world” (the encoded text in the “q” parameter) from English (“en” in the source parameter) to German (“de” in the target parameter). It returns the result as JSON:

{ "data": { "translations": [ { "translatedText": "Hallo Welt" } ] } }

To access the API from VFP code, use Craig Boyd’s VFPConnection library. Below is a function that does all the work. Pass it the text to translate and the source and target languages (spelled out, such as “English” and “German”) and it returns either the translated text if it succeeded, null if the language is invalid, or blank if the translation failed. This function supports all of the languages the Translate API supports. Note: replace the assignment to lcKey with your Google API key.

Automatic translation may not be quite as good as manual translation because it doesn’t necessarily use the same colloquialisms a native speaker would. However, it’s an excellent starting point; someone can use the Resource Editor to tweak any strings to the proper translation.

lparameters tcPhrase, ;
    tcFromLanguage, ;
    tcToLanguage
local lcKey, ;
    lcPhrase, ;
    lcFromLanguage, ;
    lcToLanguage, ;
    lcURL, ;
    lcResult, ;
    lcTranslate

* Specify the Google API key.

lcKey = 'PUT YOUR KEY HERE'

* HTML encode the phrase to translate.

lcPhrase = Encode(tcPhrase)

* Get the language codes.

lcFromLanguage = GetLanguage(tcFromLanguage)
if empty(lcFromLanguage)
    return .NULL.
endif empty(lcFromLanguage)
lcToLanguage = GetLanguage(tcToLanguage)
if empty(lcToLanguage)
    return .NULL.
endif empty(lcToLanguage)

* Set up VFPConnection.

set library to VFPConnection.FLL

* Call Google Translate and return the result.

lcURL       = 'https://www.googleapis.com/language/translate/v2' + ;
    '?key=' + lcKey + ;
    '&q=' + lcPhrase + ;
    '&source=' + lcFromLanguage + ;
    '&target=' + lcToLanguage
lcResult    = HTTPSToStr(lcURL)
lcTranslate = ''
if not empty(lcResult)
    lcTranslate = strconv(strextract(lcResult, '"translatedText": "', '"'), 11)
endif not empty(lcResult)
return lcTranslate


function Encode(tcString)
local lcString
lcString = strtran(tcString, '<', '&lt;')
lcString = strtran(lcString, '>', '&gt;')
lcString = strtran(lcString, '"', '&quot;')
lcString = strtran(lcString, '&', '&amp;')
lcString = strtran(lcString, ' ', '%20')
lcString = strtran(lcString, '?', '%3F')
return lcString


procedure GetLanguage(tcLanguage)
local laLanguages[52, 2], ;
    lnLanguage, ;
    lcLanguage
laLanguages[ 1, 1] = 'Afrikaans'
laLanguages[ 1, 2] = 'af'

laLanguages[ 2, 1] = 'Albanian'
laLanguages[ 2, 2] = 'sq'

laLanguages[ 3, 1] = 'Arabic'
laLanguages[ 3, 2] = 'ar'

laLanguages[ 4, 1] = 'Belarusian'
laLanguages[ 4, 2] = 'be'

laLanguages[ 5, 1] = 'Bulgarian'
laLanguages[ 5, 2] = 'bg'

laLanguages[ 6, 1] = 'Catalan'
laLanguages[ 6, 2] = 'ca'

laLanguages[ 7, 1] = 'Chinese Simplified'
laLanguages[ 7, 2] = 'zh-CN'

laLanguages[ 8, 1] = 'Chinese Traditional'
laLanguages[ 8, 2] = 'zh-TW'

laLanguages[ 9, 1] = 'Croatian'
laLanguages[ 9, 2] = 'hr'

laLanguages[10, 1] = 'Czech'
laLanguages[10, 2] = 'cs'

laLanguages[11, 1] = 'Danish'
laLanguages[11, 2] = 'da'

laLanguages[12, 1] = 'Dutch'
laLanguages[12, 2] = 'nl'

laLanguages[13, 1] = 'English'
laLanguages[13, 2] = 'en'

laLanguages[14, 1] = 'Estonian'
laLanguages[14, 2] = 'et'

laLanguages[15, 1] = 'Filipino'
laLanguages[15, 2] = 'tl'

laLanguages[16, 1] = 'Finnish'
laLanguages[16, 2] = 'fi'

laLanguages[17, 1] = 'French'
laLanguages[17, 2] = 'fr'

laLanguages[18, 1] = 'Galician'
laLanguages[18, 2] = 'gl'

laLanguages[19, 1] = 'German'
laLanguages[19, 2] = 'de'

laLanguages[20, 1] = 'Greek'
laLanguages[20, 2] = 'el'

laLanguages[21, 1] = 'Hebrew'
laLanguages[21, 2] = 'iw'

laLanguages[22, 1] = 'Hindi'
laLanguages[22, 2] = 'hi'

laLanguages[23, 1] = 'Hungarian'
laLanguages[23, 2] = 'hu'

laLanguages[24, 1] = 'Icelandic'
laLanguages[24, 2] = 'is'

laLanguages[25, 1] = 'Indonesian'
laLanguages[25, 2] = 'id'

laLanguages[26, 1] = 'Irish'
laLanguages[26, 2] = 'ga'

laLanguages[27, 1] = 'Italian'
laLanguages[27, 2] = 'it'

laLanguages[28, 1] = 'Japanese'
laLanguages[28, 2] = 'ja'

laLanguages[29, 1] = 'Korean'
laLanguages[29, 2] = 'ko'

laLanguages[30, 1] = 'Latvian'
laLanguages[30, 2] = 'lv'

laLanguages[31, 1] = 'Lithuanian'
laLanguages[31, 2] = 'lt'

laLanguages[32, 1] = 'Macedonian'
laLanguages[32, 2] = 'mk'

laLanguages[33, 1] = 'Malay'
laLanguages[33, 2] = 'ms'

laLanguages[34, 1] = 'Maltese'
laLanguages[34, 2] = 'mt'

laLanguages[35, 1] = 'Norwegian'
laLanguages[35, 2] = 'no'

laLanguages[36, 1] = 'Persian'
laLanguages[36, 2] = 'fa'

laLanguages[37, 1] = 'Polish'
laLanguages[37, 2] = 'pl'

laLanguages[38, 1] = 'Portuguese'
laLanguages[38, 2] = 'pt'

laLanguages[39, 1] = 'Romanian'
laLanguages[39, 2] = 'ro'

laLanguages[40, 1] = 'Russian'
laLanguages[40, 2] = 'ru'

laLanguages[41, 1] = 'Serbian'
laLanguages[41, 2] = 'sr'

laLanguages[42, 1] = 'Slovak'
laLanguages[42, 2] = 'sk'

laLanguages[43, 1] = 'Slovenian'
laLanguages[43, 2] = 'sl'

laLanguages[44, 1] = 'Spanish'
laLanguages[44, 2] = 'es'

laLanguages[45, 1] = 'Swahili'
laLanguages[45, 2] = 'sw'

laLanguages[46, 1] = 'Swedish'
laLanguages[46, 2] = 'sv'

laLanguages[47, 1] = 'Thai'
laLanguages[47, 2] = 'th'

laLanguages[48, 1] = 'Turkish'
laLanguages[48, 2] = 'tr'

laLanguages[49, 1] = 'Ukrainian'
laLanguages[49, 2] = 'uk'

laLanguages[50, 1] = 'Vietnamese'
laLanguages[50, 2] = 'vi'

laLanguages[51, 1] = 'Welsh'
laLanguages[51, 2] = 'cy'

laLanguages[52, 1] = 'Yiddish'
laLanguages[52, 2] = 'yi'

lnLanguage = ascan(laLanguages, tcLanguage, -1, -1, 1, 15)
if lnLanguage > 0
    lcLanguage = laLanguages[lnLanguage, 2]
else
    lcLanguage = ''
endif lnLanguage > 0
return lcLanguage

Tuesday, November 08, 2011

Southwest Fox 2011, Day 2

Thursday started at my usual time of 5 am. After setting out sign boards for the session rooms and registering a few newly-arrived attendees, I had breakfast and went to the first session, Eric Selje’s Lightswitch for VFP Developers. Eric did a great job explaining what Lightswitch is (a tool for rapidly developing Silverlight applications) and showing the basics of developing a Lightswitch application.

I was going to go to Steve Bodnar’s jQueryUI session next but ended up chatting with a couple of the new exhibitors, Basis and Alpha Five, about their products. Fortunately, I’d seen Steve present this session in January. In fact, his presentation inspired me to add new features to the SWFox web site, including the menu and the accordion control on the session pages.

My Developing VFP Applications for Windows 7 session was next. The first half of the session was similar to the Windows Vista session I presented four years earlier, but updated for Windows 7 and with more things I’ve learned about Windows security and virtualization since then. The second half focused on how to implement Windows 7 features in your VFP application, especially related to the Windows 7 Taskbar. I showed how I’ve implemented these features in a real-world application (Stonefield Query) using Steve Ellenoff’s Win7TLib VFPX project, including the actual code to implement those features.

After a very tasty lunch (the food at the Legado is so good, several people commented on Twitter recently about how much weight they gained!), I went to Steve Black’s Looking Back session. Although I don’t work on the type of applications Steve does, it was still interesting hearing his perspective on software development and process management techniques.

At every conference, a common phrase you’ll hear is “that session (or tip) paid for my conference”. Last year, it was Steve Ellenoff’s Win7TLib session for me. This year, it was Kevin Ragsdale’s Easy Multi-Threading session. Kevin is a great speaker: funny, great examples, and well-paced. He showed how to use a DLL created by Christof Wollenhaupt to add multi-threading to VFP applications. Like Steve’s session last year, my mind was abuzz with ideas about where in my applications I can make use of this technique. I know others felt the same way because that was a major point of discussion at every meal I had for the rest of the conference, and even on the taxi ride back to the airport on Sunday. You know you struck a chord when someone as advanced as Rick Strahl is inspired!

By a very happy coincidence, Jody Meyer’s session on ParallelFox immediately followed Kevin’s session. ParallelFox uses a different technique—out-of-process EXE servers rather than in-process COM objects—but has a similar purpose: allowing multiple tasks to be performed simultaneously to take advantage of multi-core processors common in today’s computers. The combination of these two techniques was on everyone’s mind and I saw a lot of very excited people after seeing these two sessions.

The speaker dinner was Thursday night. It’s our small way of thanking the speakers for the enormous amount of time and effort they put into preparing sessions and white papers. As Tamar pointed out at both the keynote and closing sessions, without them, there would be no conference. I had the pleasure of sitting with Rick Borup and his wife, Eric Selje, Menachem Bazian, Steve Ellenoff, and Kevin Ragsdale. Kevin was uncharacteristically quiet; I think he was still in a daze after the dynamite presentation he did in the afternoon. Menachem and Steve were like a tag-team comedy duo; rumor has it they’ll be playing Vegas soon. The food at the Gordon Biersch Brewery at the San Tan Mall was outstanding, as was the hand-crafted beer I tried. Good company, good food, good times.

As usual, we headed back to the hotel bar. Toni Feltman had planned an informal party to celebrate Cathy Pountney marrying Jim Knight this summer. However, she also found out that Alan Griver had recently married Allie (hope that’s the correct spelling) so she quickly picked up a second cake. There was tons of champagne and apple cider to celebrate with. I had an 8:30 session to present in the morning so I headed up just before midnight.

Friday, July 08, 2011

Mixed Feelings

Later today, my business partner Mickey and I are signing the papers to complete the sale of Stonefield Systems Group Inc. to a group of employees.

In case you weren’t aware, there are actually two Stonefields: Stonefield Systems Group Inc. (SSG) and Stonefield Software Inc. (SSI). (Actually, there are three: Stonefield Software USA is our U.S. operation.) SSG was created in 1991 (yes, that means the 20th anniversary is this year) by another business partner, and Mickey and I joined a few months later. SSG did all kinds of stuff: custom software development, Accpac (a popular accounting system now owned by Sage) sales and consulting, pharmacy software development and sales, IT stuff … basically, anything for a buck. Over the years, the business structure changed: Mickey and I bought out the other partners in 1995 and we refocused the business to just Accpac and software development. In 2000, we split off the software development side to Stonefield Software so SSG could focus exclusively on Accpac.

As a result, I’ve had very little to do with the day-to-day operations of SSG for over a decade. Several years ago, Mickey also decided to focus almost entirely on SSI so we handed the management reins to a general manager. So while we owned SSG and oversaw its general operation, neither of us was closely involved for quite some time.

A few years ago, a couple of long-time employees approached us with the idea of buying SSG from us. It took a while to make it happen, but later today it becomes a reality. Note that we are NOT selling SSI; it’s the business we’ve been focused on for a long time and will continue to do so. I’ve been working on Stonefield Query for more than a decade and will do so for (hopefully) another decade. I still write code every day and get grumpy when I don’t.

I have mixed feelings about selling SSG. Although it wasn’t my first company (I had a one-man company in the late 80s), it certainly was the one I was associated with the longest. So, there’s a bit of nostalgia at leaving something I spent so much time and effort building. However, I’m also very excited for the new owners, Connie, Bernie, and Rene. They’re young, have a lot of talent, and tons of new ideas about directions to take SSG in. The company is in great hands and the future is very bright. I’ll be watching happily to see how they make my old baby and their new one grow.

Thursday, June 23, 2011

Better Online Help Links

I’ve been using Rick Strahl’s West Wind HTML Help Builder for more than a decade and still think it’s the best tool for creating help files. One of the many things I like about it is that in addition to creating a CHM file, it also generates files you can upload to a web site. For example, http://www.stonefieldquery.com/OnlineHelp/EndUser/index.htm is the online version of the Stonefield Query end-user help. I didn’t have to do anything after generating my CHM other than uploading the files HTML Help Builder creates.

There are several reasons why we like having help available online:

  • Potential customers can review the complete help file before downloading the demo if they wish.
  • It’s fully indexed by Google, Bing, etc. so shows up in searches.
  • When someone asks a support question, rather than telling them to bring up the help file, open the “How To” heading, and find the “Configuring Stonefield Query” topic, we can send them a link directly to the online version: Configuring Stonefield Query.

However, one issue with the latter item is that a link like http://www.stonefieldquery.com/OnlineHelp/EndUser/_04a0xwfxe.htm displays the help topic without the rest of the help system: no table of contents or search mechanism. I discovered today that if instead of specifying the page directly, you use it as a parameter for the index page, like http://www.stonefieldquery.com/OnlineHelp/EndUser/index.htm?page=_04a0xwfxe.htm, it displays the full help system with the desired page selected. Learn something new every day!

Thanks again, Rick, for a great tool that makes documentation almost fun to create! (I did say ALMOST; I’m not crazy!)

Friday, April 15, 2011

Lost in Translation

Here is a recent press release we sent out about the latest version of Stonefield Query.This one is the same press release that was obviously translated to another language and then back to English, I suspect by an automated rather than human translator. The translated version is hilarious. Here are some of my favorite quotes:

“Stonefield Software today declared the stylish promulgation of its database news code tool, Stonefield Query 4.1”

“The newborn edition includes over 30 newborn enhancements – the most momentous existence the Dashboard Wizard”

“As a result, they never intend the flooded benefits of what Goldmine CRM crapper do for them and their business.” (Um, we didn’t really call GoldMine “crapper”. It looks like “can” became “crapper” in the re-translation.)

“They woman opportunities and that effectuation forfeited sales.” (“Miss” became “woman”.)

“The stylish edition provides an ad hoc news resolution that crapper be utilised direct by modify users as substantially as IT staff.” There’s that word “crapper” again.

Wednesday, February 02, 2011

Running Network Applications on Windows 7

Like many developers, I like using Windows Virtual PC for testing applications. Today I needed to test running Stonefield Query from a network share, so I started a virtual machine (VM), connected it to the drive on my host system, ran the Stonefield Query workstation installer to install just required runtime files on the VM, and then ran SFQuery.exe from the “server”. I immediately got a “The application failed to initialize properly (0xc000000F)” error. At first I thought something wasn’t installed properly, but a search found this Microsoft KnowledgeBase article:

Error message when you try to open a network-shared application on a client computer that is running Windows 7 or Windows Server 2008 R2: 0xc000000f

Apparently this is a known issue and you can request a hotfix to resolve it. After installing it, all was well.

Tuesday, November 09, 2010

Southwest Fox 2010: Days 3 and 4

I woke up Sunday at 4:30 a.m. For reasons I still don’t understand, I was really nervous about the speeches I was to give about Lisa and Rick at the closing session. I had slides showing their bios and photos in the closing session (unbeknownst to Rick, I had slipped in his slide after he, Tamar, and I reviewed them) but wanted to say something personal about both of them, and figured it would work better if Tamar worked the slides while I spoke. It suddenly occurred to me that if Tamar went one slide too far while I was speaking about Lisa, Rick’s slide would appear and spoil the surprise. So, I added a “But wait … there’s more” slide as a buffer between Lisa’s and Rick’s. I think this gives you an idea of how much I was obsessing about this!

After what seemed like forever composing the speeches in my head, I went down for breakfast and my last presentation, the second instance of my Cool Controls session. I was chatting with people between sessions, so I was late coming into Cathy Pountney’s fxReports - Sharing Custom Report Features, but I’m glad I went. Cathy is working on some very cool stuff: a way for VFP developers to share custom reporting features, including reporting effects and custom Report Designer dialog pages. She’s releasing it as a new VFPX project in the next little while. This actually fits perfectly into work I’ve done with Stonefield Query and a new VFPX project I recently launched, FRXTabs. After the session, Cathy and I discussed some ways we can integrate the two.

I then went to Steve Ellenoff’s Integrating Windows 7 Taskbar Functionality into VFP Applications session. From its description, it was the session I was most looking forward to seeing because I want to add Windows 7 functionality to Stonefield Query and figured Steve could jumpstart my work. I wasn’t disappointed; as I told Steve afterward, this session paid for the conference for me. He showed how, using a library he’s created and released as a VFPX project, you can with just a few lines of code support Taskbar jumplists, progress bars, and much more. About every minute in his presentation, I came up with another idea of how to use this library to add new functionality to my apps.

Finally, it was time for the closing session. Rather than describing it in detail, I suggest you watch it and you can read Lisa’s and Rick’s blogs about it. Lisa’s video was great, even if it started on the wrong foot thanks to Windows Media Player changing its mind and deciding to play a comedy audio file on my system instead of Lisa’s video. It was also great seeing the huge ovation Lisa deservedly got, and I was very pleased that her husband Colin Nicholls could be there to watch her receive the award. But the best part was definitely Rick’s reaction to the award. He was literally speechless and quite choked up. I’m amazed he even managed to get through the next part of the session. Afterward, I saw his Mom come up to him and give him a hug; that was my favorite moment of the entire conference.

As usual, Sunday afternoon is pretty anti-climactic: tearing down projectors and stands, cleaning up the registration booth, a post-conference briefing with our main hotel contact Sharon, and a Geek Gatherings meeting to discuss 2011 (yes, we actually start planning for next year the day the conference ends). It’s kind of sad in a way, because we’ve had so much fun over the past several days, talking with friends we only see once a year, knowing that’s it’s over for another year.

However, there was still fun to be had. Shortly after our last meeting ended, we took the speakers out for dinner as a small way of saying thanks for all their hard work preparing and presenting their sessions. This year, we went to Gordon Biersch and had a great meal and some very tasty beer. Afterward, it was out to the poolside again, but I headed to bed about 11:00 exhausted.

The next day was the VFP to Silverlight workshop presented by Uwe Habermann and Venelina Jordanova. More than half of the attendees stayed for this workshop, which was great to see. Unfortunately, I had a couple of client issues I had to resolve so I didn’t pay as much attention to the presentations as I’d liked. Fortunately, Uwe and Venelina handed out memory sticks with all of the presentations, sample code, and even installers for Microsoft Visual Studio Express and the Silverlight tools, so I can go over the materials when I get a chance. One of the cool things that went on was the back channel of communication using Twitter by some of the attendees. We even picked a place for lunch (In ‘n’ Out Burger, which I hadn’t been to before) without saying a word. That night, a group of about 15 went back to the Mexican restaurant I’d been to Saturday night and we had another fun evening of food, friendship, and margaritas. After we got back to the hotel, a group of us had some drinks, checked out some hilarious but definitely NSFW t-shirts online (I was laughing so hard I almost couldn’t breathe), and checking out some places in Brazil Cesar Chalom showed us on Google Maps.

So, another year of Southwest Fox is over. Every year, the conference seems to get better and better. We had a few challenges this year—a new hotel at the last minute and finding a speaker to replace Craig Boyd late in the game, which Jody Meyer did an excellent job of—but it’s always fun and worth all of the effort we put into planning it. Stay tuned for an announcement about Southwest Fox 2011 and I hope to see you there next year!

Sunday, November 07, 2010

Southwest Fox 2010: Day 1

I had an early start Friday, waking up at 5:30 a.m., partly because I was still on Central time and partly because I was going over in my mind the speeches I was to give at Sunday’s closing session for the FoxPro Lifetime Achievement Award presentations. Unfortunately, today was like sleeping in compared to the next two days.

The first session I attended was Paul Mrozowski’s jQuery for VFP Developers. Although I’ve seen a couple of introductory sessions on jQuery before, I have yet to do anything with it, which I hope to change soon. Paul’s session started by discussing the basics of JavaScript, then quickly moved into the jQuery library. He showed basic jQuery syntax, then discussed more complex uses, and finished the session showing some of the cool add-ons available for jQuery, including date-time controls and grids. This was a very inspiring session and made me wonder why I’ve waited so long to get started with jQuery.

Next I went to Extending VFP using the Web Browser Control, presented by Bo Durban. Although I’ve used the Web Browser ActiveX control in my apps for several years, I’m always looking for new ideas, and definitely got some in this session. Bo showed a subclass of the control he’s created that adds several behaviors, including disabling the shortcut menu so the user can’t do things like View Source. I got several great tips from this session and have already implemented them in my apps.

The last session of the morning was Eric Selje's The Amazing VFP2C32 Library. I wanted to see this session for two reasons: Eric was one of our new speakers and although I’ve had a little exposure to VFP2C32 (it’s used in Carlos Alloatti’s excellent Ctl32 library), I didn’t know much about it. Eric started by showing the complexities of calling some Windows API functions in VFP, and then showed how VFP2C32 makes it very easy because it simplifies the calls to those functions through an easy-to-use VFP wrapper. Because he was a little nervous, Eric stumbled on saying “VFP2C32” a couple of times, so he decided to call it “Fred” for the rest of the session. I liked that idea so much that when I mentioned VFP2C32 in my Themed Controls session (because Themed Controls uses Ctl32, which uses VFP2C32) and also stumbled saying it, I called it “Fred” too. Eric classified the various “Fred” functions by functionality and spent the rest of the session showing how it satisfies various needs in typical VFP applications. Eric’s white paper is an excellent resource for “Fred” because he’s documented the library in great detail. I definitely intend to replace some of my ugly Windows API calls with VFP2C32 functions since VFP2C32 is already included in my apps due to my use of Ctl32. Even cooler is thanks to prompting by Eric, the author of VFP2C32, Christian Ehlscheid, has now released it as a VFPX project.

After lunch, I presented my A Deep Dive into the VFPX ThemedControls session. I was a little nervous about this session: I’d practiced it several times and had it down smooth, but I went over the time limit every time because, typical for me, I tried to jam too much information into the session. Sure enough, I had only five minutes left at the end and still had a couple of the themed controls to cover. Fortunately, because I was prepared for this, I left the ones I consider to be less useful for the end, so I quickly skipped through them. Sorry for anyone who wanted to spend more time on those controls; however, the white paper for the session has lots of details and samples you can play with.

Although I didn’t plan this, it turned out that both of my sessions this year had a common theme: there’s no excuse for creating boring looking VFP apps. Using colorful modern icons, attractive fonts like Segoe UI (the system font for Windows Vista and 7), and various VFPX projects like GDIPlusX and ThemedControls, you can create applications that are as great looking as anything written in .Net or any other environment. As its name suggests, this session focused on Emerson Reed’s ThemedControls project. ThemedControls allows you to create themed forms in your application that allow the user to change color schemes as easily as they do in Microsoft Outlook. The image below uses several ThemedControls, including ThemedOutlookNavBar (the Outlook-like control at the left) and ThemedTitlePageFrame (the container at the right doesn’t look like a pageframe but it is).

Northwind

I went through the basics of the ThemedControls library: how to download and install it, how to add it to your applications, what to deploy to your users, and so on. I then went through each of the controls, starting from the simple ThemedForm and ThemedContainer to the complex ThemedOutlookNavBar and ThemedExplorerBar, blowing through the less useful (in my opinion) ThemedToolbox and ThemedZoomNavBar, and finishing with a demo of the unfinished Ribbon control. Based on the audience feedback during the session and the evals afterward (I love the new online evals Rick, Frank, and Paul implemented this year!), I thought the session went well.

Because I was chatting with folks after my session, I was late getting to Christof Wollenhaupt’s How the Fox is Different session. However, as usual, Christof blew me away with his incredibly deep knowledge of the internals of both VFP and .Net. (After the session, Bill Anderson said to me, “I’ve been working with FoxPro for 20 years. I know nothing.” and I felt as equally humbled.) Christof’s take-away point was that if you’re working in VFP, do it the VFP way, and if you’re working in .Net, do it the .Net way. He showed fundamental differences between VFP and .Net, not in terms of language and syntax, which are relatively easy to learn, but in philosophy, which takes much longer to understand. For example, VFP is object based (we do things with instances of classes) while .Net is class based (classes have a much bigger role than instances in .Net). In VFP, we’re used to using a framework and global objects such as an application object; in .Net, the “framework” is built in and there are no global objects in correctly written applications. This is one of these sessions where I’m going to have to read the white paper several times and think about what Christof has said before it truly sinks in.

The last session of the day was dedicated to “bonus” sessions. I went to the “Show Us Your Apps, Part 1” session and was amazed as everyone else at the cool things people have done using VFP. Among the highlights were Jim Nelson showing his relatively new Code References replacement VFPX project, Cesar Chalom showing his FoxyPreviewer replacement for the VFP report preview toolbar, and Bernard Bout showing some work he’s done recently integrating Silverlight into VFP apps.

The plan was to have a dinner party out on the veranda of the conference center, but some unusual Phoenix weather—a sandstorm with high winds—nixed that at literally the last minute. Fortunately, the SanTan/Elegante staff quickly pulled together and moved everything inside the ballroom at record speed, so the party only started a few minutes late. The food, as it was at other meals, was fabulous, including two kinds of lasagna and an excellent caprese salad.

More bonus sessions followed into the evening. I held a Stonefield Query Developer meeting and went over some of the new features in our 4.0 version, including the brand new interface for Stonefield Query Studio (using many of the controls I covered in my ThemedControls and Cool Controls sessions), application views, new output types including Microsoft Excel PivotTable, and so on. I then showed a couple of new features we’re planning for version 4.1, including drilldown charts, dashboards, and % change between columns in a cross-tab. These got a very enthusiastic response!

The session didn’t wind up until nearly 10:00 p.m., so I was pretty tired by now. I hung out by the pool (the replacement for the “grotto” of the Arizona Golf Resort that became the popular hang-out spot the last couple of years) for a while, but had to call it a night at about 11:30 because I had an 8:30 session.

Wednesday, October 06, 2010

Southwest Fox is Next Week

Southwest Fox 2010 starts next Thursday, October 14. However, I’m actually heading to Phoenix on Tuesday, as are Rick, Tamar, and their spouses Therese and Marshal, because we have lots of set up and finalizing to do. I’m going to be quite busy during the conference: in addition to my sessions A Deep Dive into the VFPX ThemedControls and Cool Controls for Your Applications, I’m also hosting a Stonefield Query Developer Meeting on Friday night at 8:30, showing some cool new features we’ve planned for version 4.1, and am showing a new VFPX project, FRXTabs, at the Show Us Your Apps session Friday afternoon at 5:15.

I’m looking forward to seeing old friends, meeting new ones, attending sessions, giving sessions, talking to this year’s Ceil Silver ambassadors, handing out the 2010 FoxPro Lifetime Achievement Award, and generally having a great time. See you there next week!

Final Thoughts on Looking at Stonefield Query

George Jensen of CustomerFX has concluded his series of posts about his experience learning Stonefield Query. Check out his articles: part 1, part 2, part 3, part 4, part 5, part 6, and part 7.