I've looked all over and cannot find an answer to my question; I can't even determine whether it is possible.
Referring to the attached image, you will notice that this is a statement report with data grouping activated.
1) The report shows all the services invoiced to an account by date.
You can expand the group to see all the transactions that formed part of that service for that day. (You can for instance make use of the same service multiple times per day)
2) This is the detailed layout of the service invoiced. This list is different for each service, but mainly it will show you a summarized transaction list (PK BatchId), which has the "+" symbol next to it to enable drilldown to a detailed report of the batch.
My problem:
When loading the statement report, we are now hitting multiple tables, multiple times to produce the data to be grouped and displayed in #2 (refer to image).
We are trying to avoid this like the plague.
My Question
Is there a way to populate #2 when and only when the user clicks a "+" symbol or an "expand" image where the "+" is currently located in #1.
In other words. We dispose of the group function and populate the statement without detailed information. When the user clicks on #1, we load a sproc, populate a dataset and display the data in #2.
Any thoughts on this?
Drillthrough Reports look like a good solution here. See the link for more information on how these work. So basically you have the report without the detailed information, but when somebody clicks on 1 it opens up a new report with the details behind it.
After testing, I confirmed that subreports are executed even if they are hidden within an element that can be toggled.
So subreports won't answer this problem.
[Edited: previously I thought they could be used. JAT points out that this negative answer may have some value, so I'm leaving it.]
Related
According to the searching I've done over the past couple of days, what I'm trying to achieve should be fairly straightforward but nothing that I've found has solved my problems. This is my first time at using Access, or SQL at all. Apologies in advance for the length of the question.
Essentially I need to pick up a value from one table and multiply it by another in the another table, and then store the result in the second table, via forms and subforms.
The Problem:
I'm attempting to create a database of projects, part of which is a quotation tool. The database has several tables covering all the required inputs for our project managers, most of which are linked to the PKs of their parent tables.
My current attempt has a form (frmJobDetails) giving the details of the each project (linked to tblJobs). This form has two subforms:
frmJobRolesSubform details who's working on the project in what role ( and, notably, their sale rate.
frmJobProcessesSubform details the tasks, who's allocated to which task and the estimated number of hours to complete.
Both subforms link to their own tables (tblJobs_Roles and tblJobs_Processes respectively).
frmJobProcessesSubform obtains the people working on the project and their roles from frmJobRolesSubform so the manager can allocate a person to a task on frmJobProcessesSubform. This is done via a combobox: cboRole.
So far, so good.
I'm needing to obtain the sale rate of the person working on the given task so that I can calculate the cost of the task. Specifically, I'd like a field on the subform to calculate the cost of the task and then store it in tblJobs_Processes.
My Attempts
I've attempted to build a query (qryProcessCost) that calls cboRole, either as an expression in the Field cell or in the Criteria cell ([Forms]![frmJobsProcessesSubform]![cboRole]).
I'm aware this can't successfully when the form isn't active, but I'm getting Access' request for input for [Forms]![frmJobsProcessesSubform]![cboRole] when selecting from the subform. The query runs successfully when example values are hardcoded into the query. The query should, obviously, only return a single value.
I've tried setting the ControlSource of a textbox to [qryProcessCost]![dblProcessCost] (where dblProcessCost is the calculated field), but this can't then write to the table (as far as I can deduce). Also, I get a #Name? error in the cell and I can't seem to get to the bottom of that.
I've tried setting the RecordSource property of a combobox to SELECT [qryProcessCost]![dblProcessCost] FROM [qryProcessCost], and the ControlSource to the relevant field of the table. While this would be a clunky solution, it actually doesn't work anyway as it fails to pick up the value of [Forms]![frmJobsProcessesSubform]![cboRole].
I've tried using an intermediate textbox to determine what value cboRole is passing, and I'm happy with that - the primary key of the role assigned in frmJobsRolesSubform.
The Question:
I'm guessing that I'm probably going to have to resort to VBA at this point to get what I want but I'm unfamiliar with the Access VBA structures (though I've used Excel VBA a fair bit).
Anyone got any ideas, hints, suggestions or pointers?
Cheers in advance,
Aaron
In case anyone else has a similar problem, I've posted my complete solution below:
I implemented Gene's correction to my references, which provided something, but the query wouldn't update when the fields on the form were changed. As I noted in the question, I also really wanted it to be a text box rather than a combo box for usability reasons but wasn't sure how to have a Record Source and Control Source for a text box.
I ended up going round in circles, via VBA and macros and several types of error and happened upon a suggestion to use a DLookUp here. I hadn't been able to get them to work for this particular problem before, but I managed to make it work this time. Specifically, I put the DLookUp in the following macro:
SetProperty
Control Name txtBudgetCost
Property Value
Value =DLookUp("[dblCostRate]","[tblJobs_Roles]","[pkJobs_RoleID]="[cboRole])*[txtBudgetHours]
This macro was used for the After Update event of the relevant fields on the subform.
Setting the value property of a field to a DLookUp meant that I could set the Control Source property of a the text box txtBudgetCost to the relevant field in the table, to obtain the desired behaviour.
Both cboRole and txtBudgetHours are fields on the same subform as the field txtBudgetCost.
The only problem with this solution is that, when the subform is viewed in the Datasheet view, a #Name? error is given for the new record row. I probably just need to enter some error handling somewhere, though I haven't given much thought for what it should be just yet.
Cheers,
Aaron
I'm using the new fixed page layout report in active reports 7, with a fixed cover page and a variable number of overflow pages. When it's printed the user can select a number of these reports to print at once, and the data for the report is adjusted accordingly. The report has grouping defined to start a new cover page for each group. How can I ensure that when printing to a double sided printer that each cover page is printed to a new sheet of paper? For example, consider the simple case where there is only a cover sheet and no overflow. If the dataset contains data for three such pages, how can I ensure that a new sheet is printed for each one, rather than the second being printed on the back of the first?
An alternative solution would be to split the data before it gets to the report, then repeatedly create and print the report for each group. To do this I would need to ask the user to select a printer for the first copy, but then use the same printer for subsequent invocations. How can I determine which printer the user selected, then pass that printer to the second, third, etc invocations? I could create my own printer selection dialog, I guess, but it would be useful to know if I can retrieve the information from the built in one
I don't think there is any way to do this with AR currently. It's a great idea though and I'll make sure the ActiveReports team considers this in the future. I'll also ask around and see if anyone else has ideas within GrapeCity/ComponentOne.
I have a report with 4 seperate sub-reports embedded into it.
On the main report, I have a parameter to filter by group and I have it set to filter by group unless you choose All for the parameter, then it shows all groups.
If {?Main Group Name} = "ALL" then {Incident.Group Name} like "*"
else {Incident.Group Name} = {?Main Group Name}
This filter setup works fine on the individual sub reports, however if I run it selecting "all" as part of the main group, it causes the sheet to loop indefinitely and doesn't show the data properly.
The data is in all Group header 1 and group footer 1, so ideally the same page(as below) should repeat for every group.
When I run it for all, It runs for an abnormally long time, and has to be manually stopped, otherwise it just keeps going. After manually stopping, I get the following. It almost looks like it's trying to render all the groups on top of each other.
Anyone have a clue what could cause this?
Where are your subreports located in the main report (group header)? What are you doing with the record details of the main report (suppressing, I'm guessing)? What do the record selection formulas look like, FROM the subreports? How many tables are in the subreports? If multi-table, are your joins correct?
I have seen occurrences when subreports have a given Record Selection, and then have links added from the main report, where the resulting subreport query is totally hosed as Crystal Reports "helps" by modifying the subreport record selection on top of what the developer intended. True Story (a 17 second report was updated and ran for 20 hours before anyone noticed it had never finished a scheduled run). It sounds (heh, in inter-text) like you don't have correct relationships set up in the subreports, and may actually have cartesean products being formed.
Where are you using your code shown in your question? In the Record Selection? In an #Formula? What kind of link are you using to the subreport? What "should" be linked to the subreports is the {Incident.Group Name} -- as that is what changes in the main report group.
If you break out the subreports, and run them individually, manually setting the {?Main Group Name} to "ALL" and then to sample group names, what is the result? If the individual subreports still run on, you can at least watch the record counts (status bar) and when you manually kill the report, you can look at the performance information, and at the subreport Show Query.
Lastly, if you try running the main as "ALL" using a Top 10 (or 2, or whatever number you want) and then watch the subreport performance, that might give some clues. If there are selection-hosation byproducts, this would at least limit the effects a bit. You'd still be passing "*" to the subreport, but only doing it "N" cycles.
Sigh, and one last: If you really want "all", you might be better served if you use something like:
If {?Main Group Name} = "ALL" then TRUE
else {Incident.Group Name} = {?Main Group Name}
Sorry to be so long... I didn't have enough time to shorten it.
OK, really, really LAST one: If I have misunderstood your post, assumed too many disparate themes, or am just talking out of my hat: Sorry. Missed a meal, picked up several interruptions, and doubled up on the coffee. I'm sure there's a smiley for that, somewhere.
[Inserting add'l answer, as it is distinct enough to warrant it's own entry.]
I think I understand the Group Header/Foot Charts.
Did you try running Main as a Top 10 to limit the # groups?
How big is the (chart) record set?
AND, is the report set up for asynchronous queries?
What IS going on in the subreports:
Complex query?
Simple query?
Suppressing all Details and just showing the Chart?
Going to a different table/database?
Table joins?
Run for "Top 10" Groups in main, wait until it ends, then check for the Main and each chart sub (for at least a few groups):
Report / Performance Information:
Total Number of Records -- (Main should be "Top 10" )
Performance Timing:
Run the Query,
Read Database Records,
Time to Format All Charts
or
Time to Format 1st Page.
If you have several millions of records, even with "top", it could take a while to read and calculate the top. If you are calling charting, even tho' it is for a single Group per chart, if the subreport still has to apply a linked query, parse millions of records, perform add'l calculations, create a chart (that still accounts for all records), etc., it can just be a long time running.
You may find that a small "All" Top "n" will show a lot of time being spent behind the scenes, and that allowing the whole report to run that the add'l Comparison of Ticket Counts is displayed. And if not, we can look at that later (mainly by opening up the corpse and looking inside).
I am trying to ascertain regular behaviour, and I can't get a requirements doc for review. I can only make assumptions and ask questions and make suggestions.
I'm currently modifying an existing report and replacing the data source used in the report. The reason I'm not creating a new report is because the report is laid out exactly how I would like it to be laid out. I've updated every field with the new data source fields and checked that the formulas are all correctly formatted.
Everytime I attempt to view the report (I'm using the Crystal Reports tool in VS 2010), I get the error "The group section cannot be printed because its condition field is nonexistent or invalid. Format the section to choose another condition field."
I've read another question from stackoverflow but still can't seem to find out what is wrong with my report.
First of all, why doesn't Crystal tell you more specifically what is wrong?
Any suggestions or hints?
My first thought is that you didn't update the Groups correctly when you switched backends. Go into your Group Expert. Do you see any groups simply labeled with question marks? If so, there's your problem. Go into the options for that group and choose an appropriate grouping field.
Also, use the Database->Verify Database command to look for other possible errors.
As for your question about Crystal's design, I believe that it does give reasonably accurate error messages, especially considering everything that can go wrong with any one report.
We use iReport to enable our customers to generate catalogs for print for their products. This process works GREAT. One of the things we've struggled with is how to create a table of contents for these product catalogs.
I decided to use the Scriptlet functionality to give this a shot. Note that our reports are all master-detail in nature, in that there is a master report and a subreport.
At first, I attached the scriptlet to the master report, and tried to find a way to collect all of the product numbers in the detail report, then pass that value back to the master report. I can't figure out how to get the detail information back to the master report, as it appears that you can only pass default variables from the subreport back to the master (eg PAGE_NUMBER, COLUMN_NUMBER, PAGE_COUNT, COLUMN_COUNT).
So then I tried attaching the Scriptlet to the detail report. Well, the detail report doesn't know what page the master is on, so I started passing the master's page_number into a variable in the detail report. That worked great, except that sometimes the detail can overflow to the point that page numbers from the master are skipped. In other words, if a subreport returns more than two pages worth of data, you are going to miss a page number when the subreport is called the next time.
So how to do this?
I found an approach that worked, similar to one of my ideas above. First of all, I could NOT get a subreport to return a value to the calling report, and then retrieve that value using getVariableValue from inside a scriptlet. I tried forever, and I just could not get that to work.
Instead, I went with the approach where I attached the same scriptlet to both the master and subreports. The scriptlet has a class variable where I can keep a running tally of all the product numbers I encounter in the detail, and this code goes inside the afterDetailEval() method of the scriptlet. Note that I only want this code to run for the subreport, so I do a check to see if a particular detail field, which will never be null, is present. If it's not, I don't run the code. So when that event is called by the master report, the code doesn't run.
Now for the part that I learned from the example. The admirable side-effect programming in the example is that there is a line of dimensions 1x1 that contains a call to a custom scriptlet method in the "Print When Expression" property. That's a great idea! So this custom method returns false no matter what, and the line never prints. I did the same thing in the Page Footer band, and this method collects the values from the class variable, determines the page, and stores the results in a hash. Then it resets the class variable.
In the Report Summary band, I have another line that will never print, that calls another custom method. All I do here is iterate through a map of product numbers and show all the pages each one appears on. Done!
There is an example of tables of contents (with subreport) in project folder jasperreports-x.x.x/demo/samples/tableofcontents.
And see the hyperlink example also.
Hyperlinks, Anchors and Bookmarks
JasperReports allows you to create drill-down reports, which introduce tables of contents
in your documents or redirect viewers to external documents using special report elements called hyperlinks.