Level Extreme platform
Subscription
Corporate profile
Products & Services
Support
Legal
Français
Articles
Search: 

Considerations when building Web applications Part III
Michel Fournier, March 1, 2003
The first two articles of this series have been published in the issues of December 2002 and January 2003. In this one, I will talk about graphic issues, how to negotiate with a form to launch his transaction to either within the same window or a new one, how to gather values from one page to anothe...
The first two articles of this series have been published in the issues of December 2002 and January 2003. In this one, I will talk about graphic issues, how to negotiate with a form to launch his transaction to either within the same window or a new one, how to gather values from one page to another and how to make use of JavaScript alert() function without creating a new HTML page.

Cache issue on the server

When it first happened to me, I searched for a while before finding the reason why my upload of a specific graphic was not reflected in the browser. I had the need to update an image and once I overwrote the actual copy on the server, IIS was still showing the old version. The scenario that happened was the following:

  1. I received an image from the graphic artist
  2. I uploaded that image on the IIS Web site directory
  3. The image was being shown ok in the browser
  4. I asked the graphic artist to make a correction to the image
  5. While waiting for that image, I applied a temporary correction to the version I was having
  6. I uploaded that updated version
  7. The updated image was being shown ok in the browser
  8. I then received the final version from the graphic artist
  9. I uploaded that version
  10. That version was not reflected in the browser
Anyone who faced that situation before probably know the answer right away. While thinking about it more, it struck me that everything was normal. What happened is that the timestamp of the image updated from the graphic artist was being done a few minutes before I did it locally on my version. So, the timestamp of my version was never than the one from the graphic artist. So, when I uploaded my version, it was being shown ok in the browser. But, even if I uploaded the version from the graphic artist after, it was not being reflected in the browser because his time stamp was a few minutes older than mine. As the IIS server caches the images, it never faced a need to update the version in its cache as no more recent version was detected.

This is when I decided to build a small procedure that I can use in such circumstances. I benefited of that at several occasions so far. Some may say that they will never need it. This is how I thought at first. But, when you manipulate images like that from various sources, you will face that situation occasionnally.

The trick consists of updating the time stamp of the most recent versions of the image before uploading it to the server. So, whenever I have that need, I only do something like this:

SET PROCEDURE TO Utility.prg
FileTime('d:\iis\images\MyImage.gif',DATETIME())
This little program doesn't contain any magic. It's just a small program which contains a function FileTime() that we can call to reset the related timestamps of the file. You may find related utilities in the Downloads section of the Universal Thread.

Graphic quality

This section doesn't need Visual FoxPro but I thought I would mention it as many developers are facing that situation on a regular basis. There are still a lot of developers who don't know how to deal with some of the graphic quality issues where I will discuss some of them here.

The two most common graphic formats are GIF and JPG. Many will use GIF when in need to obtain a transparent background or for small images. But, when you have a need to go with real pictures or related, a JPG format will be used.

IMHO, an image should only be saved in a JPG format once. Usually, you will start from your original artwork and save the final version in JPG. By that, you will reach maximum quality. However, what many don't realize is that if you take a JPG file, apply some editing on it and resave into a JPG, you will loose quality. That is normal as when saving a JPG over a JPG, you will never reach maximum quality.

For example, we receive a lot of pictures for the Universal Thread. Members are sending their pictures in JPG format. But, some of them need editing as some may not necessarily follow our technical guidelines as is. The dimension might not be 90*117, the one pixel black border might not be present and required editing may apply. If the image has been sent in JPG format, once we save it again, we will loose quality. However, in this situation, we don't have any choice. The only format that we have is a JPG format and we have to deal with it. In order to get as close as possible to maximum quality, most graphical software will allow you to save the JPG up to 95% quality. Of course, you will end up with a bigger file but the goal here is to get the picture with maximum quality as we can. So, this is something you might want to consider if you have to do those manipulations.

Note also that some graphical software will save a JPG file with about double size as another software would do. Some high-end software will save in layer, etc. So, they add extra information in the file which increases the size of the file. Unless I would have to do the same job as a graphic artist, I will never use those specialized software as I consider them overkill for such a job. For me, I always found LView Pro the best in that area as it allows me to convert from one format to another, to benefit of all the required tools, and to save only the required information. For those who would like to consider LView Pro, you may access their Web site at http://www.lview.com.

One form, two types of window

Anyone ever ask you to do an HTML form that would launch its transaction either in the same window or in a new window? As long as you can detect that at the form level, this is not a big deal. Assuming the case, for example with a checkbox that the user can check to tell that he wants to launch the transaction in a new window, you would be able to negotiate with that with some simple JavaScript code to change the target of the form. But, what if this detection mechanism can only be done at the table level?

This is where you will start thinking about how to achieve that. Lets assume the user has a setting in his profile which contains that information. Up until that point, everything is fine. The challenge consists of implementing an approach to return the form result either in the same window or in a new window. Assuming the setting of that user is to return the form result in the same window, you just proceed as is. But, when you have to target that in a new window, you have to do some extra manipulations.

The opening of a new browser window can only be determined from the caller window. In this case, this would be the form definition. But, as we don't know at this point if we have to launch it in a new window or not, we will go with the default, which consists of launching it in the same window. Then, when the setting of the user tells to launch it in a new window, we will simply return a small HTML page which contains some JavaScript code to call the new window:

<SCRIPT>
window.open("MyPage.html","_blank","scrollbars=yes,width=1000,height=750,resizable=yes,toolbar=yes")
</SCRIPT>
Note that MyPage.html could be replaced by a dynamic transaction to call back your Visual FoxPro server to handle some database manipulations.

So, at this point, the following scenario goes like this:

  1. The user clicks on the HTML form Save button
  2. The Visual FoxPro application detects that this is targeted into a new window
  3. The Visual FoxPro application returns the above script
  4. The browser will then call the server again to proceed with MyPage.html
However, as we are opening a new window, this means that the main window has a blank page as only some script code was present in it. This is where you have two choices. Either you build a more customizable page which would contain some related information or you add in the script some code to go back to the previous page such as:
<SCRIPT>
window.open("MyPage.html","_blank","scrollbars=yes,width=1000,height=750,resizable=yes,toolbar=yes")
window.history.back()
</SCRIPT>

Gathering value from one page to another

One common issue that we regular face is about gathering a value from one page to another. For example, a lot of stores use that approach. Either to hold the items in the basket, to hold the member ID or to hold any other related information, such a need would then apply. Some common approaches are regularly used:

One consists of using Cookies to store that information. While this is nice as you won't have to gather the required data from several pages and only extract it when needed, using Cookies bring some additional concerns. First of all, many users are either manually turning on the notification of cookie settings in their browser or they make use of specific software that will do that for them. In both cases, this means that whenever you set a cookie, they will receive a notification. This is getting annoying if you make use of that at several places in your application. I prefer to make use of Cookies only at the start-up of the application such as from a login to authenticate to the site.

Another one consists of gathering your data from one page to another by the use of hidden variables. This could be a preferred approach if you only have to move from one or two pages. But, this will get annoying if you have to gather the data for several pages.

Even if we talk here about only some specific pieces of information that you need to gather, some may still want to store it at the backend. If you wish to create temporary tables or related and do this at this level, that can also be a good approach to take. You would only have to maintain those temporary tables when required and extract the data from them when you are ready to extract the related data. I prefer to only make use of backend tables when I have a need to store the information permanently. For example, I would use a backend table to store the in basket of a user. By that, if he doesn't complete his purchase immediately, he can then log in later on and complete his transaction.

JavaScript alert() function without creating a new HTML page

You probably faced this situation a lot of times so far and you probably found your way in to achieve what I am about to explain. In some cases, you would like to do some specific database manipulations but don't have any specific need to return an HTML page. For example, you might have a list of members and each record contains a hyperlink to send an invoice. In that case, the best is to have the user to remain in the list so he will be able to continue to work with that list. So, here you have a situation that you need to process something on the backend and probably only want to return a message telling the user that the invoice has been sent.

This is quite easy to accomplish if you are within a frameset environment, thus a hidden frameset can be used to do the backend manipulation and return the alert() message. But, when you only have one single page in your environment, this is something you can't do. One approach you could use far is to have the hyperlink to launch the transaction in a new window, defined out of screen, and return the message. Then, just close that window.

So, the HTML code when the user clicks on one of the record link could be:

<A HREF=javascript:SendInvoice(1)>Send invoice
where 1 represents the primary key of the member. Then, you may have your JavaScript function to read the parameter for the primary key and pass it in the calling sequence in the new window:
function SendInvoice(tnNumero)
{
   window.open("/wconnect/wc.dll?SendInvoice~"+tnNumero,"_blank","width=1,height=1,top=2000")
}
So, in this case, we are using a West Wind Web Connection approach to call the SendInvoice() method with the member ID. Note here that the window definition is defined out of screen as it will only start at 2000 pixels from the top. So, this will move it out of range. However, even if the window is out of range, we are still able to show a JavaScript alert() message which will appear in the center of the page such as the following:

<SCRIPT>
alert("The invoice has been sent.")
window.close()
</SCRIPT>
So, in this approach, a new window will appear in the task bar for as long as the user read the message. But, as soon as he clicks on Ok, the new window will disappear from the task bar. But, the most important here is that we didn't have to send a new HTML page as the user remained within his own environment. Thus, this creates a fast transaction just for notification and he can continue to work within the actual list.
Michel Fournier, Level Extreme Inc.
Michel Fournier is a professional, visionary, perfectionist, mostly known for his renowned realizations over the years, designer, architect, owner of the « Level Extreme Platform », formerly known as the « Universal Thread », recognized as one of the longest running Web sites of the planet, also known as a precursor to social networking, product manager, Internet serial entrepreneur, practiced Lean Startup techniques long before they were known, out of the box thinker, using the tenth man rule, specializes in building entire virtual data center solutions, has provided high end IT consulting worldwide, has owned and operated three companies, delivered worldwide renowned e-commerce Web sites, designed and architected two world class top level development frameworks, wrote over 100 IT articles for various sources, presented at user groups, conventions and corporations nationwide as well as in the US, has provided his contribution in political and legal issues to provide a better world, Owner and Senior IT Consultant at Level Extreme Inc., former Architect Software/Application & Project Manager, 7 times Microsoft Most Valued Professional for VB.NET, 7 times Microsoft Most Valued Professional for Visual FoxPro, Developers Choice award for best site at VFP DevCon 2000 Connections in New Orleans, featured in Acadie Nouvelle on October 2003.
More articles from this author
Michel Fournier, February 1, 2007
From the Level Extreme .NET Framework, this small class allows a developer to manipulate easily the content of a directory by the use of a dataset. With the setup of a few properties, a call to the method and the access to the object dataset, you can have access to the file properties of the directo...
Michel Fournier, August 1, 2001
It is interesting to see how something new can evolve. This is the case for the Universal Thread Magazine. We are now at our 3rd issue and we are already overbooked by scheduled articles and hot stuff we have to cover for the upcoming issues. Publishers are sending request for book reviews, wri...
Michel Fournier, October 1, 2002
UTMag/RapoZine team Editors Michel Fournier Claudio Lassala Co-editor Martín Salías Translation coordinators Claudio Lassala Martín Salías Translators Eduardo Vidigal Rodolfo Duarte Fábio Vazquez José Cavalcanti Moacyr Zalcman Fábio Vieira M...
Michel Fournier, May 1, 2006
In this article, Michel Fournier is providing a small introduction to manipulating XML data from VB.NET. The use of XML is now widely used for various purposes such as exchanging data between application, platforms and other environments. XML is a simple and very flexibile text format that can be ma...
Michel Fournier, October 1, 2001
In our daily things we do, sometimes we find ourselves in unexpected situations. Such situations, either in our personal life or from our professional work, require some adjustments in order to walk through them. The ability to take some time to take an overall look of what is happening, apply a bas...
Michel Fournier, March 1, 2007
In this small article, Michel discusses a problem he recently encountered when converting a dataset into XML to be used later on with a XSL transformation to export into an Excel sheet. When null values were present in the dataset, this was creating weird result. This article provides a quite alte...
Michel Fournier, February 1, 2006
This article discusses a simple banner fonctionalities function which can ease the display of banners on Web sites. If your Web site displays banners in GIF, JPG of Flash format, this function could be useful to you.
Michel Fournier, January 1, 2006
There are various ways to authenticate a user to a Web Service. This article discusses one way to do it by the use of Cookies. As it could the case with a Web page sending a cookie to the browser, the same can be used from within a Web Service.
Michel Fournier, February 1, 2006
This article is a follow up on the first part of this article which appeared on our January 2006 issue. In this one, Michel discussed further implementation of getting the authentication from a members table as well as setting up a session per user.
Michel Fournier, December 1, 2003
Visual FoxPro and .NET are two great environments to build business applications with. But, fantastic they are when you combine them together in order to increase the strenght of the flexibility to respond to your client needs. In this article, I will demonstrate a case study in regards to a new ser...
Michel Fournier, December 1, 2002
Over the years, I have been involved in several types of desktop and Web applications. Every time you start a new project, there is always something new you will learn. In this article, I would like to detail some of the issues which are to be considered when delivering a Web based application. Thos...
Michel Fournier, January 1, 2003
This article is a follow-up with more advanced details in regards to the first article of this series in our December issue which included a tip on dealing with stylesheets. This one allows you to customize your HTML code based on the user, assuming each user has some ways to setup some specific sty...
Michel Fournier, April 1, 2003
In this article, I will proceed with considerations about HTTP server variables being received from a browser and about considerations for opening new windows in your Web application. Relying on the protocol or not When it first started, we didn't ask that question to ourselves as to know ...
Michel Fournier, April 1, 2009
This articles describes the use of CDO.Message to gain the ability to retrieve a URL as a MHT file. It also covers an interesting approach to retrieve a URL even if this one requires a login.
Michel Fournier, January 1, 2006
Data dictionaries has its use and also for Web applications. I see many developers building Web applications who forget about many structured that used to be in place when developping desktop applications. The same should apply for Web applications as it is no different. This article discusses some ...
Michel Fournier, June 1, 2003
DevTeach was held in Montreal from May 10-13, 2003. It presented a new breed of conference. Sessions included both presentation material and, whenever possible, hands-on training. DevTeach brought under the same roof the best speakers available for .NET, SQL Server and Visual FoxPro as well as Micro...
Michel Fournier, May 1, 2002
The Essential Fox conference was held this weekend in Independence, MO. Once again, the Universal Thread team was on site to do the official coverage of the event. It has been a great success, well planned by Russ Swall, the event owner, and his team and well appreciated by the attendees. A total of...
Michel Fournier, April 1, 2002
UTMag/RapoZine team Editors Michel Fournier Claudio Lassala Translation coordinators Claudio Lassala Martín Salías Translators Eduardo Vidigal Rodolfo Duarte Fábio Vazquez Claudio Rola José Cavalcanti Moacyr Zalcman Ricardo Soares Fábio Vieira ...
Michel Fournier, September 1, 2001
Ever wonder how to successfully and rapidly display HTML lists to your users? Well, we all probably already did. However, its implementation differs a lot from sites to sites as we all have our own different approaches. Delivering Visual FoxPro data to the Web as if you would be in Visual FoxPro is ...
Michel Fournier, November 1, 2001
A lot of things happened recently in the Visual FoxPro world and for related technologies. The Great Lakes Great Database Workshop was being held in Milwaukee from Sunday October 27 to Wednesday October 31. That conference which primaly focused on Visual FoxPro has covered a lot of technologies...
Michel Fournier, December 1, 2002
UTMag/RapoZine team Editors Michel Fournier Claudio Lassala Co-editor Martín Salías Translation coordinators Claudio Lassala Martín Salías Translators Eduardo Vidigal Rodolfo Duarte Fábio Vazquez José Cavalcanti Moacyr Zalcman Fábio Vieira M...
Michel Fournier, November 1, 2002
UTMag/RapoZine team Editors Michel Fournier Claudio Lassala Co-editor Martín Salías Translation coordinators Claudio Lassala Martín Salías Translators Eduardo Vidigal Rodolfo Duarte Fábio Vazquez José Cavalcanti Moacyr Zalcman Fábio Vieira M...
Michel Fournier, January 1, 2003
UTMag/RapoZine team Editors Michel Fournier Claudio Lassala Co-editor Martín Salías Translation coordinators Claudio Lassala Martín Salías Translators Rodolfo Duarte Fábio Vazquez Moacyr Zalcman Martín Salías Antonio Castaño Fabián Belo Rafae...
Michel Fournier, November 1, 2001
I have been following several threads on the Universal Thread recently about FTP from Visual FoxPro. I have used an ActiveX for a while to do such a task. I have found that years after years, the problem is that you have to maintain that ActiveX for your own workstation and for every servers or work...
Michel Fournier, July 1, 2002
UTMag/RapoZine team Editors Michel Fournier Claudio Lassala Co-editor Martín Salías Translation coordinators Claudio Lassala Martín Salías Translators Eduardo Vidigal Rodolfo Duarte Fábio Vazquez José Cavalcanti Moacyr Zalcman Fábio Vieira M...
Michel Fournier, January 1, 2006
With the beginning of the new year, Michel resumes some of the highlights of the Universal Thread and what is coming up for the new season.
Michel Fournier, March 1, 2006
When comes time to display the content of a memo field on a Web page, one common task we have to do is to hyperlink specific content. This article discusses about a technique which can be used to hyperlink various types of links as well as email addresses.
Michel Fournier, April 1, 2009
This article describes some basic techniques to manipulate some images in .NET. It covers image resizing, image cropping and the ability to save an image into a JPG high resolution format.
Michel Fournier, May 1, 2007
This short articles provides an approach of important data from an Excel sheet into your application without having the requirement of having Excel installed on the server.
Michel Fournier, August 1, 2002
UTMag/RapoZine team Editors Michel Fournier Claudio Lassala Co-editor Martín Salías Translation coordinators Claudio Lassala Martín Salías Translators Eduardo Vidigal Rodolfo Duarte Fábio Vazquez José Cavalcanti Moacyr Zalcman Fábio Vieira M...
Michel Fournier, July 1, 2001
Recently, I was having problems while working on several projects on my PC. The problems were happening when I had several applications open at the same time. When the problem occured, I had to reboot my PC and then was able to work for a few hours up to a few days until the next reboot. As I was wo...
Michel Fournier, June 1, 2002
UTMag/RapoZine team Editors Michel Fournier Claudio Lassala Co-editor Martín Salías Translation coordinators Claudio Lassala Martín Salías Translators Eduardo Vidigal Rodolfo Duarte Fábio Vazquez José Cavalcanti Moacyr Zalcman Fábio Vieira M...
Michel Fournier, September 1, 2002
UTMag/RapoZine team Editors Michel Fournier Claudio Lassala Co-editor Martín Salías Translation coordinators Claudio Lassala Martín Salías Translators Eduardo Vidigal Rodolfo Duarte Fábio Vazquez José Cavalcanti Moacyr Zalcman Fábio Vieira M...
Michel Fournier, January 1, 2001
Xitech (Europe) produces tools for the Windows software developer. They specialize in FoxPro Developer tools, data and code recovery and security. In this article, we will see an overview of 5 of their tools. You will find more details about each of them from Xitech documentation. To get Xitech cont...
Michel Fournier, April 1, 2006
This article discusses the ability to use Visual FoxPro to schedule a list of tasks to be executed at specific intervals. While there could be the approach of using the Windows Scheduler to execute those tasks, it is always interesting to be able to control everything from within VFP. A small VFP sc...
Michel Fournier, April 1, 2006
This article describes an overview of sending an email from VB.NET. It covers the basis of creating the email functionality in a class and using an instance of that class to define and send the email. The class includes the ability to send to multiple recipients as well as sending attachments. Sendi...
Michel Fournier, July 1, 2002
This is a follow up on my previous article on using SOAP protocol for authentication that appeared in our December 2001 issue. That article was mentioning the use of the SOAP header for authentication such as being able to identify the user for any upcoming hit to your Web Service as soon as the Log...
Michel Fournier, May 1, 2002
UTMag/RapoZine team Editors Michel Fournier Claudio Lassala Translation coordinators Claudio Lassala Martín Salías Translators Eduardo Vidigal Rodolfo Duarte Fábio Vazquez José Cavalcanti Moacyr Zalcman Fábio Vieira Martín Salías Antonio Castañ...
Michel Fournier, July 1, 2002
From recent discussions I had, with several persons from my team, about common patterns which occur in the evolution of the Universal Thread, I thought it would be nice to write an article about it. Basically, within the evolution of a product, there are some similitudes which are sometimes interest...
Michel Fournier, June 1, 2001
Welcome to our first issue of the Universal Thread Magazine. We kept receiving many requests to have such a media available on the Universal Thread, so we decided to release our first issue this month. Many people have mentioned an interest to either have such a magazine for the pleasure to read abo...
Michel Fournier, December 1, 2001
The Visual FoxPro Zone evolves As many of you may have seen, the Universal Thread Visual FoxPro Zone is evolving quite fast. In the last month, we added new content in it. As usual, the most popular option is the Toledo Wish List. Several entries are created every day. This is the place to co...
Michel Fournier, January 1, 2002
It's January 3rd, 2002, I am writing this editorial at 20h32 EST. The Christmas break is over but was it really a break? More and more, years after years, I keep seeing a lot of persons online during Christmas day or a few minutes before the new year. And, I mean, they are online as per their own ti...
Michel Fournier, January 1, 2004
In December 1993, a great history started when a small Web site known as the Visual FoxPro Yellow Pages started. Basically, a site providing ads for Visual FoxPro developers such as jobs and consulting services. Known also as the first Visual FoxPro site, it has evolved quite fast during the first t...
Michel Fournier, January 1, 2006
In the recent months, I have been involved in settings various projects at client sites, as well as for Level Extreme Web sites, which involved the support of uploading image files from an Internet browser. The process of supporting that capability in your application, either from a desktop of from ...
Michel Fournier, December 1, 2001
The Microsoft SOAP client provides access to any Web Service. Once the object is instantiated and the location of the WSDL file given, you are ready to go to access any method. Thus, based on what is supported by the Web Service, you can query to obtain various types of content such as string and bo...
Michel Fournier, February 1, 2002
On January 15th, 2002, an important joint took place for our magazine. The Universal Thread Magazine and RapoZine magazine, an online magazine available for the Portuguese developers community, joined to create UTMag/RapoZine. Effective from this issue, both magazines will offer the same technical c...
Michel Fournier, July 1, 2002
Show seconds in a readable format If you need to check elapsed time with seconds() or a datetime value, this function allows you to display the elapsed time in a human-readable format, that is, hours:minutes:seconds, instead of the total number of seconds. Just pass a number of seconds as...
Michel Fournier, August 1, 2002
Updating your DLL on IIS This has been a common question in the recent months on the Universal Thread. More and more, developers have the need to use a DLL under IIS. However, the fun part comes when you need to update it. As soon as it kicks in, you can't update your DLL anymore as it re...
Michel Fournier, November 1, 2002
Use MemLines() to wrap text lines When you need to wrap some text at a given width (say 75 characters per line), you do it easily with: SET MEMOWIDTH TO 75 lcMemo = lcNewMemo = "" _MLINE = 0 FOR i= 1 TO memlines(lcMemo) lcNewMemo = lcNewMemo ; + MLINE(lcMemo,1,_MLINE...
Michel Fournier, September 1, 2002
Getting image width and height Probably the most flexible way to extract the width and height of an image is by the use of the image object. All is needed is to load the image in the object and get the values from the Width and Height properties. LOCAL loImage,lnWidth,lnHeight loIma...
Michel Fournier, October 1, 2002
Extracting BMPs from general fields As a complement with last issue's article on image handling, yo can find useful this little function. If you got convinced that using general fields to handle images is a bad idea, you can decided go back to independent image files. But then you'll...
Michel Fournier, June 1, 2001
It was a year ago. The DevConnections team was holding the Visual FoxPro DevCon 2000, the SQL Server Connections and the DevCon 2000 in New Orleans, Louisiana from May 14 to 18, 2000. For the first time, attendees were able to attend sessions from more than one conference at the same time. This offe...
Michel Fournier, September 1, 2001
Is there a speed limit on the Internet? Probably not, because there is so much things we can do in a short time about delivering various type of content to the community. I remember a week ago we shared an idea about helping the promotion of user group activities around the world. A week ago it was ...
Michel Fournier, March 1, 2002
In the last month, we received dozens of emails from satisfied persons in regards for our initiative of opening the magazine and the Universal Thread in general for additional communities such as the Portuguese and Spanish communities. Regulars members of the Universal Thread, new members, Microsoft...