?
Solved

Searching for Checkbox Entries in  My SQL Query

Posted on 2007-10-08
18
Medium Priority
?
200 Views
Last Modified: 2010-03-19
Hi there I have the following search form

http://www.mayoor.co.uk/search.jpg

I need to build a search query in SQL. So far I have this

CREATE  PROCEDURE [dbo].[p_RetrieveProjectList]

@ClientId int,
@LocationId int,
@ProjectManagerID int,
@DesignPhaseId int,
@ManHoursStart int,
@ManHoursFinish int,
@CostStart bigint,
@CostFinish bigint,
@WaterDepthStart int,
@WaterDepthFinish int,
@YearRangeStart int,
@YearRangeFinish int,
@Search varchar(200) = null,
@DLC int = null,
@HiPressure  int = null,
@HiTemp  int = null,
@PIP  int = null,
@SubSea  int = null,
@Struct  int = null

AS

SELECT      p.id AS ProjectID, c.ClientName, l.LocationName, f.FieldName, p.DescriptionSelConcept,
            d.Name as DesignPhase, p.ManHours, p.Year, p.WaterDepth
FROM            tblProjects p
LEFT JOIN            tblClients c
ON             p.ClientId = c.Id
LEFT JOIN            tblLocation l
ON            p.LocationId = l.Id
LEFT JOIN            tblField f
ON             p.FieldId = f.id
LEFT JOIN            tblDesignPhase d
ON            p.DesignPhaseID = d.id



WHERE

(P.ClientId = (CASE WHEN @ClientID = 0 THEN P.ClientId ELSE @ClientID END))
AND
(P.LocationId = (CASE WHEN @LocationID = 0 THEN P.LocationId ELSE @LocationID END))
AND
(P.ContactId = (CASE WHEN @ProjectManagerID = 0 THEN P.ContactId ELSE @ProjectManagerID END))
AND
(P.DesignPhaseId = (CASE WHEN @DesignPhaseID = 0 THEN P.DesignPhaseID ELSE @DesignPhaseID END))
AND
p.ManHours BETWEEN @ManHoursStart and @ManHoursFinish
AND
p.approximatevalue BETWEEN @CostStart and @CostFinish
AND
p.WaterDepth BETWEEN @WaterDepthStart and @WaterDepthFinish
AND
p.Year Between @YearRangeStart and @YearRangeFinish
AND
((@Search is null or FREETEXT(DescriptionSelConcept, @Search) )
or
(@Search is null or FREETEXT(LessonsLearnt, @Search) )
or
(@Search is null or FREETEXT(ProjectTitle, @Search) )
or
(@Search is null or FREETEXT(BriefDescriptionScope, @Search) )
or
(@Search is null or FREETEXT(JobNumber, @Search) ))

Order By p.id
GO

However I have just added the checkboxes on the right which are recorded in the db as follows

http://www.mayoor.co.uk/projectkeyfeatures.jpg

Can anyone help me amend my query to help me with this as I have tried various combinations to no avail. If the user does not tick any of the boxes the query should just ignore that part of the clause.
0
Comment
Question by:MayoorPatel
  • 10
  • 7
18 Comments
 
LVL 16

Expert Comment

by:SQL_SERVER_DBA
ID: 20034658
instead of defaulting int to null set it at 0
0
 
LVL 143

Expert Comment

by:Guy Hengel [angelIII / a3]
ID: 20040402
question: why do you use LEFT JOINs? does that have a special meaning in the query?
0
 
LVL 1

Author Comment

by:MayoorPatel
ID: 20040472
No meaning at all just my foolishness. Can you suggest another way?
0
What is SQL Server and how does it work?

The purpose of this paper is to provide you background on SQL Server. It’s your self-study guide for learning fundamentals. It includes both the history of SQL and its technical basics. Concepts and definitions will form the solid foundation of your future DBA expertise.

 
LVL 1

Author Comment

by:MayoorPatel
ID: 20040482
update the query is now this.....

CREATE  PROCEDURE [dbo].[p_RetrieveProjectList]

@ClientId int,
@LocationId int,
@ProjectManagerID int,
@DesignPhaseId int,
@ManHoursStart int,
@ManHoursFinish int,
@CostStart bigint,
@CostFinish bigint,
@WaterDepthStart int,
@WaterDepthFinish int,
@YearRangeStart int,
@YearRangeFinish int,
@Search varchar(200) = null,
@DLC int = null,
@HiPressure  int = null,
@HiTemp  int = null,
@PIP  int = null,
@SubSea  int = null,
@Struct  int = null

AS

SELECT      p.id AS ProjectID, c.ClientName, l.LocationName, f.FieldName, p.DescriptionSelConcept,
            d.Name as DesignPhase, p.ManHours, p.Year, p.WaterDepth
FROM            tblProjects p
LEFT JOIN            tblClients c
ON             p.ClientId = c.Id
LEFT JOIN            tblLocation l
ON            p.LocationId = l.Id
LEFT JOIN            tblField f
ON             p.FieldId = f.id
LEFT JOIN            tblDesignPhase d
ON            p.DesignPhaseID = d.id
LEFT JOIN            tblProjectKeyFeatures kf
ON            p.id = kf.projectid


WHERE

(P.ClientId = (CASE WHEN @ClientID = 0 THEN P.ClientId ELSE @ClientID END))
AND
(P.LocationId = (CASE WHEN @LocationID = 0 THEN P.LocationId ELSE @LocationID END))
AND
(P.ContactId = (CASE WHEN @ProjectManagerID = 0 THEN P.ContactId ELSE @ProjectManagerID END))
AND
(P.DesignPhaseId = (CASE WHEN @DesignPhaseID = 0 THEN P.DesignPhaseID ELSE @DesignPhaseID END))
AND
p.ManHours BETWEEN @ManHoursStart and @ManHoursFinish
AND
p.approximatevalue BETWEEN @CostStart and @CostFinish
AND
p.WaterDepth BETWEEN @WaterDepthStart and @WaterDepthFinish
AND
p.Year Between @YearRangeStart and @YearRangeFinish
AND
((@Search is null or FREETEXT(DescriptionSelConcept, @Search) )
or
(@Search is null or FREETEXT(LessonsLearnt, @Search) )
or
(@Search is null or FREETEXT(ProjectTitle, @Search) )
or
(@Search is null or FREETEXT(BriefDescriptionScope, @Search) )
or
(@Search is null or FREETEXT(JobNumber, @Search) ))
and
kf.id in (@DLC, @HiPressure, @HiTemp, @PIP, @SubSea, @Struct, isnull(@DLC, isnull(@HiPressure, isnull(@Hitemp, isnull(@PIP, isnull(@SubSea, isnull(@Struct,kf.id)))))))


Order By p.id
GO

have added in the clause for the keay features. However the default view only brings back records that have at least 1 key feature when it should bring back the whole table.

Please help!
0
 
LVL 143

Expert Comment

by:Guy Hengel [angelIII / a3]
ID: 20040513
CREATE  PROCEDURE [dbo].[p_RetrieveProjectList]
@ClientId int,
@LocationId int,
@ProjectManagerID int,
@DesignPhaseId int,
@ManHoursStart int,
@ManHoursFinish int,
@CostStart bigint,
@CostFinish bigint,
@WaterDepthStart int,
@WaterDepthFinish int,
@YearRangeStart int,
@YearRangeFinish int,
@Search varchar(200) = null,
@DLC int = null,
@HiPressure  int = null,
@HiTemp  int = null,
@PIP  int = null,
@SubSea  int = null,
@Struct  int = null

AS

SELECT      p.id AS ProjectID, c.ClientName, l.LocationName, f.FieldName, p.DescriptionSelConcept,
            d.Name as DesignPhase, p.ManHours, p.Year, p.WaterDepth
FROM            tblProjects p
LEFT JOIN            tblClients c
ON             p.ClientId = c.Id
LEFT JOIN            tblLocation l
ON            p.LocationId = l.Id
LEFT JOIN            tblField f
ON             p.FieldId = f.id
LEFT JOIN            tblDesignPhase d
ON            p.DesignPhaseID = d.id
LEFT JOIN            tblProjectKeyFeatures kf
ON            p.id = kf.projectid
and kf.id in (@DLC, @HiPressure, @HiTemp, @PIP, @SubSea, @Struct, isnull(@DLC, isnull(@HiPressure, isnull(@Hitemp, isnull(@PIP, isnull(@SubSea, isnull(@Struct,kf.id)))))))
WHERE
(P.ClientId = (CASE WHEN @ClientID = 0 THEN P.ClientId ELSE @ClientID END))
AND
(P.LocationId = (CASE WHEN @LocationID = 0 THEN P.LocationId ELSE @LocationID END))
AND
(P.ContactId = (CASE WHEN @ProjectManagerID = 0 THEN P.ContactId ELSE @ProjectManagerID END))
AND
(P.DesignPhaseId = (CASE WHEN @DesignPhaseID = 0 THEN P.DesignPhaseID ELSE @DesignPhaseID END))
AND
p.ManHours BETWEEN @ManHoursStart and @ManHoursFinish
AND
p.approximatevalue BETWEEN @CostStart and @CostFinish
AND
p.WaterDepth BETWEEN @WaterDepthStart and @WaterDepthFinish
AND
p.Year Between @YearRangeStart and @YearRangeFinish
AND
((@Search is null or FREETEXT(DescriptionSelConcept, @Search) )
or
(@Search is null or FREETEXT(LessonsLearnt, @Search) )
or
(@Search is null or FREETEXT(ProjectTitle, @Search) )
or
(@Search is null or FREETEXT(BriefDescriptionScope, @Search) )
or
(@Search is null or FREETEXT(JobNumber, @Search) ))
0
 
LVL 1

Author Comment

by:MayoorPatel
ID: 20040562
OK Now its not filtering on keyfeatures at all. Its just bringing back the whole record set.
0
 
LVL 143

Expert Comment

by:Guy Hengel [angelIII / a3]
ID: 20040628
what do you pass as arguments?
in case all the keyfeatures parameters are null, it will return all rows indeed!
0
 
LVL 1

Author Comment

by:MayoorPatel
ID: 20040673
Right if nothing is checked then this is passed.

ClientID: 0
LocationID: 0
DesignPhaseID: 0
ManHours: 0
WaterDepth: 0
Year: 0
Search:
Cost: 0
ProjectManagerID: 0

if I check the checkboxes 2,3,and 4

ClientID: 0
LocationID: 0
DesignPhaseID: 0
ManHours: 0
WaterDepth: 0
Year: 0
Search:
Cost: 0
ProjectManagerID: 0
key_2: on
key_3: on
key_4: on

SO what I do at my end is this

If Request("key_1") = "on" then
    DLC = 1
Else    
    DLC = NULL        
End If

If Request("key_2") = "on" then
    HiPressure = 1
Else    
    HiPressure = NULL        
End If

If Request("key_3") = "on" then
    HiTemp = 1
Else    
    HiTemp = NULL        
End If

If Request("key_4") = "on" then
    PIP = 1
Else    
    PIP = NULL        
End If

If Request("key_5") = "on" then
    SubSea = 1
Else    
    SubSea = NULL        
End If

If Request("key_6") = "on" then
    Struct = 1
Else    
    Struct = NULL        
End If

'Gather the data for the client list dropdown
Set adocmd = Server.CreateObject("ADODB.Command")
With adocmd            
      .ActiveConnection = objConn
      .CommandText = "p_RetrieveProjectList"      
    .Parameters.Append .CreateParameter("@ClientId", adInteger, adParamInput,2, ClientID)
    .Parameters.Append .CreateParameter("@LocationId", adInteger, adParamInput,2, LocationID)
    .Parameters.Append .CreateParameter("@ProjectManagerId", adInteger, adParamInput,2, ProjectManagerID)
    .Parameters.Append .CreateParameter("@DesignPhaseId", adInteger, adParamInput,2, DesignPhaseID)
    .Parameters.Append .CreateParameter("@ManHoursStart", adInteger, adParamInput,2, ManHoursRangeStart)
    .Parameters.Append .CreateParameter("@ManHoursFinish", adInteger, adParamInput,2, ManHoursRangeFinish)
    .Parameters.Append .CreateParameter("@CostRangeStart", adBigInt, adParamInput,2, CostRangeStart)
    .Parameters.Append .CreateParameter("@CostRangeFinish", adBigInt, adParamInput,2, CostRangeFinish)
    .Parameters.Append .CreateParameter("@WaterDepthStart", adInteger, adParamInput,2, WaterDepthRangeStart)
    .Parameters.Append .CreateParameter("@WaterDepthFinish", adInteger, adParamInput,2, WaterDepthRangeFinish)
    .Parameters.Append .CreateParameter("@YearRangeStart", adInteger, adParamInput,2, YearRangeStart)
    .Parameters.Append .CreateParameter("@YearRangeFinish", adInteger, adParamInput,2, YearRangeFinish)
    .Parameters.Append .CreateParameter("@Search", adVarchar, adParamInput,200, Search)
    .Parameters.Append .CreateParameter("@DLC", adInteger, adParamInput,2, DLC)
    .Parameters.Append .CreateParameter("@HiPressure", adInteger, adParamInput,2, HiPressure)
    .Parameters.Append .CreateParameter("@HiTemp", adInteger, adParamInput,2, HiTemp)
    .Parameters.Append .CreateParameter("@PIP", adInteger, adParamInput,2, PIP)
    .Parameters.Append .CreateParameter("@SubSea", adInteger, adParamInput,2, SubSea)
    .Parameters.Append .CreateParameter("@Struct", adInteger, adParamInput,2, Struct)    
      .CommandType = adCmdStoredProc      
      Set objRSProjectList = .Execute      
End With
Set adocmd = Nothing


Make sense?
0
 
LVL 143

Expert Comment

by:Guy Hengel [angelIII / a3]
ID: 20040722
yes, that makes sense.
however, I don't see the gotcha...
0
 
LVL 1

Author Comment

by:MayoorPatel
ID: 20040798
also the query is returning duplicate records one for each keyfeature associated.
0
 
LVL 1

Author Comment

by:MayoorPatel
ID: 20042072
Angel I have found the reason

http://www.mayoor.co.uk/query.jpg

It is also returning the records which have null in them. Is there anyway of eliminating these?

Here is the freshest version of the query

CREATE  PROCEDURE [dbo].[p_RetrieveProjectList]
@ClientId int,
@LocationId int,
@ProjectManagerID int,
@DesignPhaseId int,
@ManHoursStart int,
@ManHoursFinish int,
@CostStart bigint,
@CostFinish bigint,
@WaterDepthStart int,
@WaterDepthFinish int,
@YearRangeStart int,
@YearRangeFinish int,
@Search varchar(200) = null,
@DLC int = null,
@HiPressure  int = null,
@HiTemp  int = null,
@PIP  int = null,
@SubSea  int = null,
@Struct  int = null

AS

SELECT      DISTINCT p.id AS ProjectID, c.ClientName, l.LocationName, f.FieldName, p.DescriptionSelConcept,
            d.Name as DesignPhase, p.ManHours, p.Year, p.WaterDepth, kf.keyfeatureid
FROM                  tblProjects p
LEFT JOIN         tblClients c
ON                   p.ClientId = c.Id
LEFT JOIN         tblLocation l
ON                  p.LocationId = l.Id
LEFT JOIN         tblField f
ON                   p.FieldId = f.id
LEFT JOIN         tblDesignPhase d
ON                  p.DesignPhaseID = d.id
LEFT JOIN         tblProjectKeyFeatures kf
ON                  p.id = kf.projectid

AND
kf.keyfeatureid in (@DLC, @HiPressure, @HiTemp, @PIP, @SubSea, @Struct, isnull(@DLC, isnull(@HiPressure, isnull(@Hitemp, isnull(@PIP, isnull(@SubSea, isnull(@Struct,kf.keyfeatureid)))))))
WHERE
(P.ClientId = (CASE WHEN @ClientID = 0 THEN P.ClientId ELSE @ClientID END))
AND
(P.LocationId = (CASE WHEN @LocationID = 0 THEN P.LocationId ELSE @LocationID END))
AND
(P.ContactId = (CASE WHEN @ProjectManagerID = 0 THEN P.ContactId ELSE @ProjectManagerID END))
AND
(P.DesignPhaseId = (CASE WHEN @DesignPhaseID = 0 THEN P.DesignPhaseID ELSE @DesignPhaseID END))
AND
p.ManHours BETWEEN @ManHoursStart and @ManHoursFinish
AND
p.approximatevalue BETWEEN @CostStart and @CostFinish
AND
p.WaterDepth BETWEEN @WaterDepthStart and @WaterDepthFinish
AND
p.Year Between @YearRangeStart and @YearRangeFinish
AND
((@Search is null or FREETEXT(DescriptionSelConcept, @Search) )
or
(@Search is null or FREETEXT(LessonsLearnt, @Search) )
or
(@Search is null or FREETEXT(ProjectTitle, @Search) )
or
(@Search is null or FREETEXT(BriefDescriptionScope, @Search) )
or
(@Search is null or FREETEXT(JobNumber, @Search) ))
GO
0
 
LVL 143

Expert Comment

by:Guy Hengel [angelIII / a3]
ID: 20042236
that is because of the left join...

CREATE  PROCEDURE [dbo].[p_RetrieveProjectList]
@ClientId int,
@LocationId int,
@ProjectManagerID int,
@DesignPhaseId int,
@ManHoursStart int,
@ManHoursFinish int,
@CostStart bigint,
@CostFinish bigint,
@WaterDepthStart int,
@WaterDepthFinish int,
@YearRangeStart int,
@YearRangeFinish int,
@Search varchar(200) = null,
@DLC int = null,
@HiPressure  int = null,
@HiTemp  int = null,
@PIP  int = null,
@SubSea  int = null,
@Struct  int = null

AS

SELECT      DISTINCT p.id AS ProjectID, c.ClientName, l.LocationName, f.FieldName, p.DescriptionSelConcept,
            d.Name as DesignPhase, p.ManHours, p.Year, p.WaterDepth, kf.keyfeatureid
FROM                  tblProjects p
JOIN         tblClients c
ON                   p.ClientId = c.Id
JOIN         tblLocation l
ON                  p.LocationId = l.Id
JOIN         tblField f
ON                   p.FieldId = f.id
JOIN         tblDesignPhase d
ON                  p.DesignPhaseID = d.id
JOIN         tblProjectKeyFeatures kf
ON                  p.id = kf.projectid

AND
kf.keyfeatureid in (@DLC, @HiPressure, @HiTemp, @PIP, @SubSea, @Struct, isnull(@DLC, isnull(@HiPressure, isnull(@Hitemp, isnull(@PIP, isnull(@SubSea, isnull(@Struct,kf.keyfeatureid)))))))
WHERE
(P.ClientId = (CASE WHEN @ClientID = 0 THEN P.ClientId ELSE @ClientID END))
AND
(P.LocationId = (CASE WHEN @LocationID = 0 THEN P.LocationId ELSE @LocationID END))
AND
(P.ContactId = (CASE WHEN @ProjectManagerID = 0 THEN P.ContactId ELSE @ProjectManagerID END))
AND
(P.DesignPhaseId = (CASE WHEN @DesignPhaseID = 0 THEN P.DesignPhaseID ELSE @DesignPhaseID END))
AND
p.ManHours BETWEEN @ManHoursStart and @ManHoursFinish
AND
p.approximatevalue BETWEEN @CostStart and @CostFinish
AND
p.WaterDepth BETWEEN @WaterDepthStart and @WaterDepthFinish
AND
p.Year Between @YearRangeStart and @YearRangeFinish
AND
((@Search is null or FREETEXT(DescriptionSelConcept, @Search) )
or
(@Search is null or FREETEXT(LessonsLearnt, @Search) )
or
(@Search is null or FREETEXT(ProjectTitle, @Search) )
or
(@Search is null or FREETEXT(BriefDescriptionScope, @Search) )
or
(@Search is null or FREETEXT(JobNumber, @Search) ))
GO
0
 
LVL 1

Author Comment

by:MayoorPatel
ID: 20047301
OK now that is working for actual searches but the default view is only bringing back the records that have keyfeatures and not ALL records as it should do.
0
 
LVL 143

Expert Comment

by:Guy Hengel [angelIII / a3]
ID: 20047352
ok, we will then need the LEFT join anyhow.
check out this version, with the join condition modified, and a where clause added

CREATE  PROCEDURE [dbo].[p_RetrieveProjectList]
@ClientId int,
@LocationId int,
@ProjectManagerID int,
@DesignPhaseId int,
@ManHoursStart int,
@ManHoursFinish int,
@CostStart bigint,
@CostFinish bigint,
@WaterDepthStart int,
@WaterDepthFinish int,
@YearRangeStart int,
@YearRangeFinish int,
@Search varchar(200) = null,
@DLC int = null,
@HiPressure  int = null,
@HiTemp  int = null,
@PIP  int = null,
@SubSea  int = null,
@Struct  int = null

AS

SELECT      DISTINCT p.id AS ProjectID, c.ClientName, l.LocationName, f.FieldName, p.DescriptionSelConcept,
            d.Name as DesignPhase, p.ManHours, p.Year, p.WaterDepth, kf.keyfeatureid
FROM                  tblProjects p
JOIN         tblClients c
ON                   p.ClientId = c.Id
JOIN         tblLocation l
ON                  p.LocationId = l.Id
JOIN         tblField f
ON                   p.FieldId = f.id
JOIN         tblDesignPhase d
ON                  p.DesignPhaseID = d.id
LEFT JOIN         tblProjectKeyFeatures kf
ON                  p.id = kf.projectid
AND   kf.keyfeatureid in (@DLC, @HiPressure, @HiTemp, @PIP, @SubSea, @Struct)
WHERE
(P.ClientId = (CASE WHEN @ClientID = 0 THEN P.ClientId ELSE @ClientID END))
AND
(P.LocationId = (CASE WHEN @LocationID = 0 THEN P.LocationId ELSE @LocationID END))
AND
(P.ContactId = (CASE WHEN @ProjectManagerID = 0 THEN P.ContactId ELSE @ProjectManagerID END))
AND
(P.DesignPhaseId = (CASE WHEN @DesignPhaseID = 0 THEN P.DesignPhaseID ELSE @DesignPhaseID END))
AND
p.ManHours BETWEEN @ManHoursStart and @ManHoursFinish
AND
p.approximatevalue BETWEEN @CostStart and @CostFinish
AND
p.WaterDepth BETWEEN @WaterDepthStart and @WaterDepthFinish
AND
p.Year Between @YearRangeStart and @YearRangeFinish
AND
((@Search is null or FREETEXT(DescriptionSelConcept, @Search) )
or
(@Search is null or FREETEXT(LessonsLearnt, @Search) )
or
(@Search is null or FREETEXT(ProjectTitle, @Search) )
or
(@Search is null or FREETEXT(BriefDescriptionScope, @Search) )
or
(@Search is null or FREETEXT(JobNumber, @Search) ))
AND kf.keyfeatureid in (@DLC, @HiPressure, @HiTemp, @PIP, @SubSea, @Struct, coalesce(@DLC, @HiPressure, @Hitemp, @PIP, @SubSea, @Struct,kf.keyfeatureid))

0
 
LVL 1

Author Comment

by:MayoorPatel
ID: 20047361
OK default view brings back no records at all. and selecting keyfetures brings nothing too. :(
0
 
LVL 143

Accepted Solution

by:
Guy Hengel [angelIII / a3] earned 2000 total points
ID: 20047373
please check the last condition to:

AND ( kf.keyfeatureid in (@DLC, @HiPressure, @HiTemp, @PIP, @SubSea, @Struct)
       or coalesce(@DLC, @HiPressure, @Hitemp, @PIP, @SubSea, @Struct ) IS NULL
       )
0
 
LVL 1

Author Comment

by:MayoorPatel
ID: 20047388
OK Now its bringing back everything everytime even when i pick keyfeatures.
0
 
LVL 1

Author Comment

by:MayoorPatel
ID: 20047403
ARGHHHHHHHHHH Its working sorry it was my fault. I messed with something in the code that last change you made worked.
0

Featured Post

Free Tool: Site Down Detector

Helpful to verify reports of your own downtime, or to double check a downed website you are trying to access.

One of a set of tools we are providing to everyone as a way of saying thank you for being a part of the community.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

A Stored Procedure in Microsoft SQL Server is a powerful feature that it can be used to execute the Data Manipulation Language (DML) or Data Definition Language (DDL). Depending on business requirements, a single Stored Procedure can return differe…
Microsoft Access has a limit of 255 columns in a single table; SQL Server allows tables with over 255 columns, but reading that data is not necessarily simple.  The final solution for this task involved creating a custom text parser and then reading…
Using examples as well as descriptions, and references to Books Online, show the different Recovery Models available in SQL Server and explain, as well as show how full, differential and transaction log backups are performed
Via a live example, show how to setup several different housekeeping processes for a SQL Server.
Suggested Courses

862 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question