Sunday, March 25, 2012
Computer Hang Up when using MDX Query Builder?
I have some reports using OLAP cube as data sources. When I use mdx
query builder to create any mdx statement as dataset, my computer will hang
up and pop up a window says:
Preparing Query: The query preparation is in process, to cancel, press
CTRL+C for at least half a second.
Even if I press CTRL+C for a long time, my computer still has no
response and hang up forever. I have tried these mdx statement in my SQL
server and they work fine. So this should not be an Analysis Serverices
problem. Would you please tell me how to solve this problem?I've found that if I create a huge data set with the mdx query builder, I
have to leave my computer to it and go get a cup of coffee while it chews
through the data.
Or you could add a few filters to it before starting the query execution, to
make sure the data set it returns is too big. Adding a date filter and make
it default to the last month or date will usually decrease the amount of
data returned.
My pc is running with 2 GB RAM and not a lot of applications in the back
ground. It still uses some time to chew through a data set that finishes
quite quickly in the SQL Server management studio, so I agree with you, it's
a RS issue more than an AS issue. You just have to be carefull about your
statement while using the builer, I guess.
Kaisa M. Lindahl Lervik
"jimmy" <jimmy@.discussions.microsoft.com> wrote in message
news:7375D569-D9C8-4309-8BA6-E46C8582FE32@.microsoft.com...
> hello,
> I have some reports using OLAP cube as data sources. When I use mdx
> query builder to create any mdx statement as dataset, my computer will
> hang
> up and pop up a window says:
> Preparing Query: The query preparation is in process, to cancel, press
> CTRL+C for at least half a second.
> Even if I press CTRL+C for a long time, my computer still has no
> response and hang up forever. I have tried these mdx statement in my SQL
> server and they work fine. So this should not be an Analysis Serverices
> problem. Would you please tell me how to solve this problem?
>|||write more efficient MDX statements?
share your MDX statement when you're having performance problems?
try not to use soo many crossjoins?
-Aaron
Kaisa M. Lindahl Lervik wrote:
> I've found that if I create a huge data set with the mdx query builder, I
> have to leave my computer to it and go get a cup of coffee while it chews
> through the data.
> Or you could add a few filters to it before starting the query execution, to
> make sure the data set it returns is too big. Adding a date filter and make
> it default to the last month or date will usually decrease the amount of
> data returned.
> My pc is running with 2 GB RAM and not a lot of applications in the back
> ground. It still uses some time to chew through a data set that finishes
> quite quickly in the SQL Server management studio, so I agree with you, it's
> a RS issue more than an AS issue. You just have to be carefull about your
> statement while using the builer, I guess.
> Kaisa M. Lindahl Lervik
>
> "jimmy" <jimmy@.discussions.microsoft.com> wrote in message
> news:7375D569-D9C8-4309-8BA6-E46C8582FE32@.microsoft.com...
> > hello,
> >
> > I have some reports using OLAP cube as data sources. When I use mdx
> > query builder to create any mdx statement as dataset, my computer will
> > hang
> > up and pop up a window says:
> >
> > Preparing Query: The query preparation is in process, to cancel, press
> > CTRL+C for at least half a second.
> >
> > Even if I press CTRL+C for a long time, my computer still has no
> > response and hang up forever. I have tried these mdx statement in my SQL
> > server and they work fine. So this should not be an Analysis Serverices
> > problem. Would you please tell me how to solve this problem?
> >
> >|||Hi, Kaisa
Thanks a lot for your suggestions. I have tried a very simple mdx with a
middle size data set. e.g.
SELECT NON EMPTY { } ON COLUMNS,
{ ([Financial Period].[Fiscal].[Fiscal Year].ALLMEMBERS ) } ON ROWS FROM
[myCube]
My computer has a 1GB RAM, not so bad...This query will take about 1
second in my SQL server, however in ES it just hang up for hours and never
get back again, much more than a cup of coffee time.
I will try that on another computer to have a test and I do not think
that will happen too.
Do you think I should remove SQL server or Visual Studio and install
again?Thanks.
"Kaisa M. Lindahl Lervik" wrote:
> I've found that if I create a huge data set with the mdx query builder, I
> have to leave my computer to it and go get a cup of coffee while it chews
> through the data.
> Or you could add a few filters to it before starting the query execution, to
> make sure the data set it returns is too big. Adding a date filter and make
> it default to the last month or date will usually decrease the amount of
> data returned.
> My pc is running with 2 GB RAM and not a lot of applications in the back
> ground. It still uses some time to chew through a data set that finishes
> quite quickly in the SQL Server management studio, so I agree with you, it's
> a RS issue more than an AS issue. You just have to be carefull about your
> statement while using the builer, I guess.
> Kaisa M. Lindahl Lervik
>
> "jimmy" <jimmy@.discussions.microsoft.com> wrote in message
> news:7375D569-D9C8-4309-8BA6-E46C8582FE32@.microsoft.com...
> > hello,
> >
> > I have some reports using OLAP cube as data sources. When I use mdx
> > query builder to create any mdx statement as dataset, my computer will
> > hang
> > up and pop up a window says:
> >
> > Preparing Query: The query preparation is in process, to cancel, press
> > CTRL+C for at least half a second.
> >
> > Even if I press CTRL+C for a long time, my computer still has no
> > response and hang up forever. I have tried these mdx statement in my SQL
> > server and they work fine. So this should not be an Analysis Serverices
> > problem. Would you please tell me how to solve this problem?
> >
> >
>
>|||im not sure that's such a simple MDX statement
do you have granularity to the seconds dimension?
how many members do you have in this dim?
I would do this and see if it's a lot faster:
Select [Financial Period].[Fiscal].[Fiscal Year].MEMBERS on COLUMNS
FROM MyCube
and see if that's a lot faster.
-Aaron
jimmy wrote:
> Hi, Kaisa
> Thanks a lot for your suggestions. I have tried a very simple mdx with a
> middle size data set. e.g.
> SELECT NON EMPTY { } ON COLUMNS,
> { ([Financial Period].[Fiscal].[Fiscal Year].ALLMEMBERS ) } ON ROWS FROM
> [myCube]
> My computer has a 1GB RAM, not so bad...This query will take about 1
> second in my SQL server, however in ES it just hang up for hours and never
> get back again, much more than a cup of coffee time.
> I will try that on another computer to have a test and I do not think
> that will happen too.
> Do you think I should remove SQL server or Visual Studio and install
> again?Thanks.
>
> "Kaisa M. Lindahl Lervik" wrote:
> > I've found that if I create a huge data set with the mdx query builder, I
> > have to leave my computer to it and go get a cup of coffee while it chews
> > through the data.
> > Or you could add a few filters to it before starting the query execution, to
> > make sure the data set it returns is too big. Adding a date filter and make
> > it default to the last month or date will usually decrease the amount of
> > data returned.
> > My pc is running with 2 GB RAM and not a lot of applications in the back
> > ground. It still uses some time to chew through a data set that finishes
> > quite quickly in the SQL Server management studio, so I agree with you, it's
> > a RS issue more than an AS issue. You just have to be carefull about your
> > statement while using the builer, I guess.
> >
> > Kaisa M. Lindahl Lervik
> >
> >
> > "jimmy" <jimmy@.discussions.microsoft.com> wrote in message
> > news:7375D569-D9C8-4309-8BA6-E46C8582FE32@.microsoft.com...
> > > hello,
> > >
> > > I have some reports using OLAP cube as data sources. When I use mdx
> > > query builder to create any mdx statement as dataset, my computer will
> > > hang
> > > up and pop up a window says:
> > >
> > > Preparing Query: The query preparation is in process, to cancel, press
> > > CTRL+C for at least half a second.
> > >
> > > Even if I press CTRL+C for a long time, my computer still has no
> > > response and hang up forever. I have tried these mdx statement in my SQL
> > > server and they work fine. So this should not be an Analysis Serverices
> > > problem. Would you please tell me how to solve this problem?
> > >
> > >
> >
> >
> >
Computed measures and role-playing dimensions
I've got a database with a single Date dimension that is used as a role-playing dimension in the cube. Measure groups have 2-4 different role relationships with the date dimension (e.g. sell date, ship date).
I've got some calculated members, defined in the style used by the Time Intelligence wizard, roughly:
Scope(
{
[Measures].[Amount],
[Measures].[Count]
}
);
( [Period].[Period].[60 calendar days],
[First Date].[Date].[Date].Members ) =
Aggregate(
{ [Period].[Period].DefaultMember } *
{ [First Date].[Date].CurrentMember.lag(59) : [First Date].[Date].CurrentMember }
);
( [Period].[Period].[60 calendar days],
[Second Date].[Date].[Date].Members ) =
Aggregate(
{ [Period].[Period].DefaultMember } *
{ [Second Date].[Date].CurrentMember.lag(59) : [Second Date].[Date].CurrentMember }
);
End Scope;
Here [First Date] and [Second Date] represent two of my role-playing date dimensions.
What I'm noticing is that this doesn't work: the calculated members are calculated correctly for whichever date dimension is listed last in the script and are apparently erased for whichever one was listed first.
The particular measure group I'm using in my sample query has a relationship with both date roles, and in fact they're identical for this measure group - both are based on the same underlying column in the relational data (that's not true for all measure groups, it just happens to be in this case).
Can someone explain what I'm seeing? Is this a bug, or a subtety that I haven't accounted for? How can I make this work for 2 or more role-playing date dimensions at the same time?
Well, if you will position current coordinate on the [First Date].[Date].[Date] level - then you will see that the first formula is applied correctly. What you probably mean by saying "last formula erases whatever was listed first" is that if you look at the aggregate level - then the aggregation is computed from the last formula. Obviously, at the aggregate level there is a conflict - which formula should be used to aggregate - it could be either first or second. The precendence rules in AS say that the later assignment wins. This is not a bug, after all, single cell cannot be calculated using two different formulas !
Perhaps if you will explain what exact results you would like to see for specific queries - this forum will be able to craft MDX script to solve it.
|||I neglected to include representative queries, so here's one that corresponds to the names I used in the first post:
select
{
[Measures].[Amount]
} on columns,
{
[Period].[Period].&[60]
} on rows
from
[Database]
where
(
-- [First Date].[Date].&[20061228]
-- [Second Date].[Date].&[20061228]
)
([Period].[Period].&[60] is the same member as [Period].[Period].[60 calendar days])
Given the computations given above, and the fact that [First Date] and [Second Date] actually refer to the same column in the fact table for this measure group, I'd expect that the above query would return the same results with either of the two lines in the where clause uncommented, but that's not the case.
Whichever date dimensions corresponds to the second set of calculations in the script produces the correct result while the other produces a wrong result - I'm not sure exactly what the wrong result represents - it's a larger number than anything I can think up that might make sense (e.g. it's not the aggregation totally ignoring the date dimension in question - it's something else).
|||
Mosha Pasumansky wrote:
Obviously, at the aggregate level there is a conflict - which formula should be used to aggregate - it could be either first or second. The precendence rules in AS say that the later assignment wins. This is not a bug, after all, single cell cannot be calculated using two different formulas !
Why is this obvious? As far as I can see, the calculations are not referencing the same locations in the cube. Please enlighten me! :)
|||Sorry, I thought it was clear :(
Both calculations apply to the leaf level of their respective Date dimension, i.e. [First Date].[Date].[Date] and [Second Date].[Date].[Date]. So the question is, how the value at ([First Date].[Date].[All Dates], [Second Date].[Date].[All Dates]) should be computed. It can aggregate from either one of lower levels - but depending on which one it will aggregate from, the results will be different, so AS has to choose one or the other.
|||OK, I can see that there's an ambiguity on those particular members, but I'm not querying those members (or am I?).
So how can I get the results I want?
|||> but I'm not querying those members (or am I?).Can you please provide the query you are using
> So how can I get the results I want?
Can you please describe what exactly result do you want.
|||I already did - see my second post in this thread.|||I see, that you added the query later, although it is still not clear from your description what is the expected result. But I am going to guess that what you want is either LastChild or LastNonEmpty semiadditive aggregation. If this is true, you need to define your measure as semiadditive with this aggregation function. Note, that you still will only be able either First Date or Second Date, but not both, because there is still a conflict at aggregate level.|||Just to add my 2 cents' worth - based on your comment that "[Period].[Period].&[60] is the same member as [Period].[Period].[60 calendar days]", is this a physical (place-holder) rather than calculated dimension member, to which the trailing-60-day calculation is applied? If so, my guess is that "the fact that [First Date] and [Second Date] actually refer to the same column in the fact table for this measure group" could be significant. If you instead create a [Period].[Period].[60 calendar days] calculated member of the [Period].[Period] hierarchy, do you get the expected results?|||I'm quite certain that I don't want LastChild or LastNonEmpty (especially since those are EE only features).
What I want is for the two dimensions to act as two independent dimensions without regard for the conflict at ([First Date].[Date].[All],[Second Date].[Date].[All]) since I will never query any value in that slice.
I'm not sure what it is I'm failing to communicate or understand - this seems like it should be straightforward and not particularly unusual. Lots of cubes have multiple date dimensions (and I expect lots of those have those date dimensions all backed up by a single role-playing dimension in the database).
Any suggestions are welcome - for now, I've abandoned the whole notion (being able to get time-based aggregations based on multiple time dimensions) as being inherently not supported by MDX/SSAS.
|||It must be my failure to understand what you are trying to achive, and I appologize for that. It must something really simple, since it looks straigtforward to you, yet I fail to grasp it. Perhaps you should start a new thread, since this got plenty of replies leading nowhere, and people don't look at threads with complicated histories but do look at fresh threads.
One last note - the cubes with multiple Time dimensions are certainly not unusual, I've seen many of them working fine (even Adventure Works sample features 3 Time dimensions).
|||You didn't mention what the results of trying my earlier suggestion were - ie. creating a calculated member, rather than using an actual member, for [Period].[Period].[60 calendar days]?|||Sorry, I forgot to reply to your suggestion.
This [Period] dimension is a real, physical dimension in the cube - and is so because I have some measure groups that associate directly with the period dimension (those "limit" measures that Mosha helped me with in another thread).
So, when I say [Period].[Period].[60 Calendar Days] is the same member as [Period].[Period].&[60], that's exactly what I mean - the member with key 60 has the name '60 Calendar Days'.
I really can't experiment with having this be a pure calculated member - I need that physical dimension to be this same dimension so that the relationships within the cube are correct.
Other than getting the "time based intelligence" to work in two time dimensions in the same cube, this all works beautifully. I have an inkling of how to get what I wanted - at the moment, I don't actually need to solve the problem right now, but sooner or later, I'll have to confront it.
I think that the solution is something like this:
Scope(
{
[Measures].[Amount],
[Measures].[Count]
}
);
( [Period].[Period].[60 calendar days],
[First Date].[Date].[Date].Members,
[Second Date].[Date].DefaultMember
) =
Aggregate(
{ [Period].[Period].DefaultMember } *
{ [First Date].[Date].CurrentMember.lag(59) : [First Date].[Date].CurrentMember }
);
( [Period].[Period].[60 calendar days],
[Second Date].[Date].[Date].Members,
[First Date].[Date].DefaultMember
) =
Aggregate(
{ [Period].[Period].DefaultMember } *
{ [Second Date].[Date].CurrentMember.lag(59) : [Second Date].[Date].CurrentMember }
);
End Scope;
If I get a chance to try it, I'll post back with the results.
|||FYI - I put a similar test case together in Adventure Works, relating [Date] and [Ship Date] to the same fact date field. Using the [Scenario] dimension &[2] (Budget) member to hold trailing 60-day calculations, only calculations for the 2nd dimension (Ship Date) work. But if a new calculated member like [Scenario].[Scenario].[Trailing60] is used instead, calculations on both [Date] and [Ship Date] seem to work fine.
Since you might not wish to go down the calculated member path, another approach which seems to work is "freezing" the first calculation, to prevent its results being changed by the next calculation. In your scenario, something like:
Scope(
{
[Measures].[Amount],
[Measures].[Count]
},
[Period].[Period].[60 calendar days]
);
Scope( [First Date].[Date].[Date].Members );
this =
Aggregate(
{ [Period].[Period].DefaultMember } *
{ [First Date].[Date].CurrentMember.lag(59) : [First Date].[Date].CurrentMember }
);
freeze(this);
End Scope;
( [Second Date].[Date].[Date].Members ) =
Aggregate(
{ [Period].[Period].DefaultMember } *
{ [Second Date].[Date].CurrentMember.lag(59) : [Second Date].[Date].CurrentMember }
);
End Scope;
Thursday, March 22, 2012
Compute Sum (Again)
including Rollup/Cube and compute sum. The problem is that compute sum canno
t
be used with select into and one cannot do a sum(count(distinct...
Rollup and cube give hierarchies and combination totals which is not what I
need.
I need something that operates as this should sum(count(distinct
a11.Policy_id)) but cannot find any function to do it. Can anyone please hel
p.
If one looks @. my select list, the final item is...
count(distinct(a11.Policy_id)) WJXBFS1
select a16.W
_id W
_id,max(a16.w
_desc) w
_desc,a14.Po_tr_bus_cat_id Po_tr_bus_cat_id,
max(a14.Po_tr_bus_cat_desc) Po_tr_bus_cat_desc,
a13.Pr_Group_id Pr_Group_id,
max(a13.Pr_group_desc) Pr_group_desc,
a12.Po_corp_unit_id Po_corp_unit_id,
count(distinct(a11.Policy_id)) WJXBFS1
into #ZZT4Z010YTNMD00B
from fat_bse_po_risk_detail a11
join POt_lu_policy a12
on (a11.Policy_id = a12.Policy_id)
join prt_lu_product a13
on (a11.product_id = a13.product_id)
join POv_lu_tr_Business_Type a14
on (a11.Po_tr_bus_type_id = a14.Po_tr_bus_type_id)
join TRt_lu_Trans_Subtype a15
on (a11.Tr_sub_type_id = a15.Tr_sub_type_id)
join TIt_lu_day a16
on (a11.Cur_trn_dt = a16.Cur_trn_dt)
where (a15.Tr_type_id in ('HNB', 'HNC', 'HRN', 'INB', 'IRN', 'HPR')
and a12.Po_corp_unit_id in ('GEI', 'GNI', 'GED')
and a12.Po_status_id in ('A')
and a11.Inception_date_id between CONVERT(datetime, '2004-02-01 00:00:00',
120) and CONVERT(datetime, '2005-01-29 00:00:00', 120)
and a13.Pr_Group_id in (2, 3, 4, 5, 6, 7)
and a12.Po_corp_unit_id in ('GEI', 'GNI', 'GED')
and a16.W
_id in (select fiftytwo_w
_roll_id fromtit_ta_fiftytwo_w
_roll where latest_w
_ind = 'Y')and a12.Po_corp_unit_id in ('GEI', 'GNI', 'GED'))
group by a16.W
_id,a14.Po_tr_bus_cat_id,
a13.Pr_Group_id,
a12.Po_corp_unit_idPlease explain what was wrong with the answer I gave yesterday.
The best way to get help with a problem like this is to post DDL (CREATE
TABLE statement(s)), sample data (INSERT statements) and show your required
end result. Probably no need to post all your tables, a simplified example
including keys and constraints should do it. If you do that you should find
you get a helpful answer much faster. The following article should help:
http://www.aspfaq.com/etiquette.asp?id=5006
David Portas
SQL Server MVP
--|||Please explain what was wrong with the answer I gave yesterday.
The best way to get help with a problem like this is to post DDL (CREATE
TABLE statement(s)), sample data (INSERT statements) and show your required
end result. Probably no need to post all your tables, a simplified example
including keys and constraints should do it. Please try to do that and you
should find you get a helpful answer much faster. The following article
should help:
http://www.aspfaq.com/etiquette.asp?id=5006
David Portas
SQL Server MVP
--|||sum(count(distinct(a11.Policy_id))
this statement is odd and it is not allowed use a sub query in an agregade
function like sum
even if you could do so
if you have 1000 of count a11.Policy_id then you get the result as 1000.1000
(it will sum the count for every row of result set)
do you realy want that? if so you can create function then sum it
create function thefunction(@.w
_id nvarchar(20))returns int
as
begin
declare @.count_id as int
select @.count_id=count(Policy_id)
from fat_bse_po_risk_detail
Return IsNull(@.count,0)
end
then
select sum(thefunction(@.w
_id))..."marcmc" wrote:
> I have tried everything to get a total of one of the columns in this query
> including Rollup/Cube and compute sum. The problem is that compute sum can
not
> be used with select into and one cannot do a sum(count(distinct...
> Rollup and cube give hierarchies and combination totals which is not what
I
> need.
> I need something that operates as this should sum(count(distinct
> a11.Policy_id)) but cannot find any function to do it. Can anyone please h
elp.
> If one looks @. my select list, the final item is...
> count(distinct(a11.Policy_id)) WJXBFS1
> select a16.W
_id W
_id,> max(a16.w
_desc) w
_desc,> a14.Po_tr_bus_cat_id Po_tr_bus_cat_id,
> max(a14.Po_tr_bus_cat_desc) Po_tr_bus_cat_desc,
> a13.Pr_Group_id Pr_Group_id,
> max(a13.Pr_group_desc) Pr_group_desc,
> a12.Po_corp_unit_id Po_corp_unit_id,
> count(distinct(a11.Policy_id)) WJXBFS1
> into #ZZT4Z010YTNMD00B
> from fat_bse_po_risk_detail a11
> join POt_lu_policy a12
> on (a11.Policy_id = a12.Policy_id)
> join prt_lu_product a13
> on (a11.product_id = a13.product_id)
> join POv_lu_tr_Business_Type a14
> on (a11.Po_tr_bus_type_id = a14.Po_tr_bus_type_id)
> join TRt_lu_Trans_Subtype a15
> on (a11.Tr_sub_type_id = a15.Tr_sub_type_id)
> join TIt_lu_day a16
> on (a11.Cur_trn_dt = a16.Cur_trn_dt)
> where (a15.Tr_type_id in ('HNB', 'HNC', 'HRN', 'INB', 'IRN', 'HPR')
> and a12.Po_corp_unit_id in ('GEI', 'GNI', 'GED')
> and a12.Po_status_id in ('A')
> and a11.Inception_date_id between CONVERT(datetime, '2004-02-01 00:00:00',
> 120) and CONVERT(datetime, '2005-01-29 00:00:00', 120)
> and a13.Pr_Group_id in (2, 3, 4, 5, 6, 7)
> and a12.Po_corp_unit_id in ('GEI', 'GNI', 'GED')
> and a16.W
_id in (select fiftytwo_w
_roll_id from> tit_ta_fiftytwo_w
_roll where latest_w
_ind = 'Y')> and a12.Po_corp_unit_id in ('GEI', 'GNI', 'GED'))
> group by a16.W
_id,> a14.Po_tr_bus_cat_id,
> a13.Pr_Group_id,
> a12.Po_corp_unit_id
Friday, February 24, 2012
Complex Cube Measure
and on a relational table using oracle for a custom dashboard my company
bought, now I need to create an Analysis Services Cube and Reporting Service
s
Client to let analysts create more in-depth reports.
The problem is this, we have a very complex metric with 4 levels in its
product hierarchy:
Business Unit
->Product Line
-->Part Number
-->Production Station
The measure is FTY,at the station level it means the percentage of pieces
that went through the station without failing, the formula for station is 1
-
pieces_rejected/pieces_tested.
Now, this would be great if I could group all the pieces tested and
rejected for a particular partnumber, and apply the same formula but to
obtain the FTY of a partnumber I have to multipy the FTY of each of its
stations, example:
Part Number 12345-001-00 FTY=0.8 * 0.5 * 1.0 = .4
->Welding Station PiecesTested=100 PiecesRejected=20 FTY=0.8 (80%)
->Assembly Station PiecesTested=1000 PiecesRejected=500 FTY=0.5 (50%)
->Test Station PiecesTested=100 PiecesRejected=0 FTY=1.0 (100%)
For the Product Line FTY we have to average all of its part numbers and
for the Business Unit we create an average of its product lines.
I don't know how to design my FTY measure so that it will take into account
that there is a different calculation for each step in the product drill dow
n.
Any ideas guys/gals?
I will thank you a lot!
IgnacioIf [PiecesTested] and [PiecesRejected] are base measures of a
[MetricsCube] with a [MetricsDim], then the metric: [Measures].&
#91;FTY]
could be defined like:
[vbcol=seagreen]
With Member [Measures].[FTY] as
'iif([MetricsDim].CurrentMember.Level.Ordinal <
[MetricsDim].[Part Number].Ordinal,
Avg([MetricsDim].Children,
[Measures].[FTY]),
iif([MetricsDim].CurrentMember.Level is
[MetricsDim].[Part Number],
Exp(Sum(Filter([MetricsDim].Children,
Not IsEmpty([Measures].[PiecesTested])),
Log([Measures].[FTY]))),
([Measures].[PiecesTested] - [Measures].[PiecesRejected])
/[Measures].[PiecesTested]))'
FORMAT_STRING = 'Percent'[vbcol=seagreen]
- Deepak
Deepak Puri
Microsoft MVP - SQL Server
*** Sent via Developersdex http://www.codecomments.com ***
Don't just participate in USENET...get rewarded for it!