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

Problem with query Syntax .. WHERE IN ()

Hi .. I have a query which will filter results from values passed from a form.

The form has two lists, so it may pass more than one value.

The first list is all the countries, and it will actually pass the value of the name of the country, example:  Mexico

if more than one is selected something like:   Hong Kong SAR, PRC, Hungary, Iceland, India, Indonesia

The second list passes on numbers (int):  02332, 123, 4324

And so on.

I want to filter my recordset based on the values passed on from the selections made on the list.

My query goes something like:

Select * from tbl .. bla bla

WHERE b.userid IN ('MMColParam11')    --- this is the one that filters out with the list of numbers

AND a.PoBCountry IN ('MMColParam12')   --- this is the one that filters out with the list of countries, meaning text not numbers

What is wrong with my query that I get no results.

One more thing .. if NO value is passed I need to select ALL, how to do this ?
0
Aleks
Asked:
Aleks
  • 6
  • 6
  • 2
8 Solutions
 
lcohanDatabase AnalystCommented:
"What is wrong with my query that I get no results. "

In my opinion you have NO rows that are matching BOTH

 b.userid IN ('MMColParam11')  AND a.PoBCountry IN ('MMColParam12')  

"One more thing .. if NO value is passed I need to select ALL, how to do this ? "

You can do that in a stored procedure where the values will be truly passed in as parameters and you use those to test the b.userid IN ... AND a.PoBCountry IN .....
0
 
JimFiveCommented:
You are passing a string that looks like this '1,2,3'
so your where clause looks like IN('1,2,3') which is not what you want.

Assuming Microsoft SQL there is no way to pass a list as a parameter to the IN clause.

What you need to do is create a table variable from your list and then use IN(Select Country from @TableVar)
0
 
lcohanDatabase AnalystCommented:
OR if is just one value as in your example use = instead of IN and keep in mind that sometimes text stored in table columns may have (noise) leading/trailing spaces and that's another possible reason to not match your criteria.
0
Cloud Class® Course: CompTIA Healthcare IT Tech

This course will help prep you to earn the CompTIA Healthcare IT Technician certification showing that you have the knowledge and skills needed to succeed in installing, managing, and troubleshooting IT systems in medical and clinical settings.

 
AleksAuthor Commented:
I am actually using Dreamweaver to create the recordset. This is the full code:

---

<%
Dim ContactsFiltered__MMColParam
ContactsFiltered__MMColParam = "0"
If (Session("FirmId") <> "") Then
  ContactsFiltered__MMColParam = Session("FirmId")
End If
%>
<%
Dim ContactsFiltered__MMColParam2
ContactsFiltered__MMColParam2 = "0"
If (Request.Form("AttyParalegals") <> "") Then
  ContactsFiltered__MMColParam2 = Request.Form("AttyParalegals")
End If
%>
<%
Dim ContactsFiltered__MMColParam3
ContactsFiltered__MMColParam3 = "%"
If (Request.Form("statuscont")  <> "") Then
  ContactsFiltered__MMColParam3 = Request.Form("statuscont")
End If
%>
<%
Dim ContactsFiltered__MMColParam4
ContactsFiltered__MMColParam4 = "%"
If (Request.Form("Contype")  <> "") Then
  ContactsFiltered__MMColParam4 = Request.Form("Contype")
End If
%>
<%
Dim ContactsFiltered__MMColParam5
ContactsFiltered__MMColParam5 = "%"
If (Request.Form("FirstNm") <> "") Then
  ContactsFiltered__MMColParam5 = Request.Form("FirstNm")
End If
%>
<%
Dim ContactsFiltered__MMColParam6
ContactsFiltered__MMColParam6 = "%"
If (Request.Form("LastNm") <> "") Then
  ContactsFiltered__MMColParam6 = Request.Form("LastNm")
End If
%>
<%
Dim ContactsFiltered__MMColParam7
ContactsFiltered__MMColParam7 = "%"
If (Request.Form("SSN") <> "") Then
  ContactsFiltered__MMColParam7 = Request.Form("SSN")
End If
%>
<%
Dim ContactsFiltered__MMColParam8
ContactsFiltered__MMColParam8 = "%"
If (Request.Form("email") <> "") Then
  ContactsFiltered__MMColParam8 = Request.Form("email")
End If
%>
<%
Dim ContactsFiltered__MMColParam9
ContactsFiltered__MMColParam9 = "%"
If (Request.Form("Nationality") <> "") Then
  ContactsFiltered__MMColParam9 = Request.Form("Nationality")
End If
%>
<%
Dim ContactsFiltered__MMColParam10
ContactsFiltered__MMColParam10 = "%"
If (Request.Form("Currstatus") <> "") Then
  ContactsFiltered__MMColParam10 = Request.Form("Currstatus")
End If
%>
<%
Dim ContactsFiltered__MMColParam500
ContactsFiltered__MMColParam500 = "a.FirstNm"
If (Request.Form("Orderbygeninfo")  <> "") Then
  ContactsFiltered__MMColParam500 = Request.Form("Orderbygeninfo")
End If
%>
<%
Dim ContactsFiltered__MMColParam11
ContactsFiltered__MMColParam11 = "0"
If (Request.Form("Employerlist")   <> "") Then
  ContactsFiltered__MMColParam11 = Request.Form("Employerlist")  
End If
%>
<%
Dim ContactsFiltered__MMColParam12
ContactsFiltered__MMColParam12 = "0"
If (Request.Form("countryDDM")   <> "") Then
  ContactsFiltered__MMColParam12 = Request.Form("countryDDM")  
End If
%>
<%
Dim ContactsFiltered
Dim ContactsFiltered_numRows

Set ContactsFiltered = Server.CreateObject("ADODB.Recordset")
ContactsFiltered.ActiveConnection = MM_eimmigration_STRING
ContactsFiltered.Source = "SELECT a.UserId ,          a.UserType ,          a.FirmId ,          a.EmployerId ,          a.LastNm ,          a.FirstNm ,          a.DobD ,          a.SSN,          a.Email ,          a.Nationality ,          a.NiStatus ,          a.NIVMaxStatus ,          a.ExpiresOnD ,          a.Docstatusstat ,          a.NIVMaxStatus ,          a.I94DateD ,          a.I94,          a.I797Date ,          a.I797,          a.EadDate ,          a.Ead,          a.ApDate ,          a.ApNum,          a.Iap66Date ,          a.Iap66,          a.GcDate ,          a.GC,          a.I20Date ,          a.I20,          a.PpExpireOnD ,          a.PpNum,          a.PobCountry ,          b.MaidenNm AS Employer ,          d.MailStr + ' ' + d.MaidenNm AS Attorney ,          a.PobCountry ,          a.archivedcont ,          a.contactstatus ,          a.Docstatusstat ,          e.Docstatdesc ,          a.Dswg ,          a.VisaExp ,          a.VisaType ,          a.VisaStatus  FROM users a          LEFT JOIN users AS b ON a.employerid = b.userid          INNER JOIN attscont AS c ON a.userid = c.userid          INNER JOIN users AS d ON c.attyid = d.userid          LEFT JOIN Documentstatus AS e ON e.documentstatus = a.Docstatusstat  WHERE a.usertype = 'contact'          AND a.firmid = " + Replace(ContactsFiltered__MMColParam, "'", "''") + "          AND d.userid = " + Replace(ContactsFiltered__MMColParam2, "'", "''") + "          AND a.Archivedcont LIKE '" + Replace(ContactsFiltered__MMColParam3, "'", "''") + "'          AND a.Contactstatus LIKE '" + Replace(ContactsFiltered__MMColParam4, "'", "''") + "'          AND ISNULL(a.FirstNm, '') LIKE '" + Replace(ContactsFiltered__MMColParam5, "'", "''") + "%'          AND ISNULL(a.LastNm, '') LIKE '" + Replace(ContactsFiltered__MMColParam6, "'", "''") + "%'          AND ISNULL(a.SSN, '') LIKE '" + Replace(ContactsFiltered__MMColParam7, "'", "''") + "%'          AND ISNULL(a.email, '') LIKE '" + Replace(ContactsFiltered__MMColParam8, "'", "''") + "%'          AND ISNULL(a.Nationality, '') LIKE '" + Replace(ContactsFiltered__MMColParam9, "'", "''") + "%'          AND ISNULL(a.Nistatus, '') LIKE '" + Replace(ContactsFiltered__MMColParam10, "'", "''") + "%' AND b.userid IN (" + Replace(ContactsFiltered__MMColParam11, "'", "''") + ") AND a.PoBCountry IN ('" + Replace(ContactsFiltered__MMColParam12, "'", "''") + "')  ORDER BY " + Replace(ContactsFiltered__MMColParam500, "'", "''") + ""
ContactsFiltered.CursorType = 0
ContactsFiltered.CursorLocation = 2
ContactsFiltered.LockType = 1
ContactsFiltered.Open()

ContactsFiltered_numRows = 0
%>

---

MMColParam11 and MMColParam12 are the two parameters I need to compare "IN", if I only make one selection and ONE value is passed it works fine and returns the correct records, but if I make more than one selection or if I make NO selections I get no results.
0
 
JimFiveCommented:
Ok, the problem is still that MMColParam11 is being passed to IN() as a comma separated string.  you will need to do this:
IN('" + Replace( Replace(ContactsFiltered__MMColParam11, "'", "''"), ",","','") + "'")

Open in new window

That is, replace each comma in the list with quote comma quote and put a quote before and after.  You'll need to do the same thing with 12.

In general a good way to debug this is to set the SQL statement to a variable name and display it.  Then paste it into Management studio and see where the problems are.
0
 
JimFiveCommented:
By the way, if any of the fields on the form allow entered text then you need to be concerned about SQL Injection.
0
 
AleksAuthor Commented:
Dind't work, I get this error (I only selected 'Mexico' from the drop down menu

Microsoft OLE DB Provider for ODBC Drivers error '80040e14'

[Microsoft][ODBC SQL Server Driver][SQL Server]Incorrect syntax near 'Mexico'.

/bluedot/Intranet/reports/ContactReports/07results.asp, line 485

---

This is that part of the code:

Replace( Replace(ContactsFiltered__MMColParam11, "'", "''"), ",","','") + ") AND a.PoBCountry IN ('" + Replace(ContactsFiltered__MMColParam12, "'", "''") + "')
0
 
AleksAuthor Commented:
Same error if I select more than one country
0
 
JimFiveCommented:
It looks like you need a single quote before the ) before the word AND.
0
 
AleksAuthor Commented:
Well .. .that gave me no results even tho there are results. I selected ALL options on both menus and all numbers and countries are passed on to this query, still no results.

---

<%
Dim ContactsFiltered__MMColParam
ContactsFiltered__MMColParam = "0"
If (Session("FirmId") <> "") Then
  ContactsFiltered__MMColParam = Session("FirmId")
End If
%>
<%
Dim ContactsFiltered__MMColParam2
ContactsFiltered__MMColParam2 = "0"
If (Request.Form("AttyParalegals") <> "") Then
  ContactsFiltered__MMColParam2 = Request.Form("AttyParalegals")
End If
%>
<%
Dim ContactsFiltered__MMColParam3
ContactsFiltered__MMColParam3 = "%"
If (Request.Form("statuscont")  <> "") Then
  ContactsFiltered__MMColParam3 = Request.Form("statuscont")
End If
%>
<%
Dim ContactsFiltered__MMColParam4
ContactsFiltered__MMColParam4 = "%"
If (Request.Form("Contype")  <> "") Then
  ContactsFiltered__MMColParam4 = Request.Form("Contype")
End If
%>
<%
Dim ContactsFiltered__MMColParam5
ContactsFiltered__MMColParam5 = "%"
If (Request.Form("FirstNm") <> "") Then
  ContactsFiltered__MMColParam5 = Request.Form("FirstNm")
End If
%>
<%
Dim ContactsFiltered__MMColParam6
ContactsFiltered__MMColParam6 = "%"
If (Request.Form("LastNm") <> "") Then
  ContactsFiltered__MMColParam6 = Request.Form("LastNm")
End If
%>
<%
Dim ContactsFiltered__MMColParam7
ContactsFiltered__MMColParam7 = "%"
If (Request.Form("SSN") <> "") Then
  ContactsFiltered__MMColParam7 = Request.Form("SSN")
End If
%>
<%
Dim ContactsFiltered__MMColParam8
ContactsFiltered__MMColParam8 = "%"
If (Request.Form("email") <> "") Then
  ContactsFiltered__MMColParam8 = Request.Form("email")
End If
%>
<%
Dim ContactsFiltered__MMColParam9
ContactsFiltered__MMColParam9 = "%"
If (Request.Form("Nationality") <> "") Then
  ContactsFiltered__MMColParam9 = Request.Form("Nationality")
End If
%>
<%
Dim ContactsFiltered__MMColParam10
ContactsFiltered__MMColParam10 = "%"
If (Request.Form("Currstatus") <> "") Then
  ContactsFiltered__MMColParam10 = Request.Form("Currstatus")
End If
%>
<%
Dim ContactsFiltered__MMColParam500
ContactsFiltered__MMColParam500 = "a.FirstNm"
If (Request.Form("Orderbygeninfo")  <> "") Then
  ContactsFiltered__MMColParam500 = Request.Form("Orderbygeninfo")
End If
%>
<%
Dim ContactsFiltered__MMColParam11
ContactsFiltered__MMColParam11 = "0"
If (Request.Form("Employerlist")   <> "") Then
  ContactsFiltered__MMColParam11 = Request.Form("Employerlist")  
End If
%>
<%
Dim ContactsFiltered__MMColParam12
ContactsFiltered__MMColParam12 = "0"
If (Request.Form("countryDDM")   <> "") Then
  ContactsFiltered__MMColParam12 = Request.Form("countryDDM")  
End If
%>
<%
Dim ContactsFiltered
Dim ContactsFiltered_numRows

Set ContactsFiltered = Server.CreateObject("ADODB.Recordset")
ContactsFiltered.ActiveConnection = MM_eimmigration_STRING
ContactsFiltered.Source = "SELECT a.UserId ,          a.UserType ,          a.FirmId ,          a.EmployerId ,          a.LastNm ,          a.FirstNm ,          a.DobD ,          a.SSN,          a.Email ,          a.Nationality ,          a.NiStatus ,          a.NIVMaxStatus ,          a.ExpiresOnD ,          a.Docstatusstat ,          a.NIVMaxStatus ,          a.I94DateD ,          a.I94,          a.I797Date ,          a.I797,          a.EadDate ,          a.Ead,          a.ApDate ,          a.ApNum,          a.Iap66Date ,          a.Iap66,          a.GcDate ,          a.GC,          a.I20Date ,          a.I20,          a.PpExpireOnD ,          a.PpNum,          a.PobCountry ,          b.MaidenNm AS Employer ,          d.MailStr + ' ' + d.MaidenNm AS Attorney ,          a.PobCountry ,          a.archivedcont ,          a.contactstatus ,          a.Docstatusstat ,          e.Docstatdesc ,          a.Dswg ,          a.VisaExp ,          a.VisaType ,          a.VisaStatus  FROM users a          LEFT JOIN users AS b ON a.employerid = b.userid          INNER JOIN attscont AS c ON a.userid = c.userid          INNER JOIN users AS d ON c.attyid = d.userid          LEFT JOIN Documentstatus AS e ON e.documentstatus = a.Docstatusstat  WHERE a.usertype = 'contact'          AND a.firmid = " + Replace(ContactsFiltered__MMColParam, "'", "''") + "          AND d.userid = " + Replace(ContactsFiltered__MMColParam2, "'", "''") + "          AND a.Archivedcont LIKE '" + Replace(ContactsFiltered__MMColParam3, "'", "''") + "'          AND a.Contactstatus LIKE '" + Replace(ContactsFiltered__MMColParam4, "'", "''") + "'          AND ISNULL(a.FirstNm, '') LIKE '" + Replace(ContactsFiltered__MMColParam5, "'", "''") + "%'          AND ISNULL(a.LastNm, '') LIKE '" + Replace(ContactsFiltered__MMColParam6, "'", "''") + "%'          AND ISNULL(a.SSN, '') LIKE '" + Replace(ContactsFiltered__MMColParam7, "'", "''") + "%'          AND ISNULL(a.email, '') LIKE '" + Replace(ContactsFiltered__MMColParam8, "'", "''") + "%'          AND ISNULL(a.Nationality, '') LIKE '" + Replace(ContactsFiltered__MMColParam9, "'", "''") + "%'          AND ISNULL(a.Nistatus, '') LIKE '" + Replace(ContactsFiltered__MMColParam10, "'", "''") + "%' AND b.userid IN('" + Replace( Replace(ContactsFiltered__MMColParam11, "'", "''"), ",","','") + "') AND a.PoBCountry IN ('" + Replace(ContactsFiltered__MMColParam12, "'", "''") + "')  ORDER BY " + Replace(ContactsFiltered__MMColParam500, "'", "''") + ""
ContactsFiltered.CursorType = 0
ContactsFiltered.CursorLocation = 2
ContactsFiltered.LockType = 1
ContactsFiltered.Open()


---
0
 
JimFiveCommented:
The changes that were made to Param11 need to be made to Param12 as well.  Once you've done that, if it doesn't work, then we need to see the actual executed query.  Set the ContactsFiltered.Source to a variable and write it out so we can see what is being passed to the engine.
0
 
AleksAuthor Commented:
I got this error after applying to both:

Microsoft VBScript compilation error '800a0409'

Unterminated string constant

/bluedot/Intranet/reports/ContactReports/07results.asp, line 481

----

This is the whole code:

<%
Dim ContactsFiltered__MMColParam
ContactsFiltered__MMColParam = "0"
If (Session("FirmId") <> "") Then
  ContactsFiltered__MMColParam = Session("FirmId")
End If
%>
<%
Dim ContactsFiltered__MMColParam2
ContactsFiltered__MMColParam2 = "0"
If (Request.Form("AttyParalegals") <> "") Then
  ContactsFiltered__MMColParam2 = Request.Form("AttyParalegals")
End If
%>
<%
Dim ContactsFiltered__MMColParam3
ContactsFiltered__MMColParam3 = "%"
If (Request.Form("statuscont")  <> "") Then
  ContactsFiltered__MMColParam3 = Request.Form("statuscont")
End If
%>
<%
Dim ContactsFiltered__MMColParam4
ContactsFiltered__MMColParam4 = "%"
If (Request.Form("Contype")  <> "") Then
  ContactsFiltered__MMColParam4 = Request.Form("Contype")
End If
%>
<%
Dim ContactsFiltered__MMColParam5
ContactsFiltered__MMColParam5 = "%"
If (Request.Form("FirstNm") <> "") Then
  ContactsFiltered__MMColParam5 = Request.Form("FirstNm")
End If
%>
<%
Dim ContactsFiltered__MMColParam6
ContactsFiltered__MMColParam6 = "%"
If (Request.Form("LastNm") <> "") Then
  ContactsFiltered__MMColParam6 = Request.Form("LastNm")
End If
%>
<%
Dim ContactsFiltered__MMColParam7
ContactsFiltered__MMColParam7 = "%"
If (Request.Form("SSN") <> "") Then
  ContactsFiltered__MMColParam7 = Request.Form("SSN")
End If
%>
<%
Dim ContactsFiltered__MMColParam8
ContactsFiltered__MMColParam8 = "%"
If (Request.Form("email") <> "") Then
  ContactsFiltered__MMColParam8 = Request.Form("email")
End If
%>
<%
Dim ContactsFiltered__MMColParam9
ContactsFiltered__MMColParam9 = "%"
If (Request.Form("Nationality") <> "") Then
  ContactsFiltered__MMColParam9 = Request.Form("Nationality")
End If
%>
<%
Dim ContactsFiltered__MMColParam10
ContactsFiltered__MMColParam10 = "%"
If (Request.Form("Currstatus") <> "") Then
  ContactsFiltered__MMColParam10 = Request.Form("Currstatus")
End If
%>
<%
Dim ContactsFiltered__MMColParam500
ContactsFiltered__MMColParam500 = "a.FirstNm"
If (Request.Form("Orderbygeninfo")  <> "") Then
  ContactsFiltered__MMColParam500 = Request.Form("Orderbygeninfo")
End If
%>
<%
Dim ContactsFiltered__MMColParam11
ContactsFiltered__MMColParam11 = "0"
If (Request.Form("Employerlist")   <> "") Then
  ContactsFiltered__MMColParam11 = Request.Form("Employerlist")  
End If
%>
<%
Dim ContactsFiltered__MMColParam12
ContactsFiltered__MMColParam12 = "0"
If (Request.Form("countryDDM")   <> "") Then
  ContactsFiltered__MMColParam12 = Request.Form("countryDDM")  
End If
%>
<%
Dim ContactsFiltered
Dim ContactsFiltered_numRows

Set ContactsFiltered = Server.CreateObject("ADODB.Recordset")
ContactsFiltered.ActiveConnection = MM_eimmigration_STRING
ContactsFiltered.Source = "SELECT a.UserId ,          a.UserType ,          a.FirmId ,          a.EmployerId ,          a.LastNm ,          a.FirstNm ,          a.DobD ,          a.SSN,          a.Email ,          a.Nationality ,          a.NiStatus ,          a.NIVMaxStatus ,          a.ExpiresOnD ,          a.Docstatusstat ,          a.NIVMaxStatus ,          a.I94DateD ,          a.I94,          a.I797Date ,          a.I797,          a.EadDate ,          a.Ead,          a.ApDate ,          a.ApNum,          a.Iap66Date ,          a.Iap66,          a.GcDate ,          a.GC,          a.I20Date ,          a.I20,          a.PpExpireOnD ,          a.PpNum,          a.PobCountry ,          b.MaidenNm AS Employer ,          d.MailStr + ' ' + d.MaidenNm AS Attorney ,          a.PobCountry ,          a.archivedcont ,          a.contactstatus ,          a.Docstatusstat ,          e.Docstatdesc ,          a.Dswg ,          a.VisaExp ,          a.VisaType ,          a.VisaStatus  FROM users a          LEFT JOIN users AS b ON a.employerid = b.userid          INNER JOIN attscont AS c ON a.userid = c.userid          INNER JOIN users AS d ON c.attyid = d.userid          LEFT JOIN Documentstatus AS e ON e.documentstatus = a.Docstatusstat  WHERE a.usertype = 'contact'          AND a.firmid = " + Replace(ContactsFiltered__MMColParam, "'", "''") + "          AND d.userid = " + Replace(ContactsFiltered__MMColParam2, "'", "''") + "          AND a.Archivedcont LIKE '" + Replace(ContactsFiltered__MMColParam3, "'", "''") + "'          AND a.Contactstatus LIKE '" + Replace(ContactsFiltered__MMColParam4, "'", "''") + "'          AND ISNULL(a.FirstNm, '') LIKE '" + Replace(ContactsFiltered__MMColParam5, "'", "''") + "%'          AND ISNULL(a.LastNm, '') LIKE '" + Replace(ContactsFiltered__MMColParam6, "'", "''") + "%'          AND ISNULL(a.SSN, '') LIKE '" + Replace(ContactsFiltered__MMColParam7, "'", "''") + "%'          AND ISNULL(a.email, '') LIKE '" + Replace(ContactsFiltered__MMColParam8, "'", "''") + "%'          AND ISNULL(a.Nationality, '') LIKE '" + Replace(ContactsFiltered__MMColParam9, "'", "''") + "%'          AND ISNULL(a.Nistatus, '') LIKE '" + Replace(ContactsFiltered__MMColParam10, "'", "''") + "%' AND AND b.userid IN('" + Replace( Replace(ContactsFiltered__MMColParam11, "'", "''"), ",","','") + "')
            AND a.PoBCountry IN('" + Replace( Replace(ContactsFiltered__MMColParam12, "'", "''"), ",","','") + "')  ORDER BY " + Replace(ContactsFiltered__MMColParam500, "'", "''") + ""
ContactsFiltered.CursorType = 0
ContactsFiltered.CursorLocation = 2
ContactsFiltered.LockType = 1
ContactsFiltered.Open()

ContactsFiltered_numRows = 0
%>

----------------------------------------------------

DW doesn't recognize the parameter 11 and 12 when I open the recordset. So far this is not working am afraid.
0
 
JimFiveCommented:
We need to see the SQL Command after it is has been built. Can you write out the ContactsFiltered.Source before you try to open it.
0
 
AleksAuthor Commented:
!
0
Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.

Join & Write a Comment

Featured Post

Cloud Class® Course: Microsoft Office 2010

This course will introduce you to the interfaces and features of Microsoft Office 2010 Word, Excel, PowerPoint, Outlook, and Access. You will learn about the features that are shared between all products in the Office suite, as well as the new features that are product specific.

  • 6
  • 6
  • 2
Tackle projects and never again get stuck behind a technical roadblock.
Join Now