Friday, November 11, 2011

Lifetime Achievement



Wow... that is all that I could really say, wow!

On Wednesday October 26, 2011, while I was waiting to hear what I knew would be a fantastic Keynote presentation from Steven Black at Southwest Fox 2011 in Phoenix, AZ, I was awarded the biggest honor in the FoxPro Community. I was awarded the FoxPro Community Lifetime Achievement Award. Not only that... I was awarded this at the same time as our Keynote speaker. To say the least I was surprised, excited, humbled and thankful.

A little background for those reading who may not be part of the FoxPro Community... FoxPro is a programming language and database engine. I have been programming in this language and using this database since.... well for a long time. :-) This programming language has a following, "the community" and in my opinion the BEST COMMUNITY of any. The community is made up of the people who, like me, use the language but it is so much more. These people really care about the others in the community. We help each other with technical issues, life issues, job issues... you name it. It is a group that shares and cares! Every year, since 2001, the Lifetime Achievement is awarded to one or more individuals that have made outstanding contributions to the community. This year I was one.

It was only fitting that my award was presented by Rick Schummer. Rick is a local (Detroit is local to Toledo, right?) FoxPro Community Member and a very good friend of mine. I am at a loss for words to describe Rick because he really is awesome. He gives so much to his family, the FoxPro community and manages to save some for himself too. I am not sure how he does it, but I think with no sleep. :-) Rick and I go back a long time and I was flattered to have him present me with my award.

When I went up to receive my award, I looked in the back of the audience and lo and behold there was my wonderful husband Mike and my brother-in-law Phil. My first thoughts... "Where are my kids? They are supposed to be home with Mike." Once past that I was so excited. You see... I would not have been standing up there had it not been for Mike and Phil. I was so glad to share this moment with them.

There are no speeches when you receive this award which is a good thing as I was not prepared. Now that it has settled in I can offer some thanks. This is not an exhaustive list by any means. There are far too many people who have had an impact on my life to mention here.

Thank you FIRST and FOREMOST to the FoxPro Community for finding me deserving of this award. This really is the best community to be involved in. There is not another group of people as awesome as we are!

Thank you God for giving me the talents that allow me to help others and accept the help that they give me.

Thank you Mike and Phil for giving me the opportunity to learn, grow and improve my skills and by sometimes (ok... a lot of times) pushing beyond what I "could" do.

Thank you to my family (extended pretty far) for understanding my emotional need to do "freebies" like technical support, presentations, articles, books, free software. Yes, I got paid for some of this but the payment does not cover the time and energy it takes to actually do the work. The personal reward is the payment!

Thank you YAG for taking me under your wing at PC Expo in 1990. You were my first face-to-face contact with the FoxPro Community and really started to show me what it was all about. I am so greatful that you and Randy Brown were there to see me receive this award.

Finally... Thank you to Janet Hurt wherever you are. I went way outside of my comfort zone as a recent college graduate when I called you and asked you if I could still have that interview that I had previously declined. Had you not allowed me that second chance, I would not have worked at Fox Software and would probably be writing COBOL code in some company basement today.

Monday, March 28, 2011

Embarking on a New Adventure

As many know I have been contracting with a local company for the last 3 ½ years working on their custom Visual FoxPro application(s). This system is a beast! It was started around 1992 and worked on by many developers with various different skill sets and levels. So as you can imagine it is a nice big ball of spaghetti.

I was brought in because of my understanding of Client-Server development. At the time, my experience was with SQL Server and this client chose Oracle. In the last 3+ years I have grown very fond of Oracle but it has been a difficult battle and we had many rocky periods.

About 2 years ago management realized that in order to compete in their market they needed software that worked correctly every day. They also needed software that was stable and could be easily enhanced to meet the expanding business needs without high risk. They took quite a while to inventory the existing system and evaluate many options. The final decision was made… they were moving to SAP.

It was not my position to judge if this was a wise choice or not. I did, however, realize that the existing code base was not going to work long term. When you have to fix code every month because monthly sales numbers do not reconcile, there is a big, deep rooted problem. I was very excited that a solution was coming that would stabilize this business. Many of my team members did not have quite the positive outlook I did but I knew it would come over time. For me, the downside was that my contract would probably end after go-live since I know nothing about SAP.

I worked with the department managers, business process owners and SAP consultants to help define the requirements since the initial try didn’t yield as much detail as was needed. My role was basically to look at the code and figure out what the existing system was doing, talk to the people who use it to make sure all of the functionality was still needed, and relay this information to the BPOs and SAP Functional Consultants. Well, I must have done a pretty good job because just recently they asked me to learn SAP and become the resident expert in MM which is Materials Management. Who can pass up an offer like that?

This week I start my training with a weeklong emersion in Materials Management. It is going to be very different approaching projects from a non-customized angle. In FoxPro, we can build anything and create data sets any way, anyhow and anytime we need some data. It is not the same when you are working with a very tightly integrated solution. I think I feel like VFE users must feel when they start to build their first application. Things are easy if you do it the “VFE way” but that is not easy when you don’t know what the “VFE way” is. I know, just like our framework users, that once I get the hang of it life will be better.

I want to share my journey over the next several months with the hopes that my observations and experiences will help someone else on a similar expedition. I hope you will come along for the ride!

Friday, August 27, 2010

VFE: Changing how system settings are stored.

Every so often I am still amazed at how awesome the VFE Framework really is. I hear a lot about YAGNI these days (you ain't going to need it) and how unnecessary features can be very wasteful. The following example illustrates how careful thought and design may save hours and hours of future development time.

I have a client who is having a lot of trouble with Users who run his app on Windows Vista and Windows 7. The problem is with access to the registry and all of the setting that VFE stores there. So, he asked me to modify the app to store these settings in a table. Now, we are not going to discuss whether a VFP table was the right approach or not. That would need to be a separate discussion. I began looking at the app and what I would need to do in order to change all of the system setting calls to read from and write to a table. I couldn't believe how easy it was. The following are the three steps. I had this feature completed far faster than I ever thought I would.

Step 1: Subclass cSystemSetting (or iSystemSetting) into a new class. I chose to put mine in the application layer but it could go in the iLayer just as easily. Get and Set are the key methods.

Step 2: Modify your new settings class to create the table, read from it and write to it. I also added code to delete and recreate the table/index if there were corruption problems. Since they are just settings, the client was fine with blowing everything away if necessary.

Step 3: Plug in the new system setting class through your application level factory table using the description of System Setting Manager.

That is all there was to it. I love this framework!

Thursday, October 29, 2009

What's up with VFE?

Many Visual FoxExpress developers have made inquiries about the status of Visual FoxExpress. It has been quite a while since there was a full release of Visual FoxExpress, in fact, it's been nearly 2 years. The good news is that we have been working on VFE during that time. We've fixed a number of outstanding issues, increased the performance and stability considerably, addressed issues with the IDE on Vista and Windows 7 and added several new features. We've also enlisted Bill Anderson the "sharp-eyed Fox anthropologist and xBase archeologist" to help us with framework changes and he's done an incredible job of fine tuning, cleaning up and ensuring that the framework adheres to our own standards. It's time we rolled all that stuff up into a new release and got it out the door.

Toni and I are working on doing just that. Tonight we posted Visual FoxExpress 2009 Beta 3. This release rolls all of the previous Visual FoxExpress betas into a single download and includes an updated version of the framework. This is a beta and does include a few changes that we have not deployed in live applications ourselves yet, so please take the appropriate caution with your production applications.

The next beta will address a couple of other longtime nagging issues, mostly related to installation. We're working on eliminating the use of the registry by the VFE IDE and installation programs and instead storing the information we need within the Visual FoxExpress directory structure. These changes will make it easier for developers that need to run multiple versions of VFE on a single machine to do so and also will allow VFE to run regardless of the currently logged in user on a machine. You can expect to see this release before the end of the year.

After we've addressed the registry issues, our primary focus for future releases will be on usability. There are two areas that we'd like to work on here; the Sample Application(s) and the documentation. Toni and I are splitting this work and plan to have an updated sample and updated documentation released in the first quarter of 2010.

If you've seen Toni speak at any VFP conferences or user groups as of late, chances are you've seen her speak about using Subversion with Visual FoxPro. We're using Subversion for source code control with VFE in-house. We are in the midst of planning changes to Visual FoxExpress to allow Visual FoxExpress users to get the latest version of the framework directly from our repository. We also plan to have those changes as part of our next major release. This will make framework changes available much more quickly than any method we've used in the past. Once all of these things are in place we will also consider opening up the repository for changes by current subscribers. When the time comes we will solicit the community for feedback on exactly how this should be implemented, so please hold your feedback on this for now.

Tuesday, October 20, 2009

CXToFRX

At Southwest Fox 2009 I showed a little utility that allows the creation of a VFP report based on the layout of a form or class. I had a need to do this quickly with several forms, so I whipped this up. All you need to do to use it is select the objects in the form or class designer that you'd like in a report, then run CXToFrx.prg and it will quickly create a report that matches the layout of the items you've selected in the form or class designer. This is a crude little utility that I whipped up for a specific need and it only supports textboxes, labels and editboxes at this point, but based on the oohs and ahs, thunderous applause and millions of dollars I've received in PayPal donations since I demoed it, it apparently has a lot of value.

In order to use it you have first create a report file named blankreport.frx in the folder where you place the CXToFrx.prg file. Enjoy...


Labels: , ,

Southwest Fox 2009 Rocked!

Toni and I are back from Southwest Fox. I'm physically drained and mentally charged. This was definitely the most fun I've had at a conference ever.

This year's speaker group was awesome and the attendees were awesome as well. There's no elitism amongst the speaker group. Everyone speaking knows that everyone in the seats is an expert in their own right and that everyone has something to share. New friends were made, 20+ year friendships were renewed and equal amounts of love and knowledge were shared. It's such a blessing to be a part of such a great community.

Thanks to Doug, Tamar, Marshal, Rick and Therese for taking care of all the details and providing such a wonderful conference. The community is truly in your debt for creating such a wonderful, hassle free, unifying event.

SW Fox 2010 was announced. I already can't wait for next October 14th to do it again. SW Fox outdoes itself each and every year and even though this year was by far the best, I fully anticipate next year being even better. SW Fox is a can't miss event for anyone working in Visual FoxPro. To everyone that was there, I know I'll see you next year. To those that weren't you've got a year to plan for it. Don't miss it again and this specifically means you Whil Hentzen, Steve Black, John Harvey, Del Lee and so many others that were missed this year. The one thing you can't BIOR is missing Southwest Fox.

Monday, October 12, 2009

Building a Sample Data Set

I had reason recently to build a sample data set for testing purposes. A little bit of background is required before I start showing you the code. We have a field representing a stock number. The first 3 characters of the stock number represent the vendor's product line. Before you start bashing me about the data design, this is old, old data and I did not design it. I know that we should have a separate field for the product line but we don’t. Anyway, I wanted to have three random records for each product line.

The data is in Oracle so I used the following as an expression for a column I named rank.

dense_rank() over (partition by substr(stk_num, 1, 3) order by substr(stk_num, 1, 3), dbms_random.Value) as rank


The rank() and dense_rank() analytical functions provide a way to rank over a grouping. This statement say rank the data grouped by the first 3 characters of the stock number in order by first those 3 characters and then some random value.

So, my full select statement looked like the following:

SELECT id, stk_num, rank
FROM
(
SELECT
product.*,
dense_rank() over (partition by substr(stk_num, 1, 3) order by substr(stk_num, 1, 3), dbms_random.Value) as rank
from product
where format <> 'V'
) r
where rank <= 3 ;


This yielded the first 3 random records but what I really needed to do is remove all of the records except for these three random ones. So I just tacked this on to a DELETE statement like the following:

DELETE FROM product where id NOT IN 
(SELECT id
FROM
(
SELECT
product.*,
dense_rank() over (partition by substr(stk_num, 1, 3) order by substr(stk_num, 1, 3), dbms_random.Value) as rank
from product
where format <> 'V'
) r
where rank <= 3 );
commit;


This took my test data set from over 222,000 records to less than 3200. This is probably not "technically" a random sampling but it should work much better than what we currently have in place.

Labels: , ,

Thursday, October 01, 2009

IsConsonant Function

I wrote this little function for a teammate the other day and could not decide if I should blog about it or not. It is a simple function that I any Visual FoxPro programmer could write. Prior to writing the function, I searched the web to see if someone else had already written it. I could not find anything so I decided to post it hoping that I will save someone else time in the future.


FUNCTION IsConsonant
* Purpose...: Returns .T. if the letter passed is a consonant.
* Author....: Toni M. Feltman
* Parameters: tcLetter, The letter to check.
* tlYIsVowel, When passed .T. the letter Y is considered a vowel.
* Returns...: Boolean
* Added.....: 09/29/2009
LPARAMETERS ;
tcLetter, ;
tlYIsVowel

LOCAL ;
lcVowelString AS Character, ;
llReturn AS Boolean

lcVowelString = IIF(tlYIsVowel, 'AEIOUY', 'AEIOU')
llReturn = ISALPHA(tcLetter) AND NOT UPPER(tcLetter)$lcVowelString
RETURN llReturn

ENDFUNC

Labels: , ,

Tuesday, June 16, 2009

Instrumenting Menus

A week or so ago I was asked about tracking menu hits in the Visual FoxPro application I am working on for a client. This application is vintage late 1990's so there is no single procedure/object to process menu hits. Each pad/bar has it's own little procedure that run some code. So, I did what I do anytime I am asked to implement something new... I googled it. I found a wonderful article titled Instrumenting FoxPro Applications by Rod Paddock. It was written in 1997. So, the article confirmed what I already knew, I was in trouble because there was not a central menu execution object in this application.

Next I stumbed across the Extending the VFP 9 IDE with MENUHIT and MENUCONTEXT article by Doug Hennig. Ok, so first of all, Intellisense is available at runtime now. I spoke on this a while back. Next, intellisense has exposed "generic" menu events. So, I should be able to use this to instrument my menu without adding code to each menu item. Yes I could! Here is how I did it:

  1. I opened my FoxCode table and copied it to the application's data directory and deleted all of the records.

  2. I added one new record to the application specific FoxCode table with the following field values:

    Type = 'S'
    Abbrev = 'MENUHIT'
    Data = The following program code.


    LPARAMETERS ;
    toParameter

    LOCAL ;
    loSelect AS Object, ;
    lcBar AS Character, ;
    lcPad AS Character

    loSelect = CREATEOBJECT('cSelect')
    lcBar = UPPER(ALLTRIM(toParameter.MenuItem))
    lcPad = UPPER(ALLTRIM(toParameter.UserTyped))

    *!* do not track use by developers
    IF VERSION(2) <> 0
    RETURN
    ENDIF

    SELECT 0
    USE MenuTrack
    LOCATE FOR UPPER(cBar) = lcBar AND UPPER(cPad) = lcPad

    IF NOT FOUND()
    APPEND BLANK
    REPLACE cBar with lcBar, cPad with lcPad
    ENDIF

    REPLACE nCount WITH nCount + 1, ;
    dLastHit WITH DATETIME()

    USE IN SELECT("MenuTrack")


  3. Then, in my main program I added the following lines of code:


    IF FILE(‘FOXCODE.DBF’)
    _FOXCODE = ‘foxcode.dbf’
    ENDIF



It works beautifully and now we are able to track which menu items are called and which ones are called most often. Thanks Rod and Doug!

Friday, May 01, 2009

Mike & Toni Feltman Speaking at Southwest Fox 2009

Speaker announcements were posted for Southwest Fox 2009 today and I'm pleased to announce that Toni and I will both be speaking at Southwest Fox. If you've seen us speak before then you know that Toni is one of the best speakers around and that conference organizers can save on hotel expenses by also having me speak. 

I'm really excited to be speaking this year and have two fun topics that I think will translate into great sessions. The first one is HTML and Visual FoxPro and the second one is Introducing  ChatterFox

The HTML and Visual FoxPro session is a two parter. First I'm going to go over all of the HTML related features that come in the box with VFP. There's a lot of them and there's not one central object or command that they're based on, so it's easy to miss some off them. There are also a lot of language features that aren't HTML specific but that make it easy to both create and consume HTML in VFP. We'll cover that as well. In the 2nd part, we're going to take a look at using HTML in desktop applications. HTML isn't just for the Internet and I'll show you why in this session. 

My other session, Introducing ChatterFox, is about some APIs I've been developing for enabling social media like features on custom web sites as well as in desktop applications. The abstract on the SW Fox site pretty much tells the whole story on that session, so head over there for all the details. While you're there, click on the register link and get yourself signed up. There are some great early discounts available. 

Also, on the topic of SW Fox, a new track has been added this year: "Technology for VFP Developers." A brilliant and wise man suggested this topic to the SW Fox organizers although I'm sure plenty of other people had the same thoughts. This track covers subjects that are not specific to VFP but that VFP developers will benefit from by knowing. Here are the topics in the track:

  1. Integrating VFP with SourceGear Vault
  2. Introduction to Subversion and Tortoise SVN
  3. Microsoft Virtual PC for VFP Developers
  4. Open Source Tools
  5. The Show Must Go On: Disaster Recovery and Business Continuity Planning
I think this track is important for several reasons. First of all, the majority of VFP developers have been working in VFP for over a decade and would be classified as experts in their field. Sometimes it's hard to justify training expenses for something you're already an expert on. (My xBase career is at 22 years now and there are indeed sessions in this conference that I know I can learn from though) . So this track provides some training on other topics of interest that will benefit VFP developers directly even if you already "know it all" as far as VFP is concerned. Secondly, a lot of VFP developers live in their own little world. It's pretty typical for a VFP developer to be either an in-house developer that maintains a single line-of-business application or that has a fixed set of clients. This is a chance to look out the window and see what other VFP developers are doing out there. 

I'm looking forward to the "Microsoft Virtual PC for VFP Developers" session by Doug Hennig. I know I should be making use of virtual machines but everytime I decide to give it a whirl I run into some show stopper and decide to get back to billable work. I'm counting on Doug to get me up and running eh. 

If you're not using Source Code Control, well, I think you need to question your sanity. I thought F1 Technologies was somewhat late adopters of source code control when we finally started using it in the 90s. I'm shocked and appalled that there are still developers out there that I consider highly skilled and otherwise brilliant not using version control. There are 2 sessions in this track for you. Introduction to Subversion and Tortoise SVN given by Toni Feltman and Integrating VFP with SourceGear Vault by Walt Krzystek. Subversion and Vault basically represent both schools of thought in Version Control. If you don't know what I mean by that, go to the sessions to find out. Then pick one! Both of them are precons, so if you register now, you can attend one of them for free. If you can't justify the expense for the 2nd precon, just go to Toni's session - Toni is way better looking than Walt. If you are using version control, if you're using VSS (or VSS with Source Off Site) and like that approach go to Walt's session on Vault and see all that you'll gain by switching to Vault. If you find Vault or VSS too prohibitive or you just want to see what Subversion is all about, go to Toni's session. 

I'll be rehearsing one of my sessions at the Grand Rapids Area FoxPro User Group on October 10th. If there's a user group out there that would like to see me rehearse the other topic or both in September let me know. Practice makes perfect. 

Anyway I'm really excited about SW Fox this year. SW Fox is the only major VFP event in North America and I'm looking forward to seeing as many of my VFP friends as possible. Hopefully Toni and I will have the party room again this year. While I can't promise there'll be any burning guitars this year I'm sure it'll be a good time. Maybe Craig Boyd will get his act together and organize a real Texas Hold 'em Tourament.



Wednesday, April 29, 2009

Work Area Manager - Go Green with VFP

At my onsite gig I'm maintaining a VFP app that's been ported from FoxPro DOS to FoxPro Windows to VFP. It has a lot of old code in it, that suffice it to say, is suboptimal. Introducing new, well-written code into it is often challenging. The old code includes very little defensive coding and is full of assumptions about the environment it runs in. It's really dependant on what cursors are open, filters, indexes, record pointers and so on. The app is modal and there's a lot of "drill-down" type behavior, so things that the environment is depenendant upon may have longn ago in the call stack. After a lot of messing around with hard coding specfic states I needed to save and restore I finally decided to just create a class that would handle this stuff for me. If you remember the cSelect class from Codebook or VFE this is basically just an extended version of it that handles all open work areas. There's nothing complex about it, so I'm not going to get into the specifics of the code here. 

In the zip I've linked here, is a class named WorkAreaManager. Basically before you're going to do something that tampers with the environment, you just create an instance of it. Then you can go about your merry way messing with the open cursors, opening new cursors, whatever it is you need to do. When the instance is destroyed (either explicitly or by letting it's variable fall out of scope), any cursors that were not previously opened are closed and the record pointer, filter, index order and alias are restored for any cursors that were previously open. 

The only potential gotcha that I'm aware of is it doesn't handle temporary cursors if your code closes them, but that hasn't been an issue for me so far. 

Give it a try. 

Clean Bill of Health

I'm back home after my surgery. For the millions of readers out there who may not have been privy to the minute details of my health, let me summarize what's transpired. Back in March I had a tummy ache that persisted long enough for me to visit the ER. It turned out that I had diverticulitis and I ended up being hospitalized for 5 nights. Due to the outstanding healthcare I received from St. Vincent's Medical Center and the overwhelming support my family and I received from our friends and family the infection cleared up and I was able to avoid emergency surgery and was discharged. My hospital stay included 4 days of nothing but intravenous liquids, followed by a delicious diet of broth and jello.

Last week I returned to St. V's to have the bad section of my colon removed. The procedure I had was a Lathroscopic Sigmoid Recession for those that want to know the exact medical terminology. The end result is that my belly now looks likes this, except the bloating is down considerably. 

I'm recovering well. A few things still cause me considerable pain - including laughing, coughing and probably most importantly - pants. I think in another week or so I'll pretty much be back to normal. 

Overall, this has been a tremendously positive experience for me. The love and support I recieved from my friends and family here in Toledo was overwhelming and truly humbling. I've always felt tremendously blessed to be a Feltman and marrying into the Taylor-Hass family has really just made me even more blessed. The shawl in the picture was knitted for me by the Prayer Shawl Ministry at our church, Saint Martin de Porres and I was really blown away to receive it. We have a lot of people with much worse conditions than mine and I was really, really touched that they took the time to knit a shawl for me. An unexpected number of people took time out to visit, send cards and call with their well wishes also. I guess you never really know how much it means for someone to say they're praying for you or express their concern until you really need it. When you're sick, little things really do mean a lot.

So I'd like to take this opportunity to thank everyone for looking out for me, particularly my wife and children, my parents and in-laws, brother and sister, all of my friends on Twitter,  Aunt Marcia and Uncle Don and their wonderful daughters, Uncle Toby, my friend Scott, the Bumpus Clan, everyone at St. Martin de Porres and everyone else that had me in their thoughts and prayers. Your love and support really made this an overall positive experience for. Thank you all so much. It's really a great honor to know I am loved and cared for by so many. 

Going forward, I basically have to maintain a healthy diet. The other bright side of this is I've lost 23 lbs and since I was about at my all time heaviest when this happened, that's a real plus. I was planning on getting down to 200 lbs by August 22nd and now I only have 15 lbs to go. I'm sure there are better diet plans out there, but this one has worked great for me. With any luck I'll have a relapse after the 4th of July and I'll make it with basically no effort. :)

My energy level is still pretty low, but mentally I'm recharged and starting to get back into the swing of things. For my Fox friends in particular - who really rock and helped to keep Toni's spirits up tremendously -  I plan on paying it forward with some long overdue blog posts, some kick ass new features in VFE and rockin' sessions at SW Fox 2009. Look for the old, enthusiastic Mike of the early 90's to come out and dazzle you with some technical wizardry, self-depracating humor and of course - frantic pacing! Maybe I'll dust off the old Foundation Read sessions - those use to be real show stoppers. Hmmm, do I have enough time to regrow the mullet for SW Fox? I figure if I do really, really well, I can move up to 2nd to last in overall speaker ranking!

Again, thanks to everyone. You're all in my thoughts and prayers and you can count on me being there for you if you ever find yourself in a time of need. 

Thursday, March 26, 2009

How to get your VFP IDE windows to behave.

This fall I watched Alan Stevens present at the Southwest Fox conference and I really liked the way he had his Visual FoxPro IDE windows docked so when I got back home I tried it. The layout looks like this:

The problem that I had is the Visual FoxPro would not remember the position of the windows when exiting. Sometimes on startup it would be close but never totally correct. I asked Alan about it but he had never seen this behavior. 

Finally after several months I found the solution on Tek-Tips. The original solution can be found here (http://www.tek-tips.com/viewthread.cfm?qid=1515817&page=4). But the basic steps behind this thread are:

1. DELETE your Resource file 
2. Start VFP and SET RESOURCE ON 
3. Confirm using ?SET("Resource")
4. Very important step: click the button to the left of the Close (X) button so that the VFP IDE is not maximized
5. Open, position, size and dock your windows/toolbars the way you want them.
6. Quit VFP by clicking the Close button (X), not by choosing File - Exit.
7. Restart VFP and the IDE should be the way you want it.

You can now Maximize the IDE and when you restart everything will still be where you want it.

Friday, March 20, 2009

Don Macintosh

Today a friend of mine posted this comment on Twitter:

"Every so often I practice typing with my nose, just in case I lose my arms in some sort of accident. It pays to be prepared!!"

The comment immediately reminded me of a long time FoxExpress customer named Don Macintosh. Don would call me regularily for technical support. The support questions were really more about custom code than how to use the product. Our receptionists alway knew when it was Don before he identified himself because he was older and spoke louder than most of our other customers. I later found out it was because he was always using handsfree. He always started the call with "Hi, this is Don Macintosh." Because Don was older, it often took several tries to get my point across which at times could be frustrating. Even though I made sure to put on my happy voice, I didn't always enjoy talking to Don. But, Don always liked talking to me and never had any issues paying for the support he used. 

I don't remember the details of the application he was writing but I think it may have been church management software. What I do remember is that it was running on Chinese windows which was one thing that I found facinating about the application. He never had any questions about running under Chinese Windows. It just worked. His questions were all about FoxPro and FoxExpress.

One summer Mike and I were presenting at several of the Southern California User Groups and Don came out to meet us face to face at the.LA Fox User group. We knew Don was coming and it was going to be nice to finally put a face with the name. We got far more of a surprise than we ever expected. Don was indeed older. My guess was early 70s, which was ancient when I was not yet 30. However, he had very minimal use of one arm and no use of the other. I think that the proper term is Diplegia. He was accompanied by his lovely wife who was always nearby when we spoke on the phone. Before meeting him, I just assumed that a retired huband and wife spent a lot of time together. 

So, I bet you are asking how he could possibly program computer in the mid 1990's (before voice recognition was popular). Well, Don had a wooden dowel with him that he put in his mouth and typed with. He was unbelievably efficient, so efficient that I had no clue when I spoke to him on the phone. Sure, I thought some things took a while, but not that long. He was able to navigate the mouse just enough using his one arm. I was so shocked.

Don demoed his application for us and it was nicely done and pretty complex. Of course, our demo was using US Windows but he did show it to us running Chineese windows just so that I could see it. I left that user group meeting with a new respect for Don. When we got back to Toledo, I welcomed each and every call from Don and... I could hear the clicking of that wooden dowel as we spoke. 

Don finished his application and we moved on to other FoxPro technologies. I wonder what ever happened to him. I should remember Don more often when I open my mouth to say "I can't" 

Friday, February 27, 2009

Where did my FoxPro Application Go?

I have been meaning to blog about this for almost a year but kept pushing it to the back burner. A client of mine had an intermittent problem for quite some time. The problem occurred when the users would have the application running and switch to another window like FireFox or Outlook or even another instance of the application. When they would come back to the original application window, it would be gone. No error, just gone.

Once of the things that I did shortly after I started on this gig was to move the runtime files from the server to the local workstation. The system was already launched from a .BAT file that copied a bunch of junk to the local machine so why not copy something useful? As you might expect, in a company with close to 300 users at any time, this move reduced the network traffic quite a bit.

Once the runtime files were moved, we started getting intermittent (but frequent) "Invalid Seek Offset" errors. The network guys insisted that this was an application problem and I insisted that it was a hardware problem. After much Google searching, they network team finally conceded that this was indeed a network issue. It was several network issues actually, NIC cards, bad cables, overloaded hubs... So, my move actually helped make the network stronger.

Once the "Invalid Seek Offset" errors started, the disappearing application windows went away totally. Interesting... when a network connection (or drive mapping) is lost and VFP has to make a call to the runtime files located on a network share, it just shuts down because it can't find the necessary files. It shuts down gracefully with no error message. Sure, data in memory is not saved but no data becomes corrupt either.

On the other hand, Invalid Seek Offset errors are really bad. FoxPro's error handling does not trap these errors and once you get one, you are not getting out of it without an End Task which can corrupt data. So, which do you choose... High network traffic and low risk for data corruption or low network traffic and high risk for data corruption? Luckily this company chose to use the errors (as horrible as they were for a short time) to correct the network problems and make the infrastructure more sound over all. Now the system runs efficiently with next to no network related errors. I would never have expected FoxPro to just shut down when it couldn't find the needed internals.

Have a great weekend!

Friday, January 16, 2009

Chatty vs. Chunky

Most of my client-server experience has led me to believe that a chatty application will perform better than a chunky one. A chatty application will pull, from the server, the smallest amount of data needed to perform a task. If more data is needed for another task another small dataset is retrieved. It is an only pull what you need system.

While working at GiftRAP, Beth Massi, tried to convince me that a chunky interface is far more scalable and much better when writing distributed applications. Since Beth knows far more about distributed applications than I do I said OK but didn't really believe her. After all, I was always taught that smaller is better when it comes to getting data from your database server. Well, I now have proof that Beth may have been right, but don't tell her. :-)

I am working on a project right now that is experiencing some bottlenecks on our Oracle Server. Some of the long running processes are really blocking the other 250 users of the system. So, I have decided that I need to do what Calvin would do and remove the slow parts.

So, here is this process that scans through a FoxPro table and retrieves some data from two different Oracle tables based on the FoxPro key field. The first mistake the original developer made was to not create one query to get the data from both Oracle tables at once since they are related. No big deal, this is an honest mistake for someone not well versed in Client-Server techniques. So, I fixed that but the process was still very slow.

As it turns out, there were about 140,000 records in the one Oracle table and just over 3000 that matched a generic query needed for this process. The Oracle cost of the generic query was like 6703 and the cost of the query specific to the Fox data was 474. The problem is that the query with th 474 cost was executed in a loop more than 15 times. Therefore, it was significantly more efficient to pull all 3000 records down (a small # of fields) and let FoxPro filter the more specific data as it was needed.

In general the process would take anywhere from 15 minutes to 1 hour to run on a daily basis and consume enough server resources to slow down other processes. Now it runs in under a minute and is barely a bleep on the server's performance monitor.

Don't get caught in old habits when tweaking performance. Chunky can be better than Chatty even in non-distributed (or plain 2 tier) applications.

Note: Mike and I were discussing this post the other day and he indicated that the point of the blog might not be so evident. So basically here is the point in a nutshell: Pulling down 10 different records 5 times is not always faster than pulling down all 50 records from the start.

Friday, November 14, 2008

UAC Hell

I have spoken to several people lately about how I do not like running with UAC turned on under Vista. The concept of UAC is a good one; I just don’t like it for me so I keep UAC turned off. For some reason it seems that Windows wants to keep turning it on for no reason and without prompting. This has been driving me crazy for several months simply because when I turn it off I have to reboot and that takes a little while I my machine. I plan to do a “Freeman” very soon.

Well, last week UAC again got turned on without prompting. This time it was far worse than any other time. I noticed right away when I went to enter my password that the dialog was different. I just figured that whatever update turned UAC back on must have also changed the login dialog. Then, I figured out that my password did not work. I entered it the same way and the login dialog accepted it but I received a message that I needed elevation. How much more elevation can you get than the administrator? So, I went and looked at my user rights and guess what, I was no longer an administrator on my own computer. I was just a debugging user. To boot, I had no clue what the password would be for the Administrator account. All I read about Vista said that the Administrator account was not really one that could be logged on to. Just great!

After an hour or so of trying to figure out what was going on, I was reminded of a conversation I had with some networks guys I work with. I needed to install a specific version of MSXML on each workstation at a fairly large company (300 machines). The network guys suggested that I allow them to push the install down using Group Policy. Ah ha! So, if they could push down entire installs I bet they push down configurations too. But, I never log on to the domain directly so does Group Policy apply to me? The answer is yes. I log into the network using a VPN connection and that is all that is needed. My login name (rather than machine name) was the key for the Group Policy. Our system admin removed my computer name from the list of computers to update and now all it well again. I just hope that it stays that way. So, when weird things happen, don’t forget to look to the network configurations, all of them.

Thursday, July 31, 2008

Rendering Blog Content to a web page

I received an email last night asking about how we render the table of contents from our blog to our home page. I thought this would make a good blog entry itself, so here it is.

Our home page is an Active FoxPro (AFP) page. It contains the code below to render the blog.

Someone just pointed out to me that this code wasn't showing up under ie. Bad ie!


?BlogFeed([http://feeds.feedburner.com/F1Technologies?id=]+DTOS(DATETIME()))
Blogfeed is a function I have defined in the .AFPA.Code file for F1Tech.com. I've attached the relevant code in a program named blogfeed in a zip file here.

In a nutshell the blogfeed class uses the Microsoft.XMLHTTP COM object to retrieve the URL, creates a cursor from it, locates the first record we want to render and then spits it out into an HTML table. I've used various versions of this class for a number of different blogs. The structure of the cursor created from the XMLToCursor call can vary widely and which record you want to start on will also vary, but this should be pretty easy to tweak to deal with that.

The id=DTOS(DATETIME()) parameter I'm appending to the URL is a dummy parameter. Feedburner doesn't do anything with this parameter, but I had to append something to force a new read. Without adding this the server (or something at feedburner maybe) seemed to cache the feed and it would take several days before new blog entries would show up. Using a GUID or a SYS(2015) value might be a better approach since those values would change on each call, but for my purposes, I don't mind if the feed is cached once a day because this should take a load off the server.

The BlogFeed wrapper function is designed for simple calls. The blogfeed class has a number of properties that are designed to make it possible to work with different blogs, use different styles and so on. Below are the key properties and methods you'll use to customize the blogfeed class for other content.

Properties
  • cBlogURL - The URL for the blog
  • cAlias - The alias created when the blog is loaded into a cursor.
  • nMaxEntries - The maximum number of blog entries to render.
  • nMaxNew - The maximum number of entries to flag as new. This property can be set to zero to specify no entries should be flagged as new.
  • nNewDays- The number of days to consider an item new.
  • cTitleField - The name of the field that contains the title for the blog entry.
  • cURLField - The name of the field that contains the URL for the blog entry.
  • cNewStyle - The style to use for items flagged as new.
  • cArticleStyle - The style to use for links to articles.
  • cErrorMessage - The error message to display when the blog cannot be read.

Methods
  • Render - Renders the blog as HTML
  • FindFirstEntry - Finds the first record to be written to the HTML table. Most blog feeds will create some header records that should be ignored.
  • GetEntryDate - Returns the date of a blog entry. Most feeds will contain a field that contains the date of the blog entry, but the format may vary greatly. This method typically is overridden to parse the date from this field.
The blogfeed class is a really simple class to make use of. I'm using AFP. The syntax for Web Connection should be identical. If you're using another web technology it should be fairly easy to adjust the call to the blog feed function as necessary. Enjoy! Somewhere around here I have calls for the VFP Wiki, VFPX, FoxCentral and a few other fox centric sites. I plan on deploying them all to a single page as a generic VFP portal sometime soon.

Labels: , ,

Monday, July 28, 2008

Our Son was Married on Friday



Our son Yuki, from Japan, married his friend Yesuel, from Korea, Friday evening in a mock wedding ceremony at the Toledo Botanical Gardens.

Yuki is staying with us for a few weeks this summer while attending the International Youth Academy sponsored by the Toledo Sister Cities International. A friend of ours has been trying to talk us into being a host family for several years and this year it fit well with our schedule. We are enjoying learning about Japanese culture as Yuki learns about American culture. It has been an absolute blast and I will be sad to see Yuki go home.

Wednesday, July 23, 2008

IE JavaScript Debugging with DebugBar

Virtually every developer I know that's doing any kind of client-side development for the browser using JavaScript prefers Firefox over Internet Explorer. The main reason for this preference is the availability of Firebug for Firefox. Personally my approach has been to develop using Firefox and then when I have everything working pray that my code will function properly in IE. I make pretty heavy use of Prototype, which addresses a lot of cross-browser issues, but there are still plenty of occasions where things work just fine in Firefox but choke in IE.

A few months ago I stumbled across a tool named DebugBar - a Firebug like debugger for IE! DebugBar allows you to inspect the Document Object Model (DOM) for the current page, view the source for you JavaScript, see the results of AJAX calls, examine styles, provides a JavaScript console and much more. I still prefer Firefox and Firebug for one simple reason, DebugBar does not currently offer JavaScript tracing - although it does work with the MS Script Debugger (which is "deprecated technology and is no longer supported") - and the ability to step through code like Firebug does. This is pretty much the only Firebug feature I really miss, but it's a big one. At any rate, I've still found DebugBar to be incredibly useful and can't imagine developing and testing for IE without it.

Labels: , , , ,

Friday, July 18, 2008

Thinking Outside the Box

As many of you know, right now I am working on a project with a lot of legacy FoxPro code. This week some team members decided to add a primary key to several of our old Fox tables. They chose an auto incrementing integer field for the primary key. Since they thought this change would be fairly harmless, they made it right on production data without running it through testing first.

A few hours into the work day (data changes are made after hours) people started getting “Field ID is ReadOnly” (2088) errors. The problem was discussed during our morning SCRUM and immediately the developers were ready to drop the field. You see there is SCATTER MEMVAR MEMO and GATHER MEMVAR MEMO code all over the place in the application and no one wanted to find each one and modify it to bypass the new ID field. I figured that we could handle it through the error handler using code like this:

IF e_no = 2088 AND 'ID'$UPPER(er_mess)
RELEASE m.id
on error do err_prg with ;
error(), ;
program(), ;
lineno(), ;
message(), ;
message(1)
RETRY
ENDIF


Releasing the id variable and retrying the command fixes the problem and if anyone
was relying on a different m.id value they were hosed anyway. So, good code in one spot to fix not so good code in many places.

During the writing of this blog entry, I looked up error 2088 in the help file and stumbled on SET AUTOINCERROR that I probably read about at one time when it didn’t apply to me and promptly forgot about. That would have been a much easier fix but less fun to blog about.

Buh bye Plaxo

I just deleted my Plaxo account. I've been on Linked In along time and am much happier with it than Plaxo. Plaxo.com immediately crashes Firefox whenever I log into it and runs painfully slow on IE7. I know these issues probably have more to do with my computer than Plaxo, but I'm not going to invest the time in trying to solve them. So, if you're looking to connect with me on a social networking site, check me out on Linked In.

View Mike Feltman's profile on LinkedIn

I just thought I'd post this here so anyone who has added me as a connection on Plaxo knows I'm no longer there.

Sometime soon I've gotta start twttering though. Toni's really enjoying cyberstalking all of her friends.

Friday, July 11, 2008

Microsoft Enterprise Library 4.0

I attended a webinar yesterday on Microsoft Enterprise Library 4.0 and I think I wasted my time. Even though it was described as Level 200 – Intro, the presenters assumed that the audience knew something about prior versions of EntLib which I did not. I was hoping for some pictures of the architecture (which they did provide) and then examples showing how you used to do something and how you can do it better with EntLib.

I think that the concept is good and similar to what we have being doing with the Factory and Data Dictionary in VFE for years. I want to be able to see the injection side but I just couldn’t see it in the examples provided. I thought maybe it was just me but another person on my team (VB.NET programmer) didn’t really get it either.

Part II is this afternoon but I think I may pass until I do some more reading on Aspect-Oriented Programming and earlier versions of EntLib.

Labels:

Thursday, September 20, 2007

Little Tidbits

I recently starting working with a great group of guys at a local company. I am not so sure that I like actually having to get dressed every day but I do like the work and the people which make it worthwhile.

The team that I am working with have worked with Fox a long time, two of them go back to our days at Fox Software. The business has grown rapidly over the last few years and the IT department has felt the pain. One of the reasons I was brought in on this project was to help get things on a smoother path. I think we are gettting there. It is so rewarding to see processes implemented and work in a way that takes the pressure down a notch or two.

Anyway, the reason for this blog entry is to talk about two tips that I learned from my new team.

1. How many places in your application do you have the following code?
IF USED("SomeAlias")
USE IN SomeAlias
ENDIF

Well, it can be replaced with:
USE IN SELECT("SomeAlias") 

This code works without error if the cursor is opened or not. Thank you Travis!

2. Did you know that anytime a Windows MessageBox is open, you can press CTRL+C and paste plain text into a text file? No need to use Shift+PrintScreen and deal with the image. Try it out... Thanks Brad.

Have a wonderful weekend!

Thursday, August 16, 2007

Toni is BACK!!!

Thank goodness that Mike settled that nasty bit with the SWFox team because it allowed me to once again be a full time part of F1 Technologies.

I am baaaacccccckkkk! And just wait until you see what I have in store for VFE.

Monday, August 13, 2007

SW Fox Dispute Finally Settled!

Finally after months and months of bitter negotiations we've resolved our long standing dispute with Tamar Granor, Rick Schummer and Doug Hennig - the organizers of this year's Southwest Fox conference. Now that we've put that matter behind us we are pleased to announce that F1 Technologies will be sponsoring Southwest Fox again this year. As part of our settlement Rick strong armed us into providing a copy of Visual FoxExpress along with a free 6-month subscription for every registered attendee. Let me tell you Rick is one shrewd negotiator - Chester Karass could take some lessons from him. Even though we'll already be giving a free copy of VFE - a $699 value - to every attendee, Rick still "convinced" us into participating in the trade show as well.

The official deal is on Rick's blog. We'll let you read the fine print there in order to avoid another dispute with Rick. One thing Rick didn't mention, which in no way am I saying is an oversight on his part, is that we'll need a valid email address for each attendee in order to redeem this offer. When we return from Southwest Fox we'll be sending an email to each attendee with instructions on how to get their copy of VFE.

In addition to exhibiting Toni Feltman will be giving two sessions: "What's all this noise about OOP?" and "Introduction to the DBI Controls Included in Sedna." We'll also be holding a session to demonstrate the latest and greatest version of VFE - you know, the one each attendee gets for free.

Southwest Fox is a great conference. We're looking forward to participating again. We hope to see you there.

P.S. If you're wondering what the dispute was about, I'm sorry to say we'll have to keep you in the dark on that one due to the confidentiality agreement Rick made us sign. Maybe you'll be able to ply it out of one of us over a few beers at the conference though.

Labels: , , , ,

Monday, May 21, 2007

Business Decision Regarding VFP?

I've had a number of people ask me recently about my position on the announcement that there will be no future versions of Visual FoxPro. Of course, this hardly comes as a surprise. The writing has been on the wall for years. I disagree that this was a business decision made by Microsoft. I believe this was a decision made years ago at Microsoft and that it was driven by egos, not business. Personnel decisions excluded, I'm not sure Microsoft has made a sound business decision related to VFP since they acquired it, unless the decision from day one was simply to kill the market. In that case, my hat is off to Microsoft. They can declare "mission accomplished" in the VFP market place in much the same way George Bush did in Iraq and with equal credibility. In reality, what's done is done and the reason - or lack thereof - behind the decision isn't all that important. I've signed the petition at MasFoxPro.com and think anyone with any interest in VFP should, but I don't expect anything to come of it. I'd love to be wrong.

What frosts me the most about the whole thing is the absolute BS we've been fed about VFP not fitting into .NET. I've had several conversations with Microsoft folk about making VFP part of .NET and they would always come back with silly arguments about "how would you compile …" If there were any merit to those arguments then in reality what they were saying is that VFP is more capable than .NET and if so, what kind of a "business decision" is being made here?

Maybe I'm just being too harsh and those guys at Microsoft just aren't that sharp after all. Maybe even with all of their vast resources the folks at Microsoft just can't figure this stuff out, yet a tiny little company like eTechnologia.net can.

Ok, ranting aside, the truth is it would've been more difficult to make VFP a .NET language back in the 90's because .NET wasn't as capable then and Microsoft was hell bent against dynamic languages. But now? Microsoft is investing in creating versions of Python and Ruby for .NET and of course already has Jscript. If these dynamic languages can be developed for .NET, there's no reason VFP can't be ported to .NET. The new DLR (Dynamic Language Runtime) for .NET should make this relatively easy. The marketplace has made Microsoft take notice of dynamic languages and as a result, a VFP.NET would take considerably less effort than it would've in the 90s.

Now, ask yourself this, if Microsoft is making business decisions about VFP, don't you think there should be some logic applied across the board? Look at the VFP, Ruby and Python markets. Which market offers millions of lines of code, thousands of developers, hundreds of large customers and hundreds of vertical market applications? Now ask yourself, where's the business decision here?

Thursday, May 10, 2007

Cool Tree View Code

I know that it has been a while since we published a Blog entry but we have been very busy. Leilani is growing quickly and doing very well overall. As you can see below she is hoping that the Red Wings win the cup again this year.

The following segment of code is something that I wrote a while ago when implementing a tree view in a form I was working on. I wanted to try something new to detect if a node needed the plus sign, indicating children were available. I was tired of always seeing the plus and having it expand to nothing. At the same time, I didn't want to load the tree with all of the children at startup either. The following is what I came up with.

SELECT
CategoryID,
Name,
(SELECT TOP 1 CategoryID
FROM Category SubCategory
WHERE ParentID = Category.CategoryID) AS Child
FROM
Category
WHERE
ParentID IS NULL
ORDER BY Name


This code grabs all parent nodes (ParentID IS NULL) and the first child to that parent. The second block of code is how I populate the tree. If the Child field IS NULL, there are no children. If the child field has a value, there is at least one. As you may be able to tell by the synax, this is SQL Server code. The good news is that this also work with VFP code.

SCAN ALL
This.oTree.Nodes.Add(,1, 'KEY_' + TRANSFORM(CategoryID), Name)

IF NOT ISNULL(Child)
This.oTree.Nodes.Add('KEY_' + TRANSFORM(CategoryID), 4, 'CHILD_' + TRANSFORM(CategoryID), "D")
ENDIF
ENDSCAN



Friday, February 02, 2007

Feltman 2.0 Has Been Released

Toledo, OH

Mike & Toni Feltman are pleased to announce that Will (fka Mickey) Feltman is now a big brother! Will welcomed his new baby sister Leilani Taylor Feltman into the world at 6:01 am on February 1st. Release had been scheduled for February 4th, but in a surprise move, the Feltman's actually decided to release early.

Leilani weighs in at 7 lbs 11 ounces, is 21 inches long and has a very healthy set of lungs!

When asked about his new role as big brother Will Feltman said "I've enjoyed the long run I've had as baby of the family, but really, after 10 years, it was time for me to move on. I mean really, what took my parents so long? I'm ready for bigger and better things. Changing poopy diapers will not be among those bigger and better things. I'm looking forward to teaching Leilani about the finer things in life, like how to get exactly what you want from your parents. I'm also very happy that Leilani is a girl so that I can continue in my role as my Dad's 'best boy.'"

Leilani is in perfect health. Delivery was incredibly fast and without complication. Mother is recovering remarkably well and may come home with Leilani as early as today. Dad is already contemplating how he's going to keep the boys away from his beautiful new daughter.

The Feltman's would like to thank their friends and families and their extended families in the FoxPro community and at St. Martin de Porres Catholic Church for the love and support they've shown us throughout the pregnancy. Your thoughts, prayers and deeds have truly touched us. We are absolutely thrilled to bring Leilani into a world with so much love.

Love to All!

Toni, Mike, Will & Leilani

Tuesday, August 08, 2006

CWIZCRYSTAL

Crystal VFE 2.01 is now available. Please click here for details.

Wednesday, June 14, 2006

Taming Dockable Toolbars

Last night I spoke at LAFOX on docking in VFP. Before my session started Ken Leland approached me about a problem he has in his application that's come up with several customers of mine over the years and we've never really tracked down.

The problem is that occassionally a toolbar will become undocked and the end user claims they didn't move it or anything like that. In fact, this problem can occur even if the movable property of the toolbar is set to false. From looking at the various office applications, it appears standard Windows behavior is for a toolbar to doc itself when you doubleclick on an empty space in it, or in its titlebar. VFP decided to go one better than than and if you doubleclick on a toolbar or empty space in it (including on a separator), the toolbar will undock itself - even if movable is set to false. The result is that if a user misses a button in a docked toolbar by a pixel or two and clicks in an empty space, the toolbar will undock. Turning off this behavior is easy all you need is a little code like this in the dblclick method.


IF This.DockPosition <> -1
NODEFAULT
ENDIF


That'll tame your toolbar.

Saturday, May 06, 2006

Version Control in MS Word

Did you know that Word has internal version control? I just stumbled across the feature this week. It is not team version control but it is version control for the individual user. I use Word 2003 and like I said, I just found this feature so I don’t know how long it has been there. How do you get at it? Well, off if the file menu, there is a Versions choice that brings up this dialog:



You can save as many versions of the document that you would like. Anytime you want to get back to them, you select the one you want and open it. Once the document is open, you can Save As another document and start editing that version. I did a little digging and found that all versions of the document are stored in the same DOC file and only the changes are saved in each version rather than the entire document.

I think I will definitely be able to use feature when writing my session white papers. On many occasions I have scrapped entire sections of the paper only to decide later that I really would like to include it. Pretty cool.

Congrats go out to YAG!

Once again Microsoft has seen the wonderful things that the Fox people (or past Fox people) are capable of and rewarded him. Yag has once again moved to a new and exciting position within Microsoft. The better news is that he will still have a firm hold on FoxPro. I can sleep much better at night knowing that Yag is watching my back.

Congratulations dude, you deserve it!

Friday, March 31, 2006

Key and Timestamp on VFP Tables

Twice in the last two months I have talked to someone getting errors because the modified fields list was too long in the data they were trying to save. The first person was using views and the second one was using Cursor Adapter. I know that the SYS(3055) function was added to help "work around" this issue. I am not sure how much memory this will use so I am not inclined to use it as a general solution. The problem has been around for many years so why couldn't MSFT just give us a Timestamp data type and we would be all set. Oh, I know why. Because then we wouldn't use SQL Server. :-)

When the first person asked about this problem, Mike and I talked about it and together we rolled a really good solution. I can't believe that we didn't think of this years ago. Here is what you need to do:

First: Add a datetime field named tUpdated to each of your tables. Or at least to the really wide ones.

Next: Add a stored procedure to the DBC where your tables reside. The stored procedure is very simple:

PROCEDURE NewTime
* Updates the datetime field of a cursor with the current
* date and time.
REPLACE tUpdated WITH DATETIME()

RETURN .T.

Third: Call the NewTime() function from the record level rule for each table with a tUpdated field. In case you are not familar with the record level rule, it is located on the Table page in the Table designer. The purpose is to validate a record before saving. I don't know about you, but I have use Valids for more non-validation code than actual validation code. So this is nothing new.

Finally: In your view or cursor adapter, set both the key and the tUpdated fields to be the key. Do not set the tUpdated field to be updatable. You also need to set the Where Clause to just Key Field.

Now, there are two additional things that you might need to deal with. The first is in VFE. A VFE cursor class doesn't like multiple field primary keys too much. So, even though the view uses the key and tUpdated field for the key, the cursor just needs to know about the real key. Therefore, you must set the cPrimaryKey property of your cursor classes to just the name of the key field. Then, the cursor class code won't ask the view what the primary key is.

The next problem is refreshing the tUpdated field. The field is modified in the table. Therefore, the old value will remain in the view until you requery or refresh it another way. In VFE you can simply set the lRefreshRowOnSave property on the business object to .T. If you are not using VFE, you can try to call the Refresh() function. Sometimes Refresh() works and sometimes it doesn't. If it does not work, you will have to retrieve the new tUpdated value from the table and update the view field with the new value.

I hope that this approach will save someone a headache.

xCase 8 - Wow!

Resolution has released Xcase 8.0. In my opinion, this is the most major upgrade to Xcase to date. I've been a big fan of Xcase for a long time; in fact, I was so impressed when I first saw Xcase that F1 Technologies ended up becoming a distributor.

Xcase has always been the most capable database design tool I've ever used, especially when it came to Fox data since it was the only real game in town. Previously I liked Xcase more for what it could do, then for how it did it. What I didn't like was the interface. It had more of a Windows 3.1 style interface that I found to be a bit dated, clunky and sometimes awkward.

Xcase 8.0 eliminates all of my concerns about its interface. What was ugly is now beautiful, what was awkward is now elegant, what was obscure is now easy to find. They've really done an amazing job with this upgrade. The workspace has been completely redesigned. It now has a very XPish interface, is easy to navigate, is snappier and well, it's just plain sexy. The toolbars have been updated with more standard icons and are customizable. The menus adhere to Windows standards. Dialogs have been consolidated into multi-tabbed browsers and so on.

The interfaces changes themselves more than justify the upgrade, but in addition to the new capabilities in the UI there are a number of other worthwhile enhancements. Most importantly Xcase 8 fully supports both SQL Server 2005 and MySQL 5. For SQL Server 2005 Xcase supports Schemas, Partitions, XML collections, XML Indexes, Index Included Columns, Description Extended Property, CLR Objects and much more. For MySQL 5 support has been added for triggers, stored procedures, functions and views.

For more information on Xcase 8 or to download a fully functional demonstration version visit http://www.f1tech.com/xcase. I will also be out and about demonstrating xCase 8 to various user groups this summer. If you’d like to arrange an xCase demonstration at your user group, contact me.

A list of new features can be found at http://www.f1tech.com/xCase/whatsnew.htm. New orders and upgrades can be placed at http://www.f1tech.com/orders.