Duane-
I don't think your sample database is going to help Khalid.
Khalid-
You need to do something similar to the technique described in the KB article:
Basically, you create unbound text boxes and companion labels in your report and give them names that can be easily indexed in code like txtBox01, txtBox02, etc. and lbl01, lbl02, etc. In the Open event of the Report, dynamically create the Record Source SQL adding the filter for the year you want. Then open the query as a Recordset and use the column names to set the label Caption properties. When you have more labels / text boxes defined that are returned by the query, hid the extra ones.
In the Format event of the Detail section, grab the fields from the current row and put them in the text boxes in a loop.
John Viescas, Author
Microsoft Access 2010 Inside Out
Microsoft Access 2007 Inside Out
Microsoft Access 2003 Inside Out
Building Microsoft Access Applications
SQL Queries for Mere Mortals
(Paris, France)
On Feb 17, 2015, at 7:43 AM, khalidtanweerburrah@yahoo.com [MS_Access_Professionals] <MS_Access_Professionals@yahoogroups.com> wrote:
Duane,
---In MS_Access_Professionals@yahoogroups.com, <duanehookom@...> wrote :
Well thank you very much for describing the bases of your CrossTab Report.
This reminds me long ago when i do work in FoxPro DOS. I understand the concepts of DO WHILE and LOOPS in FoxPro. But i have up to now never tried this in Access.
At present i have a simple Report based on query "CollectionVoucher_Crosstab" with the Sql:
TRANSFORM Count(CollectionVoucher.CartonNo) AS CountOfCartonNo
SELECT CollectionVoucher.ClientCIN, Count(CollectionVoucher.CartonNo) AS [Total Of CartonNo]
FROM Clients INNER JOIN CollectionVoucher ON Clients.ClientCIN = CollectionVoucher.ClientCIN
GROUP BY CollectionVoucher.ClientCIN
ORDER BY CollectionVoucher.ClientCIN, CollectionVoucher.ConsignmentNo
PIVOT CollectionVoucher.ConsignmentNo;
As per current data this report shows 15 Columns for ConsignmentNo
Would these columns (ConsignmentNo) give us no problem as they will be increasing year by year. Approximately 8 - 10 or more new ConsignmentNo are allotted in a year. OR should we make our report for a specific Year of Consignment.
ConsignmentNo is Text field, Field Size 9, Input Mask 9999\-A\-99;;- where Left 4 digits denotes year of ConsignmentNo
Waiting for your further guidance and suggestions.
Regards,
Khalid
---In MS_Access_Professionals@yahoogroups.com, <duanehookom@...> wrote :
If your column names in your crosstab are going to vary over time and based on filters, the solution from the demo should be applicable. There is a table in the Access file that describes how the solution works.
This is the information from the table:
Explanation
Are you familiar with Crosstab Queries? Crosstab queries will dynamically create columns/fields based on each unique value of a particular field in your query. I my demo, I used customer names as columns.
The problem is:
1) the number of columns created by the crosstab will vary based on the number of customers during a particular period of time, the type of products included in your report, and the sales persons reported. There might be 2 or there might be 20. We don't know until the crosstab is run.
2) reports expect a certain number of fields in their record source. This generally isn't a problem since we base most reports on fields/columns from a query in which the fields don't change. The records will change but the same base columns will generally be available. Since Crosstab queries will vary in the number and names of fields, reporting them takes some work arounds.
My method starts with a desire to predefine the column/field names in the report. This could be numbers, colors, or whatever. I chose letters of the alphabet since they easily afford up to 26 columns, alphabetic order is something we all understand, they have an ASCII value that converts to numbers using the ASC() function, and "A" is easier to type then "Yellow".
I can now create an "alias" table of two fields, the customer name and the associated letter of the alphabet. If I include this table in my crosstab and link the customer names, I can use the associated letter as the column heading.
This works fine except that different sales people will sell to different customers. So we add a salesperson field to the "alias" table. We can create a totals query "qappEmpCust" that will append every unique combination of salesperson and customer to the Alias table. I then use code to loop through the table and assign the letters "A-F" or whatever.
This works fine until one salesperson sells to more than 6 customers. So, I add another field that describes the level (couldn't find a better term). The code loop then assigns level 0 letters A-F and then increments to level 1 and starts over at A etc.
The final piece was to provide column headings. This was done using a label type subreport where the link master child fields reference the Salesperson and Level displaying the customer names rather than A-F.
All of this together allows me to successfully report the result of a crosstab query regardless of the number of potential columns and their names. The report also runs much faster than a solution provided in the Microsoft sample Solutions.MDB.
Are you even more confused? To be honest with you, I have to re-think what I did each time a create a new report. One of my employees has used this method for about 6-8 reports. She figures this method has saved her a couple days of development time and kept a client much more satisfied.
Duane Hookom MVP
MS Access
To: MS_Access_Professionals@yahoogroups.com
From: MS_Access_Professionals@yahoogroups.com
Date: Mon, 16 Feb 2015 10:53:06 -0800
Subject: RE: [MS_AccessPros] Report based on Crosstab query
Duane,
---In MS_Access_Professionals@yahoogroups.com, <duanehookom@...> wrote :
This is the information from the table:
Explanation
Are you familiar with Crosstab Queries? Crosstab queries will dynamically create columns/fields based on each unique value of a particular field in your query. I my demo, I used customer names as columns.
The problem is:
1) the number of columns created by the crosstab will vary based on the number of customers during a particular period of time, the type of products included in your report, and the sales persons reported. There might be 2 or there might be 20. We don't know until the crosstab is run.
2) reports expect a certain number of fields in their record source. This generally isn't a problem since we base most reports on fields/columns from a query in which the fields don't change. The records will change but the same base columns will generally be available. Since Crosstab queries will vary in the number and names of fields, reporting them takes some work arounds.
My method starts with a desire to predefine the column/field names in the report. This could be numbers, colors, or whatever. I chose letters of the alphabet since they easily afford up to 26 columns, alphabetic order is something we all understand, they have an ASCII value that converts to numbers using the ASC() function, and "A" is easier to type then "Yellow".
I can now create an "alias" table of two fields, the customer name and the associated letter of the alphabet. If I include this table in my crosstab and link the customer names, I can use the associated letter as the column heading.
This works fine except that different sales people will sell to different customers. So we add a salesperson field to the "alias" table. We can create a totals query "qappEmpCust" that will append every unique combination of salesperson and customer to the Alias table. I then use code to loop through the table and assign the letters "A-F" or whatever.
This works fine until one salesperson sells to more than 6 customers. So, I add another field that describes the level (couldn't find a better term). The code loop then assigns level 0 letters A-F and then increments to level 1 and starts over at A etc.
The final piece was to provide column headings. This was done using a label type subreport where the link master child fields reference the Salesperson and Level displaying the customer names rather than A-F.
All of this together allows me to successfully report the result of a crosstab query regardless of the number of potential columns and their names. The report also runs much faster than a solution provided in the Microsoft sample Solutions.MDB.
Are you even more confused? To be honest with you, I have to re-think what I did each time a create a new report. One of my employees has used this method for about 6-8 reports. She figures this method has saved her a couple days of development time and kept a client much more satisfied.
Duane Hookom MVP
MS Access
To: MS_Access_Professionals@yahoogroups.com
From: MS_Access_Professionals@yahoogroups.com
Date: Mon, 16 Feb 2015 10:53:06 -0800
Subject: RE: [MS_AccessPros] Report based on Crosstab query
Duane,
Sorry for that i first did not opened the CrossTab application from Rogers Access Library. Now i did opened and viewed it.
How can i use it for my purpose? Could you please guide further.
Regards,
Khalid
---In MS_Access_Professionals@yahoogroups.com, <duanehookom@...> wrote :
Khalid,
Did you try the version available from RogersAccessLibrary.com? It should have opened fine in Access 2003. When you asked for an updated version, I assumed you had Access 2010 or later.
Duane Hookom MVP
MS Access
To: MS_Access_Professionals@yahoogroups.com
From: MS_Access_Professionals@yahoogroups.com
Date: Sun, 15 Feb 2015 23:12:09 -0800
Subject: RE: [MS_AccessPros] Report based on Crosstab query
Duane,
---In MS_Access_Professionals@yahoogroups.com, <duanehookom@...> wrote :
Did you try the version available from RogersAccessLibrary.com? It should have opened fine in Access 2003. When you asked for an updated version, I assumed you had Access 2010 or later.
Duane Hookom MVP
MS Access
To: MS_Access_Professionals@yahoogroups.com
From: MS_Access_Professionals@yahoogroups.com
Date: Sun, 15 Feb 2015 23:12:09 -0800
Subject: RE: [MS_AccessPros] Report based on Crosstab query
Duane,
i have downloaded the file and un-zipped it, it has the extension .accdb. I think this is Access 2007 file and i am using Microsoft Office 2003 with Access 2003, when i try to open it from Access 2003 i cannot see it in the list.
What should i do. I also need to know if i install Office 2007 and run Access 2007, will i face problems in running my database in Access 2003 into Access 2007 and in future will i face problems in doing coding and would i be able to do it up to my present knowledge of Access 2003?
---In MS_Access_Professionals@yahoogroups.com, <duanehookom@...> wrote :
In case you missed the announcement email:
https://groups.yahoo.com/neo/groups/MS_Access_Professionals/files/1_Samples/CrossTabReport.zip
Duane Hookom MVP
MS Access
To: MS_Access_Professionals@yahoogroups.com
From: MS_Access_Professionals@yahoogroups.com
Date: Sun, 15 Feb 2015 06:52:14 -0800
Subject: RE: [MS_AccessPros] Report based on Crosstab query
Duane,
---In MS_Access_Professionals@yahoogroups.com, <duanehookom@...> wrote :
https://groups.yahoo.com/neo/groups/MS_Access_Professionals/files/1_Samples/CrossTabReport.zip
Duane Hookom MVP
MS Access
To: MS_Access_Professionals@yahoogroups.com
From: MS_Access_Professionals@yahoogroups.com
Date: Sun, 15 Feb 2015 06:52:14 -0800
Subject: RE: [MS_AccessPros] Report based on Crosstab query
Duane,
I would really appreciate if you give the updated version of the link.
Regards,
Khalid
---In MS_Access_Professionals@yahoogroups.com, <duanehookom@...> wrote :
There is a solution for creating crosstab reports at http://www.rogersaccesslibrary.com/forum/cross-tab_topic11.html. This solution allows the creation of any number of columns (you decide). If you want 10 columns but 13 columns are generated, the 3 extra are rendered under the first 10.
It looks like the demo file is quite old. If you need an updated version, let me know.
Duane Hookom, MVP
MS Access
To: MS_Access_Professionals@yahoogroups.com
From: MS_Access_Professionals@yahoogroups.com
Date: Sat, 14 Feb 2015 06:36:17 -0800
Subject: Re: [MS_AccessPros] Report based on Crosstab query
John,
---In MS_Access_Professionals@yahoogroups.com, <JohnV@...> wrote :
It looks like the demo file is quite old. If you need an updated version, let me know.
Duane Hookom, MVP
MS Access
To: MS_Access_Professionals@yahoogroups.com
From: MS_Access_Professionals@yahoogroups.com
Date: Sat, 14 Feb 2015 06:36:17 -0800
Subject: Re: [MS_AccessPros] Report based on Crosstab query
John,
When i open the query in Datasheet view, Column names for year 2014 are :
2014-A-01, 2014-A-03, 2014-A-04, 2014-A-05, 2014-A-09, 2014-B-02, 2014-B-06
I am able to open the report in Design View. First of all "Enter Parameter Value" message box displays and except of this box i could not click anywhere else. Entering year there, it popups again, and then again entering year it goes/hide. After that if i do cut or edit any control that message box appears again and then it does'nt closes, even as many times i enter year. The only option which i am left is to open the Task Manager and close the database.
Regards,
Khalid
---In MS_Access_Professionals@yahoogroups.com, <JohnV@...> wrote :
Khalid-
What are the column names of your query when you open it in Datasheet view for one of the years?
Are you not able to open the original report in Design View at all?
One of the problems with designing a report around a Crosstab query is the report designer engine tries to run the Record Source to find out the column names. You might need to go with unbound text boxes and write some code to fill in the report.
John Viescas, Author
Microsoft Access 2010 Inside Out
Microsoft Access 2007 Inside Out
Microsoft Access 2003 Inside Out
Building Microsoft Access Applications
SQL Queries for Mere Mortals
(Paris, France)
On Feb 14, 2015, at 1:24 PM, khalidtanweerburrah@... [MS_Access_Professionals] <MS_Access_Professionals@yahoogroups.com> wrote:John,I did everything as you said.The query itself runs correct, starting with "Enter Parameter Value" prompt box and displays in datasheet view the year entered (currently i have data for 3 years, 2013, 2014 & 2015).But i have still the problem with the report. I am yet unable to create a new/fresh report, nor i am able to modify the report in Design View as i had previously put the following controls on Detail SectionClientCIN, Total Of CartonNo and all ConsignmentNo from year 2013 to 2015.Now how could i resolve this issue.Is there any way to create a new report? if i do try to create a new report through report wizard, when i select "CollectionVoucher_Crosstab" from available table/query there are no fields displayed, so report wizard could move to Next asking that at least 1 field must be selected.Regards,Khalid
---In MS_Access_Professionals@yahoogroups.com, <JohnV@...> wrote :Ah, I reread your post below, and now I see the problem. It's going to prompt you at each row. If you had entered the year over and over, it would have eventually displayed.Here's what you need to do:Create a blank form, put a text box on it. Name the form frmYearPrompt. Name the text box txtYear. Put two command buttons on the form: One with a caption of GO! (name it cmdGo), and the second with a caption of Cancel (name it cmdCancel).In the click event of cmdGo, do this:Private Sub cmdGo_Click()' Hide me so the report can continueMe.Visible = FalseEnd SubIn the click event of cmdCancel, do this:Private Sub cmdCancel_Click()' Close me - the report will detect and cancel outDoCmd.Close acForm, Me.NameEnd SubChange your query to read like this:PARAMETERS [Forms]![frmYearPrompt]![txtYear] Long;TRANSFORM Count(CollectionVoucher.CartonNo) AS CountOfCartonNoSELECT CollectionVoucher.ClientCIN, Count(CollectionVoucher.CartonNo) AS [Total Of CartonNo]FROM Clients INNER JOIN CollectionVoucher ON Clients.ClientCIN = CollectionVoucher.ClientCINWHERE (((CollectionVoucher.ConsignmentNo) In (SELECT ConsignmentNo FROM [Consignment Number]WHERE Year([ExportDocs]) = [Forms]![frmYearPrompt]![txtYear])))GROUP BY CollectionVoucher.ClientCINORDER BY CollectionVoucher.ClientCIN, CollectionVoucher.ConsignmentNoPIVOT CollectionVoucher.ConsignmentNo;In the Open event of the Report, do this:Private Sub Report_Open(Cancel As Integer)' Open the parameter form' Open as a dialog so this code will wait until' the form either hides or closesDoCmd.OpenForm "frmYearPrompt", WindowMode:=acDialog' Check to see if the parameter form is still openIf Not CurrentProject.AllForms("frmYearPrompt").IsLoaded Then' Not open anymore - cancel the reportCancel = TrueEnd If' Finish and let it runEnd SubFinally, in the Close event of the report, do this:Private Sub Report_Close()' If the parameter form is open,If CurrentProject.AllForms("frmYearPrompt").IsLoaded Then' Close it to clean upDoCmd.Close acForm, "frmYearPrompt"End IfEnd SubJohn Viescas, AuthorMicrosoft Access 2010 Inside OutMicrosoft Access 2007 Inside OutMicrosoft Access 2003 Inside OutBuilding Microsoft Access ApplicationsSQL Queries for Mere Mortals
__._,_.___
Posted by: John Viescas <johnv@msn.com>
| Reply via web post | • | Reply to sender | • | Reply to group | • | Start a New Topic | • | Messages in this topic (24) |
.
__,_._,___
Tidak ada komentar:
Posting Komentar