[Openroad-users] eClient &Timezones-CORRECTION KB415539not KB415439
Bodo Bergmann
Bodo.Bergmann at ingres.com
Fri Apr 11 19:58:10 EST 2008
Darren,
thanks for your explanation.
You are right - a pure "date('now')" on the client while having the
II_TIMEZONE_NAME
set to the same as on the server would just return the same time as on
the server.
A solution without the Win32API would then be:
The client passes its actual timezone name (according to its location)
as a varchar parameter, e.g.
a client in SouthAustralia would pass 'AUSTRALIA-SOUTH', a client in
Sydney 'AUSTRALIA-NSW'.
This should be configured during the installation or first run of the
eClient (e.g. in a config file).
The server can then use the solution I provided for the other thread:
getLocalTime(tz=actual_timezone_name)
which would return the current time in Adelaide or Sydney, resp. as a
varchar.
This can then be used to store in your table.
Now to your statement:
Durwin's neat enhancement thought, however, would be sensational,
having the facility to request a date time for a timezone, either
passing no date and a timezone (DATE(ingresdatevalue, ii_timezone_name)
to return the current date time for the timezone) - OR-- passing a
datetime in the current timezone and it is returned adjusted to the
timezone passed into the function. This would address many issues with
a simple coding construct, I expect, but way beyond our technical
capabilities!
Of course it would be nice to have an according functionality.
But there is a way to implement it right now in 4GL.
Let's just extend the example I gave for the other issue to provide the
functionality:
Change the starting procedure of application "tz" (which will be imaged
to tz.img) as following:
procedure writecurtime() =
DECLARE
dtgmt = VARCHAR(25) NOT NULL;
{
dtgmt = CurSession.GetEnv(name='DT_GMT');
IF dtgmt=''
THEN
CurProcedure.Trace(text=VARCHAR(DATE('NOW')));
ELSE
CurProcedure.Trace(text=VARCHAR(DATE(dtgmt)));
ENDIF;
}
Then extend the "getLocalTime" procedure as following:
PROCEDURE getLocalTime(
dt = DATE DEFAULT NULL,
tz=VARCHAR(100) NOT NULL
)=
declare
str = StringObject;
enddeclare
{
CurSession.SetEnv(envstring='II_LOG=C:\temp'); // to specify
logfile directory
CurSession.SetEnv(envstring='II_TIMEZONE_NAME='+tz);
CurSession.SetEnv(envstring='DT_GMT='+date_gmt(IFNULL(dt,
DATE('NOW'))));
CALL SYSTEM 'w4glrun tz.img -Ltz.log';
str.FileHandle = 'C:\temp\tz.log';
RETURN str.Value;
}
So, you can now pass the timezone name and an optional date to the 4GL
Procedure getLocalTime().
It will give you the provided datetime (or the current datetime if not
provided) in the given timezone.
Bodo.
Bodo Bergmann
Senior Software Engineer
OpenROAD Worldwide Development
Ingres Corp.
________________________________
From: openroad-users-bounces at peerlessit.com
[mailto:openroad-users-bounces at peerlessit.com] On Behalf Of Darren Mason
Sent: Friday, April 11, 2008 9:50 AM
To: 'International OpenROAD Users'
Subject: Re: [Openroad-users]eClient &Timezones-CORRECTION KB415539not
KB415439
Hi Bodo,
The nature of our application is if an employee is scheduled to start
work at a specific time then that is the time - it does not change
depending on which timezone you are viewing the data from. I am
rostered to start a shift at 7:00 and finish at 15:00, then these times
are static. If this is in Perth and I view the data in Sydney then I
still want to see that the employee is rostered to start at 7:00 and
finish at 15:00 - not for the times to alter.
What compounds this is that many employees using electronic timeclocks
to record their start and finish times and these is gathered by the
OpenROAD server and loaded - bypassing the local client. They arrive
unaltered so the if the employee started in Perth as 6:42 then that is
how it needs to be recognised so it will correctly match to the start
time of their shift - the OpenROAD server in Sydney needs to know the
Perth 07:00 shift start time is, in fact, 07:00.
It is this nature of the application that makes it very different to a
scheduling tool where you want the Web conference to reflect different
times based on the local timezone.
So yes, in hindsight with these learnings, storing them in a varchar
column would have been potentially a better way to go (although we would
have lost access to the neat date handling functions we currently
utilise). Unfortunately much of the system is built around the Ingres
Date usage and date functions provided by Ingres and OpenROAD, and the
time to convert the system to use Varchar columns is significant, and
then the upgrade of the application to the client base makes this
commercially not viable...
So, back to the approach of running the clients and the servers on the
same timezone...
If Date ('now') gives the system date on the PC rather than the timezone
adjusted view of the current time then this will be perfect, however a
previous e-mail of yours indicates date('now') applies the
II_Timezone_Name applied during application startup - so would that
give the current time in Sydney regardless of the location of the client
if all clients were set to the same timezone as the server? IF so,
back to the win32 SDK because we would have all clients on the same
timezone as the server...
Darren's original timezone question was interestingly different because
we need to adjust the times on the clocks accordingly, as we experience
daylight savings changes to times between states,. We know the timzone
each clock resides in, we just need to know what time to set them to
when they are due to change, or if a user simply wants to reset the
clock time. The system controls this centrally so we need to process
the clocks in 'timezone groups' - but how do we know what time to set
them to? We have a group of clocks in Perth, a group in Adelaide, a
group in Melbourne, and another group in Brisbane - all in different
timezones . You provided a solution where we could, as we process each
group, SET the II_Timezone variable through another application /
image, and return to the calling up so the times can be processed based
on the newly set timezone, repeating this for each timezone. This
appears to be an excellent solution to our problem and we will be
implementing this.
Durwin's neat enhancement thought, however, would be sensational,
having the facility to request a date time for a timezone, either
passing no date and a timezone (DATE(ingresdatevalue, ii_timezone_name)
to return the current date time for the timezone) - OR-- passing a
datetime in the current timezone and it is returned adjusted to the
timezone passed into the function. This would address many issues with
a simple coding construct, I expect, but way beyond our technical
capabilities!
Anyway - thank you all for your contributions... we certainly
understand much, much more about date handling and the implication of
various scenarios on our solution. Through these discussions we
benefit greatly - just hope others have not been too bored along the
way!
Regards
Darren Mason
From: openroad-users-bounces at peerlessit.com
[mailto:openroad-users-bounces at peerlessit.com] On Behalf Of Bodo
Bergmann
Sent: Friday, 11 April 2008 4:42 PM
To: International OpenROAD Users
Subject: Re: [Openroad-users] eClient &Timezones-CORRECTION KB415539not
KB415439
Darren,
You wrote:
If a Sydney user then access the Perth times, the 9:00am will then be
displayed as 11:00am because it is applying the Sydney - NSW timezone.
The reverse is true if a user in Perth needed to view times from a
Sydney employee... 11:00 am will be displayed as 9:00am.
We fear needing to introduce text fields to store the times that need to
be displayed on each screen
I think the handling is what most users that use timezone-aware software
would expect - e.g. if I plan a Web conference
for a distinct time (e.g. 4pm) in Germany I want the other attendees
take part in it at the correct time, not at 4pm of their local time.
Does this mean that you do not want to have any timezone specific
handling at all?
All your clients in all timezones would see the same date/time for dates
entered by any client.
Then why don't you just pass the dates as VARCHAR from the clients and
store them into a VARCHAR column?
Anyway, for the "remaining SELECT DATE('now') problem" you described:
You just have to pass the client's DATE('now') as a parameter to the
OpenROAD server,
which then uses it rather then selecting it from the DB
(e.g. by setting a global variable first, so you don't have to pass it
along procedures and methods).
Comments to Durwin:
DATE LITERALS and Timezones
You can actually pass a timezone aware date literal between the client
and OpenROAD Server, e.g.
by using the date_gmt() function rather than simpe varchar() conversion.
DATE(ingresdatevalue, ii_timezone_name)
I had already provided a solution for the problem in a former email
thread "Timezone Question"
(which was also started by Darren Harvey). This solution can be applied
on both client and server.
Bodo.
Bodo Bergmann
Senior Software Engineer
OpenROAD Worldwide Development
Ingres Corp.
________________________________
From: openroad-users-bounces at peerlessit.com
[mailto:openroad-users-bounces at peerlessit.com] On Behalf Of Durwin
Wright
Sent: Friday, April 11, 2008 3:03 AM
To: International OpenROAD Users
Subject: Re: [Openroad-users] eClient &Timezones-CORRECTION KB415539not
KB415439
Hello Chris,
Good point Chris. I have a question. Are you talking about an INGRES
DATE or an INGRES DATE LITERAL. Darren wants the value in Perth and
Sydney to have the same display value.
I believe what Darren actually wants is some like DATE(ingresdatevalue,
ii_timezone_name). Alas, this does not exist. It would be a pretty
cool enhancement!
Durwin Wright | Sr. Architect | Durwin.Wright at ingres.com
<blocked::mailto:Durwin.Wright at ingres.com> | Ingres | 500 Arguello
Street | Suite 200 | Redwood City | CA | 94063 | USA
<blocked::http://maps.google.com/maps?q=500+arguello+street,+94063&ll=37
.487297,-122.233200&spn=0.004602,0.012771&t=k&hl=en> +1 650-587-5523 |
fax: +1 650-587-5550
________________________________
From: openroad-users-bounces at peerlessit.com
[mailto:openroad-users-bounces at peerlessit.com] On Behalf Of Chris
Wallace
Sent: Thursday, April 10, 2008 5:58 PM
To: International OpenROAD Users
Subject: Re: [Openroad-users] eClient & Timezones-CORRECTION KB415539not
KB415439
Darren,
Storing a 'local' view of the time is only good if you don't care /
aren't impacted by daylight savings changes. Particularly, since Perth,
Tassie and Sydney/Melbourne are all change to or from daylight savings
on different dates.
Regards
Chris Wallace
________________________________
From: openroad-users-bounces at peerlessit.com
[mailto:openroad-users-bounces at peerlessit.com] On Behalf Of Darren Mason
Sent: Friday, 11 April 2008 07:39
To: 'International OpenROAD Users'
Subject: Re: [Openroad-users] eClient & Timezones -CORRECTION
KB415539not KB415439
Thank you Durwin and Bill,
It seems the consensus is to store a copy of each date field into a text
field that represents the 'local' view of the time and then use this for
display purposes.
What concerns me is the effort required by us to address the issue in
this way. As we are developers of Time & Attendance software, as you
would expect, the software is a heavy user of date fields. What
compounds this is the implication of rolling such a change out to 100+
clients. Not pretty in a commercial world.
Where our thoughts have evolved to is deploying the eClient so it runs
the same Timezone as the server, so Perth WA in effect, is on the Sydney
NSW Timezone. This will ensure all data is viewed consistently - I
submit 9:00am in Perth it will be displayed as 9:00am in Sydney, etc.
Are there any gotchas with this, is this heresy, or a viable approach?
This leaves us with cases where we have used SELECT date('now'). My
understanding is this gets the current date and time from the server so
bypasses input from the client. So if a user clicks on a button to say
they are starting or finishing work it will apply the server view of
'now', which if I was in Perth and the server in Sydney would be out by
2 hours.
To address this I expect we need to get the current system time from the
local client and use it (where appropriate). Our audit logs that
record when changes were made by users will need to use this alternate
approach.
We have not used any Windows API calls to get the time on the client PC
previously but I expect it is simple enough.
If anyone can see any 'gotchas' with what we are doing we will gladly
hear them!
Thanks...
Regards
Darren Mason
From: openroad-users-bounces at peerlessit.com
[mailto:openroad-users-bounces at peerlessit.com] On Behalf Of Durwin
Wright
Sent: Friday, 11 April 2008 1:25 AM
To: International OpenROAD Users
Subject: Re: [Openroad-users] eClient & Timezones - CORRECTION
KB415539not KB415439
Hello Darren,
It looks like you are dealing with an artifact of the Ingres
implementation of the INGRES DATE datatype. Your description of how the
INGRES DATE is stored as GMT in the database is accurate. When a local
client retrieves an INGRES DATE datatype, it flows across the wire in
the GMT normalized form. Internally in the local client it retrains
it's GMT form. When it is time to convert the date into a DATE LITERAL
is when the timezone offsets are applied.
We tend to think of the INGRES DATE and the INGRES DATE LITERAL as being
equivalent. In many cases they do get treated identically.
Maybe you can try introducing an additional column in which you store
the the INGRES DATE LITERAL value evaluated on the local OpenROAD
eClient by using he VARCHAR(ingresdate) expression. If you have an
Ingres database (or EA) connection this expression will evaluate to the
same value since the DBMS server will put the session that the client is
using into the same timezone name. If you have an eClient that uses an
OpenROAD Server connection, the same is not true.
If the Sydney client stores the VARCHAR(ingresdate) value in the
database where the time is 11:00 AM, then when the Perth client
retrieves this value they will also see 11:00 AM. This can be converted
back into an INGRES DATE value by using the DATE(ingres date liternal)
expression. One caution, is that when you use this technique, you are
effectively using an implicit INGRES DATE WITHOUT TIMEZONE value. Do
not forget that the INGRES DATE semantic always assume that the they
will be normalized to GMT when they are passed to the Ingres Server.
When the eClient passes an INGRES DATE to the OpenROAD Server, it get's
passed also in a GMT normalized form. The only difference, is that when
the OpenROAD Server passes the date into an Ingres database, it applies
the timezone offset that the OpenROAD Server is set to instead of the
timezone offset of the cleint.
Durwin Wright | Sr. Architect | Durwin.Wright at ingres.com
<mailto:Durwin.Wright at ingres.com> | Ingres | 500 Arguello Street |
Suite 200 | Redwood City | CA | 94063 | USA
<http://maps.google.com/maps?q=500+arguello+street,+94063&ll=37.487297,-
122.233200&spn=0.004602,0.012771&t=k&hl=en> +1 650-587-5523 | fax: +1
650-587-5550
________________________________
From: openroad-users-bounces at peerlessit.com
[mailto:openroad-users-bounces at peerlessit.com] On Behalf Of Darren Mason
Sent: Thursday, April 10, 2008 2:39 AM
To: 'International OpenROAD Users'
Subject: Re: [Openroad-users] eClient & Timezones - CORRECTION
KB415539not KB415439
(on behalf of Darren Harvey)
Thanks for the advice Durwin,
That gives as some ideas on how to ensure we set the correct timezone at
each of our interstate sites. Our immediate thought is to check for an
.ini file on the client PC that will contain the local timezone value,
and if it does not exists then prompt the user to select a timezone.
Once this has been done the first time we should be ok from then on. We
will start putting ths in place. The problem we are trying to resolve
leads down the path of viewing the data after it has been saved. The
following is based on the Australian timezones.
Let's use Perth in WA where the is at 9:00am , Sydney in NSW where the
time is 11:00am, and GMT being 1:00 at the same time.
What we will be doing is enabling our Perth users to view the time as
9:00am and save it accordingly - all is good.
Our Sydney users will view their times as 11:00am, and saving it
accordingly so all is good.
Our understanding is that the times are saved in the db as GMT times, so
9:00am in Perth and 11:00am in Sydney will both be saved as 1:00am GMT.
Now we start introducing an issue.
If a Sydney user then access the Perth times, the 9:00am will then be
displayed as 11:00am because it is applying the Sydney - NSW timezone.
The reverse is true if a user in Perth needed to view times from a
Sydney employee... 11:00 am will be displayed as 9:00am.
We fear needing to introduce text fields to store the times that need to
be displayed on each screen, and I expect reporting will become an issue
as it will be reporting on a collective set of date fields without
knowing the source?
Any advice on how to address this would be greatly appreciated...
Regards
Darren Mason
From: openroad-users-bounces at peerlessit.com
[mailto:openroad-users-bounces at peerlessit.com] On Behalf Of Durwin
Wright
Sent: Thursday, 10 April 2008 5:59 PM
To: International OpenROAD Users
Subject: Re: [Openroad-users] eClient & Timezones - CORRECTION KB415539
not KB415439
Are you using the eClient ENVIRONMENT= directive in your eclient in the
INSTALL4GL.TXT file that you use to package the eClient application? An
excerpt fron the readme.txt for the eCleint is as follows,
ENVIRONMENT
This line can appear ZERO or more times. The string to the
right of
the first "=" sign is treated as an environment variable
specification.
These environment variables will be set in the eClient runtime
process
before the OpenROAD runtime is initialized.
The variable name is separated from the variable value by the
second
"=" sign, similar to the syntax for using "set" in a command
window.
Variable values can refer to other variables using the standard
%xxx%
syntax (such as in the %II_ECLIENT_APPDIR% example shown above).
The following "built-in" variables can be referenced by your own
definitions:
II_ECLIENT_APPDIR
This will be set to the current eClient application's
installation directory, which is also the current
directory
when the OpenROAD runtime executes this eClient
application.
II_ECLIENT_ROOT
This will be set to the parent directory of the
application's
installation directory.
II_ECLIENT_LIBDIR
This will be set to the eClient shared library
installation
directory.
(Other predefined variables are described in a later
section.)
Variable definitions are processed in two passes. First the
variables
that do not reference any other variables (i.e., those that do
not
contain any "%" characters) are set. In the second pass, the
variables
that contain "%" references are expanded using the current
environment
settings, and then set.
The order in which variables are processed within each pass is
not
defined. Therefore, you should not attempt to use more than one
level
of nesting in your variable definitions.
Normally the II_TIMEZONE_NAME is retrieved from the SYMBOL.TBL for the
nstallation. The eClient does not use a SYMBOL.TBL. If there is an
Ingres installation on the machine where the eClient is deployed, then
you could use the ENVIRONMENT directive to set II_SYSTEM to an explicit
value.
An alternative to the SYMBOL.TBL is to explicitly use the SET command to
specific an II_TIMEZONE_NAME vlaue. This environment variable cannot be
set after the eClient starts the underlying OpenROAD runtime. The
ENVIRONMENT directive is processed prior to the eClient OpenROAD runtime
initializing and performs a SET on behalf of the eClient prior to the
initialization of the eClient OpenROAD runtime.
Take a look at Ingres KB415539, "How to run an eClient application using
different settings for II_W4GLAPPS_DIR to use different image versions".
It specifically refers to II_W4GLAPPS_DIR but the technique cold easily
be generalized to having a previously Windows environment variable set
that contains the local value of II_TIMEZONE_NAME.
Durwin Wright | Sr. Architect | Durwin.Wright at ingres.com
<mailto:Durwin.Wright at ingres.com> | Ingres | 500 Arguello Street |
Suite 200 | Redwood City | CA | 94063 | USA
<http://maps.google.com/maps?q=500+arguello+street,+94063&ll=37.487297,-
122.233200&spn=0.004602,0.012771&t=k&hl=en> +1 650-587-5523 | fax: +1
650-587-5550
________________________________
From: openroad-users-bounces at peerlessit.com
[mailto:openroad-users-bounces at peerlessit.com] On Behalf Of Darren
Harvey
Sent: Wednesday, April 09, 2008 7:17 PM
To: 'International OpenROAD Users'
Subject: [Openroad-users] eClient & Timezones
I have a question re the handling of Timezones within an eClient
environment.
Assume the time in NSW is 11:00 and Western Australia is 09:00.
We have built the Cab file through the OR Web-Publisher and specified an
environment parameter of 'II_TIMEZONE_NAME=AUSTRALIA-NSW'. This works
fine in NSW, however when users in Western Australia run the eClient,
they see the 'current' time as 11:00 instead of the correct local time
of 09:00. (I assume this is correct from an OR point of view? But
unfortunately it isn't what we require.)
Does this mean we need to build a separate Web application for Western
Australian users, that specifies a parameter of
'II_TIMEZONE_NAME=AUSTRALIA-WEST'? And that this would then show the
'current' time as 09:00.
I hope this makes sense.
Thanks
Darren
Regards
Darren Harvey
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://www.peerlessit.com/pipermail/openroad-users/attachments/20080411/c6ecd611/attachment.html
More information about the Openroad-users
mailing list