• Status: Solved
  • Priority: Medium
  • Security: Public
  • Views: 2561
  • Last Modified:

Select SQL Column to filter on with DropDownList in SSRS Report

Hi Experts,

I'm trying to allow users of an SSRS report to select the column they want to filter by with a DropDownList.  In this case WHERE the selected Column contains 'No'.

I have an SSRS Report with a single table.  DataSet1 is just a Select statement for all columns.

I put another DataSet called Column_Names that is just a list of column names from INFORMATION_SCHEMA.Columns.

I added
"WHERE @Column_Name IN ('No')" to the Select query of DataSet1 so now I have a DropDownList where I can select from all the columns, but the report comes up with no records.  

No errors.  I get the report.  Just no records are returned even though I know that the column I selected has some 'No' entries.  It seems like it should work.  If I replace the parameter with an actual column name I do get the records.
0
megnin
Asked:
megnin
  • 28
  • 10
  • 5
  • +1
1 Solution
 
ralmadaCommented:
>> WHERE @Column_Name IN ('No')"  <<

Will never work

you need to do the comparison with each column individually

so

WHERE column1 in ('No') or column2 in ('No') ... and so on...
0
 
megninAuthor Commented:
I see.  But, how do I determine what column is selected in the DropDownList?

I assume I'll have to create a Parameter manually instead of just sticking a @parameter in the query so I get one automatically.
0
Important Lessons on Recovering from Petya

In their most recent webinar, Skyport Systems explores ways to isolate and protect critical databases to keep the core of your company safe from harm.

 
megninAuthor Commented:
Why didn't you just say, "Google it?"  I'm afraid those two posts either didn't seem to apply or I couldn't figure them out.
0
 
ralmadaCommented:
how do I determine what column is selected in the DropDownList?

How are you creating your @Column_Names variable

I assume I'll have to create a Parameter manually instead of just sticking a @parameter in the query so I get one automatically.

I can help with you expanding the @Column_Names variable, but can you please post an example of what the string looks like?
0
 
megninAuthor Commented:
DataSet1 Select:
SELECT
  WIA_Adult.ReviewID
  ,WIA_Adult.ReviewDateFrom
  ,WIA_Adult.ReviewDateTo

  ,WIA_Adult.Veteran
  ,WIA_Adult.FileHaveTimesheets
  ,WIA_Adult.CasenoteForEachMonth
  ,WIA_Adult.CorrectiveAction
FROM
  WIA_Adult
--WHERE Veteran IN ('N')  -- <--works fine
WHERE @Column_Name IN ('N')

Open in new window

 -- <-- returns no records
DataSet Column_Names:
SELECT COLUMN_NAME FROM INFORMATION_SCHEMA.Columns where TABLE_NAME = 'WIA_Adult'

Open in new window

In Column_Name Parameter Properties I have "Available Values" set to "Get values from a query" and getting them from DataSet Column_Names.  I can select a column name from the dropdownlist, but still get no records.

Edit:  I'm not sure I know what "string" you mean.
0
 
ralmadaCommented:
So when you say "@Column_Name ", that is interpreted as a variable. Which I'm assuming it's a string variable.
0
 
megninAuthor Commented:
Yes.   When I put @Column_Name in the WHERE clause of the Select statement for DataSet1, it automatically puts a DropDownList in the SSRS Report page.  So, I can select the column name from the DropDownList.  It's just not being recognized as a column in the query I suppose.  I don't know what it's doing because I don't get any errors.  The report comes up with just the header but no records.
0
 
ralmadaCommented:
ok, but this is the way you need to create your dataset1. So basically you need to use dynamic SQL. The below will take all columns from WIA_Adult table from INFORMATION_SCHEMA.Columns and create a string like this

col1 in ('N') OR col2 in ('N') OR col3 in ('N') .... and so on...

Then you simply attach it to your WHERE clause there

declare @colnames as varchar(max)

set @colnames = ''

SELECT @colnames = @colnames + ' OR [' + COLUMN_NAME + '] in (''N'')'
FROM INFORMATION_SCHEMA.Columns 
where TABLE_NAME = 'WIA_Adult'


declare @strSQL varchar(max)

set @strSQL = 'SELECT
  WIA_Adult.ReviewID
  ,WIA_Adult.ReviewDateFrom
  ,WIA_Adult.ReviewDateTo

  ,WIA_Adult.Veteran
  ,WIA_Adult.FileHaveTimesheets
  ,WIA_Adult.CasenoteForEachMonth
  ,WIA_Adult.CorrectiveAction
FROM
  WIA_Adult
WHERE ' + @colnames

exec(@strSQL)

Open in new window

0
 
SThayaCommented:
use the below function for mutlivalue parametrs and call the same in the code .. this will help you to run the SP with multi parameters


create FUNCTION [dbo].[fn_MVParam](@RepParam varchar(max), @Delim char(1)= ',')
RETURNS @VALUES TABLE ([Param] varchar(max))AS
   BEGIN
   DECLARE @chrind INT
   DECLARE @Piece varchar(max)
   SELECT @chrind = 1
   WHILE @chrind > 0
      BEGIN
         SELECT @chrind = CHARINDEX(@Delim,@RepParam)
         IF @chrind > 0
            SELECT @Piece = LEFT(@RepParam,@chrind - 1)
         ELSE
            SELECT @Piece = @RepParam
         INSERT @VALUES([Param]) VALUES(@Piece)
         SELECT @RepParam = RIGHT(@RepParam,LEN(@RepParam) - @chrind)
         IF LEN(@RepParam) = 0 BREAK
      END
   RETURN
END


 


In your Where condition  please call the sample below

physicianname in(select [param] from fn_MVParam (@physicianName,',')
0
 
megninAuthor Commented:
Ralmada, thanks, I'll give that a shot.

SThaya, you refer to calling the function in code.  I'm creating an SSRS report using Report Builder.  I'm not sure how I would use your function.
0
 
SThayaCommented:
you can use the sample below code

SELECT
  WIA_Adult.ReviewID
  ,WIA_Adult.ReviewDateFrom
  ,WIA_Adult.ReviewDateTo

  ,WIA_Adult.Veteran
  ,WIA_Adult.FileHaveTimesheets
  ,WIA_Adult.CasenoteForEachMonth
  ,WIA_Adult.CorrectiveAction
FROM
  WIA_Adult
WHERE COLUMN_NAME in (select [param] from fn_MVParam (@COLUMNNAME,','))
0
 
megninAuthor Commented:
SThaya, that makes sense, except I don't know where to put or define the Function.  I'm working in SQL Server Reort Builder so I'm not sure where to put the code to create the Function.  

I'm learning, so let me take a guess...  If I put your "create FUNCTION [dbo.]..." code in SSMS that will create a Function in the database that SSRS can call using your WHERE clause.  Is that right?
0
 
ralmadaCommented:
SThaya, that makes sense, except I don't know where to put or define the Function

Actually it doesnt make sense. Because COLUMN_Name is not a column in WIA_Adult table, isn't it?
0
 
megninAuthor Commented:
Do I need to replace anything in that Function with my actual table name or anything?
0
 
megninAuthor Commented:
No, COLUMN_NAME is a column in INFORMATION_SCHEMA.Columns.

I probably should not have also used @Column_Name as the name of a parameter, but in the WHERE clause of my original DataSet1 I'm using the parameter @Colum_Name.
0
 
ralmadaCommented:
Actually, I don't think you need the function at all. can you please advise on my suggestion? have you tried it? comment http:#a38409846
0
 
megninAuthor Commented:
ralmada, sorry, I'm doing several things at the same time and I got sidetracked off that comment.  I'll try that right now since that seems to be the simplest solution...
0
 
megninAuthor Commented:
Is There a typo in the WHERE clause?  I got an error in Report Builder that the list of columns could not be updated or something like that.
0
 
megninAuthor Commented:
The exact error is:
Could not update a list of fields for the query.  Verify that you can connect to the data source and that your query syntax is correct.
Incorrect syntax near "WHERE'.
0
 
ralmadaCommented:
No, problem is that we are trying to run dynamic SQL in report builder.

So maybe we need something like this


="SELECT
  WIA_Adult.ReviewID
  ,WIA_Adult.ReviewDateFrom
  ,WIA_Adult.ReviewDateTo
  ,WIA_Adult.Veteran
  ,WIA_Adult.FileHaveTimesheets
  ,WIA_Adult.CasenoteForEachMonth
  ,WIA_Adult.CorrectiveAction
FROM   WIA_Adult " +
iif(Parameters!ColumnName.count > 0, " WHERE ", "")
+ Join(Parameters!ColumnName.Label, " in ('N') OR ")
0
 
megninAuthor Commented:
"something like" ?  I'm afraid I wouldn't know where to adjust that if it's not "exactly like".  I'm sorry.  

I'm curious about the "="SELECT" part, with the equal sign.

Also, the WHERE clause seems to end with "OR".

I'll stick it in there and see what happens...
0
 
megninAuthor Commented:
Error:
Failed to preview report.

The Command Text expression for the dataset 'DataSet1'
refers to an non-existing report parameter 'ColumnName'.
Letters in the names of parameters must use the correct
case.

Hmmm, I'll check the case and see if I need an underscore in the name...
0
 
megninAuthor Commented:
I put underscores in "Column_Name" and it seemed to get past that point and then I got:

Failed to preview report.

The CommandText expression for the query 'DataSet1' contains an error: [BC30451] Name 'WHERE' is not declared.
0
 
ralmadaCommented:
try the below

="SELECT
  WIA_Adult.ReviewID
  ,WIA_Adult.ReviewDateFrom
  ,WIA_Adult.ReviewDateTo
  ,WIA_Adult.Veteran
  ,WIA_Adult.FileHaveTimesheets
  ,WIA_Adult.CasenoteForEachMonth
  ,WIA_Adult.CorrectiveAction
FROM   WIA_Adult " + 
iif(Parameters!Column_Name.count > 0, " WHERE ", " ")
+ Join(Parameters!Column_Name.Label, " in ('N') OR ")

Open in new window

0
 
megninAuthor Commented:
I got this this time:

Error during processing of the CommandText expression of dataset ‘DataSet1’. (rsQueryCommandTextProcessingError)
----------------------------
Cannot set the command text for dataset 'DataSet1'. (rsErrorSettingCommandText)
----------------------------
An error has occurred during report processing. (rsProcessingAborted)
0
 
megninAuthor Commented:
Okay.  

Just for reference, here is what I have in Report Builder so far, including the full DataSet1 statement:



DataSet1:
="SELECT
  WIA_Adult.ReviewID
  ,WIA_Adult.ReviewDateFrom
  ,WIA_Adult.ReviewDateTo
  ,WIA_Adult.LastName
  ,WIA_Adult.FirstName
  ,WIA_Adult.SSN
  ,WIA_Adult.Region
  ,WIA_Adult.County
  ,WIA_Adult.OneStop
  ,WIA_Adult.Unit
  ,WIA_Adult.Notes05
  ,WIA_Adult.CaseManagerLName
  ,WIA_Adult.ProjCode
  ,WIA_Adult.ReviewerName
  ,WIA_Adult.ReviewType
  ,WIA_Adult.ReviewDate
  ,WIA_Adult.AdultDW
  ,WIA_Adult.DuallyEnrolled
  ,WIA_Adult.DocOfAge
  ,WIA_Adult.DocOfCitizenship
  ,WIA_Adult.SSNMatchEFM
  ,WIA_Adult.LowIncome
  ,WIA_Adult.RegSelServ
  ,WIA_Adult.NotesSelectiveService
  ,WIA_Adult.DocLayOff1
  ,WIA_Adult.DocLayOff2
  ,WIA_Adult.DocLayOff3
  ,WIA_Adult.DocLayOff4
  ,WIA_Adult.DocLayOff5
  ,WIA_Adult.DocLayOff6
  ,WIA_Adult.DocLayOff7
  ,WIA_Adult.DocLayOff8
  ,WIA_Adult.DocLayOff9
  ,WIA_Adult.DocLayOff10
  ,WIA_Adult.DocLayOff
  ,WIA_Adult.CoreAssisted
  ,WIA_Adult.CoreDocAssisted
  ,WIA_Adult.CoreAllowable
  ,WIA_Adult.CoreUnableObtainEmp
  ,WIA_Adult.CoreDeterminedNeed
  ,WIA_Adult.IntensiveService
  ,WIA_Adult.IntensiveDoc
  ,WIA_Adult.IntensiveAllowable
  ,WIA_Adult.IntensiveUnableObtain
  ,WIA_Adult.IntensiveDeterminedNeed
  ,WIA_Adult.TrainingEntered
  ,WIA_Adult.TrainingInDemandOcc
  ,WIA_Adult.TrainingHrsDoc
  ,WIA_Adult.TrainingFedGuidelines
  ,WIA_Adult.TrainingEmployedWorker
  ,WIA_Adult.TrainingServicesNeeded
  ,WIA_Adult.TrainingEmpNotMeetDef
  ,WIA_Adult.TrainingProvOnList
  ,WIA_Adult.NotesTrainingProvider
  ,WIA_Adult.TrainingMeetExemptions
  ,WIA_Adult.TrainingAccountUtilized
  ,WIA_Adult.TrainingDocSupportInability
  ,WIA_Adult.TrainingExceptionAllowable
  ,WIA_Adult.NotesException
  ,WIA_Adult.TrainingCredDoc
  ,WIA_Adult.TrainingCredRecorded
  ,WIA_Adult.TrainingIn9MoRecorded
  ,WIA_Adult.TrainingTerminated
  ,WIA_Adult.TrainingEmployedAtExit
  ,WIA_Adult.TrainingEmploymentVerified
  ,WIA_Adult.TrainingEmpStartDateRec
  ,WIA_Adult.TrainingCareerAdvancement
  ,WIA_Adult.TrainingWageGain
  ,WIA_Adult.TrainingEmpAt6Mo
  ,WIA_Adult.TrainingFollowUp
  ,WIA_Adult.Training30Days
  ,WIA_Adult.Training60Days
  ,WIA_Adult.Training90days
  ,WIA_Adult.Training6Months
  ,WIA_Adult.Training9Months
  ,WIA_Adult.Training12Months
  ,WIA_Adult.TrainingSpecialPop
  ,WIA_Adult.TrainingInPartnerProg
  ,WIA_Adult.SuppIssued
  ,WIA_Adult.SuppDocSubstUnable
  ,WIA_Adult.SuppIfIssued
  ,WIA_Adult.SuppActivityEFM
  ,WIA_Adult.WIAAdultComments
  ,WIA_Adult.ReviewDateTime
  ,WIA_Adult.Veteran
  ,WIA_Adult.DocToVerifyVeteran
  ,WIA_Adult.SpouseOfVeteran
  ,WIA_Adult.WasFileTransfered
  ,WIA_Adult.TransferIntExt
  ,WIA_Adult.TransferDate
  ,WIA_Adult.TransferFileChecklistInFile
  ,WIA_Adult.ExtTransferForm
  ,WIA_Adult.ExtRequestForm
  ,WIA_Adult.ExtTransferFileChecklist
  ,WIA_Adult.IEPCompleted
  ,WIA_Adult.ActivitiesProvidedInIEP
  ,WIA_Adult.DocAssesBeforeEnroll
  ,WIA_Adult.DeterminationOfNeed
  ,WIA_Adult.GrievanceFormSigned
  ,WIA_Adult.FileHaveTimesheets
  ,WIA_Adult.CasenoteForEachMonth
  ,WIA_Adult.CorrectiveAction
FROM   WIA_Adult " + 
iif(Parameters!Column_Name.count > 0, " WHERE ", " ")
+ Join(Parameters!Column_Name.Label, " in ('N') OR ")

Open in new window

DataSet "Column_Names"
SELECT COLUMN_NAME FROM INFORMATION_SCHEMA.Columns where TABLE_NAME = 'WIA_Adult'

Open in new window

Parameters "@Column_Name" using Dataset "Column_Names" with the single field "COLUMN_NAME".
0
 
megninAuthor Commented:
I tried changing Column_Name.Label to Column_Name.Value.ToString and then tried .Label.ToString and I got this with both of those:

The CommandText expression for the query ‘DataSet1’ contains an error: [BC30518] Overload resolution failed because no accessible 'Join' can be called with these arguments:
0
 
megninAuthor Commented:
I created a new DataSet called DisplayFields with 'COLUMN_NAME' just like the Column_Name DataSet...
I added a new Parameter in Parameters called pDisplayFields and I changed the DataSet1 clause to:
FROM   WIA_Adult " + 
iif(Parameters!pDisplayFields.count > 0, " WHERE ", " ")
+ Join(Parameters!pDisplayFields.Label, " in ('N') OR ")

Open in new window


I also tried it with
.Label.ToString
.Value
.Value.ToString

and I got one or the other of the errors already mentioned.
0
 
megninAuthor Commented:
Okay, just in case there might be a better way to do what my ultimate goal is and that I may be overlooking a much easier way to do it in SSRS let me explain what I really need.  If there's not an easy way or better way, that's fine, I at least want to make sure I'm not trying to re-invent the wheel the wrong way...

The table that's displayed is like an audit or maybe looks like survey results.  There are sixty to eighty questions, so that many columns.  Each question is a column.  Each one can be either "Yes" or "No".   I want the user to be able to single out a single question and filter on the value in that field.  Say he want to look at question number 43.  He needs to filter the table/Grid to show all the records where the answer to #43 was "No".

What I was trying to accomplish with the parameters and the DropDownList is to allow the user to select which question to filter by.

Hard coding a single column would look like this:
WHERE Veteran = 'No'

I just need the Column Name to be selectable.  I'll check and see if I can simply "Enable Filtering" on the columns in SSRS.  That would be just perfect and I'd feel silly trying to do all these parameters and code.  ;)
0
 
megninAuthor Commented:
Yes, that does look like just about what I need.

SThaya, is that about what your Function accomplishes?

Hmmm, looking at the solution in the mssqltips above, that looks like a lot of work to put sixty or eighty columns in four separate Functions with each column name hard coded into each Function.  I have 10 of these reports to do for 10 different community programs we do.  A quick calculation gives me a set of Functions, totaling 3,200 separate little 5 to 10 line code blocks.  Let's call it 30,000 lines of code to set up the Functions.  They can just export it to Excel and use Excel to filter the data. (!)
0
 
megninAuthor Commented:
SThaya, can you help me to get your Function to work?

I created the Function exactly as you posted it.

I tried the WHERE clause as posted and I get an error:  Invalid column name, "COLUMN_NAME."
0
 
Nico BontenbalCommented:
Don't use
Parameters!pDisplayFields.Label

Open in new window

but
Parameters!pDisplayFields.Value

Open in new window

0
 
megninAuthor Commented:
Hi.  Thanks.  Look 5 comments up:

I also tried it with
.Label.ToString
.Value
.Value.ToString

and I got one or the other of the errors already mentioned.
0
 
Nico BontenbalCommented:
Sorry didn't read through your complete post. Just scanned it and noticed the error. To make up for my mistake I attached a working sample of what you try to accomplish. I think both techniques described here work but I would like to introduce a third because it is the most simple one I can think of. To get the example working you need to modify the data source because I use a different connectstring than you.

Usually you refer to a field in an expression like this Fields!Field1.Value. But you can also use Fields("Field1").Value. And when you take this a step further you can even use:
=Fields(Parameters!FilterField.Value).Value

Open in new window

This way the expression returns the value of the field that the parameter refers to. Now look at the filters property of the DataSet1 Dataset. I use this expression in the filter there.
Survey.rdl
0
 
megninAuthor Commented:
Oh, I see.  Excellent idea.  I will give that a try when I get in the office on Monday.
0
 
megninAuthor Commented:
I'm sorry.  I couldn't make heads or tails out of the Survey.rdl xml file.  It opened in Visual Studio as the text of the xml file.

Just to reiterate what I'm trying to do and where I am with it since I've tinkered with the report since starting this question...

I want a user to be able to select one of a number of columns to filter the data on.

For example with columns 1 through 80, where each could contain a value of either "Y" or "N",
select one of the columns, say, column 27, perhaps from a dropdownlist,
and the data will be filtered where the value of column 27 = "N" which is predetermined.  i.e. the filter value will always be "N"; hard coded somewhere.

I want to select the column where the values are all filtered on "N".  
Show all the records where column 27 = "N"

I hope I haven't made it more confusing.  If my goal was already clearly understood, then I'm sorry for going on like this.  ;)

My DataSet1 currently looks like this with no filters, just basic:
=SELECT
  WIA_Adult.ReviewID
  ,WIA_Adult.ReviewDateFrom
  ,WIA_Adult.ReviewDateTo
  ,WIA_Adult.Veteran
  ,WIA_Adult.FileHaveTimesheets
  ,WIA_Adult.CasenoteForEachMonth
  ,WIA_Adult.CorrectiveAction
FROM   WIA_Adult 

Open in new window

I have a Dataset called Column_Names:
SELECT COLUMN_NAME FROM INFORMATION_SCHEMA.Columns 
where TABLE_NAME = 'WIA_Adult'

Open in new window

And a parameter called Column_Name (with no 's') which uses Dataset Column_Names, Value field: COLUMN_NAME and Label field: COLUMN_NAME (This gives me a dropdownlist of the available columns.)
0
 
Nico BontenbalCommented:
The survey.rdl is a report definition file. You should add it to project in BIDS (Business Intelligence Development Studio).
0
 
megninAuthor Commented:
Oh, I see.  I'm not using BIDS, I'm using the Report Builder v3.

I was able to get the dropdownlist to correctly select the column to filter by, using this:
=Fields(Parameters!Column_Name.Value).Value.ToString
in the FilterExpression of the DataSource1 properties.

I added a new set of parameters called aAnswer containing only "Y", "N" and "N/A" and for the "Operator =" Value I put the expression:
=Parameters!aAnswer.Value(0)

That allows the user to select the column to filter by and the answer to use in the filter.  It's not perfect, though.  Right now the Answer only allows you to select one of the options, "Y", "N" or "N/A", not multiple answers and not "Select All".  Maybe it's because I have the Operator "=" set instead of "IN".  I'll see if it will work if I change it.  I'm not sure though because the =Parameters!aAnswer.Value(0) looks to me like it's refering to an index number "(0)" so I don't know if Operator "IN" and "Select All" will work like I hope.  I'll report back after I try...
0
 
megninAuthor Commented:
No joy.  
IN operates exactly like "=" with:  =Parameters!aAnswer.Value(0)

With "Y" selected I get the records with "Y".  That's good.
With "N" selected I get the records with "N".  That's good.
With both Y and N selected always only get records with "Y" instead of records with either Y or N.
0
 
Nico BontenbalCommented:
I'm pretty sure there is a solution. I'm away for two days. I'l get back on this at the end of the week.
0
 
megninAuthor Commented:
With the dropdownlist working for selecting the column to filter on I can actually live with the Answer selector allowing only one option.  It would be nice if the "Select All" option would actually show "all" instead of either nothing or just "Y", but it's not something I have to resolve at all cost and time not being an object.

I will, of course, appreciate your help, so I'll keep working on it until you get back.

Thanks!
0
 
Nico BontenbalCommented:
Oh, I see.  I'm not using BIDS, I'm using the Report Builder v3.
Don't know Report Builder that well. I think you need to upload my sample to your reporting server first, and then edit it with Report Builder.

I've attached a new sample. But I'll explain what I've changed also. I have a parameter FilterField, single select text, with the column names. And a parametere Answer, multi select text, with 'yes', 'no', 'n/a'. In the Filters part of the Dataset Properties of my main dataset I have this as an expression:
=instr(";" & join(parameters!Answer.Value,";") & ";", ";" & Fields(Parameters!FilterField.Value).Value & ";",comparemethod.Text) > 0

Open in new window

join(parameters!Answer.Value,";") will return a ; seperated string of all the values selected in the parameters. (Try it out in a text field on the report somewhere, you'll see what is does). The instr function returns the position of the string returned by Fields(Parameters!FilterField.Value).Value in this string. When there is a match (>0) it returns true, if there is no match it returns false.
expression type: Boolean
operator:
value: true
Survey.rdl
0
 
megninAuthor Commented:
Thanks.  That worked just fine.

In the dataset1 properties | filters | expression I put this expression:

=Fields(Parameters!Column_Name.Value).Value.ToString

Where Column_Name is a list of the column names. hmmm

Operator is set to "In"

and Value is this expression:

=Parameters!aAnswer.Value(0)

Where aAnswer is set with the Available and Default values of "Y", "N" and "N/A".

Allow blank and allow multiple are checked.


Then to use another drop down list to select the columns to be visible:

In the "Column Visibility" properties of each of the columns I added this Expression:

=IIF(InStr(JOIN(Parameters!pDisplayFields.Value,","),"LastName")>0,False,True)

Replacing "LastName" with the name of each column.

pDisplayFields is a Parameter getting its Available and Default values from this query:

SELECT COLUMN_NAME FROM INFORMATION_SCHEMA.Columns where TABLE_NAME = 'WIA_Adult'
0

Featured Post

Important Lessons on Recovering from Petya

In their most recent webinar, Skyport Systems explores ways to isolate and protect critical databases to keep the core of your company safe from harm.

  • 28
  • 10
  • 5
  • +1
Tackle projects and never again get stuck behind a technical roadblock.
Join Now