Please start any new threads on our new
site at https://forums.sqlteam.com. We've got lots of great SQL Server
experts to answer whatever question you can come up with.
| Author |
Topic |
|
gems
Starting Member
19 Posts |
Posted - 2005-11-04 : 09:11:31
|
| Hi,I created a report in Crystal Report that uses a stored procedure. Stored Procedure is pretty simple where I declare my parameters for the report and my select statement. I have 4 groupings in my report namely -Region, Sector, SubSector and Interval. The interval group is a formula(created in crystal) that checks the field interval_length and if the values in that field are AA, BB, CC, DD then it puts it under "Less Than Weekly Interval" else "Greater Than Weekly". Now my problem is that if there are no records found for a particular Interval Group, crystal does not group on it and totally skips that interval. I want to be able to display that interval even if there are no records and display a message saying "No Records Found". My understanding is that I'll have to handle this in my stored procedure. I'll have to somehow create the interval group in the stored procedure and check if it is empty for a particular region, sector, subsector and display the message so that when crystal calls the stored procedure it will grab the interval group even if it is empty. I hope it makes sense. I am totally lost as to how this should be done in the stored procedure. I'd really appreciate any help.Thanks |
|
|
blindman
Master Smack Fu Yak Hacker
2365 Posts |
Posted - 2005-11-04 : 09:45:35
|
| Move your interval grouping formula to your stored procedure.In your procedure, you will use this formula to first create both interval groupings, which you will then LEFT OUTER JOIN to your calculated result set. This will leave a record for each interval, with NULL values in the details if there are no related calculated records. You could then use the ISNULL() or COALESCE() functions to change the NULL value to your default message. |
 |
|
|
gems
Starting Member
19 Posts |
Posted - 2005-11-04 : 14:26:27
|
| Thanks for your reply blilndman. I am fairly new to stored procedures. Can you please help me alittle with the code. I understand what you want me to do. First should the Interval formula go in the procedure. I am posting my stored procedure. I would really appreciate your help.CREATE PROCEDURE [dbo].[pPMPERDET_ES] @START_DATE DATETIME, @END_DATE DATETIME, @FAC_REGION char (2), @FAC_SECTOR char (2) , @FAC_SUBSECTOR char ASBEGINSELECT LOGHDR.MPS_FAC_BASE_IDENT, LOGHDR.MPS_FAC_SUFX_IDENT, LOGHDR.ENTRY_YEAR AS HDR_ENTRY_YEAR, LOGHDR.ENTRY_NUMBER AS HDR_ENTRY_NUMBER, LOGHDR.ENTRY_SEQUENCE AS HDR_ENTRY_SEQUENCE, LOGHDR.VOID_STATUS, LOGCOM_PMCERT.MPS_FAC_BASE_IDENT AS LOGCOM_MPS_FAC_BASE_IDENT, LOGCOM_PMCERT.MPS_FAC_SUFX_IDENT AS LOGCOM_MPS_FAC_SUFX_IDENT, LOGCOM_PMCERT.ENTRY_YEAR, LOGCOM_PMCERT.ENTRY_NUMBER, LOGCOM_PMCERT.ENTRY_SEQUENCE, LOGCOM_PMCERT.DIRECTIVE_LEVEL, LOGCOM_PMCERT.ENTRY_TYPE, LOGCOM_PMCERT.INTERVAL_LENGTH, LOGLCO.MPS_FAC_BASE_IDENT AS LOGLCO_MPS_FAC_BASE_IDENT, LOGLCO.MPS_FAC_SUFX_IDENT AS LOGLCO_MPS_FAC_SUFX_IDENT, LOGLCO.COMMENT_SEQUENCE, LOGLCO.COMMENT_DATE_TIME, LOGLCO.COMMENT_TEXTFROM ((mmssql.dbo.LOGHDR LOGHDR INNER JOIN mmssql.dbo.LOGCOM_PMCERT LOGCOM_PMCERT ON LOGHDR.MPS_FAC_BASE_IDENT = LOGCOM_PMCERT.MPS_FAC_BASE_IDENT AND LOGHDR.MPS_FAC_SUFX_IDENT = LOGCOM_PMCERT.MPS_FAC_SUFX_IDENT AND LOGHDR.ENTRY_YEAR = LOGCOM_PMCERT.ENTRY_YEAR AND LOGHDR.ENTRY_SEQUENCE = LOGCOM_PMCERT.ENTRY_SEQUENCE AND LOGHDR.ENTRY_NUMBER = LOGCOM_PMCERT.ENTRY_NUMBER) LEFT OUTER JOIN mmssql.dbo.LOGLCO LOGLCO ON LOGCOM_PMCERT.MPS_FAC_BASE_IDENT = LOGLCO.MPS_FAC_BASE_IDENT AND LOGCOM_PMCERT.MPS_FAC_SUFX_IDENT = LOGLCO.MPS_FAC_SUFX_IDENT AND LOGCOM_PMCERT.ENTRY_YEAR = LOGLCO.ENTRY_YEAR AND LOGCOM_PMCERT.ENTRY_NUMBER = LOGLCO.ENTRY_NUMBER AND LOGCOM_PMCERT.ENTRY_SEQUENCE = LOGLCO.ENTRY_SEQUENCE)WHERE -- fixed selection criteria (LOGCOM_PMCERT.DIRECTIVE_LEVEL = 'N' OR LOGCOM_PMCERT.DIRECTIVE_LEVEL = '')AND (LOGCOM_PMCERT.ENTRY_TYPE = 'LPM')AND (LOGHDR.VOID_STATUS <> 'V' OR LOGHDR.VOID_STATUS <> '') ORDER BY LOGCOM_PMCERT.FAC_REGION ASC, LOGCOM_PMCERT.FAC_SECTOR ASC, LOGCOM_PMCERT.FAC_SUBSECTOR ASC ENDGOMy Interval formula in crystal is something like thisIf {pPMPERDET_ES.INTERVAL_LENGTH} IN ["DD","DA","SW","SW4"] then "LESS THAN WEEKLY INTERVALS" else"FOR WEEKLY OR GREATER INTERVALS"Thanks so much |
 |
|
|
blindman
Master Smack Fu Yak Hacker
2365 Posts |
Posted - 2005-11-04 : 14:44:19
|
This could certainly be cleaned up a lot, but this is the general idea:CREATE PROCEDURE [dbo].[pPMPERDET_ES] @START_DATE DATETIME, @END_DATE DATETIME,@FAC_REGION char (2), @FAC_SECTOR char (2) ,@FAC_SUBSECTOR charASBEGINSELECT INTERVALGROUPS.INTERVALGROUP, RESULTDATA.*FROM --INTERVALGROUPS (SELECT 'LESS THAN WEEKLY INTERVALS' AS INTERVALGROUP UNION SELECT 'FOR WEEKLY OR GREATER INTERVALS') INTERVALGROUPS LEFT OUTER JOIN --RESULTDATA (SELECT CASE WHEN LOGCOM_PMCERT.INTERVAL_LENGTH IN('DD','DA','SW','SW4') THEN 'LESS THAN WEEKLY INTERVALS' ELSE 'FOR WEEKLY OR GREATER INTERVALS' END AS INTERVAL_GROUP, LOGHDR.MPS_FAC_BASE_IDENT, LOGHDR.MPS_FAC_SUFX_IDENT, LOGHDR.ENTRY_YEAR AS HDR_ENTRY_YEAR, LOGHDR.ENTRY_NUMBER AS HDR_ENTRY_NUMBER, LOGHDR.ENTRY_SEQUENCE AS HDR_ENTRY_SEQUENCE, LOGHDR.VOID_STATUS, LOGCOM_PMCERT.MPS_FAC_BASE_IDENT AS LOGCOM_MPS_FAC_BASE_IDENT, LOGCOM_PMCERT.MPS_FAC_SUFX_IDENT AS LOGCOM_MPS_FAC_SUFX_IDENT, LOGCOM_PMCERT.ENTRY_YEAR, LOGCOM_PMCERT.ENTRY_NUMBER, LOGCOM_PMCERT.ENTRY_SEQUENCE, LOGCOM_PMCERT.DIRECTIVE_LEVEL, LOGCOM_PMCERT.ENTRY_TYPE, LOGCOM_PMCERT.INTERVAL_LENGTH, LOGLCO.MPS_FAC_BASE_IDENT AS LOGLCO_MPS_FAC_BASE_IDENT, LOGLCO.MPS_FAC_SUFX_IDENT AS LOGLCO_MPS_FAC_SUFX_IDENT, LOGLCO.COMMENT_SEQUENCE, LOGLCO.COMMENT_DATE_TIME, LOGLCO.COMMENT_TEXT FROM ((mmssql.dbo.LOGHDR LOGHDR INNER JOIN mmssql.dbo.LOGCOM_PMCERT LOGCOM_PMCERT ON LOGHDR.MPS_FAC_BASE_IDENT = LOGCOM_PMCERT.MPS_FAC_BASE_IDENT AND LOGHDR.MPS_FAC_SUFX_IDENT = LOGCOM_PMCERT.MPS_FAC_SUFX_IDENT AND LOGHDR.ENTRY_YEAR = LOGCOM_PMCERT.ENTRY_YEAR AND LOGHDR.ENTRY_SEQUENCE = LOGCOM_PMCERT.ENTRY_SEQUENCE AND LOGHDR.ENTRY_NUMBER = LOGCOM_PMCERT.ENTRY_NUMBER) LEFT OUTER JOIN mmssql.dbo.LOGLCO LOGLCO ON LOGCOM_PMCERT.MPS_FAC_BASE_IDENT = LOGLCO.MPS_FAC_BASE_IDENT AND LOGCOM_PMCERT.MPS_FAC_SUFX_IDENT = LOGLCO.MPS_FAC_SUFX_IDENT AND LOGCOM_PMCERT.ENTRY_YEAR = LOGLCO.ENTRY_YEAR AND LOGCOM_PMCERT.ENTRY_NUMBER = LOGLCO.ENTRY_NUMBER AND LOGCOM_PMCERT.ENTRY_SEQUENCE = LOGLCO.ENTRY_SEQUENCE) WHERE -- fixed selection criteria (LOGCOM_PMCERT.DIRECTIVE_LEVEL = 'N' OR LOGCOM_PMCERT.DIRECTIVE_LEVEL = '') AND (LOGCOM_PMCERT.ENTRY_TYPE = 'LPM') AND (LOGHDR.VOID_STATUS <> 'V' OR LOGHDR.VOID_STATUS <> '')) RESULTDATA ON INTERVALGROUPS.INTERVALGROUP = RESULTDATA.INTERVALGROUPORDER BYFAC_REGION ASC,FAC_SECTOR ASC,FAC_SUBSECTOR ASCENDGO |
 |
|
|
gems
Starting Member
19 Posts |
Posted - 2005-11-04 : 16:37:22
|
| Thanks a ton. I will try it out and get back to you. |
 |
|
|
gems
Starting Member
19 Posts |
Posted - 2005-11-04 : 16:43:40
|
| One more thing, where do I create my Interval formula in the stored procedure? |
 |
|
|
blindman
Master Smack Fu Yak Hacker
2365 Posts |
Posted - 2005-11-04 : 17:18:02
|
It's already in the code I posted:CASE WHEN LOGCOM_PMCERT.INTERVAL_LENGTH IN('DD','DA','SW','SW4') THEN 'LESS THAN WEEKLY INTERVALS' ELSE 'FOR WEEKLY OR GREATER INTERVALS' END AS INTERVAL_GROUP,...right after the SELECT. |
 |
|
|
gems
Starting Member
19 Posts |
Posted - 2005-11-07 : 09:36:44
|
| Hi Blindman, I added the code but it keeps giving me this error - Error 107: The column prefix 'LOGCOM_PMCERT' does not match with a table name or alias name used in the query. The column prefix 'LOGCOM_PMCERT' does not match with a table name or alias name used in the query.The column prefix 'LOGCOM_PMCERT' does not match with a table name or alias name used in the query.Table name is correct. Don't know why it is giving me this error. |
 |
|
|
|
|
|
|
|