[Webinar] Learn how to a build a cloud-first strategyRegister Now

x
?
Solved

Can't query database to see if room is booked

Posted on 2006-04-03
18
Medium Priority
?
225 Views
Last Modified: 2008-03-17
Hi, im designing a room booking system for our Intranet.  The plan is to have a table with 25 empty cells in for each period of the week.  From there the user can book a free period.

To check if the room is free i've written code:

<%
Do
      If rs("BookDate")=WeekStartdate AND rs("BookPeriod")="1" then
            response.write "Booked by <br>" & rs("BookName")
      else
            (hyperlink to book room goes in here)

      End If
      rs.movenext
Loop Until rs.EOF
%>      

When i run this on the page it retruns all of the records if they fit the If statement or not.  Once this script works ill place it into every cell on the page, changing the variable for date and period. i.e:

Monday period 2 would be:
<%
Do
      If rs("BookDate")=WeekStartdate AND rs("BookPeriod")="2" then
            response.write "Booked by <br>" & rs("BookName")
      else
            (hyperlink to book room goes in here)

      End If
      rs.movenext
Loop Until rs.EOF
%>

and Wednesday Period 5:
<%
Do
      If rs("BookDate")=WeekStartdate+2 AND rs("BookPeriod")="5" then
            response.write "Booked by <br>" & rs("BookName")
      else
            (hyperlink to book room goes in here)

      End If
      rs.movenext
Loop Until rs.EOF
%>

Any ideas how I can get the If statment to work by displaying the correct date/ period and if its booked or not in the database.  Or is there a more direct route I can use to do the same job but for different days and periods.

Ocassionally when I play with script the page attempts to load but remains blank and eventually times out.  Is this part of the problem or something else completely?

Thanks, I hope what i've written makes sense.  Any questions? Ask away
0
Comment
Question by:ryan_powell
  • 9
  • 7
  • 2
18 Comments
 
LVL 143

Expert Comment

by:Guy Hengel [angelIII / a3]
ID: 16365164
you have to tune the logic to reduce the number of times you call the database to a strict mininum, which would be 1 database call for all the cells/periods for the entire week.
I put the pseudo-code here:

query = "select bookdate, bookperiod from yourtable where bookdate between <start_of_week> and <end_of_week> ORDER BY bookdate ASC, period ASC"
rs = db.execute(query)

for i = <start_of_week> to <end_of_week>
  // ensure we are at least at the good booking date
  if not rs.eof then
    blnSearch = true
    while blnSearch
      blnSearch = false
      if rs("Bookdate") < i then
        rs.movenext
        blnSearch = not rs.eof
      end if
    wend
  end if

  // loop the 25 period
  for p = 1 to 25
    // ensure we are at least at the good booking date and the good period
    if not rs.eof then
      blnSearch = true
      while blnSearch
        blnSearch = false
        if rs("Bookdate") < i then
          rs.movenext
          blnSearch = not rs.eof
        else if rs("Bookdate") = i and rs("BookPeriod") < p then
          rs.movenext
          blnSearch = not rs.eof
        end if
      wend
    end if

    //now, check if we are on the matching row
    blnFoundRecord = false
    if not rs.eof then
      if i = rs("bookdate") and p = rs("BookPeriod") then
        blnFoundRecord = true
      end if
    end if
   
   // if we found (at least) a row, display them in the cell, otherwise put an empty cell
    if blnFoundRecord then
      <start a cell>      
      while blnFoundRecord
         <put the current records link>
         rs.Movenext

         blnFoundRecord = false
         if not rs.eof then
           if i = rs("bookdate") and p = rs("BookPeriod") then
            blnFoundRecord = true
          end if
         end if
      wend
      <close the cell>
    else
       <put an empty cell>
    end if
  next p

next i

0
 
LVL 1

Author Comment

by:ryan_powell
ID: 16365224
Hi thanks for the quick reponse.  How would i implement the above code into my page?  At the moment its a html table with the 25 empty cells and the ASP connection to the database.

What in the code needs to be changed for it to work, variables etc?

Thanks, as you can tell im not very proficent in ASP but would love to learn it inside and out.
0
 
LVL 143

Expert Comment

by:Guy Hengel [angelIII / a3]
ID: 16365315
how should the cells be organized? 5x5 I guess?
the above code is actually quite close to real asp-code, you only need to use response.write "<table>" to start the table for example, and response.write "</table>" to end the table

the <start_of_week> code will actually need to be a variable holding the date value for the first day of the week.
0
Industry Leaders: We Want Your Opinion!

We value your feedback.

Take our survey and automatically be enter to win anyone of the following:
Yeti Cooler, Amazon eGift Card, and Movie eGift Card!

 
LVL 1

Author Comment

by:ryan_powell
ID: 16365330
Ok thanks.  Yeah the table is 5x5.  Ill have a go now and let you know how it goes.
0
 
LVL 1

Author Comment

by:ryan_powell
ID: 16365458
I had a try of the script, it returned the error that:

"Error Type:
Microsoft VBScript compilation (0x800A0400)
Expected statement
/Bramcote/staff/databaseapps/booking/it1.asp, line 50
wend"

and if i remove the wend it reports:
Error Type:
Microsoft VBScript compilation (0x800A041F)
Unexpected 'Next'
/Bramcote/staff/databaseapps/booking/it1.asp, line 78
next p

Any ideas?  This is the whole of the source code for the entire page:
------------------------------------------------------------------------------
<%
sConnString="PROVIDER=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source=" & Server.MapPath("BookDB.mdb")

'create an ADO connection and recordset
Set connection = Server.CreateObject("ADODB.Connection")
Set rs = Server.CreateObject("ADODB.Recordset")
            
            function weekstartdate()
              Dim dt
               dt = Date
                   While (Weekday(dt) <> 2)
                          dt = DateAdd("d",-1,dt)
                   Wend
                   weekstartdate = dt
            end function
'End Of Function
mondaydate = dt

query = "select bookdate, bookperiod from Bookings where bookdate between weekstartdate and weekstart+4 ORDER BY bookdate ASC, period ASC"
rs = db.execute(query)

for i = weekstartdate to weekstartdate+4
  // ensure we are at least at the good booking date
  if not rs.eof then
    blnSearch = true
    while blnSearch
      blnSearch = false
      if rs("Bookdate") < i then
        rs.movenext
        blnSearch = not rs.eof
      end if
    wend
  end if

  // loop the 25 period
  for p = 1 to 25
    // ensure we are at least at the good booking date and the good period
    if not rs.eof then
      blnSearch = true
      while blnSearch
        blnSearch = false
        if rs("Bookdate") < i then
          rs.movenext
          blnSearch = not rs.eof
        else if rs("Bookdate") = i and rs("BookPeriod") < p then
          rs.movenext
          blnSearch = not rs.eof
        end if
       end if

    //now, check if we are on the matching row
    blnFoundRecord = false
    if not rs.eof then
      if i = rs("bookdate") and p = rs("BookPeriod") then
        blnFoundRecord = true
      end if
    end if
   
   // if we found (at least) a row, display them in the cell, otherwise put an empty cell
    if blnFoundRecord then
      response.write "<td>"
      while blnFoundRecord
         response.write "Booked"
         rs.Movenext

         blnFoundRecord = false
         if not rs.eof then
           if i = rs("bookdate") and p = rs("BookPeriod") then
            blnFoundRecord = true
          end if
         end if
      wend
      response.write "</td>"
    else
       response.write "<td></td>"
    end if
  next p

next i
%>      
-------------------------------------------
Im sure its something simple but its beating me.  Many thanks again.
0
 
LVL 3

Expert Comment

by:Cirieno
ID: 16395547
Okay, this might look convoluted but it will do the job with the minimum (really!) of fuss.  I don't have your data to hand so I have *simulated* using getrows by making an array for myself, but this is exactly what the proper getrows method will do with your data.  This code works as posted, hopefully it's plain enough when you come to style it / make links work etc.


    '/* when you're using the getrows method use "dim arrBookings" instead of the following: */
    dim arrBookings(2,5)    '/* there are 6 bookings this week, each with 3 bits of information */
    dim ii, colCounter, intPeriod
    dim dtmToday, dtmMonday, dtmThis


    '/* do your SQL stuff: select bookDate, bookPeriod, bookName from bookings where ...
    '/* then use something like:
    '/*
    '/*    if not objRS.eof then
    '/*        arrBookings = objRS.getrows
    '/*       else
    '/*          redim arrBookings(0,0)
    '/*          arrBookings(0,0) = -1
    '/*    end if
    '/*
    '/* but because I don't have access to your data, I've made up the following dummy result set
    '/* if you have decided not to go with the bookName info (taken from your first post) then just drop all references to (2,ii)


    arrBookings(0,0) = cdate("2006-04-03") : arrBookings(1,0) = 1 : arrBookings(2,0) = "Albert"
    arrBookings(0,1) = cdate("2006-04-03") : arrBookings(1,1) = 2 : arrBookings(2,1) = "Brooke"
    arrBookings(0,2) = cdate("2006-04-03") : arrBookings(1,2) = 3 : arrBookings(2,2) = "Charlie"
    arrBookings(0,3) = cdate("2006-04-04") : arrBookings(1,3) = 2 : arrBookings(2,3) = "Dilbert"
    arrBookings(0,4) = cdate("2006-04-04") : arrBookings(1,4) = 5 : arrBookings(2,4) = "Edna"
    arrBookings(0,5) = cdate("2006-04-05") : arrBookings(1,5) = 3 : arrBookings(2,5) = "Fred"


    dtmToday = date    '/* get today's (or any) date. */
    dtmMonday = dtmToday - ((datepart("w", dtmToday, vbMonday))-1)    '/* then we get that week's Monday */


    '/* start to print your table. hopefully this orientation is okay for you!..
    response.write( "<table border=""1"" cellpadding=""5"">" )
    response.write( "<tr>" )
    response.write( "<td>&nbsp;</td>" )
    for ii = 2 to 6
       response.write( "<td>" & weekdayname(ii,1) & "</td>" )
    next
    response.write( "</tr>" &vbcrlf)

    intPeriod = 1
    for ii = 1 to 25
       colCounter = (ii mod 5)    '/* the remainder of 25 divided by ii */
       if colCounter > 0 then
          dtmThis = dtmMonday + (colCounter-1)
       else
          dtmThis = dtmMonday + 4
       end if

       if (colCounter = 1) then
          response.write( "<tr>" )
          response.write( "<td>Period " & intPeriod & ":</td>" )
       end if

       call checkIsBooked(dtmThis, intPeriod, arrBookings)

       if (colCounter = 0) then    '/* we need to know when to start a new line */
          response.write( "</tr>" & vbcrlf)
          intPeriod = (intPeriod + 1)
       end if
    next

    response.write( "</table>" )




function checkisBooked(dtmInput, intPeriod, arrInput)
    dim ii, blnIsBooked
    blnIsBooked = false

    if (arrBookings(0,0) <> -1) then    '/* no point searching the array if we know it's empty */
       for ii = 0 to ubound(arrInput,2)
          if (arrInput(0,ii) = dtmInput) and (arrInput(1,ii) = intPeriod) then
             blnIsBooked = true
             exit for    '/* no point continuing now we know it's booked
          end if
       next
    end if

    if (blnIsBooked = true) then
       response.write( "<td style=""background-color: #cccccc;"">" )
       response.write( arrBookings(2,ii) )    '/* print the booker */
       response.write( "</td>" )
    else
       response.write( "<td style=""background-color: #99CC00;"">" )
       response.write( "<a href=""#"">book now</a>" )
       response.write( "</td>" )
    end if
end function
0
 
LVL 3

Expert Comment

by:Cirieno
ID: 16399686
I spotted a typo. This line:

    if (arrBookings(0,0) <> -1) then    '/* no point searching the array if we know it's empty */

should read

    if (arrInput(0,0) <> -1) then    '/* no point searching the array if we know it's empty */
0
 
LVL 1

Author Comment

by:ryan_powell
ID: 16399999
Hi.  Thants brilliant. thanks.  One problem I recieve after putting in the database references is a "type mismatch on line 33".  this is the code as far as line 40, is there something obviously wrong?  
-----------
<%
 '/* when you're using the getrows method use "dim arrBookings" instead of the following: */
    dim arrBookings(2,5)    '/* there are 6 bookings this week, each with 3 bits of information */
    dim ii, colCounter, intPeriod
    dim dtmToday, dtmMonday, dtmThis


'declare variables
Dim Connection, objRS
Dim sSQL, sConnString

'declare SQL statement that will query the database
sSQL="SELECT * FROM Bookings"
'define the connection string, specify database
'driver and the location of database
sConnString="PROVIDER=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source=" & Server.MapPath("BookDB.mdb")

'create an ADO connection and recordset
Set connection = Server.CreateObject("ADODB.Connection")
Set objRS = Server.CreateObject("ADODB.Recordset")

'Open the connection to the database
connection.Open sConnString

'Open the recordset object, execute the SQL statement
objRS.Open sSQL, connection      

    '/* do your SQL stuff: select bookDate, bookPeriod, bookName from bookings where ...
    '/* then use something like:
   
    if not objRS.eof then
           arrBookings = objRS.getrows
          else
             redim arrBookings(0,0)
             arrBookings(0,0) = -1
       end if
   
    '/* but because I don't have access to your data, I've made up the following dummy result set
    '/* if you have decided not to go with the bookName info (taken from your first post) then just drop all references to (2,ii)
-------------

Where you've put the array of values for testing I've remarked them out, i.e put the '/* before:
------------
arrBookings(0,0) = cdate("2006-04-03") : arrBookings(1,0) = 1 : arrBookings(2,0) = "Albert"
------------
and so on.
Thanks
0
 
LVL 3

Expert Comment

by:Cirieno
ID: 16400045
Yes, the first line! As you're now using the getrows method, you don't need to predeclare the dimensions of the array, or even that it is an array at all until the moment you use it in the getrows statement.  Give it a try, let me know.
0
 
LVL 1

Author Comment

by:ryan_powell
ID: 16400100
Yeah that works now thanks a lot.

On my original plan i was going to use:

a href='#' onClick=popupWin=window.open('book.asp?bookdate=" & bookdate & "&bookperiod=" & bookperiod & "&Room=" & room & "','remote','width=350,height=410,top=100,left=100')>Book</a>

as a means of passing the room, date and period to the booking form.  Is there any variable names I need to change or create in order for this script to work?
0
 
LVL 3

Expert Comment

by:Cirieno
ID: 16400231
This line:

   call checkIsBooked(dtmThis, intPeriod, arrBookings)

pretty much sets everything up for you.  It passes the cell's date and period into the function that prints the table cell.  So inside the function "checkIsBooked" your link would be as you've listed above, where:

    bookDate = dtmInput
    bookPeriod = intPeriod

My suggestion is to use server.htmlencode( bookDate ) because the date in its raw format can have slashes, spaces, all sorts in.  In fact, dates are probably the most frustrating type of variable, mainly cos of the UK/US style format issues, so just keep an eye on that.  The professional practice would be to turn the date into the ISO format ( yyyymmdd ) before you pass it and then, in book.asp, you use left(), mid() and right() to split the incoming string apart into year, month and day, then join those together using cdate().

Don't let the above confuse you, it's just there for information.  Let me know how you get on.
0
 
LVL 1

Author Comment

by:ryan_powell
ID: 16400439
Yea the variables work, but when I fill in the book information and book the room the page doesn't display the room as being booked and still gives the option to book it.  The information is in the database so it's being booked just the page doesn't alter the status to booked.  The database is formatted for as text for the date field if that has any affect on it but i wouldn't have thought it would of.

I you like I could email you the page/ database so you can check for inconsistancies.
0
 
LVL 3

Expert Comment

by:Cirieno
ID: 16400637
It makes a big difference.  Dates is dates is dates ;) and this function is expecting dates.  Are you able to add a new column to the database and replicate your text-dates as real-dates, and then use that in this function until you're sure it's all working?

When you have created and populated your new column, don't use * in your SQL, use

    select yournewcolumn as bookDate, bookPeriod, bookPerson from ...
0
 
LVL 3

Accepted Solution

by:
Cirieno earned 2000 total points
ID: 16400663
or, if it's easier, try this line in checkIsBooked:

    if (arrInput(0,ii) = cdate(dtmInput)) and (arrInput(1,ii) = intPeriod) then

but dates are tricksy things if you don't know exactly how they're being represented in the string.
0
 
LVL 1

Author Comment

by:ryan_powell
ID: 16403056
Hi that works great now mate thanks a lot, the points are yours.  Couple of little questions, is it easy to alter the orintation of the table so that days go down and periods go across.  As well as this can we display the full weekday names - i.e Monday not Mon (if it's easy to do) with the days can we display date as well, i.e. 'Monday 21 March' or something similar.  

Oh and where we pick the sql statement to query the database can we add "Where bookitem = 'IT1'" i tried myself but it kept saying everything was free and wouldn't book a period.  We have 5 rooms that can be booked and I wanted to store it all in one table so we can query who books what most etc, IT1 is the value of the bookitem field of the table for the current page.  On another page i'd query 'WHERE bookitem = 'IT2'" etc

The script is great without these alterations but these last couple of bits would just make it brilliant.  Only do the changes (or tell me how to do it) if its convinent and easy.  Otherwise dont worry.  Here is the entire script, along with the 'Where' statement if you need it:
-------

<head>
<link rel="stylesheet" type="text/css" href="../../Resources/Styles/booking.css">
</head>

<%
 '/* when you're using the getrows method use "dim arrBookings" instead of the following: */
 '/* dim arrBookings(2,5)    '/* there are 6 bookings this week, each with 3 bits of information */
 dim ii, colCounter, intPeriod
 dim dtmToday, dtmMonday, dtmThis


'declare variables
Dim Connection, objRS
Dim sSQL, sConnString

'declare SQL statement that will query the database
sSQL="SELECT BookedOn as bookDate, bookPeriod, bookname from bookings"
'define the connection string, specify database
'driver and the location of database
sConnString="PROVIDER=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source=" & Server.MapPath("BookDB.mdb")

'create an ADO connection and recordset
Set connection = Server.CreateObject("ADODB.Connection")
Set objRS = Server.CreateObject("ADODB.Recordset")

'Open the connection to the database
connection.Open sConnString

'Open the recordset object, execute the SQL statement
objRS.Open sSQL, connection    

    '/* do your SQL stuff: select bookDate, bookPeriod, bookName from bookings where ...
    '/* then use something like:
   
    if not objRS.eof then
           arrBookings = objRS.getrows
          else
             redim arrBookings(0,0)
             arrBookings(0,0) = -1
       end if
   
    '/* but because I don't have access to your data, I've made up the following dummy result set
    '/* if you have decided not to go with the bookName info (taken from your first post) then just drop all references to (2,ii)


  '/* arrBookings(0,0) = cdate("2006-04-03") : arrBookings(1,0) = 1 : arrBookings(2,0) = "Albert"
  '/* arrBookings(0,1) = cdate("2006-04-03") : arrBookings(1,1) = 2 : arrBookings(2,1) = "Brooke"
  '/* arrBookings(0,2) = cdate("2006-04-03") : arrBookings(1,2) = 3 : arrBookings(2,2) = "Charlie"
  '/* arrBookings(0,3) = cdate("2006-04-04") : arrBookings(1,3) = 2 : arrBookings(2,3) = "Dilbert"
  '/* arrBookings(0,4) = cdate("2006-04-04") : arrBookings(1,4) = 5 : arrBookings(2,4) = "Edna"
  '/* arrBookings(0,5) = cdate("2006-04-05") : arrBookings(1,5) = 3 : arrBookings(2,5) = "Fred"


    dtmToday = date    '/* get today's (or any) date. */
    dtmMonday = dtmToday - ((datepart("w", dtmToday, vbMonday))-1)    '/* then we get that week's Monday */


    '/* start to print your table. hopefully this orientation is okay for you!..
    response.write( "<table border=""1"" cellspacing=0 bordercolordark=#000000 bordercolorlight=#000000 style=""border-color: #000000 cellpadding=""5"">" )
    response.write( "<tr>" )
    response.write( "<td>&nbsp;</td>" )
    for ii = 2 to 6
       response.write( "<td><p class='bookday'>" & weekdayname(ii,1) & "</p></td>" )
    next
    response.write( "</tr>" &vbcrlf)
    intPeriod = 1
    for ii = 1 to 25
       colCounter = (ii mod 5)    '/* the remainder of 25 divided by ii */
       if colCounter > 0 then
          dtmThis = dtmMonday + (colCounter-1)
       else
          dtmThis = dtmMonday + 4
       end if

       if (colCounter = 1) then
          response.write( "<tr>" )
          response.write( "<td>Period " & intPeriod & ":</td>" )
       end if

       call checkIsBooked(dtmThis, intPeriod, arrBookings)

       if (colCounter = 0) then    '/* we need to know when to start a new line */
          response.write( "</tr>" & vbcrlf)
          intPeriod = (intPeriod + 1)
       end if
    next



    response.write( "</table>" )




function checkisBooked(dtmInput, intPeriod, arrInput)
    dim ii, blnIsBooked
    blnIsBooked = false

   if (arrInput(0,0) <> -1) then    '/* no point searching the array if we know it's empty */
       for ii = 0 to ubound(arrInput,2)
          if (arrInput(0,ii) = dtmInput) and (arrInput(1,ii) = intPeriod) then
             blnIsBooked = true
             exit for    '/* no point continuing now we know it's booked
          end if
       next
    end if

    if (blnIsBooked = true) then
       response.write( "<td style=""background-color: #ff0000;"" width=100 height=50>" )
       response.write( "<font size=2 color=ffffff><p style=""text-align: center"">Booked by:</font>")
       response.write( "<br>")
       response.write( "<font size=3 color=000000>" & arrBookings(2,ii) )    '/* print the booker */
       response.write( "</p></td>" )
    else
       response.write( "<td style=""background-color: #ffffff;"" width=100 height=50>" )
       response.write( "<p style=""text-align: center""><a href='#' onClick=popupWin=window.open('book.asp?bookdate=" & dtminput & "&bookperiod=" & intperiod & "&Room=" & bookroom & "','remote','width=350,height=410,top=100,left=100')>Book</a>" )
       response.write( "</p></td>" )
    end if
end function
%>
-------

0
 
LVL 1

Author Comment

by:ryan_powell
ID: 16403083
sorry missed the Where statement from the script should say:

sSQL="SELECT BookedOn as bookDate, bookPeriod, bookname from bookings WHERE bookitem = 'IT1' "
0
 
LVL 1

Author Comment

by:ryan_powell
ID: 16439949
I know I've already accepted you answer Cirieno but if you could do those minor alterations for me - the main one being the orientation of the table (periods across the top and days down the side) I'd be eternally gratefull.

Many Thanks.
0
 
LVL 3

Expert Comment

by:Cirieno
ID: 16441707
   dtmToday = date    '/* get a date corresponding to any day in the active week */
    dtmMonday = dtmToday - ((datepart("w", dtmToday, vbMonday))-1)    '/* then we get that week's Monday */

    response.write( "<table border=""1"" cellpadding=""5"">" )
    response.write( "<tr>" )
    response.write( "    <td>&nbsp;</td>" )
    for ii = 1 to 5
        response.write( "<td>Period " & ii & "</td>" )
    next
    response.write( "</tr>" &vbcrlf)
    for rowCounter = 0 to 4     '/* loop through 5 days */
        for colCounter = 1 to 5     '/* for each day, loop through 5 periods */
            if (colCounter = 1) then
                response.write( "<tr>" )
                response.write( "<td> " & weekdayname(rowCounter+1,1,2) & ":</td>" )
            end if

            dtmThis = cdate(dtmMonday + rowCounter)
            call checkIsBooked(dtmThis, colCounter, arrBookings)

            if (colCounter = 5) then
                response.write( "</tr>" & vbcrlf)
            end if
        next
    next
    response.write( "</table>" )
0

Featured Post

VIDEO: THE CONCERTO CLOUD FOR HEALTHCARE

Modern healthcare requires a modern cloud. View this brief video to understand how the Concerto Cloud for Healthcare can help your organization.

Question has a verified solution.

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

I have helped a lot of people on EE with their coding sources and have enjoyed near about every minute of it. Sometimes it can get a little tedious but it is always a challenge and the one thing that I always say is:   The Exchange of informatio…
Have you ever needed to get an ASP script to wait for a while? I have, just to let something else happen. Or in my case, to allow other stuff to happen while I was murdering my MySQL database with an update. The Original Issue This was written…
Loops Section Overview
Whether it be Exchange Server Crash Issues, Dirty Shutdown Errors or Failed to mount error, Stellar Phoenix Mailbox Exchange Recovery has always got your back. With the help of its easy to understand user interface and 3 simple steps recovery proced…
Suggested Courses

864 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