<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-18962598</id><updated>2011-12-01T13:59:31.960-05:00</updated><category term='AFP'/><category term='FoxPro'/><category term='Sample Data'/><category term='Reports'/><category term='Firebug'/><category term='SQL Server'/><category term='Visual'/><category term='XML'/><category term='Internet Explorer'/><category term='SWFOX'/><category term='JavaScript'/><category term='FoxExpress'/><category term='Oracle'/><category term='VFP'/><category term='DebugBar'/><category term='Southwest Fox'/><category term='VFE'/><category term='.NET'/><category term='Consonant'/><category term='FireFox'/><title type='text'>F1 Technologies Blog</title><subtitle type='html'>All the latest happenings at &lt;a href="http://www.f1tech.com"&gt;F1 Technologies&lt;/a&gt;, Visual FoxPro and other tech info of interest and whatever else we feel like ranting and raving about. :)</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://f1technologies.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18962598/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://f1technologies.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Mike Feltman</name><uri>http://www.blogger.com/profile/03174215705395971982</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://www.f1tech.com/images/mikef.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>56</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-18962598.post-5170973216314493131</id><published>2011-11-11T07:35:00.003-05:00</published><updated>2011-11-11T08:37:13.813-05:00</updated><title type='text'>Lifetime Achievement</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/-HjMzReUSgI4/Tr0k-o2AwoI/AAAAAAAAAC4/oKjVAJzESDU/s1600/2011-10-27%2B08.13.06.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 150px; height: 200px;" src="http://2.bp.blogspot.com/-HjMzReUSgI4/Tr0k-o2AwoI/AAAAAAAAAC4/oKjVAJzESDU/s200/2011-10-27%2B08.13.06.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5673731764091142786" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Wow... that is all that I could really say, wow!&lt;br /&gt;&lt;br /&gt;On Wednesday October 26, 2011, while I was waiting to hear what I knew would be a fantastic Keynote presentation from &lt;a href="http://stevenblack.com/"&gt;Steven Black&lt;/a&gt; at Southwest Fox 2011 in Phoenix, AZ, I was awarded the biggest honor in the FoxPro Community. I was awarded the &lt;a href="http://fox.wikis.com/wc.dll?Wiki~FoxProCommunityLifetimeAchievementAward"&gt;FoxPro Community Lifetime Achievement Award&lt;/a&gt;. 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. &lt;br /&gt;&lt;br /&gt;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.&lt;br /&gt;&lt;br /&gt;It was only fitting that my award was presented by &lt;a href="http://rickschummer.com/"&gt;Rick Schummer&lt;/a&gt;. 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. &lt;br /&gt;&lt;br /&gt;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. &lt;br /&gt;&lt;br /&gt;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.&lt;br /&gt;&lt;br /&gt;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!&lt;br /&gt;&lt;br /&gt;Thank you God for giving me the talents that allow me to help others and accept the help that they give me.&lt;br /&gt;&lt;br /&gt;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.&lt;br /&gt;&lt;br /&gt;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!&lt;br /&gt;&lt;br /&gt;Thank you &lt;a href="http://fox.wikis.com/wc.dll?Wiki~YAlanGriver"&gt;YAG&lt;/a&gt; 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.&lt;br /&gt;&lt;br /&gt;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.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18962598-5170973216314493131?l=f1technologies.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://f1technologies.blogspot.com/feeds/5170973216314493131/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18962598&amp;postID=5170973216314493131' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18962598/posts/default/5170973216314493131'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18962598/posts/default/5170973216314493131'/><link rel='alternate' type='text/html' href='http://f1technologies.blogspot.com/2011/11/lifetime-achievement.html' title='Lifetime Achievement'/><author><name>Toni M. Feltman</name><uri>http://www.blogger.com/profile/07215237972663023252</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/-HjMzReUSgI4/Tr0k-o2AwoI/AAAAAAAAAC4/oKjVAJzESDU/s72-c/2011-10-27%2B08.13.06.jpg' height='72' width='72'/><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18962598.post-8205002411910058151</id><published>2011-03-28T16:29:00.002-05:00</published><updated>2011-03-29T09:49:33.526-05:00</updated><title type='text'>Embarking on a New Adventure</title><content type='html'>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. &lt;br /&gt;&lt;br /&gt;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. &lt;br /&gt;&lt;br /&gt;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. &lt;br /&gt;&lt;br /&gt;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. &lt;br /&gt;&lt;br /&gt;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?&lt;br /&gt;&lt;br /&gt;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.&lt;br /&gt;&lt;br /&gt;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!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18962598-8205002411910058151?l=f1technologies.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://f1technologies.blogspot.com/feeds/8205002411910058151/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18962598&amp;postID=8205002411910058151' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18962598/posts/default/8205002411910058151'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18962598/posts/default/8205002411910058151'/><link rel='alternate' type='text/html' href='http://f1technologies.blogspot.com/2011/03/embarking-on-new-adventure.html' title='Embarking on a New Adventure'/><author><name>Toni M. Feltman</name><uri>http://www.blogger.com/profile/07215237972663023252</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18962598.post-1787453545409894845</id><published>2010-08-27T15:52:00.002-05:00</published><updated>2010-08-27T16:05:48.365-05:00</updated><title type='text'>VFE: Changing how system settings are stored.</title><content type='html'>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. &lt;br /&gt;&lt;br /&gt;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. &lt;br /&gt;&lt;br /&gt;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.&lt;br /&gt;&lt;br /&gt;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. &lt;br /&gt;&lt;br /&gt;Step 3: Plug in the new system setting class through your application level factory table using the description of System Setting Manager. &lt;br /&gt;&lt;br /&gt;That is all there was to it. I love this framework!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18962598-1787453545409894845?l=f1technologies.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://f1technologies.blogspot.com/feeds/1787453545409894845/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18962598&amp;postID=1787453545409894845' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18962598/posts/default/1787453545409894845'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18962598/posts/default/1787453545409894845'/><link rel='alternate' type='text/html' href='http://f1technologies.blogspot.com/2010/08/vfe-changing-how-system-settings-are.html' title='VFE: Changing how system settings are stored.'/><author><name>Toni M. Feltman</name><uri>http://www.blogger.com/profile/07215237972663023252</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18962598.post-3989727886785064737</id><published>2009-10-29T05:39:00.000-05:00</published><updated>2009-10-29T05:39:22.149-05:00</updated><title type='text'>What's up with VFE?</title><content type='html'>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.&lt;div&gt;&lt;br /&gt;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.&lt;br /&gt;&lt;br /&gt;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.&lt;br /&gt;&lt;br /&gt;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.&lt;br /&gt;&lt;br /&gt;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.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18962598-3989727886785064737?l=f1technologies.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://f1technologies.blogspot.com/feeds/3989727886785064737/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18962598&amp;postID=3989727886785064737' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18962598/posts/default/3989727886785064737'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18962598/posts/default/3989727886785064737'/><link rel='alternate' type='text/html' href='http://f1technologies.blogspot.com/2009/10/whats-up-with-vfe.html' title='What&apos;s up with VFE?'/><author><name>Mike Feltman</name><uri>http://www.blogger.com/profile/03174215705395971982</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://www.f1tech.com/images/mikef.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18962598.post-4530760526198403858</id><published>2009-10-20T14:40:00.004-05:00</published><updated>2009-10-20T15:39:58.023-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='VFP'/><category scheme='http://www.blogger.com/atom/ns#' term='Reports'/><category scheme='http://www.blogger.com/atom/ns#' term='SWFOX'/><title type='text'>CXToFRX</title><content type='html'>At &lt;a href="http://www.swfox.net/"&gt;Southwest Fox 2009&lt;/a&gt; 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 &lt;a href="http://www.f1tech.com/downloads/cxtofrx.zip"&gt;CXToFrx.prg&lt;/a&gt; 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. &lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;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...&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18962598-4530760526198403858?l=f1technologies.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://www.f1tech.com/downloads/cxtofrx.zip' title='CXToFRX'/><link rel='replies' type='application/atom+xml' href='http://f1technologies.blogspot.com/feeds/4530760526198403858/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18962598&amp;postID=4530760526198403858' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18962598/posts/default/4530760526198403858'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18962598/posts/default/4530760526198403858'/><link rel='alternate' type='text/html' href='http://f1technologies.blogspot.com/2009/10/cxtofrx.html' title='CXToFRX'/><author><name>Mike Feltman</name><uri>http://www.blogger.com/profile/03174215705395971982</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://www.f1tech.com/images/mikef.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18962598.post-1092401130191504815</id><published>2009-10-20T10:23:00.002-05:00</published><updated>2009-10-20T10:36:30.095-05:00</updated><title type='text'>Southwest Fox 2009 Rocked!</title><content type='html'>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. &lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;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. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;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.  &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;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 &lt;a href="http://blameitonrick.rickschummer.com/"&gt;BIOR&lt;/a&gt; is missing Southwest Fox. &lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18962598-1092401130191504815?l=f1technologies.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://f1technologies.blogspot.com/feeds/1092401130191504815/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18962598&amp;postID=1092401130191504815' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18962598/posts/default/1092401130191504815'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18962598/posts/default/1092401130191504815'/><link rel='alternate' type='text/html' href='http://f1technologies.blogspot.com/2009/10/southwest-fox-2009-rocked.html' title='Southwest Fox 2009 Rocked!'/><author><name>Mike Feltman</name><uri>http://www.blogger.com/profile/03174215705395971982</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://www.f1tech.com/images/mikef.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18962598.post-1636991378897249116</id><published>2009-10-12T10:55:00.009-05:00</published><updated>2009-10-22T10:06:48.181-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Oracle'/><category scheme='http://www.blogger.com/atom/ns#' term='SQL Server'/><category scheme='http://www.blogger.com/atom/ns#' term='Sample Data'/><title type='text'>Building a Sample Data Set</title><content type='html'>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. &lt;br /&gt;&lt;br /&gt;The data is in Oracle so I used the following as an expression for a column I named rank.&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;code&gt;dense_rank() over (partition by substr(stk_num, 1, 3) order by substr(stk_num, 1, 3), dbms_random.Value) as rank&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;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. &lt;br /&gt;&lt;br /&gt;So, my full select statement looked like the following:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;code&gt;SELECT id, stk_num, rank&lt;br /&gt;FROM&lt;br /&gt;  (&lt;br /&gt;    SELECT&lt;br /&gt;      product.*, &lt;br /&gt;      dense_rank() over (partition by substr(stk_num, 1, 3) order by substr(stk_num, 1, 3), dbms_random.Value) as rank &lt;br /&gt;    from product &lt;br /&gt;    where format &lt;&gt; 'V'&lt;br /&gt;  ) r&lt;br /&gt;where rank &lt;= 3 ;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;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:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;code&gt;DELETE FROM product where id NOT IN &lt;br /&gt;(SELECT id&lt;br /&gt;FROM&lt;br /&gt;  (&lt;br /&gt;    SELECT&lt;br /&gt;      product.*, &lt;br /&gt;      dense_rank() over (partition by substr(stk_num, 1, 3) order by substr(stk_num, 1, 3), dbms_random.Value) as rank &lt;br /&gt;    from product &lt;br /&gt;    where format &lt;&gt; 'V'&lt;br /&gt;  ) r&lt;br /&gt;where rank &lt;= 3 );&lt;br /&gt;commit;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;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.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18962598-1636991378897249116?l=f1technologies.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://f1technologies.blogspot.com/feeds/1636991378897249116/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18962598&amp;postID=1636991378897249116' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18962598/posts/default/1636991378897249116'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18962598/posts/default/1636991378897249116'/><link rel='alternate' type='text/html' href='http://f1technologies.blogspot.com/2009/10/building-sample-data-set.html' title='Building a Sample Data Set'/><author><name>Toni M. Feltman</name><uri>http://www.blogger.com/profile/07215237972663023252</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18962598.post-4321337412989486988</id><published>2009-10-01T08:48:00.002-05:00</published><updated>2009-10-01T08:57:12.605-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='FoxPro'/><category scheme='http://www.blogger.com/atom/ns#' term='Consonant'/><category scheme='http://www.blogger.com/atom/ns#' term='Visual'/><title type='text'>IsConsonant Function</title><content type='html'>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. &lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;FUNCTION IsConsonant&lt;br /&gt; * Purpose...: Returns .T. if the letter passed is a consonant.&lt;br /&gt; * Author....: Toni M. Feltman&lt;br /&gt; * Parameters: tcLetter, The letter to check.&lt;br /&gt; *     tlYIsVowel, When passed .T. the letter Y is considered a vowel. &lt;br /&gt; * Returns...: Boolean&lt;br /&gt; * Added.....: 09/29/2009&lt;br /&gt; LPARAMETERS ;&lt;br /&gt;  tcLetter, ;&lt;br /&gt;  tlYIsVowel&lt;br /&gt;&lt;br /&gt; LOCAL ;&lt;br /&gt;  lcVowelString AS Character, ;&lt;br /&gt;  llReturn AS Boolean &lt;br /&gt;&lt;br /&gt; lcVowelString = IIF(tlYIsVowel, 'AEIOUY', 'AEIOU')&lt;br /&gt; llReturn = ISALPHA(tcLetter) AND NOT UPPER(tcLetter)$lcVowelString&lt;br /&gt; RETURN llReturn&lt;br /&gt;  &lt;br /&gt;ENDFUNC  &lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18962598-4321337412989486988?l=f1technologies.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://f1technologies.blogspot.com/feeds/4321337412989486988/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18962598&amp;postID=4321337412989486988' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18962598/posts/default/4321337412989486988'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18962598/posts/default/4321337412989486988'/><link rel='alternate' type='text/html' href='http://f1technologies.blogspot.com/2009/10/isconsonant-function.html' title='IsConsonant Function'/><author><name>Toni M. Feltman</name><uri>http://www.blogger.com/profile/07215237972663023252</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18962598.post-9191591829407726683</id><published>2009-06-16T22:20:00.002-05:00</published><updated>2009-06-16T22:52:07.125-05:00</updated><title type='text'>Instrumenting Menus</title><content type='html'>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 &lt;a href="http://portal.dfpug.de/dFPUG/Dokumente/FoxTalk/FoxTalk1997/FT19979_4.PDF"&gt;Instrumenting FoxPro Applications&lt;/a&gt; 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.&lt;br /&gt;&lt;br /&gt;Next I stumbed across the &lt;a href="http://msdn.microsoft.com/en-us/library/ms947606.aspx"&gt;Extending the VFP 9 IDE with MENUHIT and MENUCONTEXT &lt;/a&gt;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:&lt;br /&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;I opened my FoxCode table and copied it to the application's data directory and deleted all of the records.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;I added one new record to the application specific FoxCode table with the following field values:&lt;br /&gt;&lt;br /&gt;Type = 'S'&lt;br /&gt;Abbrev = 'MENUHIT'&lt;br /&gt;Data = The following program code.&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;LPARAMETERS ;&lt;br /&gt;   toParameter&lt;br /&gt;&lt;br /&gt;LOCAL ;&lt;br /&gt;   loSelect AS Object, ;&lt;br /&gt;   lcBar AS Character, ;&lt;br /&gt;   lcPad AS Character&lt;br /&gt;&lt;br /&gt;loSelect = CREATEOBJECT('cSelect')&lt;br /&gt;lcBar = UPPER(ALLTRIM(toParameter.MenuItem))&lt;br /&gt;lcPad = UPPER(ALLTRIM(toParameter.UserTyped))&lt;br /&gt;&lt;br /&gt;*!* do not track use by developers&lt;br /&gt;IF VERSION(2) &lt;&gt; 0&lt;br /&gt;   RETURN&lt;br /&gt;ENDIF&lt;br /&gt;&lt;br /&gt;SELECT 0&lt;br /&gt;USE MenuTrack&lt;br /&gt;LOCATE FOR UPPER(cBar)  = lcBar AND UPPER(cPad) = lcPad&lt;br /&gt;&lt;br /&gt;IF NOT FOUND()&lt;br /&gt;   APPEND BLANK&lt;br /&gt;   REPLACE cBar with lcBar, cPad with lcPad&lt;br /&gt;ENDIF&lt;br /&gt;&lt;br /&gt;REPLACE nCount WITH nCount + 1, ;&lt;br /&gt;   dLastHit WITH DATETIME()&lt;br /&gt;&lt;br /&gt;USE IN SELECT("MenuTrack")&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Then, in my main program I added the following lines of code:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;IF FILE(‘FOXCODE.DBF’)&lt;br /&gt;   _FOXCODE = ‘foxcode.dbf’&lt;br /&gt;ENDIF&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;&lt;br /&gt;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!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18962598-9191591829407726683?l=f1technologies.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://f1technologies.blogspot.com/feeds/9191591829407726683/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18962598&amp;postID=9191591829407726683' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18962598/posts/default/9191591829407726683'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18962598/posts/default/9191591829407726683'/><link rel='alternate' type='text/html' href='http://f1technologies.blogspot.com/2009/06/instrumenting-menus.html' title='Instrumenting Menus'/><author><name>Toni M. Feltman</name><uri>http://www.blogger.com/profile/07215237972663023252</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18962598.post-3301752898810601127</id><published>2009-05-01T10:44:00.007-05:00</published><updated>2009-05-01T12:28:27.665-05:00</updated><title type='text'>Mike &amp; Toni Feltman Speaking at Southwest Fox 2009</title><content type='html'>&lt;span class="Apple-style-span" style="font-size: medium;"&gt;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. &lt;/span&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt;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 &lt;/span&gt;&lt;a href="http://www.swfox.net/sessions.aspx#HTML_and_Visual_FoxPro"&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt;HTML and Visual FoxPro&lt;/span&gt;&lt;/a&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt; and the second one is &lt;/span&gt;&lt;a href="http://www.swfox.net/sessions.aspx#Introducing_ChatterFox"&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt;Introducing  ChatterFox&lt;/span&gt;&lt;/a&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt;. &lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt;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. &lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt;My other session, &lt;/span&gt;&lt;a href="http://www.swfox.net/sessions.aspx#Introducing_ChatterFox"&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt;Introducing ChatterFox&lt;/span&gt;&lt;/a&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt;, 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 &lt;/span&gt;&lt;a href="http://www.swfox.net/register.aspx"&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt;register&lt;/span&gt;&lt;/a&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt; link and get yourself signed up. There are some great early discounts available. &lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt;Also, on the topic of SW Fox, a new track has been added this year: "&lt;/span&gt;&lt;a href="http://www.swfox.net/sessionstrack.aspx#Technology_for_VFP_Developers"&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt;Technology for VFP Developers&lt;/span&gt;&lt;/a&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt;." 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:&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;ol&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt;Integrating VFP with SourceGear Vault&lt;br /&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt;Introduction to Subversion and Tortoise SVN&lt;br /&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt;Microsoft Virtual PC for VFP Developers&lt;br /&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt;Open Source Tools&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt;The Show Must Go On: Disaster Recovery and Business Continuity Planning&lt;br /&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ol&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt;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. &lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt;I'm looking forward to the "&lt;/span&gt;&lt;a href="http://www.swfox.net/sessions.aspx#Microsoft_Virtual_PC_for_VFP_Developers"&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt;Microsoft Virtual PC for VFP Developers&lt;/span&gt;&lt;/a&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt;" 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. &lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt;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. &lt;/span&gt;&lt;a href="http://www.swfox.net/sessions.aspx#Introduction_to_Subversion_and_Tortoise_SVN"&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt;Introduction to Subversion and Tortoise SVN&lt;/span&gt;&lt;/a&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt; given by Toni Feltman and &lt;/span&gt;&lt;span class="Apple-style-span" style=" -webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; "&gt;&lt;a href="http://www.swfox.net/sessions.aspx#Integrating_VFP_with_SourceGear_Vault"&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt;Integrating VFP with SourceGear Vault&lt;/span&gt;&lt;/a&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt; 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 &lt;/span&gt;&lt;a href="http://www.swfox.net/register.aspx"&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt;register now&lt;/span&gt;&lt;/a&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt;, 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. &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style=" -webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px;"&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style=" -webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px;"&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt;I'll be rehearsing one of my sessions at the &lt;/span&gt;&lt;a href="http://grafug.com/"&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt;Grand Rapids Area FoxPro User Group&lt;/span&gt;&lt;/a&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt; 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. &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style=" -webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px;"&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style=" -webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px;"&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt;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 &lt;/span&gt;&lt;a href="http://www.youtube.com/watch?v=beBi2avvmho"&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt;burning guitars&lt;/span&gt;&lt;/a&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt; 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.&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style=" -webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px;"&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style=" -webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px;"&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18962598-3301752898810601127?l=f1technologies.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://www.swfox.net' title='Mike &amp; Toni Feltman Speaking at Southwest Fox 2009'/><link rel='replies' type='application/atom+xml' href='http://f1technologies.blogspot.com/feeds/3301752898810601127/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18962598&amp;postID=3301752898810601127' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18962598/posts/default/3301752898810601127'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18962598/posts/default/3301752898810601127'/><link rel='alternate' type='text/html' href='http://f1technologies.blogspot.com/2009/05/mike-toni-feltman-speaking-at-southwest.html' title='Mike &amp; Toni Feltman Speaking at Southwest Fox 2009'/><author><name>Mike Feltman</name><uri>http://www.blogger.com/profile/03174215705395971982</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://www.f1tech.com/images/mikef.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18962598.post-8843666671097781138</id><published>2009-04-29T12:19:00.003-05:00</published><updated>2009-04-29T12:49:31.940-05:00</updated><title type='text'>Work Area Manager - Go Green with VFP</title><content type='html'>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. &lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;In the &lt;a href="http://www.f1tech.com/downloads/workareamanager.zip"&gt;zip&lt;/a&gt; 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. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;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. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Give it a try. &lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18962598-8843666671097781138?l=f1technologies.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://f1technologies.blogspot.com/feeds/8843666671097781138/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18962598&amp;postID=8843666671097781138' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18962598/posts/default/8843666671097781138'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18962598/posts/default/8843666671097781138'/><link rel='alternate' type='text/html' href='http://f1technologies.blogspot.com/2009/04/work-area-manager.html' title='Work Area Manager - Go Green with VFP'/><author><name>Mike Feltman</name><uri>http://www.blogger.com/profile/03174215705395971982</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://www.f1tech.com/images/mikef.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18962598.post-2747012442844791529</id><published>2009-04-29T11:02:00.004-05:00</published><updated>2009-04-29T12:14:32.590-05:00</updated><title type='text'>Clean Bill of Health</title><content type='html'>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.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;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 &lt;a href="http://twitpic.com/41scn"&gt;this&lt;/a&gt;, except the bloating is down considerably. &lt;a href="http://s3.amazonaws.com/twitpic/photos/full/6801863.jpg?AWSAccessKeyId=0ZRYP5X5F6FSMBCCSE82&amp;amp;Expires=1241022369&amp;amp;Signature=6edxP4PRg%2FDH8M64EBB4%2FsutYzc%3D"&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;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. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;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, &lt;a href="http://www.saintmartindeporres.com/"&gt;Saint Martin de Porres&lt;/a&gt; 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.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;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. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;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. :)&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;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 &lt;a href="http://swfox.net/"&gt;SW Fox 2009&lt;/a&gt;. 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!&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;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. &lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18962598-2747012442844791529?l=f1technologies.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://f1technologies.blogspot.com/feeds/2747012442844791529/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18962598&amp;postID=2747012442844791529' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18962598/posts/default/2747012442844791529'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18962598/posts/default/2747012442844791529'/><link rel='alternate' type='text/html' href='http://f1technologies.blogspot.com/2009/04/clean-bill-of-health.html' title='Clean Bill of Health'/><author><name>Mike Feltman</name><uri>http://www.blogger.com/profile/03174215705395971982</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://www.f1tech.com/images/mikef.jpg'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18962598.post-8900650351230250264</id><published>2009-03-26T08:11:00.010-05:00</published><updated>2009-04-12T20:49:48.878-05:00</updated><title type='text'>How to get your VFP IDE windows to behave.</title><content type='html'>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:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_biEcgaSfPVQ/SdQvgi_M5WI/AAAAAAAAAA4/PaK_z-5--Xo/s1600-h/Docking.bmp"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 200px; height: 125px;" src="http://1.bp.blogspot.com/_biEcgaSfPVQ/SdQvgi_M5WI/AAAAAAAAAA4/PaK_z-5--Xo/s200/Docking.bmp" border="0" alt="" id="BLOGGER_PHOTO_ID_5319929296025609570" /&gt;&lt;/a&gt;&lt;div&gt;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. &lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Finally after several months I found the solution on Tek-Tips. The original solution can be found here (&lt;a href="http://www.tek-tips.com/viewthread.cfm?qid=1515817&amp;amp;page=4"&gt;http://www.tek-tips.com/viewthread.cfm?qid=1515817&amp;amp;page=4).&lt;/a&gt; But the basic steps behind this thread are:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;1. DELETE your Resource file &lt;/div&gt;&lt;div&gt;2. Start VFP and SET RESOURCE ON &lt;/div&gt;&lt;div&gt;3. Confirm using ?SET("Resource")&lt;/div&gt;&lt;div&gt;4. Very important step: click the button to the left of the Close (X) button so that the VFP IDE is not maximized&lt;/div&gt;&lt;div&gt;5. Open, position, size and dock your windows/toolbars the way you want them.&lt;/div&gt;&lt;div&gt;6. Quit VFP by clicking the Close button (X), not by choosing File - Exit.&lt;/div&gt;&lt;div&gt;7. Restart VFP and the IDE should be the way you want it.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;You can now Maximize the IDE and when you restart everything will still be where you want it.&lt;span class="Apple-style-span" style="color: rgb(0, 0, 238); text-decoration: underline;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18962598-8900650351230250264?l=f1technologies.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://f1technologies.blogspot.com/feeds/8900650351230250264/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18962598&amp;postID=8900650351230250264' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18962598/posts/default/8900650351230250264'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18962598/posts/default/8900650351230250264'/><link rel='alternate' type='text/html' href='http://f1technologies.blogspot.com/2009/03/this-fall-i-watched-alan-stevens.html' title='How to get your VFP IDE windows to behave.'/><author><name>Toni M. Feltman</name><uri>http://www.blogger.com/profile/07215237972663023252</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_biEcgaSfPVQ/SdQvgi_M5WI/AAAAAAAAAA4/PaK_z-5--Xo/s72-c/Docking.bmp' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18962598.post-3527467132533528070</id><published>2009-03-20T09:27:00.006-05:00</published><updated>2009-03-20T19:58:30.917-05:00</updated><title type='text'>Don Macintosh</title><content type='html'>&lt;span class="Apple-style-span"   style="color: rgb(51, 51, 51);   line-height: 15px; font-family:'Lucida Grande';font-size:14px;"&gt;&lt;div&gt;Today a friend of mine posted this comment on Twitter:&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;"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!!"&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;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. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;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.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;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. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;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.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;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. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;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" &lt;/div&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18962598-3527467132533528070?l=f1technologies.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://f1technologies.blogspot.com/feeds/3527467132533528070/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18962598&amp;postID=3527467132533528070' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18962598/posts/default/3527467132533528070'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18962598/posts/default/3527467132533528070'/><link rel='alternate' type='text/html' href='http://f1technologies.blogspot.com/2009/03/don-macintosh.html' title='Don Macintosh'/><author><name>Toni M. Feltman</name><uri>http://www.blogger.com/profile/07215237972663023252</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18962598.post-1188552855452079954</id><published>2009-02-27T08:51:00.004-05:00</published><updated>2009-02-27T10:55:19.061-05:00</updated><title type='text'>Where did my FoxPro Application Go?</title><content type='html'>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.&lt;br /&gt;&lt;br /&gt;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.&lt;br /&gt;&lt;br /&gt;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.&lt;br /&gt;&lt;br /&gt;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.&lt;br /&gt;&lt;br /&gt;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.&lt;br /&gt;&lt;br /&gt;Have a great weekend!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18962598-1188552855452079954?l=f1technologies.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://f1technologies.blogspot.com/feeds/1188552855452079954/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18962598&amp;postID=1188552855452079954' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18962598/posts/default/1188552855452079954'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18962598/posts/default/1188552855452079954'/><link rel='alternate' type='text/html' href='http://f1technologies.blogspot.com/2009/02/where-did-my-foxpro-application-go.html' title='Where did my FoxPro Application Go?'/><author><name>Toni M. Feltman</name><uri>http://www.blogger.com/profile/07215237972663023252</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18962598.post-1157414787589881414</id><published>2009-01-16T10:20:00.006-05:00</published><updated>2009-02-27T08:21:53.381-05:00</updated><title type='text'>Chatty vs. Chunky</title><content type='html'>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.&lt;br /&gt;&lt;br /&gt;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. :-) &lt;br /&gt;&lt;br /&gt;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. &lt;br /&gt;&lt;br /&gt;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. &lt;br /&gt;&lt;br /&gt;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. &lt;br /&gt;&lt;br /&gt;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.&lt;br /&gt;&lt;br /&gt;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.&lt;br /&gt;&lt;br /&gt;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.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18962598-1157414787589881414?l=f1technologies.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://f1technologies.blogspot.com/feeds/1157414787589881414/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18962598&amp;postID=1157414787589881414' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18962598/posts/default/1157414787589881414'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18962598/posts/default/1157414787589881414'/><link rel='alternate' type='text/html' href='http://f1technologies.blogspot.com/2009/01/chatty-vs-chunky.html' title='Chatty vs. Chunky'/><author><name>Toni M. Feltman</name><uri>http://www.blogger.com/profile/07215237972663023252</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18962598.post-8000493291144842137</id><published>2008-11-14T17:37:00.003-05:00</published><updated>2008-11-14T17:38:14.597-05:00</updated><title type='text'>UAC Hell</title><content type='html'>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. &lt;br /&gt;&lt;br /&gt;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!&lt;br /&gt;&lt;br /&gt;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.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18962598-8000493291144842137?l=f1technologies.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://f1technologies.blogspot.com/feeds/8000493291144842137/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18962598&amp;postID=8000493291144842137' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18962598/posts/default/8000493291144842137'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18962598/posts/default/8000493291144842137'/><link rel='alternate' type='text/html' href='http://f1technologies.blogspot.com/2008/11/uac-hell.html' title='UAC Hell'/><author><name>Toni M. Feltman</name><uri>http://www.blogger.com/profile/07215237972663023252</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18962598.post-9145179201668468512</id><published>2008-07-31T07:43:00.005-05:00</published><updated>2008-08-14T11:14:54.188-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='VFP'/><category scheme='http://www.blogger.com/atom/ns#' term='AFP'/><category scheme='http://www.blogger.com/atom/ns#' term='XML'/><title type='text'>Rendering Blog Content to a web page</title><content type='html'>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.&lt;br /&gt;&lt;br /&gt;Our home page is an Active FoxPro (AFP) page. It contains the code below to render the blog.&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;span style="font-weight: bold;"&gt;Someone just pointed out to me that this code wasn't showing up under ie. Bad ie!&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt; ?BlogFeed([http://feeds.feedburner.com/F1Technologies?id=]+DTOS(DATETIME()))&lt;br /&gt;&lt;/pre&gt;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 &lt;a href="http://www.f1tech.com/downloads/blogfeed.zip"&gt;here&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;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.&lt;br /&gt;&lt;br /&gt;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.&lt;br /&gt;&lt;br /&gt;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.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Properties&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;cBlogURL  -  The URL for the blog&lt;/li&gt;&lt;li&gt;cAlias - The alias created when the blog is loaded into a cursor. &lt;/li&gt;&lt;li&gt;nMaxEntries - The maximum number of blog entries to render.&lt;/li&gt;&lt;li&gt;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.&lt;/li&gt;&lt;li&gt;nNewDays- The number of days to consider an item new.&lt;/li&gt;&lt;li&gt;cTitleField - The name of the field that contains the title for the blog entry.&lt;/li&gt;&lt;li&gt;cURLField - The name of the field that contains the URL for the blog entry.&lt;/li&gt;&lt;li&gt;cNewStyle - The style to use for items flagged as new.&lt;/li&gt;&lt;li&gt;cArticleStyle - The style to use for links to articles.&lt;/li&gt;&lt;li&gt;cErrorMessage - The error message to display when the blog cannot be read.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Methods&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Render - Renders the blog as HTML&lt;/li&gt;&lt;li&gt;FindFirstEntry - Finds the first record to be written to the HTML table. Most blog feeds will create some header records that should be ignored.&lt;/li&gt;&lt;li&gt;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.&lt;/li&gt;&lt;/ul&gt;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.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18962598-9145179201668468512?l=f1technologies.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://www.f1tech.com' title='Rendering Blog Content to a web page'/><link rel='replies' type='application/atom+xml' href='http://f1technologies.blogspot.com/feeds/9145179201668468512/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18962598&amp;postID=9145179201668468512' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18962598/posts/default/9145179201668468512'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18962598/posts/default/9145179201668468512'/><link rel='alternate' type='text/html' href='http://f1technologies.blogspot.com/2008/07/rendering-blog-content-to-web-page.html' title='Rendering Blog Content to a web page'/><author><name>Mike Feltman</name><uri>http://www.blogger.com/profile/03174215705395971982</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://www.f1tech.com/images/mikef.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18962598.post-5726309955255382206</id><published>2008-07-28T06:17:00.002-05:00</published><updated>2008-07-28T06:22:40.520-05:00</updated><title type='text'>Our Son was Married on Friday</title><content type='html'>&lt;a href="http://bp2.blogger.com/_biEcgaSfPVQ/SI2rGLUnGrI/AAAAAAAAAAk/et88krT-viY/s1600-h/Yuki_and_Yesuel.JPG"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;" src="http://bp2.blogger.com/_biEcgaSfPVQ/SI2rGLUnGrI/AAAAAAAAAAk/et88krT-viY/s400/Yuki_and_Yesuel.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5228022865053817522" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Our son Yuki, from Japan, married his friend Yesuel, from Korea, Friday evening in a mock wedding ceremony at the Toledo Botanical Gardens.&lt;br /&gt;&lt;br /&gt;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.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18962598-5726309955255382206?l=f1technologies.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://f1technologies.blogspot.com/feeds/5726309955255382206/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18962598&amp;postID=5726309955255382206' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18962598/posts/default/5726309955255382206'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18962598/posts/default/5726309955255382206'/><link rel='alternate' type='text/html' href='http://f1technologies.blogspot.com/2008/07/our-son-was-married-on-friday.html' title='Our Son was Married on Friday'/><author><name>Toni M. Feltman</name><uri>http://www.blogger.com/profile/07215237972663023252</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://bp2.blogger.com/_biEcgaSfPVQ/SI2rGLUnGrI/AAAAAAAAAAk/et88krT-viY/s72-c/Yuki_and_Yesuel.JPG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18962598.post-8408987336331212447</id><published>2008-07-23T15:55:00.004-05:00</published><updated>2008-07-23T16:13:32.835-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JavaScript'/><category scheme='http://www.blogger.com/atom/ns#' term='Internet Explorer'/><category scheme='http://www.blogger.com/atom/ns#' term='FireFox'/><category scheme='http://www.blogger.com/atom/ns#' term='DebugBar'/><category scheme='http://www.blogger.com/atom/ns#' term='Firebug'/><title type='text'>IE JavaScript Debugging with DebugBar</title><content type='html'>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 &lt;a href="http://getfirebug.com/"&gt;Firebug&lt;/a&gt; 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 &lt;a href="http://www.prototypejs.org/"&gt;Prototype&lt;/a&gt;, 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.&lt;br /&gt;&lt;br /&gt;A few months ago I stumbled across a tool named &lt;a href="http://www.debugbar.com/"&gt;DebugBar&lt;/a&gt; - 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.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18962598-8408987336331212447?l=f1technologies.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://www.debugbar.com/' title='IE JavaScript Debugging with DebugBar'/><link rel='replies' type='application/atom+xml' href='http://f1technologies.blogspot.com/feeds/8408987336331212447/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18962598&amp;postID=8408987336331212447' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18962598/posts/default/8408987336331212447'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18962598/posts/default/8408987336331212447'/><link rel='alternate' type='text/html' href='http://f1technologies.blogspot.com/2008/07/ie-javascript-debugging-with-debugbar.html' title='IE JavaScript Debugging with DebugBar'/><author><name>Mike Feltman</name><uri>http://www.blogger.com/profile/03174215705395971982</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://www.f1tech.com/images/mikef.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18962598.post-3415911551121561539</id><published>2008-07-18T16:17:00.002-05:00</published><updated>2008-07-18T16:32:35.360-05:00</updated><title type='text'>Thinking Outside the Box</title><content type='html'>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.&lt;br /&gt;&lt;br /&gt;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:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;IF e_no = 2088 AND 'ID'$UPPER(er_mess)&lt;br /&gt;    RELEASE m.id&lt;br /&gt;    on error do err_prg with ;&lt;br /&gt;        error(), ;&lt;br /&gt;        program(), ;&lt;br /&gt;        lineno(), ;&lt;br /&gt;        message(), ;&lt;br /&gt;        message(1)&lt;br /&gt;    RETRY&lt;br /&gt;ENDIF&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Releasing the id variable and retrying the command fixes the problem and if anyone&lt;br /&gt;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.&lt;br /&gt;&lt;br /&gt;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.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18962598-3415911551121561539?l=f1technologies.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://f1technologies.blogspot.com/feeds/3415911551121561539/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18962598&amp;postID=3415911551121561539' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18962598/posts/default/3415911551121561539'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18962598/posts/default/3415911551121561539'/><link rel='alternate' type='text/html' href='http://f1technologies.blogspot.com/2008/07/thinking-outside-box.html' title='Thinking Outside the Box'/><author><name>Toni M. Feltman</name><uri>http://www.blogger.com/profile/07215237972663023252</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18962598.post-1914858898279868667</id><published>2008-07-18T11:37:00.002-05:00</published><updated>2008-07-18T11:43:13.398-05:00</updated><title type='text'>Buh bye Plaxo</title><content type='html'>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.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.linkedin.com/in/mikefeltman"&gt;&lt;img height="33" alt="View Mike Feltman's profile on LinkedIn" src="http://www.linkedin.com/img/webpromo/btn_myprofile_160x33.gif" width="160" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;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.&lt;br /&gt;&lt;br /&gt;Sometime soon I've gotta start twttering though. Toni's really enjoying cyberstalking all of her friends.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18962598-1914858898279868667?l=f1technologies.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://f1technologies.blogspot.com/feeds/1914858898279868667/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18962598&amp;postID=1914858898279868667' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18962598/posts/default/1914858898279868667'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18962598/posts/default/1914858898279868667'/><link rel='alternate' type='text/html' href='http://f1technologies.blogspot.com/2008/07/buh-bye-plaxo.html' title='Buh bye Plaxo'/><author><name>Mike Feltman</name><uri>http://www.blogger.com/profile/03174215705395971982</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://www.f1tech.com/images/mikef.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18962598.post-6451214224523919918</id><published>2008-07-11T11:32:00.002-05:00</published><updated>2008-07-11T11:51:10.557-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='.NET'/><title type='text'>Microsoft Enterprise Library 4.0</title><content type='html'>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. &lt;br /&gt;&lt;br /&gt;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. &lt;br /&gt;&lt;br /&gt;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.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18962598-6451214224523919918?l=f1technologies.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://f1technologies.blogspot.com/feeds/6451214224523919918/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18962598&amp;postID=6451214224523919918' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18962598/posts/default/6451214224523919918'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18962598/posts/default/6451214224523919918'/><link rel='alternate' type='text/html' href='http://f1technologies.blogspot.com/2008/07/microsoft-enterprise-library-40.html' title='Microsoft Enterprise Library 4.0'/><author><name>Toni M. Feltman</name><uri>http://www.blogger.com/profile/07215237972663023252</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18962598.post-1767451066054844981</id><published>2007-09-20T21:37:00.000-05:00</published><updated>2007-09-20T21:53:06.072-05:00</updated><title type='text'>Little Tidbits</title><content type='html'>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.&lt;br /&gt;&lt;br /&gt;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.&lt;br /&gt;&lt;br /&gt;Anyway, the reason for this blog entry is to talk about two tips that I learned from my new team.&lt;br /&gt;&lt;br /&gt;1. How many places in your application do you have the following code?&lt;br /&gt;&lt;pre&gt;IF USED("SomeAlias")&lt;br /&gt;     USE IN SomeAlias&lt;br /&gt;ENDIF&lt;/pre&gt;&lt;br /&gt;Well, it can be replaced with:&lt;br /&gt;&lt;pre&gt;USE IN SELECT("SomeAlias") &lt;/pre&gt;&lt;br /&gt;This code works without error if the cursor is opened or not. Thank you Travis!&lt;br /&gt;&lt;br /&gt;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.&lt;br /&gt;&lt;br /&gt;Have a wonderful weekend!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18962598-1767451066054844981?l=f1technologies.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://f1technologies.blogspot.com/feeds/1767451066054844981/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18962598&amp;postID=1767451066054844981' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18962598/posts/default/1767451066054844981'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18962598/posts/default/1767451066054844981'/><link rel='alternate' type='text/html' href='http://f1technologies.blogspot.com/2007/09/little-tidbits.html' title='Little Tidbits'/><author><name>Toni M. Feltman</name><uri>http://www.blogger.com/profile/07215237972663023252</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18962598.post-6232171673490821834</id><published>2007-08-16T16:03:00.000-05:00</published><updated>2007-08-16T16:16:07.158-05:00</updated><title type='text'>Toni is BACK!!!</title><content type='html'>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.&lt;br /&gt;&lt;br /&gt;I am baaaacccccckkkk! And just wait until you see what I have in store for VFE.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18962598-6232171673490821834?l=f1technologies.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://www.f1tech.com/About/ToniFeltman.asp' title='Toni is BACK!!!'/><link rel='replies' type='application/atom+xml' href='http://f1technologies.blogspot.com/feeds/6232171673490821834/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18962598&amp;postID=6232171673490821834' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18962598/posts/default/6232171673490821834'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18962598/posts/default/6232171673490821834'/><link rel='alternate' type='text/html' href='http://f1technologies.blogspot.com/2007/08/toni-is-back.html' title='Toni is BACK!!!'/><author><name>Toni M. Feltman</name><uri>http://www.blogger.com/profile/07215237972663023252</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18962598.post-4181034123860549216</id><published>2007-08-13T12:44:00.000-05:00</published><updated>2007-08-14T15:23:56.380-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='FoxPro'/><category scheme='http://www.blogger.com/atom/ns#' term='VFP'/><category scheme='http://www.blogger.com/atom/ns#' term='Southwest Fox'/><category scheme='http://www.blogger.com/atom/ns#' term='FoxExpress'/><category scheme='http://www.blogger.com/atom/ns#' term='VFE'/><title type='text'>SW Fox Dispute Finally Settled!</title><content type='html'>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 &lt;a href="http://www.swfox.net/"&gt;Southwest Fox conference&lt;/a&gt;. 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.&lt;br /&gt;&lt;br /&gt;The official deal is on &lt;a href="http://rickschummer.com/blog/"&gt;Rick's blog.&lt;/a&gt; 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.&lt;br /&gt;&lt;br /&gt;In addition to exhibiting Toni Feltman will be giving two sessions: "&lt;a href="http://swfox.net/sessions.aspx#What%27s_All_This_Noise_About_OOP?"&gt;What's all this noise about OOP?&lt;/a&gt;" and "&lt;a href="http://swfox.net/sessions.aspx#Introduction_to_the_DBI_Controls_Included_in_Sedna"&gt;Introduction to the DBI Controls Included in Sedna&lt;/a&gt;." 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.&lt;br /&gt;&lt;br /&gt;Southwest Fox is a great conference. We're looking forward to participating again. We hope to see you there.&lt;br /&gt;&lt;br /&gt;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.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18962598-4181034123860549216?l=f1technologies.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://www.swfox.net/' title='SW Fox Dispute Finally Settled!'/><link rel='replies' type='application/atom+xml' href='http://f1technologies.blogspot.com/feeds/4181034123860549216/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18962598&amp;postID=4181034123860549216' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18962598/posts/default/4181034123860549216'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18962598/posts/default/4181034123860549216'/><link rel='alternate' type='text/html' href='http://f1technologies.blogspot.com/2007/08/sw-fox-dispute-finally-settled.html' title='SW Fox Dispute Finally Settled!'/><author><name>Mike Feltman</name><uri>http://www.blogger.com/profile/03174215705395971982</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://www.f1tech.com/images/mikef.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18962598.post-304644335651524938</id><published>2007-05-21T14:15:00.000-05:00</published><updated>2007-05-21T14:23:17.083-05:00</updated><title type='text'>Business Decision Regarding VFP?</title><content type='html'>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.&lt;br /&gt;&lt;br /&gt;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?&lt;br /&gt;&lt;br /&gt;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 &lt;a href="http://www.etecnologia.net"&gt;eTechnologia.net&lt;/a&gt; can.&lt;br /&gt;&lt;br /&gt;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.&lt;br /&gt;&lt;br /&gt;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?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18962598-304644335651524938?l=f1technologies.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://f1technologies.blogspot.com/feeds/304644335651524938/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18962598&amp;postID=304644335651524938' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18962598/posts/default/304644335651524938'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18962598/posts/default/304644335651524938'/><link rel='alternate' type='text/html' href='http://f1technologies.blogspot.com/2007/05/business-decision-regarding-vfp.html' title='Business Decision Regarding VFP?'/><author><name>Mike Feltman</name><uri>http://www.blogger.com/profile/03174215705395971982</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://www.f1tech.com/images/mikef.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18962598.post-5193165700370308712</id><published>2007-05-10T16:59:00.000-05:00</published><updated>2007-05-10T17:24:51.726-05:00</updated><title type='text'>Cool Tree View Code</title><content type='html'>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.&lt;br /&gt;&lt;br /&gt;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.&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;SELECT&lt;br /&gt;    CategoryID,&lt;br /&gt;    Name,&lt;br /&gt;    (SELECT TOP 1 CategoryID&lt;br /&gt;     FROM Category SubCategory&lt;br /&gt;     WHERE ParentID = Category.CategoryID) AS Child&lt;br /&gt;FROM&lt;br /&gt;    Category&lt;br /&gt;WHERE&lt;br /&gt;    ParentID IS NULL&lt;br /&gt;ORDER BY Name&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;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.&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;SCAN ALL&lt;br /&gt;    This.oTree.Nodes.Add(,1, 'KEY_' + TRANSFORM(CategoryID), Name)&lt;br /&gt;&lt;br /&gt;    IF NOT ISNULL(Child)&lt;br /&gt;        This.oTree.Nodes.Add('KEY_' + TRANSFORM(CategoryID), 4, 'CHILD_' + TRANSFORM(CategoryID), "D")  &lt;br /&gt;    ENDIF&lt;br /&gt;ENDSCAN&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://bp2.blogger.com/_biEcgaSfPVQ/RkObK2UedQI/AAAAAAAAAAc/nyxUdCacvEs/s1600-h/Misc+146.jpg"&gt;&lt;img id="BLOGGER_PHOTO_ID_5063061016776963330" style="FLOAT: left; MARGIN: 0px 10px 10px 0px; CURSOR: hand" alt="" src="http://bp2.blogger.com/_biEcgaSfPVQ/RkObK2UedQI/AAAAAAAAAAc/nyxUdCacvEs/s400/Misc+146.jpg" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href="http://bp3.blogger.com/_biEcgaSfPVQ/RkOalGUedPI/AAAAAAAAAAU/vCJZDQVHauY/s1600-h/Misc+146.jpg"&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18962598-5193165700370308712?l=f1technologies.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://f1technologies.blogspot.com/feeds/5193165700370308712/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18962598&amp;postID=5193165700370308712' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18962598/posts/default/5193165700370308712'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18962598/posts/default/5193165700370308712'/><link rel='alternate' type='text/html' href='http://f1technologies.blogspot.com/2007/05/cool-tree-view-code.html' title='Cool Tree View Code'/><author><name>Toni M. Feltman</name><uri>http://www.blogger.com/profile/07215237972663023252</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://bp2.blogger.com/_biEcgaSfPVQ/RkObK2UedQI/AAAAAAAAAAc/nyxUdCacvEs/s72-c/Misc+146.jpg' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18962598.post-117042402225560864</id><published>2007-02-02T08:28:00.000-05:00</published><updated>2007-02-02T08:47:33.263-05:00</updated><title type='text'>Feltman 2.0 Has Been Released</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/x/blogger/3578/1684/1600/557349/DSC01056.jpg"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://photos1.blogger.com/x/blogger/3578/1684/320/308173/DSC01056.jpg" alt="" border="0" /&gt;&lt;/a&gt;Toledo, OH&lt;br /&gt;&lt;br /&gt;Mike &amp; 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.&lt;br /&gt;&lt;br /&gt;Leilani weighs in at 7 lbs 11 ounces, is 21 inches long and has a very healthy set of lungs!&lt;br /&gt;&lt;br /&gt;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.'"&lt;br /&gt;&lt;br /&gt;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.&lt;br /&gt;&lt;br /&gt;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.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/x/blogger/3578/1684/1600/825158/DSC01049.jpg"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://photos1.blogger.com/x/blogger/3578/1684/320/552326/DSC01049.jpg" alt="" border="0" /&gt;&lt;/a&gt;Love to All!&lt;br /&gt;&lt;br /&gt;Toni, Mike, Will &amp;amp; Leilani&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18962598-117042402225560864?l=f1technologies.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://f1technologies.blogspot.com/feeds/117042402225560864/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18962598&amp;postID=117042402225560864' title='22 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18962598/posts/default/117042402225560864'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18962598/posts/default/117042402225560864'/><link rel='alternate' type='text/html' href='http://f1technologies.blogspot.com/2007/02/feltman-20-has-been-released.html' title='Feltman 2.0 Has Been Released'/><author><name>Mike Feltman</name><uri>http://www.blogger.com/profile/03174215705395971982</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://www.f1tech.com/images/mikef.jpg'/></author><thr:total>22</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18962598.post-115504584601770687</id><published>2006-08-08T09:04:00.000-05:00</published><updated>2006-08-08T09:04:06.123-05:00</updated><title type='text'>CWIZCRYSTAL</title><content type='html'>Crystal VFE 2.01 is now available. Please &lt;a href="http://www.f1tech.com/CrystalVFE/CRYSTALVFE201.htm"&gt;click here for details.&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18962598-115504584601770687?l=f1technologies.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://www.f1tech.com/CrystalVFE/CRYSTALVFE201.htm' title='CWIZCRYSTAL'/><link rel='replies' type='application/atom+xml' href='http://f1technologies.blogspot.com/feeds/115504584601770687/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18962598&amp;postID=115504584601770687' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18962598/posts/default/115504584601770687'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18962598/posts/default/115504584601770687'/><link rel='alternate' type='text/html' href='http://f1technologies.blogspot.com/2006/08/cwizcrystal.html' title='CWIZCRYSTAL'/><author><name>Mike Feltman</name><uri>http://www.blogger.com/profile/03174215705395971982</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://www.f1tech.com/images/mikef.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18962598.post-115029720415390294</id><published>2006-06-14T09:50:00.000-05:00</published><updated>2006-06-14T10:00:04.910-05:00</updated><title type='text'>Taming Dockable Toolbars</title><content type='html'>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. &lt;br /&gt;&lt;br /&gt;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.&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;IF This.DockPosition &lt;&gt; -1&lt;br /&gt;    NODEFAULT&lt;br /&gt;ENDIF&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;That'll tame your toolbar.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18962598-115029720415390294?l=f1technologies.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://f1technologies.blogspot.com/feeds/115029720415390294/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18962598&amp;postID=115029720415390294' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18962598/posts/default/115029720415390294'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18962598/posts/default/115029720415390294'/><link rel='alternate' type='text/html' href='http://f1technologies.blogspot.com/2006/06/taming-dockable-toolbars.html' title='Taming Dockable Toolbars'/><author><name>Mike Feltman</name><uri>http://www.blogger.com/profile/03174215705395971982</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://www.f1tech.com/images/mikef.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18962598.post-114692636910504529</id><published>2006-05-06T09:25:00.000-05:00</published><updated>2006-05-06T09:39:29.483-05:00</updated><title type='text'>Version Control in MS Word</title><content type='html'>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:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://photos1.blogger.com/blogger/5213/1880/1600/Word_Version.0.jpg"&gt;&lt;img style="DISPLAY: block; MARGIN: 0px auto 10px; CURSOR: hand; TEXT-ALIGN: center" alt="" src="http://photos1.blogger.com/blogger/5213/1880/400/Word_Version.jpg" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;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.&lt;br /&gt;&lt;br /&gt;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.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18962598-114692636910504529?l=f1technologies.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://f1technologies.blogspot.com/feeds/114692636910504529/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18962598&amp;postID=114692636910504529' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18962598/posts/default/114692636910504529'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18962598/posts/default/114692636910504529'/><link rel='alternate' type='text/html' href='http://f1technologies.blogspot.com/2006/05/version-control-in-ms-word.html' title='Version Control in MS Word'/><author><name>Toni M. Feltman</name><uri>http://www.blogger.com/profile/07215237972663023252</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18962598.post-114692530670440094</id><published>2006-05-06T09:16:00.000-05:00</published><updated>2006-05-06T09:21:46.720-05:00</updated><title type='text'>Congrats go out to YAG!</title><content type='html'>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.&lt;br /&gt;&lt;br /&gt;Congratulations dude, you deserve it!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18962598-114692530670440094?l=f1technologies.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://blogs.msdn.com/vsdata/archive/2006/05/04/590521.aspx' title='Congrats go out to YAG!'/><link rel='replies' type='application/atom+xml' href='http://f1technologies.blogspot.com/feeds/114692530670440094/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18962598&amp;postID=114692530670440094' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18962598/posts/default/114692530670440094'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18962598/posts/default/114692530670440094'/><link rel='alternate' type='text/html' href='http://f1technologies.blogspot.com/2006/05/congrats-go-out-to-yag.html' title='Congrats go out to YAG!'/><author><name>Toni M. Feltman</name><uri>http://www.blogger.com/profile/07215237972663023252</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18962598.post-114384680859420143</id><published>2006-03-31T17:48:00.000-05:00</published><updated>2006-03-31T18:13:28.606-05:00</updated><title type='text'>Key and Timestamp on VFP Tables</title><content type='html'>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. :-)&lt;br /&gt;&lt;br /&gt;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:&lt;br /&gt;&lt;br /&gt;First: Add a datetime field named tUpdated to each of your tables. Or at least to the really wide ones.&lt;br /&gt;&lt;br /&gt;Next: Add a stored procedure to the DBC where your tables reside. The stored procedure is very simple:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;PROCEDURE NewTime&lt;br /&gt;* Updates the datetime field of a cursor with the current&lt;br /&gt;* date and time.&lt;br /&gt;REPLACE tUpdated WITH DATETIME()&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:courier new;font-size:85%;"&gt;RETURN .T.&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;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.&lt;br /&gt;&lt;br /&gt;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.&lt;br /&gt;&lt;br /&gt;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.&lt;br /&gt;&lt;br /&gt;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.&lt;br /&gt;&lt;br /&gt;I hope that this approach will save someone a headache.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18962598-114384680859420143?l=f1technologies.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://f1technologies.blogspot.com/feeds/114384680859420143/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18962598&amp;postID=114384680859420143' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18962598/posts/default/114384680859420143'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18962598/posts/default/114384680859420143'/><link rel='alternate' type='text/html' href='http://f1technologies.blogspot.com/2006/03/key-and-timestamp-on-vfp-tables.html' title='Key and Timestamp on VFP Tables'/><author><name>Toni M. Feltman</name><uri>http://www.blogger.com/profile/07215237972663023252</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18962598.post-114381803692742108</id><published>2006-03-31T09:18:00.000-05:00</published><updated>2006-03-31T12:27:09.130-05:00</updated><title type='text'>xCase 8 - Wow!</title><content type='html'>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. &lt;br /&gt;&lt;br /&gt;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. &lt;br /&gt;&lt;br /&gt;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.&lt;br /&gt;&lt;br /&gt;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. &lt;br /&gt;&lt;br /&gt;For more information on Xcase 8 or to download a fully functional demonstration version visit &lt;a href="http://www.f1tech.com/xcase"&gt;http://www.f1tech.com/xcase&lt;/a&gt;. 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 &lt;a href="http://www.f1tech.com/About/ContactForm.asp?Contact=MikeF"&gt;me&lt;/a&gt;. &lt;br /&gt;&lt;br /&gt;A list of new features can be found at &lt;a href="http://www.f1tech.com/xCase/whatsnew.htm"&gt;http://www.f1tech.com/xCase/whatsnew.htm&lt;/a&gt;. New orders and upgrades can be placed at &lt;a href="http://www.f1tech.com/orders"&gt;http://www.f1tech.com/orders&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18962598-114381803692742108?l=f1technologies.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://www.f1tech.com/xcase' title='xCase 8 - Wow!'/><link rel='replies' type='application/atom+xml' href='http://f1technologies.blogspot.com/feeds/114381803692742108/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18962598&amp;postID=114381803692742108' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18962598/posts/default/114381803692742108'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18962598/posts/default/114381803692742108'/><link rel='alternate' type='text/html' href='http://f1technologies.blogspot.com/2006/03/xcase-8-wow.html' title='xCase 8 - Wow!'/><author><name>Mike Feltman</name><uri>http://www.blogger.com/profile/03174215705395971982</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://www.f1tech.com/images/mikef.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18962598.post-114149505551228749</id><published>2006-03-04T12:32:00.000-05:00</published><updated>2006-03-04T14:44:11.840-05:00</updated><title type='text'>Linked Form Support in VFE</title><content type='html'>In my last blog entry I mentioned that we've added support for a new feature named "Linked Forms" to our Visual FoxExpress framework.  Linked forms allows the developer to specify a form that's linked to a field or a view parameter. A linked form is specified by setting the "Linked Form Class Name" for the field or view parameter in the data dictionary.&lt;br /&gt;&lt;br /&gt;   When a field or view parameter has a linked form associated with it the label appears as a hyperlink. If the user clicks the label, the form object is created and a reference to the &lt;span style="font-weight: bold;"&gt;label &lt;/span&gt;is passed to the form's init method. If the form that contains the label has a DoChildForm method, then the linked form is creating using the DoChildForm method. If there isn't a DoChildForm method available then the Application Object's DoForm method is executed.&lt;br /&gt;&lt;br /&gt;   That's pretty much all this feature does out of the box.  What happens in the linked form from there is up to the developer. There are a number of possibilities.&lt;br /&gt;&lt;br /&gt;   In some scenarios you may opt to do nothing in a linked form when it's called. If you're building your application using local tables and the table used by the linked form is open in the calling form's data session, the record pointer should already be position on correct record when the linked form is opened. If you're using the linked form as some type of lookup, perhaps you'd wait to have the user file in parameter values and then act when a record is selected.&lt;br /&gt; &lt;br /&gt;   A more common scenario will be to attempt to move to the data associated with the value of the field the linked form is tied to. Remember when the linked form is called an object reference to the label that made the call is passed. From that label, you can easily retrieve data or other properties and act on them. Here's some sample code that sets a parameter based on the label passed to the form and requeries:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:100%;"&gt;&lt;span style="font-family:courier new;"&gt;&lt;pre&gt;&lt;br /&gt;*==============================================================================&lt;br /&gt;* Method:      Init&lt;br /&gt;* Purpose:      If a parameter is passed, search for a customer that matches&lt;br /&gt;*          it.&lt;br /&gt;* Author:      F1 Technologies&lt;br /&gt;* Parameters:    toParameter, Object, in this case a label object from the&lt;br /&gt;*          calling form.&lt;br /&gt;* Returns:      None&lt;br /&gt;* Added:      02/01/2006&lt;br /&gt;*==============================================================================&lt;br /&gt;LPARAMETERS ;&lt;br /&gt; toParameter&lt;br /&gt;&lt;br /&gt;IF PCOUNT() = 1&lt;br /&gt; This.oPresentObj.oBizObj.Search(toParameter.oField.Name, toParameter.oField.Value)&lt;br /&gt;ENDIF&lt;br /&gt;DODEFAULT(toParameter)&lt;br /&gt;&lt;br /&gt;* Clear the object reference held in the parameter so we don't have a reference&lt;br /&gt;* to an object in another form hanging around.&lt;br /&gt;This.oParameter = NULL&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;This example works with a form that is based on a small view that will have already retrieved all of its data automatically by the time the form's init method is called, so all we do here is call the business object's search method to position the record pointer on the appropriate record. If we were working with parameterized data we could've just as easily set a parameter and then requeried.&lt;br /&gt;&lt;br /&gt;    The most important line in the example is This.oParameter = NULL. By default, when a parameter is passed to a form the parameter is stored in the form's oParameter property. In the case of linked forms, this will be an object reference to a control in another form. This object should reference should always be nullified before the form is destroyed. If you're using a non-modal form, as I was in this example, it's more or less required to release this reference at or near the end of the Init method. If this object reference is left in place and the calling form is subsequently released VFP isn't very happy about it and eventually it will let you know in the form of a crash. If the Linked Form is modal the framework takes care of clearing the oParameter property when the form is destroyed, but it is probably still best to take a cautious approach to this and release the object reference as soon as its no longer needed. &lt;br /&gt;&lt;br /&gt;    This was a relatively easy feature to implement, but it can be quite powerful. I'm making use of it in several places in the new sample application and someday in the near future we'll actually make that available. In the meantime, give it a whirl. It's pretty straightforward.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18962598-114149505551228749?l=f1technologies.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://f1technologies.blogspot.com/feeds/114149505551228749/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18962598&amp;postID=114149505551228749' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18962598/posts/default/114149505551228749'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18962598/posts/default/114149505551228749'/><link rel='alternate' type='text/html' href='http://f1technologies.blogspot.com/2006/03/linked-form-support-in-vfe.html' title='Linked Form Support in VFE'/><author><name>Mike Feltman</name><uri>http://www.blogger.com/profile/03174215705395971982</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://www.f1tech.com/images/mikef.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18962598.post-114148996845565274</id><published>2006-03-04T10:57:00.000-05:00</published><updated>2006-03-04T12:32:00.443-05:00</updated><title type='text'>Integrated Upates Posted for VFE</title><content type='html'>Yesterday we posted another  set of integrated updates for VFE. The following describes what class libraries were changed and what the changes were.  Thanks to Steve Derzi and Troy Neville for finding a few of the issues we've addressed with this update and testing the changes.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Class Library: cVFEMgr&lt;br /&gt;&lt;br /&gt;   cVFEManager&lt;/span&gt;&lt;br /&gt;   Changes were made to several methods to eliminate potential runtime errors if the iId fields get out of sync between VFEMeta and Coremeta.&lt;br /&gt;   Changes were made to force the iIds to remain in sync between VFEMeta and Codemeta for index records. Occassionally the ids were not updated in VFE which caused a runtime error in cCursor.CreateIndexes()&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Class Library: &lt;/span&gt;&lt;span style="font-weight: bold;"&gt;cUtils.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;   cGlobalHook&lt;/span&gt;&lt;br /&gt;   Some previously commented out code was deleted.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Class Library: &lt;/span&gt;&lt;span style="font-weight: bold;"&gt;cToolbar&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;&lt;br /&gt;   &lt;/span&gt;&lt;span style="font-weight: bold;"&gt;cToolbar&lt;/span&gt;&lt;br /&gt;   The refresh method was changed so that controls within the toolbar were not always automatically enabeld when the toolbar was refreshed. This change was necessary to enable proper disabling of toolbars not associated with a modal form when the form is open.&lt;br /&gt; &lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Class Library: cSecure&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;   cUsersPresObj&lt;br /&gt;&lt;br /&gt;   &lt;/span&gt;The PopulateGroupsMethod was changed to make use of the groups cursor directly. In the 1/13/06 build we modified security so that all of the presentation objects are loaded using delayed instantiation. This change made it possible to load a different presentation object from the i-layer if desired. This change caused the groups cursor to not open until the groups page has been activated.&lt;br /&gt;   We also changed the UIEnable method of the cboGroup_Id combobox to automatically requery when the page is activated. This ensures it reflects all currently available groups.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;    cUsersEnvironment&lt;/span&gt;&lt;br /&gt;   An instance of the cGroupsCursor class was added to this data environment to ensure that the groups cursor is available when necessary.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Class Library: cOle&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;    cListViewSelector&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;   The class was created to allow selecting the view in an associated ListView control.&lt;br /&gt;&lt;br /&gt;   &lt;span style="font-weight: bold;"&gt;cListView&lt;/span&gt;&lt;br /&gt;   The OnRowChange_Perform method was modified to check for pending changes in a data entry cursor and act accordingly.&lt;br /&gt;   The SetItem method was modified to append an _ to the begining of the key before searching, which makes it function properly.&lt;br /&gt;&lt;br /&gt;   &lt;span style="font-weight: bold;"&gt;Class Library: cContrls&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;   &lt;span style="font-weight: bold;"&gt;    cLabel&lt;/span&gt;&lt;br /&gt;      The modifications made to cLabel were made to support a new feature: Linked Forms.  I'll write up a separate entry about linked forms in the near future.&lt;br /&gt;&lt;br /&gt;    &lt;span style="font-weight: bold;"&gt;cGrid&lt;/span&gt;&lt;br /&gt;    The OnRowChange_Perform method was refactored based on some conversation in the forums.&lt;br /&gt;    A new method, GetCursorForGrid was added that returns an object reference to the cursor object associated with the grid.&lt;br /&gt;    In the BeforeRowColChange method we sdded code to prompt the user to save when a data entry and list cursor business object is in use with the grid and there are changes pending in the data entry cursor.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Class Library: cCustFrm&lt;/span&gt;&lt;br /&gt;    A couple of minor nits not worth going into detail over were addressed in this class library.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Class Library: cData&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;    &lt;span style="font-weight: bold;"&gt;cField&lt;/span&gt;&lt;br /&gt;    Support was added for fields in local VFP tables to the CheckUnique method.&lt;br /&gt;&lt;br /&gt;    &lt;span style="font-weight: bold;"&gt;cViewParameter&lt;/span&gt;&lt;br /&gt;    Corrected an issue with the Auto Foreign Key (lFKParam) property in value_access.&lt;br /&gt;   &lt;br /&gt;    &lt;span style="font-weight: bold;"&gt;cCursor&lt;/span&gt;&lt;br /&gt;    Added a few checks to ensure that all of the necessary property values retrieved from DBCX are present before trying to create an index.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Class Library: cDataTree&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;    &lt;span style="font-weight: bold;"&gt;cDataTree&lt;/span&gt;&lt;br /&gt;    Changed the LoadBizObj method to better take advantage of business objects that have already been instantiated.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Class Library: cForms&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;    cBaseForm&lt;/span&gt;&lt;br /&gt;    Added code to enable/disable the main toolbar in the activate method based on the modality of the form.&lt;br /&gt;&lt;br /&gt;    &lt;span style="font-weight: bold;"&gt;cPresentObjForm&lt;/span&gt;&lt;br /&gt;    Added code to only refresh the main toolbar when it is enabled.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18962598-114148996845565274?l=f1technologies.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://f1technologies.blogspot.com/feeds/114148996845565274/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18962598&amp;postID=114148996845565274' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18962598/posts/default/114148996845565274'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18962598/posts/default/114148996845565274'/><link rel='alternate' type='text/html' href='http://f1technologies.blogspot.com/2006/03/integrated-upates-posted-for-vfe.html' title='Integrated Upates Posted for VFE'/><author><name>Mike Feltman</name><uri>http://www.blogger.com/profile/03174215705395971982</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://www.f1tech.com/images/mikef.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18962598.post-114026663412215968</id><published>2006-02-18T07:35:00.000-05:00</published><updated>2006-02-18T07:43:54.133-05:00</updated><title type='text'>Up All Night with AFP</title><content type='html'>No, I didn't pull an all nighter and stay up writing AFP code. :) I can't remember the last time I pulled an all nighter coding. 3:00 AM is my limit nowadays and that's pretty rare.&lt;br /&gt;&lt;br /&gt;Anyway, my &lt;a href="http://f1technologies.blogspot.com/2006/02/waking-up-afp-in-background.html"&gt;Waking Up AFP&lt;/a&gt; blog entry got an immediate rise out of Chrisof at Prolib, the author of AFP. I kind of figured it would. :)&lt;br /&gt;&lt;br /&gt;AFP has a lot of configuration options and of course, how long it stays up and running on the server is one of the things you can configure.&lt;br /&gt;&lt;br /&gt;So, here's what Christof had to say about it:&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 102, 255);font-family:arial;" &gt;The default configuration is to shut down an engine when it's been idle for 15 minutes or has processed 2000 hits (to avoid memory problems). You can change that in the afp.config file (or in the ControlCenter):&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 102, 255);font-family:arial;" &gt;max-idle="900" max-uptime="0" max-hits="0" &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 102, 255);font-family:arial;" &gt;max-uptime defines that an AFP engine stops when it has been running for the specified number of seconds, no matter how many hits it processed or how long it has been idle. These settings define how AFP shuts down engines.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 102, 255);font-family:arial;" &gt;A second set of parameter specifies how AFP deals with starting engines:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 102, 255);font-family:arial;" &gt;threads="4" min-threads="0" max-threads="4"&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 102, 255);font-family:arial;" &gt;The default configuration tells AFP to start 4 engines when it starts up. On demand AFP launches up to a total of four engines (it starts with the maximum number), AFP monitors that the number of engines never goes down below zero (that is, all engines can terminate). If you change the min-threads value to "1", AFP always keeps one instance running. Together with the max-idle setting, this would cause AFP to restart the egine every 15 minutes, but always keep one available for fast response times. You can increase the max-threads value to increase reaction time for higher request rates. The recommended value is four times the number of processors on your machine. The best value depends on a number of factors and is best determined by experimenting. &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 102, 255);font-family:arial;" &gt;There's a whole multi-threading infrastructure in AFP. &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Thanks for setting me straight Christof!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18962598-114026663412215968?l=f1technologies.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://f1technologies.blogspot.com/feeds/114026663412215968/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18962598&amp;postID=114026663412215968' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18962598/posts/default/114026663412215968'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18962598/posts/default/114026663412215968'/><link rel='alternate' type='text/html' href='http://f1technologies.blogspot.com/2006/02/up-all-night-with-afp.html' title='Up All Night with AFP'/><author><name>Mike Feltman</name><uri>http://www.blogger.com/profile/03174215705395971982</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://www.f1tech.com/images/mikef.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18962598.post-114019423594677619</id><published>2006-02-17T11:24:00.000-05:00</published><updated>2006-02-17T11:39:27.113-05:00</updated><title type='text'>Waking up AFP in the background</title><content type='html'>I’m in the final stages of the development of a commercial website that was built using AFP. I’ve been really pleased with how well AFP has worked for this site and its performance. Because AFP is VFP, obviously its data handling capabilities are superb. I’ve found this to fit in really well with AJAX style applications because typically server side scripting is handling data intensive operations.&lt;br /&gt;&lt;br /&gt;One caveat to using any VFP technology for server side scripting is its load time. So, of course, this applies to AFP. If AFP hasn’t done anything in a while, it shuts down. That means that when you hit an AFP page, AFP has to be loaded. AFP loads the VFP runtime and this seems to be by far the biggest bottleneck in its startup time. So basically the amount of time it takes to load AFP is roughly equivalent to the amount of time it takes VFP to load, AFP then has to process the page the user navigated to and then lastly, the page is returned to the browser. The end result of all this is that the first time a user hits an AFP page on your server (when AFP isn’t already running) is slow.&lt;br /&gt;&lt;br /&gt;I decided to deal with this by stealing a few techniques from my AJAX functions. It’s pretty simple really, in the onload event of non AFP page (which is my home page), make an XMLHTTP call to open a dummy .AFP page in the background. This starts AFP while the user is viewing the page. By the time they click on a link to an AFP page AFP is already up and running and then the performance is of course, snappy.&lt;br /&gt;I always have trouble getting code to format in the blog, but here it goes.&lt;br /&gt;First, in the body section of your page add onload=”LoadAFP()”. This code tells your browser to execute this function after the page has loaded.&lt;br /&gt;&lt;br /&gt;Now, if you want to avoid an error, you need a LoadAFP function. You can place it in a .js file and simply reference the file, which I’d recommend if you’re going to do this in more than one page or you can place it in the heading section of your page. Here’s the code for that, sans the script tags which Blogger will eat.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;function LoadAFP() {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;var xmlhttp;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;/*@cc_on&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;@if (@_jscript_version &gt;= 5)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;try {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;xmlhttp = new ActiveXObject("Msxml2.XMLHTTP");&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;} catch (e) {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;try {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;} catch (E) {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;xmlhttp = false;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;@else&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;xmlhttp = false;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;@end @*/&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;if (!xmlhttp &amp;&amp;amp; typeof XMLHttpRequest != 'undefined') {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;try {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;xmlhttp = new XMLHttpRequest();&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;} catch (e) {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;xmlhttp = false;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;xmlhttp.open("GET", "http://www.f1tech.com/afploader.afp", true);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;xmlhttp.send(null); &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Basically this function just creates the xmlhttp object – which is complicated due to browser differences. In ie7 (currently in beta), it’ll be native to the browser like it is currently in modern Mozzilla based browsers, but it’ll be a long time before you can just count on it being present. Once you’ve got a reference to an xmlhttp object, the last two lines are one loads AFP in the background. Make sure you change the URL to something on your own server. Starting AFP on mine won’t help your performance. BTW, I didn’t include any code for afploader.afp because it can be any old AFP page. I didn’t test this, but I’d suspect it doesn’t even have to include and AFP script. AFP is invoked on the server whenever a request is made for a file with a .AFP extension.&lt;br /&gt;&lt;br /&gt;I also played around with another variation of this that might be more appropriate if you're using AFP on your home page. Basically, the idea is to make a dummy homepage that just says something like "Server idle, loading website..." and then in your onload section just call a oneline javascript function that reads:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;function LoadAFP() {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;window.location="YourAFPHomePage.AFP" &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;This approach displays the server idle message for as long as necessary, then displays your home page. If AFP is already loaded it jumps to the homepage immediately.&lt;br /&gt;&lt;br /&gt;Neither of these techniques take a lot of effort or are difficult to implement, but I think they can really make a difference for visitors to your website.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18962598-114019423594677619?l=f1technologies.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://www.f1tech.com/afp' title='Waking up AFP in the background'/><link rel='replies' type='application/atom+xml' href='http://f1technologies.blogspot.com/feeds/114019423594677619/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18962598&amp;postID=114019423594677619' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18962598/posts/default/114019423594677619'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18962598/posts/default/114019423594677619'/><link rel='alternate' type='text/html' href='http://f1technologies.blogspot.com/2006/02/waking-up-afp-in-background.html' title='Waking up AFP in the background'/><author><name>Mike Feltman</name><uri>http://www.blogger.com/profile/03174215705395971982</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://www.f1tech.com/images/mikef.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18962598.post-113892419749186463</id><published>2006-02-02T18:25:00.000-05:00</published><updated>2006-02-02T18:49:57.513-05:00</updated><title type='text'>To GMT or to not GMT</title><content type='html'>Toni and I are currently working on a project that has had as many as 9 developers working on it at one time, working from as many as four different locations, plus some developers also working from home. As a result, we've been doing a lot of work on VFE in recent months to make it more friendlier for team environment. One of the things we added to DBCX recently was the ability to write all of the metadata for a DBC out to an XML file and to load metadata from this XML file. This lets developers check in and check out individual DBCs and makes it easier for other developers to get their data dictionary changes without having to check in or check out the meta data for the entire project all at once. The project we're on currently has 47 DBCs, so you can imagine there's a lot of meta data as well.&lt;br /&gt;&lt;br /&gt;Anyway, in working on this, I discovered that I needed to make sure that I properly dealt with different time zones. One of the offices is on West Coast time and well, Toni and I are likely to login from any number of time zones - and seeing as its February in Toledo right now, Hawaii Time sounds about perfect. So, in order to avoid any confusion related to timezones, I built the mechanisms for checking date and time of the changed metadata around GMT - Greenwich Mean Time. In a nutshell, in GMT it's always the same time everywhere in the world, no matter what time zone you're in - even if you're in Indiana or New Foundland. For more info on GMT, &lt;a href="http://wwp.greenwichmeantime.com/"&gt;check this out&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;I haven't done real well with posting code in the blog, so I put a file of the GMT related functions &lt;a href="http://www.f1tech.com/downloads/gmttime.zip"&gt;here&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;There are 4 functions in this procedure file:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;GMTDateTime&lt;/span&gt;() - which returns the current GMTDateTime. There's a Windows API call to get this.&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;GMTTimeDifference&lt;/span&gt;() - which returns the difference in seconds between the machine's local time and GMT. This function is used internally for the remaining functions.&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;GMTToLocal(ltDateTime) &lt;/span&gt;- which converts GMT a to its local equivalent.&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;LocalToGMT(ltDateTime)&lt;/span&gt; - which converts a local date &amp;amp; time to its GMT equivalent.&lt;/li&gt;&lt;/ul&gt;The code is commented pretty well, so I won't bore you with the details here.&lt;br /&gt;&lt;br /&gt;This really got me thinking, should my applications be storing dates and times in GMT and then converting it to the current users local date and time for display purposes? It'd really depend on the application, but this is definitely something that I plan on giving somethought with my next application. Most of the time when we look at a date and time, we think of it in terms of our current locale, this could be a big issue in apps where the data comes from multiple locations and of course in web apps, where the users could be logging on at any time from any where.&lt;br /&gt;&lt;br /&gt;So, I don't really have any guidelines or recommendations at this point for when GMT should or should not be used. If you have any, let me know. It's definitely something worth more thought.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18962598-113892419749186463?l=f1technologies.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://f1technologies.blogspot.com/feeds/113892419749186463/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18962598&amp;postID=113892419749186463' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18962598/posts/default/113892419749186463'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18962598/posts/default/113892419749186463'/><link rel='alternate' type='text/html' href='http://f1technologies.blogspot.com/2006/02/to-gmt-or-to-not-gmt.html' title='To GMT or to not GMT'/><author><name>Mike Feltman</name><uri>http://www.blogger.com/profile/03174215705395971982</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://www.f1tech.com/images/mikef.jpg'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18962598.post-113875082489508514</id><published>2006-01-31T18:16:00.000-05:00</published><updated>2006-01-31T18:47:33.506-05:00</updated><title type='text'>The Good, The Bad, and The Code</title><content type='html'>The good:&lt;br /&gt;&lt;br /&gt;Most of you don't know the history, but I am so excited by the latest news that I have to blog about it. Last March my mom was diagnosed with lung cancer. Yes, she &lt;strong&gt;was&lt;/strong&gt; a smoker but has not smoked in close to 20 years. Of course we were all very nervous. She went through chemo and radiation and finished up at the end of 2005. She received MRI results last week telling her that her tumors were gone! Wow are we relieved.&lt;br /&gt;&lt;br /&gt;The bad:&lt;br /&gt;&lt;br /&gt;Well, I will not be participating in the half time show at the big game on Sunday after all. As it turns out, there was some confusion and our group leader did not get all of the paperwork in on time and we were cut. Oh well. I can sit in an easy chair and watch the game like the rest of the world. It will be just as fun and I don't have to break our family tradition of "junk food day."&lt;br /&gt;&lt;br /&gt;The code sample:&lt;br /&gt;&lt;br /&gt;The following code sample is really simple. There are many simple things that we could do to improve our development environment that we don't because we don't want to take the time. Well, I took the 5 minutes needed to put this together and I hope that somone else will find it useful.&lt;br /&gt;&lt;br /&gt;Not long ago, Rick Schummer posted some tips on the &lt;a href="http://rickschummer.com/blog/2005_11_01_archive.html"&gt;Class Browser&lt;/a&gt;.  After reading the entry, I was compelled to start using the class browser more. All of my attempts seemed clumsy.  I was either stumbling on typing the library name (DO (_browser) WITH ....) or fumbling around trying to find the library when I used the Open button.  So, I wrote this &lt;span style="font-size:78%;"&gt;very little&lt;/span&gt; program to help me. The Class Browser feels so much better to me now.&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;&lt;br /&gt;LOCAL ;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;lcVCX AS Character&lt;br /&gt;&lt;br /&gt;lcVCX = GETFILE('VCX', 'Select Class Library')&lt;br /&gt;&lt;br /&gt;IF NOT EMPTY(lcVCX)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;DO (_BROWSER) WITH lcVCX&lt;br /&gt;ENDIF&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;I load this program in my Task Pane Enviroment Post Scripts using:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;ON KEY LABEL ALT+F2 ;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;DO c:\development\devtools\LoadClassInBrowser&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Enjoy!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18962598-113875082489508514?l=f1technologies.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://f1technologies.blogspot.com/feeds/113875082489508514/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18962598&amp;postID=113875082489508514' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18962598/posts/default/113875082489508514'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18962598/posts/default/113875082489508514'/><link rel='alternate' type='text/html' href='http://f1technologies.blogspot.com/2006/01/good-bad-and-code.html' title='The Good, The Bad, and The Code'/><author><name>Toni M. Feltman</name><uri>http://www.blogger.com/profile/07215237972663023252</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18962598.post-113833206998002159</id><published>2006-01-26T22:18:00.000-05:00</published><updated>2006-01-26T22:21:09.990-05:00</updated><title type='text'>Customized View Editor</title><content type='html'>I cannot believe that I forgot to document one of the coolest new features in the latest version of Visual FoxExpress, customized view editors in DBCX!&lt;br /&gt;&lt;br /&gt;When a view is selected in DBCX Explorer and Modify is chosen from either the toolbar or right-click menu, the normal behavior is to open the Visual FoxPro View Designer. Well, we can now incorporate other behaviors. If a program named ModifyView exists somewhere in the application path, that program is used to modify the view rather than the VFP View editor.&lt;br /&gt;&lt;br /&gt;The ModifyView program is passed the name of the view that is selected in DBCXExplorer. Therefore, you could have a ModifyView program like the one below to run your favorite view editor program.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;* Program ModifyView&lt;br /&gt;LPARAMETERS ;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;tcView&lt;br /&gt;&lt;br /&gt;DO C:\development\devtools\MyFavoriteViewEditor WITH tcView&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;I hope that you think that this enhancement is as cool as I do!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18962598-113833206998002159?l=f1technologies.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://f1technologies.blogspot.com/feeds/113833206998002159/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18962598&amp;postID=113833206998002159' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18962598/posts/default/113833206998002159'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18962598/posts/default/113833206998002159'/><link rel='alternate' type='text/html' href='http://f1technologies.blogspot.com/2006/01/customized-view-editor.html' title='Customized View Editor'/><author><name>Toni M. Feltman</name><uri>http://www.blogger.com/profile/07215237972663023252</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18962598.post-113778373114362279</id><published>2006-01-20T13:27:00.000-05:00</published><updated>2006-02-17T17:19:56.696-05:00</updated><title type='text'>Version Control Rocks</title><content type='html'>One thing I forgot to mention when I was &lt;a href="http://f1technologies.blogspot.com/2006/01/vfp-gridoptimize-gotcha.html"&gt;ranting about grid.optimize&lt;/a&gt;,  is that version control rocks. Toni and I were sort of late adapters of version control, but it amazes me how many developers still don't use it. I used to be one of them. I was stupid.&lt;br /&gt;&lt;br /&gt;Looking at a Diff of the cContrls class library is what got me looking into the optimize property. Troy, the customer who encountered this problem, had already told me that it doesn't occur with our August release of VFE. We've checked in changes to this class library over a dozen times since August, but I was able to view a Diff between the current version and the August release and easily identify the change. Without version control, this change history would've been lost or taken a helluva lot more time to dig up and wade through.&lt;br /&gt;&lt;br /&gt;One of the things that made this easy was that Toni and I create VCA files for all class libraries at the time of check in. I work on a project where most of the other developers don't and it sucks. It takes about a second to make a VCA file, but if you don't make them at the time of check in, then you have to make a VCA file for the file you're working with, copy it off somewhere, get the class library for the version you want to compare to from source control, then make the VCA for it. If you've got changes you don't want to check in you also have to copy them out to another location first. By the time you're finished with all of the copying you've usually forgot what you were going to look for, so it's best just to make the VCA files all of the time.&lt;br /&gt;&lt;br /&gt;BTW, we used a &lt;a href="ftp://ftp.prolib.de/public/vfp/pl_scctext.prg"&gt;revised version of SCCTEXT&lt;/a&gt; to get around some of its limitations. For more info, check out the &lt;a href="http://fox.wikis.com/wc.dll?Wiki%7ESccText%7EVFP"&gt;SCCTEXT topic on the wiki&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;I have a little PRG I use to make my VCA files, so I don't have to do it manually for each VCX file I have checked out.  (SCX's are for sissies, but you can add support to it for them easyily enough.) Here it is:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;&lt;br /&gt;*==============================================================================&lt;br /&gt;* Procedure:        VCAAll&lt;br /&gt;* Purpose:            Makes a .VCA file for every VCX file that is missing one&lt;br /&gt;*                    in a directory and for every existing VCA file that's not&lt;br /&gt;*                    readonly.&lt;br /&gt;*                    Also packs .VCX file first so that smaller files can be&lt;br /&gt;*                    checked in and checked out.&lt;br /&gt;* Author:            F1 Technologies&lt;br /&gt;* Parameters:        None&lt;br /&gt;* Returns:            None&lt;br /&gt;* Added:            01/20/2006&lt;br /&gt;*==============================================================================&lt;br /&gt;LOCAL ;&lt;br /&gt;  lcDirectory, ;&lt;br /&gt;  lnI, ;&lt;br /&gt;  lcVCA, ;&lt;br /&gt;  lcClassLib, ;&lt;br /&gt;  llGen&lt;br /&gt;&lt;br /&gt;LOCAL ARRAY laFiles[1]&lt;br /&gt;lcDirectory = ADDBS(GETDIR())&lt;br /&gt;FOR lnI = 1 TO ADIR(laFiles,lcDirectory + [*.VCX])&lt;br /&gt;  lcVCA = lcDirectory + JUSTSTEM(laFiles[lnI,1]) + [.VCA]&lt;br /&gt;  DO CASE&lt;br /&gt;  CASE NOT FILE(lcVCA)&lt;br /&gt;      llGen = .T.&lt;br /&gt;  CASE NOT [R] $ laFiles[lnI,5]        &amp;&amp;amp; VCA is not readonly, assume checked out.&lt;br /&gt;      llGen = .T.&lt;br /&gt;  OTHERWISE&lt;br /&gt;      llGen = .F.&lt;br /&gt;  ENDCASE&lt;br /&gt;  IF llGen&lt;br /&gt;      lcClassLib = lcDirectory + laFiles[lnI,1]&lt;br /&gt;      CLEAR CLASSLIB (lcClassLib)     &lt;br /&gt;      USE (lcClassLib) EXCLUSIVE ALIAS ClassLib&lt;br /&gt;      TRY&lt;br /&gt;          PACK&lt;br /&gt;          USE IN CLASSLIB&lt;br /&gt;          DO (_SCCTEXT) WITH lcClassLib&lt;br /&gt;      CATCH&lt;br /&gt;      ENDTRY&lt;br /&gt;      IF LASTKEY()=27&lt;br /&gt;          EXIT&lt;br /&gt;      ENDIF&lt;br /&gt;  ENDIF&lt;br /&gt;NEXT&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;I hang this program off of my utilities menu and when I'm ready to check files in to version control I just run it on the directory I'm working on. I'd be easy enough to make it walk several directories, but I really haven't had a need for it.&lt;br /&gt;&lt;br /&gt;Enjoy, and let me know if you improve on it.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18962598-113778373114362279?l=f1technologies.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://f1technologies.blogspot.com/feeds/113778373114362279/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18962598&amp;postID=113778373114362279' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18962598/posts/default/113778373114362279'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18962598/posts/default/113778373114362279'/><link rel='alternate' type='text/html' href='http://f1technologies.blogspot.com/2006/01/version-control-rocks.html' title='Version Control Rocks'/><author><name>Mike Feltman</name><uri>http://www.blogger.com/profile/03174215705395971982</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://www.f1tech.com/images/mikef.jpg'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18962598.post-113777761369975057</id><published>2006-01-20T12:06:00.000-05:00</published><updated>2006-01-20T12:20:13.746-05:00</updated><title type='text'>Happy Birthday to Two</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/blogger/3578/1684/1600/WMF3%20-%203rd%20Grade.jpg"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://photos1.blogger.com/blogger/3578/1684/320/WMF3%20-%203rd%20Grade.jpg" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Hey, while I'm blogging I might as well wish a happy Birthday to two of the most important people in my life: William Michael Feltman the 1st and William Michael Feltman the 3rd. That's right, today my Dad turns 70 and Mickey is a whopping 9 years old already - double digits are just around the corner.&lt;br /&gt;&lt;br /&gt;So...&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 153);font-size:180%;" &gt;&lt;span style="font-weight: bold;"&gt;Happy Birthday Dad &amp; Mickey!&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 153);font-size:180%;" &gt;&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;39 is just around the corner for William Michael Feltman the 2nd on February 2nd. Apparently I'm about to embark on my last year up the hill!&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 153);font-size:180%;" &gt;&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18962598-113777761369975057?l=f1technologies.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://f1technologies.blogspot.com/feeds/113777761369975057/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18962598&amp;postID=113777761369975057' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18962598/posts/default/113777761369975057'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18962598/posts/default/113777761369975057'/><link rel='alternate' type='text/html' href='http://f1technologies.blogspot.com/2006/01/happy-birthday-to-two.html' title='Happy Birthday to Two'/><author><name>Mike Feltman</name><uri>http://www.blogger.com/profile/03174215705395971982</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://www.f1tech.com/images/mikef.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18962598.post-113777663173308286</id><published>2006-01-20T11:47:00.000-05:00</published><updated>2006-01-20T12:03:51.746-05:00</updated><title type='text'>VFP Grid.Optimize Gotcha</title><content type='html'>A new optimize property was added to grid's in VFP9. When this property is set to true, the grid uses Rushmore optimization. For backward compatability, this property defaults to false in the VFP grid base class. Seeing as Rushmore optimization is a good thing, we set it to true in the cGrid class in VFE which is the base grid class in the framework.&lt;br /&gt;&lt;br /&gt;We've been shipping VFE this way since August and it hasn't seemed to be an issue - except for one customer. This customer has been consistently getting a "Uniqueness of index xxxx is violated" error whenever the user enters a duplicate value in a textbox that's bound to a primary or candidate key AND there's a grid bound to the same table is also visible.&lt;br /&gt;&lt;br /&gt;I've been looking all over for changes we've made to framework code, as there's been a fair amount of work done in grids recently, and it turns out, it's just a simple property setting. This situation only occurs when the user is doing data entry directly into tables (as opposed to views), the user can edit a primary or candidate key and there's a grid that's visible at the same time. When the user exits the control (generally a textbox) associated with the primary or candidate key and VFP updates it, it also tries to refresh the grid at that point in time and this is when the error occurs. What's really confusing about the whole thing is that no events fire that you can see, so what exactly is happening at this point in time took a while to unravel. At any rate, the moral of the story is that if you've got primary or candidate keys that the user can enter, you bind directly to table fields and you display this data in a grid, it's probably best to set the optimize property of the grid to false. If this is how you build your VFE apps, it'd be wise to set this property to false in iGrid of iContrls.&lt;br /&gt;&lt;br /&gt;Oh, and BTW, if you do RTFM, there's a note in the doc for the optimize property that explains this:&lt;br /&gt;&lt;p&gt;    &lt;span style="font-style: italic;"&gt;As with any data manipulation command that can impact Rushmore optimization,  you should be aware that actions taken against the Grid's data source could  result in behavior that differs from when the Optimize property is set to False  (.F.). For example, Rushmore optimization might trigger an implicit TABLEUPDATE  to occur for a row buffered cursor. And an error may or may not occur depending  on whether the record is blank or whether the cursor is a view.&lt;/span&gt;&lt;/p&gt;Now that I've encountered this scenario, I actually understand what the note refers to!&lt;br /&gt;&lt;br /&gt;I lost some hair on this one, hopefully this'll save somebody else from early baldness.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18962598-113777663173308286?l=f1technologies.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dv_foxhelp9/html/1965efce-dfdd-42ab-97a0-01513d9cb103.asp' title='VFP Grid.Optimize Gotcha'/><link rel='replies' type='application/atom+xml' href='http://f1technologies.blogspot.com/feeds/113777663173308286/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18962598&amp;postID=113777663173308286' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18962598/posts/default/113777663173308286'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18962598/posts/default/113777663173308286'/><link rel='alternate' type='text/html' href='http://f1technologies.blogspot.com/2006/01/vfp-gridoptimize-gotcha.html' title='VFP Grid.Optimize Gotcha'/><author><name>Mike Feltman</name><uri>http://www.blogger.com/profile/03174215705395971982</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://www.f1tech.com/images/mikef.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18962598.post-113744389999572340</id><published>2006-01-16T15:25:00.000-05:00</published><updated>2006-01-16T15:38:20.006-05:00</updated><title type='text'>Friday the 13th Build</title><content type='html'>I am sorry that I am a few days late on this, but better late than never. We posted a new VFE.APP as well as integrated updates on Jan. 13, 2006. This keeps with the F1 Technologies tradition of releasing new software on Friday the 13th. &lt;br /&gt;&lt;br /&gt;We fixed most known issues to date and implemented the following enhancements for this build.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://csc.f1tech.com/F1CustomerServiceCenter/showerdetails.asp?cBizObj=EREntryBizObj&amp;cenhancementid=89D58C5D9EEB40B4"&gt;Please default Minimizable to .F. in Single Record Modal Add Form Wiza&lt;/a&gt;&lt;br /&gt;&lt;a href="http://csc.f1tech.com/F1CustomerServiceCenter/showerdetails.asp?cBizObj=EREntryBizObj&amp;cenhancementid=1960F8FE8B164EAE"&gt;More descriptive title for the default Lookup Selection Form&lt;/a&gt;&lt;br /&gt;&lt;a href="http://csc.f1tech.com/F1CustomerServiceCenter/showerdetails.asp?cBizObj=EREntryBizObj&amp;cenhancementid=4E12353E223F43BB"&gt;Allow Deleting of Invalid Views in DBCX Explorer.&lt;/a&gt;&lt;br /&gt;&lt;a href="http://csc.f1tech.com/F1CustomerServiceCenter/showerdetails.asp?cBizObj=EREntryBizObj&amp;cenhancementid=3418BA9C690F4898"&gt;BROWSE LAST in DBCX Explorer browse.&lt;/a&gt;&lt;br /&gt;&lt;a href="http://csc.f1tech.com/F1CustomerServiceCenter/showerdetails.asp?cBizObj=EREntryBizObj&amp;cenhancementid=279723A4A434438A"&gt;Lookup Setup Builder addform drop down.&lt;/a&gt;&lt;br /&gt;&lt;a href="http://csc.f1tech.com/F1CustomerServiceCenter/showerdetails.asp?cBizObj=EREntryBizObj&amp;cenhancementid=B4E884F05D204BB7"&gt;Add Query Option to DBCX Explorer&lt;/a&gt;&lt;br /&gt;&lt;a href="http://csc.f1tech.com/F1CustomerServiceCenter/showerdetails.asp?cBizObj=EREntryBizObj&amp;cenhancementid=C7B5790F416F4980"&gt;Remove the Exclusive lock on FEApps.dbf&lt;/a&gt;&lt;br /&gt;&lt;a href="http://csc.f1tech.com/F1CustomerServiceCenter/showerdetails.asp?cBizObj=EREntryBizObj&amp;cenhancementid=B48E2237E92249A2"&gt;cGrid AddColumnFrom.... methods and column width issues&lt;/a&gt;&lt;br /&gt;&lt;a href="http://csc.f1tech.com/F1CustomerServiceCenter/showerdetails.asp?cBizObj=EREntryBizObj&amp;cenhancementid=3A89EC7278C24390"&gt;cPortionsLabel finesse&lt;/a&gt;&lt;br /&gt;&lt;a href="http://csc.f1tech.com/F1CustomerServiceCenter/showerdetails.asp?cBizObj=EREntryBizObj&amp;cenhancementid=5740DC54FC4E4886"&gt;DBCX tooltip text length&lt;/a&gt;&lt;br /&gt;&lt;a href="http://csc.f1tech.com/F1CustomerServiceCenter/showerdetails.asp?cBizObj=EREntryBizObj&amp;cenhancementid=6F3ADB4D481947A1"&gt;VP.GetFKValue()&lt;/a&gt;&lt;br /&gt;                              &lt;br /&gt;&lt;br /&gt;The next Friday the 13th is not until October. I think we can get our next update out before then.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18962598-113744389999572340?l=f1technologies.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://f1technologies.blogspot.com/feeds/113744389999572340/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18962598&amp;postID=113744389999572340' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18962598/posts/default/113744389999572340'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18962598/posts/default/113744389999572340'/><link rel='alternate' type='text/html' href='http://f1technologies.blogspot.com/2006/01/friday-13th-build.html' title='Friday the 13th Build'/><author><name>Toni M. Feltman</name><uri>http://www.blogger.com/profile/07215237972663023252</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18962598.post-113710547968333765</id><published>2006-01-12T17:16:00.000-05:00</published><updated>2006-01-13T09:02:23.403-05:00</updated><title type='text'>Watch for Toni at Super Bowl XL</title><content type='html'>Oh my gosh, I cannot hardly believe it. I have been asked to dance during the halftime show with the Rolling Stones at Super Bowl XL. My friend Michele called me this afternoon and invited me to join her and several other girls to represent the Alzheimer's Association. Is this an opportunity of a lifetime or what? So, watch for me during halftime and maybe the pre-game show. Thank you Michele!!!!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18962598-113710547968333765?l=f1technologies.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://f1technologies.blogspot.com/feeds/113710547968333765/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18962598&amp;postID=113710547968333765' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18962598/posts/default/113710547968333765'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18962598/posts/default/113710547968333765'/><link rel='alternate' type='text/html' href='http://f1technologies.blogspot.com/2006/01/watch-for-toni-at-super-bowl-xl.html' title='Watch for Toni at Super Bowl XL'/><author><name>Toni M. Feltman</name><uri>http://www.blogger.com/profile/07215237972663023252</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18962598.post-113691942020232507</id><published>2006-01-10T13:53:00.000-05:00</published><updated>2006-01-13T08:49:05.130-05:00</updated><title type='text'>Automated Testing?</title><content type='html'>Not long ago, &lt;a href="http://www.whitelightcomputing.com"&gt;Rick Schummer&lt;/a&gt; had a blog entry about how his views never break when he changes the structures of his tables because he uses &lt;a href="http://www.whitelightcomputing.com/prodvieweditorpro.htm"&gt;View Editor Professional&lt;/a&gt;. Unfortunately I am not so lucky. I make table changes all of the time that break my views. Most of this is at the start of a project when the data model is not locked down yet. I don't have problems when I add fields to my tables, but I do have trouble when I remove fields. If you add 9 other developers and many DBCs and this can get crazy.&lt;br /&gt;&lt;br /&gt;One solution to this problem is automated testing. I have been talking about automated testing with several clients for a couple of years now. I truly believe in the concept but have yet to find a developer that has successfully implemented the automated testing of a Visual FoxPro Application. There are many products on market that can be used. Why isn't there a good solution?&lt;br /&gt;&lt;br /&gt;I can tell you one reason that I don't have a successful Visual FoxPro automated test case study; the learning curve. All of the automated testing tools are pretty complex and require a great deal of time to learn, even for simple tasks. So instead we keep moving ahead with all manual testing. I don’t like that. There has to be a better way.&lt;br /&gt;&lt;br /&gt;If you have a VFP automated testing success story, please share it with me. In the mean time, I am going to begin writing my own automated testing tools. These will be very simple tools to automate some of the testing I do all of the time. As I write something, I will share it with you. Something is better than nothing, right?&lt;br /&gt;&lt;br /&gt;My first tool is a program to test all of the views in a data folder to make sure that they can be opened. If the view cannot be opened, details will be logged to a cursor. Simple right? My first pass on a fairly large application I am working on yielded 8 broken views. Now, these can be fixed and we can move on until tomorrow’s data changes come. The code is not rocket science. Anyone reading his blog could have written it, but as far as I know no one has. This simple program will save my projects a boat load of bug fixing time. I hope it is worth something to you too.&lt;br /&gt;&lt;br /&gt;Here's the program. You will probably want to modify it to SET PATH and such but it is a start.&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;&lt;br /&gt;*====================================================&lt;br /&gt;* Program: TestViews&lt;br /&gt;* Purpose: Tests all of the views in all DBCs in a&lt;br /&gt;* data folder.&lt;br /&gt;* Author: F1 Technologies&lt;br /&gt;* Parameters: None&lt;br /&gt;* Returns: None&lt;br /&gt;*====================================================&lt;br /&gt;LOCAL ;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;lcDir, ;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;lnFiles, ;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;lnI, ;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;lcDataDir, ;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;lnJ, ;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;lnViews&lt;br /&gt;&lt;br /&gt;CLEAR ALL&lt;br /&gt;CLOSE ALL&lt;br /&gt;CLEAR&lt;br /&gt;lcDir = ;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;GETDIR(SYS(5) + CURDIR(),[Select Data Directory])&lt;br /&gt;&lt;br /&gt;IF EMPTY(lcDir)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;RETURN&lt;br /&gt;ENDIF&lt;br /&gt;&lt;br /&gt;lcDataDir = ADDBS(lcDir)&lt;br /&gt;lnFiles = ADIR(laDBCs, lcDataDir + [*.DBC])&lt;br /&gt;ON ERROR DO LogError WITH DBC(), laViews[lnJ], MESSAGE()&lt;br /&gt;&lt;br /&gt;FOR lnI = 1 TO lnFiles&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;OPEN DATABASE (lcDataDir + laDBCs[lnI,1])&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;lnViews = ADBOBJECTS(laViews,"VIEW")&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;FOR lnJ = 1 TO lnViews&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;SELECT 0&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;USE (laViews[lnJ]) ALIAS Test NODATA&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;IF USED('Test')&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;USE IN Test&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ENDIF&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;ENDFOR&lt;br /&gt;NEXT&lt;br /&gt;&lt;br /&gt;IF USED("Errors")&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;SELECT Errors&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;* You could run a report here if you&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;* wanted to really automate this.&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;BROWSE&lt;br /&gt;ENDIF&lt;br /&gt;&lt;br /&gt;CLOSE DATABASES ALL&lt;br /&gt;&lt;br /&gt;PROCEDURE LogError&lt;br /&gt;LPARAMETERS ;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;tcDBC, ;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;tcAlias, ;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;tcMessage&lt;br /&gt;&lt;br /&gt;IF NOT USED("Errors")&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;CREATE CURSOR Errors ;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(mDBC M, ;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;mAlias M, ;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;mMessage M)&lt;br /&gt;ENDIF&lt;br /&gt;&lt;br /&gt;INSERT INTO Errors ;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;(mDBC, mAlias, mMessage) ;&lt;br /&gt;VALUES ;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;(tcDBC, tcAlias, tcMessage)&lt;br /&gt;&lt;br /&gt;RETURN&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18962598-113691942020232507?l=f1technologies.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://f1technologies.blogspot.com/feeds/113691942020232507/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18962598&amp;postID=113691942020232507' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18962598/posts/default/113691942020232507'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18962598/posts/default/113691942020232507'/><link rel='alternate' type='text/html' href='http://f1technologies.blogspot.com/2006/01/automated-testing.html' title='Automated Testing?'/><author><name>Toni M. Feltman</name><uri>http://www.blogger.com/profile/07215237972663023252</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18962598.post-113520920447570307</id><published>2005-12-21T18:43:00.000-05:00</published><updated>2005-12-22T10:35:46.223-05:00</updated><title type='text'>More Integrated Updates for VFE</title><content type='html'>I just posted another set of integrated updates for VFE. There are a couple of things to note here.&lt;br /&gt;&lt;br /&gt;1st, the cUtils class library was inadvertently included in the last set of integrated updates. A change to cGlobalHook that was not ready for primetime snuck in with that set. An updated version of cUtils that is ready for primetime is included in this set.&lt;br /&gt;&lt;br /&gt;The work we've been doing on the Global Hook class has been in the enabled_assign_hook. Basically, what we've done with it is dumbed it down. It used to have a lot of code in it to deal with specific control classes and that code has now been moved to those specific classes. Please let us know on the forums if you notice any negative behavior with how controls are enabled or disabled in your applications. This should also correct bug #&lt;span style="font-family:Arial;font-size:85%;"&gt;&lt;a href="http://csc.f1tech.com/F1CustomerServiceCenter/showbugdetails.asp?cBizObj=BugReportEntryBizObj&amp;cbugreportid=225D3CDB44CD41A4"&gt;225D3CDB44CD41A4&lt;/a&gt;&lt;/span&gt; which was the problem introduced by the inadvertent update we posted on 12/16/2005.&lt;br /&gt;&lt;br /&gt;Included in this set of upgrades is also the fix for bug # &lt;span style=";font-family:Arial;font-size:85%;"  &gt;&lt;a href="http://csc.f1tech.com/F1CustomerServiceCenter/showbugdetails.asp?cBizObj=BugReportEntryBizObj&amp;amp;cbugreportid=9FC33BA57BCD4FB4"&gt;9FC33BA57BCD4FB4&lt;/a&gt;&lt;/span&gt;. The fix for this bug is in the vfewiz60 class library located in the wizards\libs\ directory beneath VFE. This is the first time we've put out integrated updates that change the wizard class libraries so be careful if you've made changes to any of these.&lt;br /&gt;&lt;br /&gt;Toni also made a couple of enhancements that one of our consulting clients needed. She'll post more on these some time soon. In the meantime, I believe all of the the changes are in cBizObj and cCursor if you want to poke around yourself and have a look.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18962598-113520920447570307?l=f1technologies.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://f1technologies.blogspot.com/feeds/113520920447570307/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18962598&amp;postID=113520920447570307' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18962598/posts/default/113520920447570307'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18962598/posts/default/113520920447570307'/><link rel='alternate' type='text/html' href='http://f1technologies.blogspot.com/2005/12/more-integrated-updates-for-vfe.html' title='More Integrated Updates for VFE'/><author><name>Mike Feltman</name><uri>http://www.blogger.com/profile/03174215705395971982</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://www.f1tech.com/images/mikef.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18962598.post-113518566138029484</id><published>2005-12-21T12:14:00.000-05:00</published><updated>2005-12-21T12:21:01.390-05:00</updated><title type='text'>Blogger Spam</title><content type='html'>Ok, so this is getting a little out of hand now. Yesterday, I posted a blog entry about the GLGDW conference in April of 2006. Harmless topic, right? Wrong! Sometime yesterday afternoon a guy named "Jimmy" posted a nonsense comment to my blog entry. His comment included a URL that I followed and found to be a casino site. What is the cyber world coming to?&lt;br /&gt;&lt;br /&gt;Thank you Jeff for noticing the comment so that we could delete it before too many people found it.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18962598-113518566138029484?l=f1technologies.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://f1technologies.blogspot.com/feeds/113518566138029484/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18962598&amp;postID=113518566138029484' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18962598/posts/default/113518566138029484'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18962598/posts/default/113518566138029484'/><link rel='alternate' type='text/html' href='http://f1technologies.blogspot.com/2005/12/blogger-spam.html' title='Blogger Spam'/><author><name>Toni M. Feltman</name><uri>http://www.blogger.com/profile/07215237972663023252</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18962598.post-113508339937608849</id><published>2005-12-20T07:50:00.000-05:00</published><updated>2005-12-20T14:48:57.030-05:00</updated><title type='text'>GLGDW is back in 2006!</title><content type='html'>Wow, I am so excited that Whil has decided to put on yet one more FoxPro conference. He is taking a slightly different approach to sessions and I think that this is exactly the sort of in depth conference that many developers could use about now.&lt;br /&gt;&lt;br /&gt;The bummer is that we (Mike &amp;amp; Toni) will not be able to attend this great conference because we will be on vacation. We are going on vacation with Mike's sister and her family so it is sort if difficult to change our plans at this point. However we will stay tuned to the RSS feeds while we sun ourselves on the beach.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18962598-113508339937608849?l=f1technologies.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://www.hentzenwerke.com/conferences/zconferences.htm#09' title='GLGDW is back in 2006!'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18962598/posts/default/113508339937608849'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18962598/posts/default/113508339937608849'/><link rel='alternate' type='text/html' href='http://f1technologies.blogspot.com/2005/12/glgdw-is-back-in-2006.html' title='GLGDW is back in 2006!'/><author><name>Toni M. Feltman</name><uri>http://www.blogger.com/profile/07215237972663023252</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-18962598.post-113474478726504666</id><published>2005-12-16T09:44:00.000-05:00</published><updated>2005-12-16T09:53:07.276-05:00</updated><title type='text'>More Integrated Updates Released for VFE</title><content type='html'>Last night just before I hit the sack we put out a handful of updates to VFE. These updates are only available through VFE's Integrated Updates feature.&lt;br /&gt;&lt;br /&gt;Here's a list of the bugs that were fixed since the last time integrated updates were released:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:Arial;font-size:85%;"&gt; &lt;a href="http://csc.f1tech.com/F1CustomerServiceCenter/adminupdatebug.asp?cBizObj=BugReportEntryBizObj&amp;cbugreportid=CEDFA65F5FDD4D84"&gt;CEDFA65F5FDD4D84&lt;/a&gt;&lt;/span&gt;&lt;span style="font-family:Arial;font-size:85%;"&gt; cCursor Property lRepairWithSDT missing&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:Arial;font-size:85%;"&gt; &lt;a href="http://csc.f1tech.com/F1CustomerServiceCenter/adminupdatebug.asp?cBizObj=BugReportEntryBizObj&amp;amp;cbugreportid=B3E6DBDA498D459E"&gt;B3E6DBDA498D459E&lt;/a&gt;&lt;/span&gt;&lt;span style="font-family:Arial;font-size:85%;"&gt; ComboBox Quick Fill feature broke after VFE 2005 applied.&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:Arial;font-size:85%;"&gt; &lt;a href="http://csc.f1tech.com/F1CustomerServiceCenter/adminupdatebug.asp?cBizObj=BugReportEntryBizObj&amp;cbugreportid=4406153DFC184E8E"&gt;4406153DFC184E8E&lt;/a&gt;&lt;/span&gt;&lt;span style="font-family:Arial;font-size:85%;"&gt; cTreeView SelectNextNode nit&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:Arial;font-size:85%;"&gt; &lt;a href="http://csc.f1tech.com/F1CustomerServiceCenter/adminupdatebug.asp?cBizObj=BugReportEntryBizObj&amp;amp;cbugreportid=FE75760809EF459E"&gt;FE75760809EF459E&lt;/a&gt;&lt;/span&gt;&lt;span style="font-family:Arial;font-size:85%;"&gt; cSession Init nit&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:Arial;font-size:85%;"&gt; &lt;a href="http://csc.f1tech.com/F1CustomerServiceCenter/adminupdatebug.asp?cBizObj=BugReportEntryBizObj&amp;cbugreportid=2A8DDF4217F94881"&gt;2A8DDF4217F94881&lt;/a&gt;&lt;/span&gt;&lt;span style="font-family:Arial;font-size:85%;"&gt; cPresentObjForm.Hide nits&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:Arial;font-size:85%;"&gt; &lt;a href="http://csc.f1tech.com/F1CustomerServiceCenter/adminupdatebug.asp?cBizObj=BugReportEntryBizObj&amp;amp;cbugreportid=3E36201022F54283"&gt;3E36201022F54283&lt;/a&gt;&lt;/span&gt;&lt;span style="font-family:Arial;font-size:85%;"&gt; cBizObj Delete_Perform problem&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:Arial;font-size:85%;"&gt; &lt;a href="http://csc.f1tech.com/F1CustomerServiceCenter/adminupdatebug.asp?cBizObj=BugReportEntryBizObj&amp;amp;cbugreportid=FB7FE8B56AA248B9"&gt;FB7FE8B56AA248B9&lt;/a&gt;&lt;/span&gt;&lt;span style="font-family:Arial;font-size:85%;"&gt; Tools/Filter is broken&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;Most of the changes addressed some minor bugs that had been reported. I've got several other changes that I'm still beating up on in-house a little bit before posting, so stay tuned.&lt;br /&gt;&lt;span style="font-family:Arial;font-size:85%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18962598-113474478726504666?l=f1technologies.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://f1technologies.blogspot.com/feeds/113474478726504666/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18962598&amp;postID=113474478726504666' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18962598/posts/default/113474478726504666'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18962598/posts/default/113474478726504666'/><link rel='alternate' type='text/html' href='http://f1technologies.blogspot.com/2005/12/more-integrated-updates-released-for.html' title='More Integrated Updates Released for VFE'/><author><name>Mike Feltman</name><uri>http://www.blogger.com/profile/03174215705395971982</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://www.f1tech.com/images/mikef.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18962598.post-113415129404599564</id><published>2005-12-09T13:01:00.000-05:00</published><updated>2005-12-09T13:05:38.340-05:00</updated><title type='text'>Visual FoxPro is a mover and a shaker</title><content type='html'>&lt;a href="http://www.tiobe.com/index.htm?tiobe_index"&gt;TIOBE Software - The Coding Standards Company&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Somebody just posted a link to this article on the Wiki and I thought it'd be interesting to check it out.&lt;br /&gt;&lt;br /&gt;The methods they use are a bit suspect, but it's still interesting nonetheless. Two things really stood out. First VFP made the most significant gains in popularity of all programming languages - moving from #51 to #20. That rocks!&lt;br /&gt;&lt;br /&gt;The other thing that really stood out was the top 6. Java was is number one. C and C++ are 2 &amp;amp; 3. Combined that would make C number 1.&lt;br /&gt;&lt;br /&gt;I was nice to see PHP at number 4. I knew it was popular, but not that popular. I have been leaning heavily towards getting into PHP when I consider developing skills in another language. There are a lot of things I like about it verses .NET and according to these rankings, it's more than twice as popular as VB.NET and C# combined.&lt;br /&gt;&lt;br /&gt;VB at number 5 is no surprise. Perl at number 6 is. Again, I knew it was popular, but not that popular.&lt;br /&gt;&lt;br /&gt;Anyway, this is good news for VFP. This and the &lt;a href="http://www.redmondmag.com/columns/article.asp?EditorialsID=1166"&gt;FoxPro Not An Endangered Species&lt;/a&gt; article give VFP some long overdue respect and recognition.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18962598-113415129404599564?l=f1technologies.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://www.tiobe.com/index.htm?tiobe_index' title='Visual FoxPro is a mover and a shaker'/><link rel='replies' type='application/atom+xml' href='http://f1technologies.blogspot.com/feeds/113415129404599564/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18962598&amp;postID=113415129404599564' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18962598/posts/default/113415129404599564'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18962598/posts/default/113415129404599564'/><link rel='alternate' type='text/html' href='http://f1technologies.blogspot.com/2005/12/visual-foxpro-is-mover-and-shaker.html' title='Visual FoxPro is a mover and a shaker'/><author><name>Mike Feltman</name><uri>http://www.blogger.com/profile/03174215705395971982</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://www.f1tech.com/images/mikef.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18962598.post-113390925541413936</id><published>2005-12-06T17:46:00.000-05:00</published><updated>2005-12-06T17:47:35.426-05:00</updated><title type='text'>Menu Performance</title><content type='html'>&lt;p&gt;Just recently I was debugging a security issue in an application menu when I came across something very interesting. When you click on a menu pad the SKIP FOR condition is evaluated on every menu item in the menu. Wow! This can be a pretty big performance hit if you have a bunch of complex SKIP FORs. It just so happens that a user reported a menu delay on a pretty slow machine that very same day.  &lt;/p&gt;&lt;p&gt;VFE menu bars have an Allow method that checks to see if a menu item should be available. There are many things that could disable a menu and security level is one of them. The Allow method becomes the Skip For condition on the menu bar. The checking for security level was the thing that was really hurting menu performance. This code was going out to a table to retrieve the access level. The actual method code was efficient, just not running so many times. In addition, the menu’s security level is read and written to a property when the menu bar is instantiated. Therefore, it does need to be looked up each time unless the user’s access level has changed. &lt;/p&gt;&lt;p&gt;I was able to fix the performance problem with a very simple change to the base menu classes. This example applies directly to a Visual FoxExpress menu but the code can easily apply to any Visual FoxPro menu. &lt;/p&gt;&lt;p&gt;Here is what I did:&lt;/p&gt;&lt;ol&gt;&lt;li&gt;I added a property to my menu class called lRefreshSecurityLevelOnAllow. &lt;/li&gt;&lt;li&gt;In the Allow method, the code that tries to find the security level is wrapped in an IF lRefreshSecurityLevelOnAllow. &lt;/li&gt;&lt;/ol&gt;&lt;p&gt;If I want the security level to be retrieved, I can simply set the menu property to .T. and the next time the code runs, the security level will be looked up in the table. &lt;/p&gt;&lt;p&gt;In the VFE menu class, this property is .F. by default so that all menus get the best performance. If you have code in your application that allows the user’s security level to change while the menu is active, you can set the property to .T. in order to refresh the menu and then turn it back to .F.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18962598-113390925541413936?l=f1technologies.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://f1technologies.blogspot.com/feeds/113390925541413936/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18962598&amp;postID=113390925541413936' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18962598/posts/default/113390925541413936'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18962598/posts/default/113390925541413936'/><link rel='alternate' type='text/html' href='http://f1technologies.blogspot.com/2005/12/menu-performance.html' title='Menu Performance'/><author><name>Toni M. Feltman</name><uri>http://www.blogger.com/profile/07215237972663023252</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18962598.post-113320513507220354</id><published>2005-11-28T13:33:00.000-05:00</published><updated>2006-03-07T11:28:57.706-05:00</updated><title type='text'>Parenting</title><content type='html'>I was going to try to keep my posts related to techie things but I am compelled to blog about an article I read in the newspaper today. The text can be found &lt;a href="http://www.toledoblade.com/apps/pbcs.dll/article?AID=/20051128/OPINION02/511270306/-1/OPINION"&gt;here&lt;/a&gt; if you are interested in reading it. The basic story behind the article is that a mother made her 14 year old daughter stand on a busy street corner (the mother was present the entire time) holding a sign that read:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;p&gt;I don't do my homework and I act up in school, so my parents are preparing me&lt;br /&gt;for my future. Will work for food.&lt;/p&gt;&lt;/blockquote&gt;I say BRAVO! However, a psychologist was quoted as saying that this is psychological abuse and can damage the child. Is that same psychologist going to be there to support the parents when they have to deal with the pain of bailing the child out of jail when skipping school escalates to something more serious? How about the trauma on the parents when they ask the adult child to move out of the house in hopes if teaching them to live on their own when they know they will just probably live on the street?&lt;br /&gt;&lt;br /&gt;It is obvious that this mother cares! She cares more about her daughter than herself. If you think about it, the mother was holding the invisible sign that said, "Look at me, my daughter is a screw up!" It would not be easy for a parent to go out in public and do what she did.  When there is obvious caring and love like this, I don't think you can call it abuse in any way, shape or form.&lt;br /&gt;&lt;br /&gt;I just hope that articles like this one don’t discourage other parents from doing what they feel is best when it comes to teaching their children. I think that Ms. Henderson did the right thing for her child and I would stand behind her. I would really love to sit down with the children of the people who think she is so out of line. Hmm, I wonder if they even have children? &amp;lt;s&amp;gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18962598-113320513507220354?l=f1technologies.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://f1technologies.blogspot.com/feeds/113320513507220354/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18962598&amp;postID=113320513507220354' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18962598/posts/default/113320513507220354'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18962598/posts/default/113320513507220354'/><link rel='alternate' type='text/html' href='http://f1technologies.blogspot.com/2005/11/parenting.html' title='Parenting'/><author><name>Toni M. Feltman</name><uri>http://www.blogger.com/profile/07215237972663023252</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18962598.post-113211071723735221</id><published>2005-11-15T21:26:00.000-05:00</published><updated>2005-11-16T22:16:00.256-05:00</updated><title type='text'>AtoutFox</title><content type='html'>Welcome to the inaugural blog entry for F1 Technologies. Mike and I hope to use this as a way to communicate with the community. I just hope that we can find interesting things to post about each week. :-)&lt;br /&gt;&lt;br /&gt;For my first post I would like to talk about the &lt;a href="http://www.atoutfox.org/"&gt;AtoutFox&lt;/a&gt; conference. Mike and I both had the pleasure of speaking at this conference November 3-5, 2005. This year the conference was held in Lyon, France. It is held around the annual meeting of the AtoutFox group. This group is a large user group whose members are spread across much of France.&lt;br /&gt;&lt;br /&gt;Mike and I arrived in Lyon in the morning on November 2, 2005. As we were exiting the plane, we noticed a backpack with the MVP logo on it. The gentleman did not look familiar to me, but based on the speaker list I guessed that it might be Anders Altberg. While waiting for our luggage I got a closer look and saw that it was indeed Anders. I had conversed with Anders over the years but never met him face to face. What a great surprise meeting we had. We shared a cab with Anders and his wife to the hotel. He used to teach French so his language skills were much better than mine.&lt;br /&gt;&lt;br /&gt;The conference started with a single track on Thursday (11/3/2005). I received a surprise phone call in the morning from Anders. He was scheduled to present a session on What's New in VFP 9 with Louis de Lacroix and they wanted me to participate too. Of course I could not say no. So I met with Anders and Louis and picked some topics. Then I was off to throw together some demos. The session went well even though I felt unprepared. Luckily, Steve Black translated for me so more people were able to understand what I was saying.&lt;br /&gt;&lt;br /&gt;Mike and I had planned to head out and see the sights after my session since the rest of the sessions were in French. As it turned out, I understood enough to keep my attention and we hung out in the session room. The last session of the day was with a Microsoft France Community representative. He was grilled pretty hard but held his composure well.&lt;br /&gt;&lt;br /&gt;After the last session ended, at 7:30p, we had a short break and then headed out for dinner in Lyon. It was a wonderful time and we were able to converse some with the attendees. English is not spoken as much at this conference as it is at some of the other international conferences but we all managed to communicate.&lt;br /&gt;&lt;br /&gt;On Friday, there were three session rooms going at one time. I presented a session on n-tier application development that seemed to be pretty well received. I was asked several good questions which is a fine indicator that people were paying attention. :-) Mike and I were going to head into town after the session but the weather was terrible. It was raining cats and dogs so we decided to stay at the hotel.&lt;br /&gt;&lt;br /&gt;Mike gave a Visual FoxExpress demo on the final day. That session was extremely well received. We are proud to say that we now have several new VFE users in France. Welcome to FoxExpress!&lt;br /&gt;&lt;br /&gt;After Mike's session we left for Paris. We took the TGV train and traveled from Lyon to Paris at close to 300 MPH. We made it in just less than 2 hours. What a ride!&lt;br /&gt;&lt;br /&gt;We had a nice day and 1/2 in Paris doing all of the touristy stuff. We went to mass at Notre Dame Cathedral which was really neat. I could only understand a little of what was said, but it was in the same format as home so we could follow along. The bulletin had the readings in French, English, Italian and German so we were able to read them. And to answer everyone's question... "No, we did not see the riots."&lt;br /&gt;&lt;br /&gt;After we returned home and got back in the swing of things, I received an email from François, the conference organizer. He informed me that I had been elected as an honorary member of the AtoutFox board for 2005-2006. What an honor. I am still waiting to find out what my duties are.&lt;br /&gt;&lt;br /&gt;All in all this was a great trip. The French VFP users are a wonderful group and we would like to thank them for their hospitality and patience with us. I speak just a little bit of French and Mike speaks almost none at all. It was totally awesome seeing the passion that this group has for VFP. I sure hope that we will be invited back next year. I promise that I will practice my French between now and then.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18962598-113211071723735221?l=f1technologies.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://f1technologies.blogspot.com/feeds/113211071723735221/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18962598&amp;postID=113211071723735221' title='9 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18962598/posts/default/113211071723735221'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18962598/posts/default/113211071723735221'/><link rel='alternate' type='text/html' href='http://f1technologies.blogspot.com/2005/11/atoutfox.html' title='AtoutFox'/><author><name>Mike Feltman</name><uri>http://www.blogger.com/profile/03174215705395971982</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://www.f1tech.com/images/mikef.jpg'/></author><thr:total>9</thr:total></entry></feed>
