Saturday, March 11, 2023

Virtual Fox Fest 2023 (May)

Virtual Fox Fest 2023 (May) is a one-day event on Wednesday, May 10, 2023. We have some great speakers delivering great sessions, live chatting during presentations, and getting to hang out virtually with new and old friends. This event will feature classic sessions (from previous conferences), updated for 2023, along with at least one brand new session. More details here: https://virtualfoxfest.com.

Registration is open! Details, deadlines and cost are available on our Web site. You register for the conference here: https://geekgatherings.com/Registration. Don't procrastinate, get this done today!

We’re planning Southwest Fox in Arizona this October. We expect to announce our plans for a hybrid (in-person and virtual) fall conference some time in April.

Wednesday, December 28, 2022

Upsize VFP Free Tables to SQL Server

The VFPX Upsizing Wizard allows you to upsize the tables in a database container to a SQL Server database. It can be used visually by running UpsizingWizard.app or programmatically; see TestEngine.prg that comes with the Upsizing Wizard for an example.

One thing the Upsizing Wizard doesn't do is support free tables. The new Upsizer utility gives the Upsizing Wizard the ability to do that. I've used it on decent sized data sets (more than 100 tables with 10 GB of data total) and it works very well. One thing I like is that I can run it over and over to upsize to the same database; that allows me to refresh the SQL Server database with changes in the VFP data while we work on upsizing a VFP application.

Tuesday, December 27, 2022

Updated Upsizing Wizard

I released an update for the Upsizing Wizard that fixes a few bugs and adds some new features. Some of these were suggested by Rick Borup in his Switching to SQL Server session at Virtual Fox Fest 2022 (October), including:

  • Optionally creating default values for all columns so fields that don't allow nulls and aren't listed in an INSERT statement don't prevent the statement from executing.
  • Optionally exporting table and field comments to the MS_Description extended property.
  • Using Varchar(max) rather than Text as the default mapping for Memo.

See the 2022.12.27 section of the Releases section of the Upsizing Wizard VFPX repository for details on all changes.

You can install the new version by cloning the repository, downloading the files from the repository, or using Thor Check for Updates.

And stay tuned: later this week, I'm going to release a new tool that extends the Upsizing Wizard to support free tables and uses SQL Bulk Copy for even better upsizing performance.

Monday, November 14, 2022

Bulk Copying VFP Data to SQL Server

The VFP Upsizing Wizard does a great job of upsizing a VFP database to SQL Server. However, after doing the initial upsizing, you may wish to re-upload the content of one or more tables with doing a complete re-upsize. A new tool, SQLBulkCopy, available from https://github.com/DougHennig/SQLBulkCopy, is great for that.

Thursday, October 27, 2022

Virtual Fox Fest 2022 (October) Follow-up

Here are some follow-up notes about Virtual Fox Fest 2022 (October):

  • Videos for all presentations are now available on YouTube for free to everyone, as our contribution to the VFP community. Be sure to subscribe to our channel.
  • If you didn't attend Virtual Fox Fest and want materials (white papers and sample code) for the presentations, go to  https://geekgatherings.com/Registration and "register" for the conference. You're not really registering since it's over, but in the Registration Fees section of the registration page, you'll see "Virtual Fox Fest Session Materials" for previous events. There's also an opportunity to sponsor Virtual Fox Fest, which means your name will be listed on our Sponsors page.
  • If you didn't attend Virtual Fox Fest, check out our Facebook page and see what you missed, then plan to attend a future one so you can join in the fun.

Tuesday, September 13, 2022

Virtual Fox Fest 2022 (October): Don't Forget or Regret

Thanks to all who have registered for Virtual Fox Fest 2022 (October). Early registrants help us plan ahead. This is another friendly reminder to the rest of you that it takes just a few minutes to register.

We're really excited about this year's Virtual Fox Fest line-up and we know you will be, too. You can find all the details:

You can order your Virtual Fox Fest gear anytime. If you don't like the items or colors we've chosen, click on any item as a starting point and then click "Customize This Product" to choose the product and color you really want.

Virtual Fox Fest is October 13th, 19th, and 25th, 2022.

Monday, August 29, 2022

Virtual Fox Fest 2022 (Oct): Early-Bird ends in 2 days

Last call! (we want to make sure we have your attention)

The Early-Bird discount ends midnight (North American Eastern time) on Wednesday, which is just a couple of days away. Here is the direct link to get registered: http://geekgatherings.com/registration.

Virtual Fox Fest is October 13, 19, and 25, 2022.

Tuesday, August 16, 2022

Virtual Fox Fest Registration Reminder

Thanks to all who have already registered for Virtual Fox Fest; we appreciate your support and our speakers are excited to share their sessions with you soon. Please register for Virtual Fox Fest before September 1st, our Early-Bird deadline. We know you are interested in saving $50, and we would appreciate processing the bulk of the registrations in August. Perfect synergy! As a bonus, we won't process your payment until September. It takes just a few minutes to register. Virtual Fox Fest is October 13, 19, and 25, 2022.

Thursday, August 04, 2022

Virtual Fox Fest 2022 (October): Speakers, Sessions, and Registration

Speakers and sessions for Virtual Fox Fest 2022 (October) have been announced, and registration is open!

While I’m of course interested in all the sessions, the ones that interest me the most are Joel Leach's DevOps with Visual FoxPro and Rick Borup's Switching to SQL Server. I have no experience with the former so I'm keen to learn about it and have lots of experience with the latter so I'm interested in Rick's take.

Virtual Fox Fest is October 13, 19, and 25, 2022. The cost is $299 US but register before September 1 to save $50.

Saturday, May 21, 2022

Formatting Grids Dynamically

I've been working with grids a lot lately, and find setting them up very tedious: set ColumnCount to the desired value, set ControlSource and other properties such as InputMask and Alignment for every column, set Caption and other properties for every header, etc. To make matters worse, if you change the RecordSource for the grid, ControlSource gets reset for every column so now you have to go back and fix them. To matters even worse, if you need to add a new column between two existing ones, you have to move all the property settings for the subsequent columns. (Yes, I know you can just increment ColumnCount and set ColumnOrder for the new column to the proper value, but then the visual appearance of the grid doesn't match the column order in the Properties window. Do that a couple of times and then have fun trying to find a specific column.)

So, I decided to format grids programmatically. At first, I wrote a lot of code like this:

with This.grdOrders
   .ColumnCount  = 22
   .RecordSource = 'orders'

   .Column1.ControlSource   = 'orders.line'
   .Column1.Width           = 30
   .Column1.Header1.Caption = 'Line'

   .Column2.ControlSource   = 'sorder.item'
   .Column2.Width           = 40
   .Column2.Header1.Caption = 'Item #'

   * more code here for the rest of the columns
endwith

That too grew tedious quickly. So, I decided to dynamically format the grid at run time rather than design time. I added a SetupColumns method to my grid base class with code that accepts a format string and applies it to the grid. Then in an instance of the grid, I write code that sets up the format string and calls SetupColumns. Here's an example:

text to lcColumns noshow
Field		|Width	|Caption	|Alignment	|InputMask	|ReadOnly	|Control
Invnum		|70	|Invoice #	|		|		|.T.		|
Date		|70	|Date		|		|		|.T.		|
Name		|*	|Project	|		|		|.T.		|
Amount		|60	|Amount		|1		|99,999.99	|.T.		|
Hours		|40	|Hours		|1		|999.99		|.T.		|
Paid		|70	|Date Paid	|		|		|		|Checkbox
Received	|60	|Received	|1		|99,999.99	|		|
endtext
Thisform.grdInvoices.SetupColumns(lcColumns)

Here are some rules for the format string:

  • The format settings must be in this order and have a header row like shown above
  • Separate format settings with tabs and a pipe
  • "Field" is the field name (aliased or not)
  • Use a tab for an unspecified value, such as Alignment and InputMask for most of the entries in the example
  • Use "*" for Width to "auto-size" a column; that is, size it to the rest of the space after the other columns are sized
  • Control specifies what control to use for the column. Currently only Checkbox is supported but others could easily be added

Now setting up a grid is just a matter of filling out an easy-to-understand "table" of column settings. Need to add a new column in the middle of the grid? Just add a new line to the table.

However, it's still slightly tedious because you have to run the form the grid is on to see what it looks like, close the form, edit the table (adjust column widths and alignment, for example), run the form again, rinse and repeat. So, I created a builder named SFGridBuilder that does the same thing at design time. Select the format string without the "text" and "endtext" statements, copy it, invoke the builder, and ta da, the grid is formatted at design time. Tweak the string, copy it, run the builder again ... repeat until perfect. This builder works with any grid, even a VFP base class.

How do you invoke the builder? Any way you normally would:

  • I added a Builder property to my grid base class and set it to SFGridBuilder.prg
  • You can register it with Thor and invoke it through a Thor hot key or menu
  • You can register it with Builder.app
  • You can run it directly: do (path + 'SFGridBuilder')
Rick Schummer did a session at Virtual Fox Fest 2020 about builders, so watch the video for details.