Hi everyone, I have a table with the following data upon which I would
like to report:
SomeDt SomeValue
1-sep-09 100
12-dec-09 200
02-feb10 50
14-apr-10 75
I need to report on this data showing values for all months within the
given min and max dates on the file so:
These dates need to be part of a *rolling* report.
I have data for Sep, Dec,Feb and Apr, but I want to display on the
report ALL months regardless of whether they have data in the table
and return 0 where they do not. Thus:
Month Value
Sep 09 100
Oct 09 0
Nov 09 0
Dec 09 200
Jan 10 0
Feb 10 50
Mar 10 0
Apr 10 75
I can get the min and max and the count of months easily enough:
select min(SomeDt) as StDt, max(SomeDt) as EndDt, datediff("m" , StDt,
EndDt) as CountofMonthsBetween from SomeTable
What I cannot get is how to then determine what the months are in
between. What I want if possible is a resultset that looks something
like this
StDt EndDt Mth
01/9/09 14/4/10 Sep 09
01/9/09 14/4/10 Oct 09
01/9/09 14/4/10 Nov 09
01/9/09 14/4/10 Dec 09
01/9/09 14/4/10 Jan 10
01/9/09 14/4/10 Feb 10
01/9/09 14/4/10 Mar 10
01/9/09 14/4/10 Apr 10
How can I do it?
As much as possible I want to use QUERY resultsets, rather than
creating intermediary tables etc which are just messy in MS Access,
but will use them if no other choice.
Happy to write a function if needs be to calc the Mth column. Am
absolutely desperate so all help greatly appreciated. If it can't be
done at all via queries alone, please let me know this too.
Edwina63
|
|
0
|
|
|
|
Reply
|
Edwinah63
|
5/16/2010 8:53:55 AM |
|
The missing months have to come from somewhere, so you need a table to
generate them.
1. Create a new table with just one field named (say) CountID, type Number,
and mark it as primary key. Save the table as (say) tblCount.
2. Enter records into this table, from zero to the largest number of months
you will need for your report. If there could be a large number of months,
here's some code to enter the records for you:
http://allenbrowne.com/ser-39.html
3. Create a query using tblCount as the source table.
Drag CountID into the grid. In the Criteria row under this field, enter:
< [How many months?]
4. Type this expression into the next column, the Field row:
TheMonth: DateAdd("m", [CountID], [StartMonth])
5. Declare the Parameters (Parameters on ribbon or Query menu.)
Access opens the Parameters dialog.
Enter 2 rows, using exactly the same names as you used above:
[How many months?] Long
StartMonth Date/Time
6. Test. This should generate a record for every month.
Save the query as qryCount.
7. Create a query using your existing table.
Enter this expression into the Field row:
MonthStart: [SomeDt] - Day([SomeDt]) + 1
8. Depress the Total button on the toolbar/ribbon.
Access adds a Total row to the design grid.
Accept Group By under this field.
9. Drag SomeValue into the grid.
In the Total row under this field, choose Sum.
Test: the query will give you one total for each month that has data.
Save the query as qryMonthData.
10. Create another query using qryCount and qryMonthData as input 'tables'.
11. Drag qryCount.TheMonth onto qryMonthData.MonthStart.
Access draws a line between the two tables.
12. Double-click the line between the 2 dialogs.
Access opens a dialog with 3 options.
Choose the one that says:
All records from qryCount, and any matches from qryMonthData.
(Technically, that's known as an outer join, and it's what gives you every
month.)
--
Allen Browne - Microsoft MVP. Perth, Western Australia
Tips for Access users - http://allenbrowne.com/tips.html
Reply to group, rather than allenbrowne at mvps dot org.
"Edwinah63" <edwinah@customercare.com.au> wrote in message
news:592bf063-f748-40d6-9b87-5270e4f575f6@42g2000prb.googlegroups.com...
> Hi everyone, I have a table with the following data upon which I would
> like to report:
>
> SomeDt SomeValue
> 1-sep-09 100
> 12-dec-09 200
> 02-feb10 50
> 14-apr-10 75
>
> I need to report on this data showing values for all months within the
> given min and max dates on the file so:
> These dates need to be part of a *rolling* report.
>
> I have data for Sep, Dec,Feb and Apr, but I want to display on the
> report ALL months regardless of whether they have data in the table
> and return 0 where they do not. Thus:
>
> Month Value
> Sep 09 100
> Oct 09 0
> Nov 09 0
> Dec 09 200
> Jan 10 0
> Feb 10 50
> Mar 10 0
> Apr 10 75
>
>
> I can get the min and max and the count of months easily enough:
>
> select min(SomeDt) as StDt, max(SomeDt) as EndDt, datediff("m" , StDt,
> EndDt) as CountofMonthsBetween from SomeTable
>
> What I cannot get is how to then determine what the months are in
> between. What I want if possible is a resultset that looks something
> like this
>
> StDt EndDt Mth
> 01/9/09 14/4/10 Sep 09
> 01/9/09 14/4/10 Oct 09
> 01/9/09 14/4/10 Nov 09
> 01/9/09 14/4/10 Dec 09
> 01/9/09 14/4/10 Jan 10
> 01/9/09 14/4/10 Feb 10
> 01/9/09 14/4/10 Mar 10
> 01/9/09 14/4/10 Apr 10
>
> How can I do it?
>
> As much as possible I want to use QUERY resultsets, rather than
> creating intermediary tables etc which are just messy in MS Access,
> but will use them if no other choice.
>
> Happy to write a function if needs be to calc the Mth column. Am
> absolutely desperate so all help greatly appreciated. If it can't be
> done at all via queries alone, please let me know this too.
>
> Edwina63
>
>
>
>
>
>
|
|
0
|
|
|
|
Reply
|
Allen
|
5/16/2010 11:01:45 AM
|
|
Hi Allen,
Thanks for your solution, it is very neat. Now let me ask the truly
stoopid question: is it possible to generate those eight records that
are put into tblCount via a query alone ie: based on the the record
count (in this example 8 months between Sep and Apr), is it possible
to force a *query* to return 8 records (containing 1 to 8, 0 to 7 or
whatever)?
I am certain the answer is no, but I am interested to have that
confirmed by someone who knows Access well (or queries in general and
likes a challenge!). As a quick background, I am used to doing these
sorts of things in MS SQL stored procs. I would create the kind of
table you suggested as a temp table within the procedure and outer
join that table back to my query containing the data all as you have
outlined. The advantage of stored procs is that when they go out of
scope, all the temp tables I have created are destroyed with them.
I am worried about creating the table because once I have the final
resultset I want all the intermediary steps destroyed. This is coupled
with the fact that the owner of this database wants it to be as
codeless as possible. Hence the idea of forcing a query to return 8
records in a resultset (which seems to be the nearest thing to a temp
table I can find in Access).
Any suggestions as the best way to approach this?
Edwinah63
ps not sure how i would go about forcing a query to return 8 empty
records in ms sql either!! :-) so over to the floor!
|
|
0
|
|
|
|
Reply
|
Edwinah63
|
5/16/2010 11:56:11 AM
|
|
>ps not sure how i would go about forcing a query to return 8 empty
>records in ms sql either!! :-) so over to the floor!
Bite the bullet. Create the tblDates table and then use it in your query.
Then you'll create a deliberate partial cartesian product, constraining the
dates to be between a start and end date.
--
Message posted via AccessMonster.com
http://www.accessmonster.com/Uwe/Forums.aspx/access-queries/201005/1
|
|
0
|
|
|
|
Reply
|
PieterLinden
|
5/16/2010 7:50:40 PM
|
|
Do you already have a table in your database that contains an autonumber
field? If so, use that instead of creating a new table.
Otherwise, a dynamic solution is not possible. You can of course hard-code
some unioned queries to force the missing records to be included.
As an alternative, create a new database in code, create the Numbers table
in it, link to it, and use it in your query, deleting the database when
finished. I'm sure Allen has an example of VBA code to create a database on
his website. If not, try www.rogersaccesslibrary.com
As for SQL Server, given the existence of a Numbers table, the exact same
solution is possible without the overhead of temp tables.
Edwinah63 wrote:
> Hi Allen,
>
> Thanks for your solution, it is very neat. Now let me ask the truly
> stoopid question: is it possible to generate those eight records that
> are put into tblCount via a query alone ie: based on the the record
> count (in this example 8 months between Sep and Apr), is it possible
> to force a *query* to return 8 records (containing 1 to 8, 0 to 7 or
> whatever)?
>
> I am certain the answer is no, but I am interested to have that
> confirmed by someone who knows Access well (or queries in general and
> likes a challenge!). As a quick background, I am used to doing these
> sorts of things in MS SQL stored procs. I would create the kind of
> table you suggested as a temp table within the procedure and outer
> join that table back to my query containing the data all as you have
> outlined. The advantage of stored procs is that when they go out of
> scope, all the temp tables I have created are destroyed with them.
>
> I am worried about creating the table because once I have the final
> resultset I want all the intermediary steps destroyed. This is coupled
> with the fact that the owner of this database wants it to be as
> codeless as possible. Hence the idea of forcing a query to return 8
> records in a resultset (which seems to be the nearest thing to a temp
> table I can find in Access).
>
> Any suggestions as the best way to approach this?
>
> Edwinah63
>
> ps not sure how i would go about forcing a query to return 8 empty
> records in ms sql either!! :-) so over to the floor!
--
Microsoft MVP - ASP/ASP.NET - 2004-2007
Please reply to the newsgroup. This email account is my spam trap so I
don't check it very often. If you must reply off-line, then remove the
"NO SPAM"
|
|
0
|
|
|
|
Reply
|
Bob
|
5/16/2010 8:33:57 PM
|
|
FWIW,
here's Tony's explanation of how to use Temp Tables in Access....
http://www.granite.ab.ca/access/temptables.htm
not quite the same as SQL Server, but the best you're going to do in Access...
--
Message posted via http://www.accessmonster.com
|
|
0
|
|
|
|
Reply
|
PieterLinden
|
5/16/2010 10:46:24 PM
|
|
>>You can of course hard-code
>>some unioned queries to force the missing records to be included.
D'oh! I completely forgot about creating a dynamic union query! Thank
you for reminding me!
Maybe something like this?
public sub CreateAQuery(mthsBetween as integer)
dim i as integer
dim sql as string
for i = 0 to mthsBetween
sql = sql & "select " & i & " as Mth union "
next i
<------Can I do this next bit??--->
Currentdb.Execute " If exists(SELECT name FROM sysobjects WHERE name =
'MyUnionQuery' DROP QUERY MyUnionQuery;"
CurrentDb.Execute "CREATE QUERY MyUnionQuery AS " & sql
end sub
The code above isn't quite right but you get the idea.
Had a hunt around the internet for a "Create Query" statement. Is
there one? Would prefer to stick to SQL statements wherever possible
but will use querydefs etc otherwise.
A big thank you to everyone who responded :-)
|
|
0
|
|
|
|
Reply
|
Edwinah63
|
5/17/2010 8:58:10 AM
|
|
Edwinah63 wrote:
>>> You can of course hard-code
>>> some unioned queries to force the missing records to be included.
>
> D'oh! I completely forgot about creating a dynamic union query! Thank
> you for reminding me!
>
> Maybe something like this?
>
> public sub CreateAQuery(mthsBetween as integer)
>
> dim i as integer
> dim sql as string
>
> for i = 0 to mthsBetween
>
> sql = sql & "select " & i & " as Mth union "
>
> next i
>
> <------Can I do this next bit??--->
>
> Currentdb.Execute " If exists(SELECT name FROM sysobjects WHERE name =
> 'MyUnionQuery' DROP QUERY MyUnionQuery;"
> CurrentDb.Execute "CREATE QUERY MyUnionQuery AS " & sql
>
>
> end sub
>
> The code above isn't quite right but you get the idea.
>
> Had a hunt around the internet for a "Create Query" statement. Is
> there one? Would prefer to stick to SQL statements wherever possible
> but will use querydefs etc otherwise.
>
> A big thank you to everyone who responded :-)
Aside from the test for existence: absolutely. In this case, it would be
CREATE VIEW view [(field1[, field2[, ...]])] AS selectstatement
If you parameterize it or create an action query, it would be
CREATE PROCEDURE procedure
[param1 datatype[, param2 datatype[, ...]] AS sqlstatement
Online help has a well-hidden section on JetSQL, but I did manage to find it
:-)
Just hit F1, find the again well-hidden link on the help screen to get to
the table of contents, and find the node called "Microsoft Jet SQL
Reference" - the last bit isn't so hard :-)
You would have to look at the querydefs collection (if using DAO) or the
ADOX Views or Procedures collection (if using ADO) to find out if the query
exists. But you know ... since you're already into the Querydefs collection,
you might as well simply use a querydef object ... it will truly be
temporary if you omit the qryname argument from the CreateQuerydef
statement. Since you are using VBA, you're code won't be portable anyways,
so you might as well do it the easy way.
Oh! And don't forget: unlike Transact-SQL, Jet SQL requires a FROM clause
with table expression. You don't have to actually retrieve any data from the
table, but you do have to name one.
Transact-SQl:
Select 'a' as col1, 2 as col2
union
Select 'b', 4
Jet SQL:
Select TOP 1 'a' as col1, 2 as col2 FROM existingtable
union
Select TOP 1 'b', 4 FROM existingtable
--
Microsoft MVP - ASP/ASP.NET - 2004-2007
Please reply to the newsgroup. This email account is my spam trap so I
don't check it very often. If you must reply off-line, then remove the
"NO SPAM"
|
|
0
|
|
|
|
Reply
|
Bob
|
5/17/2010 11:38:07 AM
|
|
Thanks for your reply. I am having trouble now with the Create View
Statement.
To check I had the right syntax I created a dummy table with 1 field,
1 record. I then created the sample statement in the SQL view of both
an ordinary and so called "Data Definition" query
create view MyView as select dummyid from tblDummy
Both come back with the error "Syntax error in Create Table statement"
What am I doing wrong?
Had a google around and it seems that Access 2007 will not recognize
create view statement for this database unless the ANSI92
compatibility is turned on and the ANSI92 option under Access Options/
Object Designers/Query Design/Sql Server Compatible Syntax is greyed
out.
Database is an Access 2007 database looking at Access 2007 tables
within the same database. I really want to avoid the whole querydefs
thing if I can.
Are you sure that JetSQL supports the DDL statements Create View/
Procedure? If so may I have the full steps please?
|
|
0
|
|
|
|
Reply
|
Edwinah63
|
5/18/2010 1:45:00 AM
|
|
Edwinah63 wrote:
> Thanks for your reply. I am having trouble now with the Create View
> Statement.
>
> To check I had the right syntax I created a dummy table with 1 field,
> 1 record. I then created the sample statement in the SQL view of both
> an ordinary and so called "Data Definition" query
>
> create view MyView as select dummyid from tblDummy
>
> Both come back with the error "Syntax error in Create Table statement"
>
> What am I doing wrong?
>
> Had a google around and it seems that Access 2007 will not recognize
> create view statement for this database unless the ANSI92
> compatibility is turned on and the ANSI92 option under Access Options/
> Object Designers/Query Design/Sql Server Compatible Syntax is greyed
> out.
>
> Database is an Access 2007 database looking at Access 2007 tables
> within the same database. I really want to avoid the whole querydefs
> thing if I can.
>
> Are you sure that JetSQL supports the DDL statements Create View/
> Procedure? If so may I have the full steps please?
I can't give you any more than what is in the online help .. sorry.
In A2003, I did have to check the ANSI92 option for the database I was
testing with in order to make the CREATE VIEW statement work in the SQL View
of a query builder window. Without that option turned on, I got the same
error you did.
This snippet of code also failed until I turned on ANSI92:
Sub testcreateview()
Dim db As DAO.Database
Set db = CurrentDb
db.Execute "CREATE VIEW testqry AS select * from table1", dbFailOnError
End Sub
If you cannot turn on that option, it appears you will have to resort to the
querydef (or ADOX Views) method. I'm baffled as to why you are so desperate
to avoid it. Is it because of the need to create a Reference to DAO? If so,
you can do that in code by using the Application object's References
collection, which has two methods for creating references: AddFromFile and
AddFromGuid. Here is an example of the latter:
Dim ref As Reference, DAOfound As Boolean
DAOfound = False
For Each ref In Application.References
If ref.Name = "DAO" Then
DAOfound = True
exit for
End If
Next ref
If Not DAOfound Then
Application.References.AddFromGuid
"{00025E01-0000-0000-C000-000000000046}", 3, 6
End If
They are very simple to use. You don't even have to drop the querydef if
you've already created it - just set the .SQL property to the new sql
statement, like this:
sub createqry()
dim db as database,qdf as querydef,strsql as string
'build your string
set db=currentdb
on error resume next
set qdf=db.querydefs("qryname")
if err <> 0 then set qdf=db.createquerydef("qryname")
qdf.sql=strsql
end sub
--
Microsoft MVP - ASP/ASP.NET - 2004-2007
Please reply to the newsgroup. This email account is my spam trap so I
don't check it very often. If you must reply off-line, then remove the
"NO SPAM"
|
|
0
|
|
|
|
Reply
|
Bob
|
5/18/2010 2:47:42 AM
|
|
Edwina,
you don't need to save the query at all... you just have to _execute_ it.
You could do something like this...
1. create a function to create your dynamic union query STRING (there's no
need to save it!)
2. If you keep a dummy query around in your queries, you can just overwrite
its SQL like this:
DBEngine(0)(0).QueryDefs("MyUnionQuery").SQL = fCreateUnionSQL()
as long as fCreateUnionSQL() returns a valid SQL statement, everything should
work fine.
Pieter
Edwinah63 wrote:
>>>You can of course hard-code
>>>some unioned queries to force the missing records to be included.
>
>D'oh! I completely forgot about creating a dynamic union query! Thank
>you for reminding me!
>
>Maybe something like this?
>
>public sub CreateAQuery(mthsBetween as integer)
>
>dim i as integer
>dim sql as string
>
>for i = 0 to mthsBetween
>
>sql = sql & "select " & i & " as Mth union "
>
>next i
>
><------Can I do this next bit??--->
>
>Currentdb.Execute " If exists(SELECT name FROM sysobjects WHERE name =
>'MyUnionQuery' DROP QUERY MyUnionQuery;"
>CurrentDb.Execute "CREATE QUERY MyUnionQuery AS " & sql
>
>end sub
>
>The code above isn't quite right but you get the idea.
>
>Had a hunt around the internet for a "Create Query" statement. Is
>there one? Would prefer to stick to SQL statements wherever possible
>but will use querydefs etc otherwise.
>
>A big thank you to everyone who responded :-)
--
Message posted via http://www.accessmonster.com
|
|
0
|
|
|
|
Reply
|
PieterLinden
|
5/18/2010 4:38:17 AM
|
|
Edwina,
you don't need to save the query at all... you just have to _execute_ it.
You could do something like this...
1. create a function to create your dynamic union query STRING (there's no
need to save it!)
2. If you keep a dummy query around in your queries, you can just overwrite
its SQL like this:
DBEngine(0)(0).QueryDefs("MyUnionQuery").SQL = fCreateUnionSQL()
as long as fCreateUnionSQL() returns a valid SQL statement, everything should
work fine.
Pieter
Edwinah63 wrote:
>>>You can of course hard-code
>>>some unioned queries to force the missing records to be included.
>
>D'oh! I completely forgot about creating a dynamic union query! Thank
>you for reminding me!
>
>Maybe something like this?
>
>public sub CreateAQuery(mthsBetween as integer)
>
>dim i as integer
>dim sql as string
>
>for i = 0 to mthsBetween
>
>sql = sql & "select " & i & " as Mth union "
>
>next i
>
><------Can I do this next bit??--->
>
>Currentdb.Execute " If exists(SELECT name FROM sysobjects WHERE name =
>'MyUnionQuery' DROP QUERY MyUnionQuery;"
>CurrentDb.Execute "CREATE QUERY MyUnionQuery AS " & sql
>
>end sub
>
>The code above isn't quite right but you get the idea.
>
>Had a hunt around the internet for a "Create Query" statement. Is
>there one? Would prefer to stick to SQL statements wherever possible
>but will use querydefs etc otherwise.
>
>A big thank you to everyone who responded :-)
--
Message posted via AccessMonster.com
http://www.accessmonster.com/Uwe/Forums.aspx/access-queries/201005/1
|
|
0
|
|
|
|
Reply
|
PieterLinden
|
5/18/2010 4:38:28 AM
|
|
Hi to Bob and Pieter (and everyone else),
Thanks for all your help and patience! I went with creating the union
query since I need to outer join this back to get the results I want.
Here is the final code - for posterity
This is sample code so the functions and variables probably don't have
such good names. I am sure there are more elegant ways of achieving
this code, but it will do for me - it works!!.
Public Function MonthsBetweenDates(StDt As Date, MaxMths As Integer)
As Integer 'works
Dim sql As String
On Error Resume Next
CurrentDb.QueryDefs.Delete "MyUnion"
On Error GoTo err
sql = getMths(StDt, MaxMths)
CurrentDb.CreateQueryDef "MyUnion", sql
CurrentDb.QueryDefs.Refresh
Exit Function
err:
MsgBox err.Description
End Function
Public Function getMths(RangeStDt As Date, MaxMths As Integer) As
String 'works
On Error GoTo err
Dim i As Integer
Dim sql As String
Dim MthStDt As Date
Dim MthEndDt As Date
Dim RangeEndDt As Date
For i = 0 To MaxMths
'US_Date function used since Access for reasons known only to
itself converts 01/11/2011 to 11/1/2011 and vice versa, despite region
set for Oz
RangeEndDt = DateAdd("m", 12, RangeStDt) - 1
MthStDt = DateAdd("m", i, RangeStDt)
MthEndDt = DateAdd("m", i + 1, RangeStDt) - 1
sql = sql & "select " & US_Date(RangeStDt) & " as RangeStDt, "
sql = sql & "#" & RangeEndDt & "# as RangeEndDt, "
sql = sql & US_Date(MthStDt) & " as MthStDt, "
sql = sql & "#" & MthEndDt & "# as MthEndDt "
sql = sql & "from tblDummy union "
Next i
'tidy up query remove final union clause
sql = Left(sql, Len(sql) - Len(" union "))
getMths = sql
Exit Function
err:
MsgBox err.Description
End Function
Union query for 8 months looks like this:
select #6/1/2011# as RangeStDt, #31/05/2012# as RangeEndDt, #6/1/2011#
as MthStDt, #30/06/2011# as MthEndDt from tblDummy union
select #6/1/2011# as RangeStDt, #31/05/2012# as RangeEndDt, #7/1/2011#
as MthStDt, #31/07/2011# as MthEndDt from tblDummy union
select #6/1/2011# as RangeStDt, #31/05/2012# as RangeEndDt, #8/1/2011#
as MthStDt, #31/08/2011# as MthEndDt from tblDummy union
select #6/1/2011# as RangeStDt, #31/05/2012# as RangeEndDt, #9/1/2011#
as MthStDt, #30/09/2011# as MthEndDt from tblDummy union
select #6/1/2011# as RangeStDt, #31/05/2012# as RangeEndDt,
#10/1/2011# as MthStDt, #31/10/2011# as MthEndDt from tblDummy union
select #6/1/2011# as RangeStDt, #31/05/2012# as RangeEndDt,
#11/1/2011# as MthStDt, #30/11/2011# as MthEndDt from tblDummy union
select #6/1/2011# as RangeStDt, #31/05/2012# as RangeEndDt,
#12/1/2011# as MthStDt, #31/12/2011# as MthEndDt from tblDummy union
select #6/1/2011# as RangeStDt, #31/05/2012# as RangeEndDt, #1/1/2012#
as MthStDt, #31/01/2012# as MthEndDt from tblDummy UNION
select #6/1/2011# as RangeStDt, #31/05/2012# as RangeEndDt, #2/1/2012#
as MthStDt, #29/02/2012# as MthEndDt from tblDummy;
There is another query just to get the sample recordset from the table
containing the production data, then I outer join it back thus so:
SELECT CDate("01/" & Month([dt]) & "/" & Year([dt])) AS MthStDt,
Table1.name, Table1.number AS Qty, Table1.dt
FROM Table1
WHERE (((Table1.dt) Between #6/1/2011# And #2/28/2012#));
Put it all together:
SELECT
MyUnion.RangeStDt,
MyUnion.RangeEndDt,
MyUnion.MthStDt,
MyUnion.MthEndDt,
GraphSample01.name,
IIf(IsNull([qty]),0,[qty]) AS Qtyx
FROM MyUnion LEFT JOIN GraphSample01 ON MyUnion.MthStDt =
GraphSample01.MthStDt;
Hopefully this code can be a starting point for someone else in the
same situation.
Again, thank you thank you thank you to everyone who helped out with
this :-)
|
|
0
|
|
|
|
Reply
|
Edwinah63
|
5/18/2010 8:53:44 AM
|
|
D'oh! forgot to add the very first query that needs to be run:
SELECT Min([dt]) AS MinDt, Max([dt]) AS MaxDt, DateDiff("m",[mindt],
[maxdt]) AS MaxMths, MonthsBetweenDates([MinDt],[Maxmths]) AS MthsBtwn
FROM Table1
WHERE (((Table1.dt)>#5/1/2011#));
:-)
|
|
0
|
|
|
|
Reply
|
Edwinah63
|
5/18/2010 8:56:11 AM
|
|
Now I think about it, just dumping the data into a table (which I
dislike because they can contain stale data if not managed) and right
joining back would have been easier and a lot less code intensive and
I'm still stuck with a potentially stale query if it is not managed :(
A lot of work for something that can be achieved so easily in a stored
proc.
|
|
0
|
|
|
|
Reply
|
Edwinah63
|
5/18/2010 9:03:41 AM
|
|
Edwinah63 wrote:
> Hi to Bob and Pieter (and everyone else),
>
> Thanks for all your help and patience! I went with creating the union
> query since I need to outer join this back to get the results I want.
>
> Here is the final code - for posterity
> This is sample code so the functions and variables probably don't have
> such good names. I am sure there are more elegant ways of achieving
> this code, but it will do for me - it works!!.
A couple of comments if you don't mind. I'm sure you're very proud of
accomplishing this goal (with good reason), but theres are several problems
with this code that make it a poor example for beginners, several poor
programming practices that should not be perpetuated.
See inline.
>
>
> Public Function MonthsBetweenDates(StDt As Date, MaxMths As Integer)
> As Integer 'works
> Dim sql As String
> On Error Resume Next
> CurrentDb.QueryDefs.Delete "MyUnion"
I'm really baffled by your commitment to this modus operandi of first
dropping the querydef and then recreating it. It's not even something that
needs to be done in SQL Server given the "ALTER ..." commands. I won't
bother posting the code to do this again.
>
> On Error GoTo err
"err" is the name of a builtin VBA object and should therefore be avoided.
You seem to have gotten away with it here but you may not be so fortunate in
the future. Avoid using reserved keywords for your own code. "err_handler"
is a much better name for your error handler.
> sql = getMths(StDt, MaxMths)
> CurrentDb.CreateQueryDef "MyUnion", sql
It's a bad idea to make multiple calls to the CurrentDb function (yes, it's
a function). You should drop this habit now - it's a performance drain.
Instead, declare a Database variable (as I showed in my samples) and assign
the result of CurrentDb to it. Even better would be the technique
illustrated by Peter of using DBEngine(0)(0)
> CurrentDb.QueryDefs.Refresh
This call to Refresh is another performance drain that is usually not
necessary.
>
> Exit Function
> err:
> MsgBox err.Description
This is typically followed by GoTo err_handler so that your function has a
single exit point
> End Function
>
>
> Public Function getMths(RangeStDt As Date, MaxMths As Integer) As
> String 'works
> On Error GoTo err
> Dim i As Integer
> Dim sql As String
> Dim MthStDt As Date
> Dim MthEndDt As Date
> Dim RangeEndDt As Date
>
> For i = 0 To MaxMths
>
> 'US_Date function used since Access for reasons known only to
> itself converts 01/11/2011 to 11/1/2011 and vice versa, despite region
> set for Oz
See online help. Date literals must use either US date format or better,
the less ambiguous IS format: yyyy-mm-dd. Anyways, a custom function is
unnecessary - you can use the builtin Format fuction - see below:
>
<snip>
> Put it all together:
>
> SELECT
> MyUnion.RangeStDt,
> MyUnion.RangeEndDt,
> MyUnion.MthStDt,
> MyUnion.MthEndDt,
> GraphSample01.name,
> IIf(IsNull([qty]),0,[qty]) AS Qtyx
> FROM MyUnion LEFT JOIN GraphSample01 ON MyUnion.MthStDt =
> GraphSample01.MthStDt;
>
--
Microsoft MVP - ASP/ASP.NET - 2004-2007
Please reply to the newsgroup. This email account is my spam trap so I
don't check it very often. If you must reply off-line, then remove the
"NO SPAM"
|
|
0
|
|
|
|
Reply
|
Bob
|
5/18/2010 9:44:25 AM
|
|
Edwinah63 wrote:
> Now I think about it, just dumping the data into a table (which I
> dislike because they can contain stale data if not managed) and right
> joining back would have been easier and a lot less code intensive and
> I'm still stuck with a potentially stale query if it is not managed :(
>
And you've also violated your goal of not creating "extra" tables in the
database.:-)
The original solution offered by Allen is not only more suitable for this
situation, it also provides a tool that can help solve other problems you
might run into in the future. This is not the only situation where a Numbers
table can come in handy. There are even situations in SQL Server where a
Numbers table can help provide set-based solutions to problems (avoiding
cursors), although the introduction of CTEs has made it less necessary to
have a permanent table. String-parsing is certainly one of the places where
a Numbers table is useful.
> A lot of work for something that can be achieved so easily in a stored
> proc.
All right, this is at least the third time you've expressed this type of
sentiment. Please, stop moaning about the tool you're using and learn to
live and work within its limitations. Jet is a file-based rdbms and was
never intended to offer the functionality of a server-database like SQL
Server.
--
Microsoft MVP - ASP/ASP.NET - 2004-2007
Please reply to the newsgroup. This email account is my spam trap so I
don't check it very often. If you must reply off-line, then remove the
"NO SPAM"
|
|
0
|
|
|
|
Reply
|
Bob
|
5/18/2010 10:05:57 AM
|
|
Hi Bob,
Thanks for your reply. I did have fun along the way and will take your
comments on board and go with Allen's solution - but one must try
these things :)
E
|
|
0
|
|
|
|
Reply
|
Edwinah63
|
5/18/2010 11:02:58 AM
|
|
|
17 Replies
226 Views
(page loaded in 0.373 seconds)
Similiar Articles: Count of Weekdays Between Two Dates - microsoft.public.access ...Task: With a given start date and end date, print a list of Months showing ... two dates ... days in between 2 dates ... How to determine sunday and saturday dates? - microsoft ... Date differential between a full date and a date that has a year ...Determine if a month falls between two dates. - microsoft.public ... Check if date is ... ... COUNT number of occurances in a table given a date ... Count unique ... how to calculate a projected date - microsoft.public.excel ...... eHow.com Determining the due date of a ... date The Date Calculator calculates the duration between 2 dates. It adds or subtracts days, weeks, months and years from a given date. Calculating Dates - microsoft.public.access... and then, for every ... from a date The Date Calculator calculates the duration between 2 dates. It adds or subtracts days, weeks, months and years from a given date. Calculate working days between records - microsoft.public.access ...... Web) between comments to determine if our staff is contacting customers at least every three ... days between 2 given dates with ... of days, months and years between two dates. Change date to days - microsoft.public.project... had leap years every four ... from a date The Date Calculator calculates the duration between 2 dates. It adds or subtracts days, weeks, months and years from a given date. How to determine sunday and saturday dates? - microsoft.public ...... Weekday(Date, vbSaturday) + 2, Date ... Count of Weekdays Between Two Dates - microsoft.public.access ... How to determine sunday and ... of a certain day are in a given month How do I find how many of a certain day are in a given month ...I need to show how far into a month we are at any given time in % form. I want this to change every day ... to find out the number of Wednesdays between two given dates ... Deadline Calculator - microsoft.public.office.misc... method to determine ... and need every ... date The Date Calculator calculates the duration between 2 dates. It adds or subtracts days, weeks, months and years from a given date. How to Calculate if a Range of Times Falls Between two Date/Time S ...c# - Determine if time falls in designated ... the number of days, weeks, or months between two particular dates. ... Count How Many Times A Given Date Falls Between ... Check if Time falls between ? - microsoft.public.excel.worksheet ...Previously every time I tried to modify your ... Check if date is between two dates, then sum only those rows ... ... Determine if a month falls between two dates ... Lookup value that falls between two values in a range and then som ...Determine if a month falls between two dates. - microsoft.public ..... can then count the X values. ... See if cell value appears within a value range given by another ... Format DatePart - microsoft.public.access.queriesAny month returned will be between 1 and 12. Formatting a value between 2 and 12 as a date ... was given by Karl Dewey Format(Date ... to determine the week number for dates ... Counting Days between dates - microsoft.public.access.queries ...... above to determine ... Counting dates between 2 ... Weekdays Between Two Dates - microsoft.public.access ... Task: With a given start date and end date, print a list of Months ... Unable to use filter in datasheet view or add criteria to query in ...Here is purpose, input and output and example uses: Purpose: If given 2 dates, a month ... The ... criteria selected using checkboxes determine query result ... switch ... Group by fiscal months - microsoft.public.access.reports ...I > need to determine in which "fiscal month" each row of data belongs, then ... statement that compares the "shiftdate" with every fiscal month's > start and end date. Query to extract data on the basis of date - microsoft.public ...... extract data from any given week in a query. I ... The the query to extract the last three month's data would ... Group by date ... query doing ... determining the date range ... How do I get Access 2003 to notify me of Due Dates - microsoft ...... reports each night/week/month/etc You want to backup your database every ... 2003 to notify me of Due Dates - microsoft ..... given ... Days Between Dates in Excel - Mike and ... time compare - microsoft.public.scripting.vbscript... year(Date)) if err.number then bday=cDate(month ... not compute the absolute value which lies between two given dates. ... the execution to succeed 50 minutes out of every ... How do I average every 3rd cell in a column of a spreadsheet ...... $4,545.12 store #2 > > I just picked 2 dates that ... column - microsoft.public.excel.misc ..... in a given ... spreadsheet to keep track of my food expenses every month. Determining EVERY month between 2 given dates DataBaseHi everyone, I have a table with the following data upon which I would like to report: SomeDt SomeValue 1-sep-09 100 12-dec-09 Worksheet Functions For Dates And Times... A1),1)+CHOOSE(WEEKDAY(DATE(YEAR(A1),MONTH(A1),1)),1,0,0,0,0,0,2) ... return will return the date of Nth day-of-week for a given month ... To determine if a date is a work day ... How to calculate the number of months between two dates in ExcelFor example, given a start date of 10/31/00 and an end date of 11/2/00, one month is returned even though only two days elapsed. For this method, use the ... Calculate The Difference In Days Between Two Dates | Using ...'CHECK IF DATE TO CHECK FALLS BETWEEN THE GIVEN MONTHS AND DAY OF THE 2 DATES ... to an archive zipped folder; and you run this same code every 7 ... Date and time calculations including add and subtracting dates ...... for leap years, determining ages, calculating differences between dates ... calendar days and months. If you use a leap date such as: #2 ... of the week of a given date How to Calculate Weeks Between Two Dates | eHow.com... Weeks & Days Between Two Given Dates in ... total number of days between the two dates by 7 to determine ... to Calculate Months Between Dates. Calculating days, weeks, months ... Calculating years, months and days between two dates « Oracle ...This script returns the number of years, months and days between dates given in parameters. ... Get every new post delivered to your Inbox. Excel :: Calculate Number Of Months Between Two Given Date... Of Months Between Two Given Date Start ... column 2. Since every month ... Ending Date. I'm trying to determine the total number of months between those two dates down to 2 ... Count Days Between Two Dates in Excel - Free Microsoft Excel ...... the number of days between two dates ... of business days between two dates or find the start and end dates of a project given a ... the same day of the month as the date ... Calculate The Number Of Days, Months Or Years Between Two Dates ...Calculate The Number Of Days, Months Or Years Between Two Dates Have you ever needed to determine the number of days, months or years between two dates? 7/22/2012 5:56:30 PM
|