Solved

Check to see if similar record exists before insert

Posted on 2008-10-04
4
979 Views
Last Modified: 2012-05-05
Dear Experts

I am using Dreamweaver and  SQL 2005.

We have a web page with a form that enters data for an address book.  The problem we are experiencing is that users are occasionally entering duplicate address book data.

What we would like to achieve is to prevent successfull submission of the form if the form fields cTitle, cFirstName and cSurName already exist in a row on that table 'addressbook'

I wondered if anyone could advise how to read the data entered into these 3 form fields and prevent insertion into the table if a row already exists with the same data.  If possible we would like a pop up warning message to appear after hitting submit if a record already exists on the table.

Please see existing code below.

Thanks for any help.

Grant
<%@LANGUAGE="VBSCRIPT"%>

<!--#include file="../../Connections/camsmith.asp" -->

<%

if Session("MM_Username") = "" then

Response.Redirect("solicitor_estateagency_cmslogin_timeout.asp")

end if

%>

<%

Dim MM_editAction

MM_editAction = CStr(Request.ServerVariables("SCRIPT_NAME"))

If (Request.QueryString <> "") Then

  MM_editAction = MM_editAction & "?" & Server.HTMLEncode(Request.QueryString)

End If
 

' boolean to abort record edit

Dim MM_abortEdit

MM_abortEdit = false

%>

<%

If (CStr(Request("MM_insert")) = "form1") Then

  If (Not MM_abortEdit) Then

    ' execute the insert

    Dim MM_editCmd
 

    Set MM_editCmd = Server.CreateObject ("ADODB.Command")

    MM_editCmd.ActiveConnection = MM_camsmith_STRING

    MM_editCmd.CommandText = "INSERT INTO dbo.addressbook (cTitle, cFirstName, cFirstName2, cSurname, cCompany, cAddress1, cAddress2, cTown, cPostCode, cType, cTelHome, cTelWork, cTelMobile, cTelMobile2, cEmail, cEmail2) VALUES (?,  ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)" 

    MM_editCmd.Prepared = true

	if Request.Form("cTitle") <> "other" then

    MM_editCmd.Parameters.Append MM_editCmd.CreateParameter("param1", 201, 1, 10, Request.Form("cTitle")) 

	else' adLongVarChar

    MM_editCmd.Parameters.Append MM_editCmd.CreateParameter("param2", 201, 1, 10, Request.Form("cTitle_other")) 

	end if ' adLongVarChar

    MM_editCmd.Parameters.Append MM_editCmd.CreateParameter("param3", 201, 1, 30, Request.Form("cFirstName")) ' adLongVarChar

    MM_editCmd.Parameters.Append MM_editCmd.CreateParameter("param4", 201, 1, 30, Request.Form("cFirstName2")) ' adLongVarChar

    MM_editCmd.Parameters.Append MM_editCmd.CreateParameter("param5", 202, 1, 30, Request.Form("cSurName")) ' adVarWChar

    MM_editCmd.Parameters.Append MM_editCmd.CreateParameter("param6", 201, 1, 30, Request.Form("cCompany")) ' adLongVarChar

    MM_editCmd.Parameters.Append MM_editCmd.CreateParameter("param7", 201, 1, 60, Request.Form("cAddress1")) ' adLongVarChar

    MM_editCmd.Parameters.Append MM_editCmd.CreateParameter("param8", 201, 1, 60, Request.Form("cAddress2")) ' adLongVarChar

    MM_editCmd.Parameters.Append MM_editCmd.CreateParameter("param9", 201, 1, 60, Request.Form("cTown")) ' adLongVarChar

    MM_editCmd.Parameters.Append MM_editCmd.CreateParameter("param10", 201, 1, 10, Request.Form("cPostCode")) ' adLongVarChar

    MM_editCmd.Parameters.Append MM_editCmd.CreateParameter("param11", 201, 1, 20, Request.Form("cType")) ' adLongVarChar

    MM_editCmd.Parameters.Append MM_editCmd.CreateParameter("param12", 201, 1, 20, Request.Form("cTelHome")) ' adLongVarChar

    MM_editCmd.Parameters.Append MM_editCmd.CreateParameter("param13", 201, 1, 20, Request.Form("cTelWork")) ' adLongVarChar

    MM_editCmd.Parameters.Append MM_editCmd.CreateParameter("param14", 201, 1, 20, Request.Form("cTelMobile")) ' adLongVarChar

    MM_editCmd.Parameters.Append MM_editCmd.CreateParameter("param15", 201, 1, 20, Request.Form("cTelMobile2")) ' adLongVarChar

    MM_editCmd.Parameters.Append MM_editCmd.CreateParameter("param16", 201, 1, 100, Request.Form("cEmail")) ' adLongVarChar

    MM_editCmd.Parameters.Append MM_editCmd.CreateParameter("param17", 201, 1, 100, Request.Form("cEmail2")) ' adLongVarChar

    MM_editCmd.Execute

    MM_editCmd.ActiveConnection.Close
 

    ' append the query string to the redirect URL

    Dim MM_editRedirectUrl

    MM_editRedirectUrl = "solicitor_estateagency_addressbook.asp"

    If (Request.QueryString <> "") Then

      If (InStr(1, MM_editRedirectUrl, "?", vbTextCompare) = 0) Then

        MM_editRedirectUrl = MM_editRedirectUrl & "?" & Request.QueryString

      Else

        MM_editRedirectUrl = MM_editRedirectUrl & "&" & Request.QueryString

      End If

    End If

    Response.Redirect(MM_editRedirectUrl)

  End If

End If

%>
 
 

<%

Dim user__MMColParam

user__MMColParam = "1"

If (Session("MM_Username") <> "") Then 

  user__MMColParam = Session("MM_Username")

End If

%>

<%

Dim category

Dim category_cmd

Dim category_numRows
 

Set category_cmd = Server.CreateObject ("ADODB.Command")

category_cmd.ActiveConnection = MM_camsmith_STRING

category_cmd.CommandText = "SELECT * FROM dbo.addressbook_categories ORDER BY cCategory" 

category_cmd.Prepared = true
 

Set category = category_cmd.Execute

category_numRows = 0

%>

<%

Dim user

Dim user_cmd

Dim user_numRows
 

Set user_cmd = Server.CreateObject ("ADODB.Command")

user_cmd.ActiveConnection = MM_camsmith_STRING

user_cmd.CommandText = "SELECT * FROM dbo.cmslogin WHERE UserLoginID = ?" 

user_cmd.Prepared = true

user_cmd.Parameters.Append user_cmd.CreateParameter("param1", 200, 1, 10, user__MMColParam) ' adVarChar
 

Set user = user_cmd.Execute

user_numRows = 0

%><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">

<head>

<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />

<title> Estate-Agent Solicitor Intelligent Property Management</title>

<script type="text/javascript" src="scripts.js"></script>
 

<script type="text/javascript">

<!--
 

function ToggleOther()

{

    var select = document.getElementById("cTitle");

    var selected = select.selectedIndex;

 

    // -1 means no item has been selected

    if(selected == -1)

        return;

 

    // display the texfield

    if(select.options[selected].value == "other")

    {

        document.getElementById("cTitle_other").style.display = "";

    }

    // otherwise hide it

    else

    {

       document.getElementById("cTitle_other").style.display = "none";

    }

}
 
 
 

function MM_preloadImages() { //v3.0

  var d=document; if(d.images){ if(!d.MM_p) d.MM_p=new Array();

    var i,j=d.MM_p.length,a=MM_preloadImages.arguments; for(i=0; i<a.length; i++)

    if (a[i].indexOf("#")!=0){ d.MM_p[j]=new Image; d.MM_p[j++].src=a[i];}}

}
 

function YY_checkform() { //v3.05

  var args = YY_checkform.arguments; var myDot=true; myV=''; var myErr='';var addErr=false;

  if (document.all){eval("args[0]=args[0].replace(/.layers/gi, '.all');");}

  for (var i=1; i<args.length;i=i+4){

    if (args[i+1].charAt(0)=='#'){

      var myReq=true; args[i+1]=args[i+1].substring(1);

    }else{myReq=false}

    var myObj = eval(args[0]+'.'+args[i])

    if (myObj.type=='text'){

      if (myReq&&myObj.value.length==0){addErr=true}

      myV=myObj.value;

      if ((myV.length>0)&&(args[i+2]==1)){ //fromto

        if (isNaN(parseInt(myV))||myV<args[i+1].substring(0,args[i+1].indexOf('_'))/1||myV > args[i+1].substring(args[i+1].indexOf('_')+1)/1){addErr=true}

      }

      if ((myV.length>0)&&(args[i+2]==2)){ //e-mail

        if (myV.lastIndexOf('.')<myV.lastIndexOf('@')||myV.lastIndexOf('.')==-1||myV.lastIndexOf('@')==-1){addErr=true}

      }

      if ((myV.length>0)&&(args[i+2]==3)){ // date

        var myD=''; myM=''; myY=''; myYY=0; myDot=true;

        for(var j=0;j<args[i+1].length;j++){

          if(args[i+1].charAt(j)=='D')myD=myD.concat(myObj.value.charAt(j));

          if(args[i+1].charAt(j)=='M')myM=myM.concat(myObj.value.charAt(j));

          if(args[i+1].charAt(j)=='Y'){myY=myY.concat(myObj.value.charAt(j)); myYY++}

          if(args[i+1].charAt(j)=='-'&&myObj.value.charAt(j)!='-')myDot=false;

          if(args[i+1].charAt(j)=='.'&&myObj.value.charAt(j)!='.')myDot=false;

          if(args[i+1].charAt(j)=='/'&&myObj.value.charAt(j)!='/')myDot=false;

        }

        if(myD/1<1||myD/1>31||myM/1<1||myM/1>12||myY.length!=myYY)myDot=false;

        if(!myDot){addErr=true}

       }

      if ((myV.length>0)&&(args[i+2]==4)){ // time

        var myDot=true;

        var myH = myObj.value.substr(0,myObj.value.indexOf(':'))/1;

        var myM = myObj.value.substr(myObj.value.indexOf(':')+1,2)/1;

                var myP = myObj.value.substr(myObj.value.indexOf(':')+3,2);

        if ((args[i+1])=="12:00pm"){if(myH<0||myH>12||myM<0||myM>59||(myP!="pm"&&myP!="am")||myObj.value.length>7)myDot=false; }

        if ((args[i+1])=="12:00"){if(myH<0||myH>12||myM<0||myM>59||myObj.value.length>5)myDot=false;}

        if ((args[i+1])=="24:00"){if(myH<0||myH>23||myM<0||myM>59||myObj.value.length>5)myDot=false;}

        if(!myDot){addErr=true}

      }

      if ((myV.length>0)&&(args[i+2]==5)){ // check this 2

        if (!eval(args[0]+'.'+args[i+1]+'.checked')){addErr=true}

      }

    }

    if (myObj.type=='radio'){

      if (args[i+2]==1&&myObj.checked&&eval(args[0]+'.'+args[i+1]+'.value.length')/1==0){addErr=true}

      if (args[i+2]==2){

        myDot=false;

        myV=eval(args[0]+'.'+args[i].substring(0,args[i].lastIndexOf('[')));

        for(var j=0;j<myV.length;j++){myDot=myDot||myV[j].checked}

        if(!myDot){myErr+='* ' +args[i+3]+'\n'}

      }

    }

    if (myObj.type=='checkbox'){

      if(args[i+2]==1&&myObj.checked==false){addErr=true}

      if(args[i+2]==2&&myObj.checked&&eval(args[0]+'.'+args[i+1]+'.value.length')/1==0){addErr=true}

    }

    if (myObj.type=='select-one'||myObj.type=='select-multiple'){

      if(args[i+2]==1&&eval(args[0]+'.'+args[i]+'.selectedIndex')/1==0){addErr=true}

    }

    if (myObj.type=='textarea'){

      myV = eval(args[0]+'.'+args[i]+'.value');

      if(myV.length<args[i+1]){addErr=true}

    }

    if (addErr){myErr+='* '+args[i+3]+'\n'; addErr=false}

  }

  if (myErr!=''){alert('The required information is incomplete or contains errors:\t\t\t\t\t\n\n'+myErr)}

  document.MM_returnValue = (myErr=='');

}

//-->

</script>
 
 

<link href="solicitors_estateagency_styles.css" rel="stylesheet" type="text/css" />

<script type="text/javascript" src="p7pm/p7popmenu.js"></script>

<link href="includes/p7pm/p7pmv0.css" rel="stylesheet" type="text/css" />

<style type="text/css">

<!--

.style1 {color: #FFFFFF}

-->

</style>

</head>

<body onload="P7_initPM(0,1,1,-20,10);MM_preloadImages('../graphics/menu/currentpropertylist_bt_ro.jpg','../graphics/menu/addnewproperty_bt_ro.jpg','../graphics/menu/propertyarchive_bt_ro.jpg')">

<div id ="outerwrapper">

  <table width="840" height="75" border="0" cellpadding="0" cellspacing="0" background="../graphics/cms_bg_header.jpg">

    <tr>

      <td><img src="../graphics/menu2/sea_logo.jpg" alt="Solicitor Estate Agency Property Management" width="200" height="75" hspace="0" vspace="0" /></td>

      <td width="640" align="right" valign="bottom"><table width="0" height="70" border="0" cellpadding="0" cellspacing="0">

        <tr>

          <td colspan="10"></td>

        </tr>

        <tr align="right">

          <td width="80"><img src="../graphics/easi_menu/property_details_inactive.jpg" alt="Property Details" name="Image12" width="62" height="70" id="Image12" /></td>

          <td><img src="../graphics/easi_menu/checklists_inactive.jpg" alt="Checklists" width="62" height="70" /></td>

          <td><img src="../graphics/easi_menu/viewing_appts_inactive.jpg" alt="Viewing Appointments" width="62" height="70" id="Image21" /></td>

          <td><img src="../graphics/easi_menu/noi_inactive.jpg" alt="Notes of Interest" width="62" height="70" id="Image31" /></td>

          <td><img src="../graphics/easi_menu/surveys_inactive.jpg" alt="Surveys Instructed" width="62" height="70" id="Image41" /></td>

          <td><img src="../graphics/easi_menu/offers_inactive.jpg" alt="Offers Received" width="62" height="70" id="Image51" /></td>

          <td><img src="../graphics/easi_menu/merge_docs_inactive.jpg" alt="Merge Documents" width="62" height="70" id="Image61" /></td>

          <td><img src="../graphics/easi_menu/upload_inactive.jpg" alt="Upload Photo/PDF" width="62" height="70" id="Image71" /></td>

          <td><img src="../graphics/easi_menu/general_notes_inactive.jpg" alt="General Notes" width="62" height="70" id="Image81" /></td>

          <td><img src="../graphics/easi_menu/enquiries_inactive.jpg" alt="Enquiries" width="62" height="70" /></td>

        </tr>

      </table></td>

    </tr>

  </table>

  <div id="maincontent">

  <table width="100%" height="0" border="0" cellpadding="0" cellspacing="0">

    <tr>

      <td height="0" colspan="2" valign="top" background="../graphics/menu_cms_bg.gif"></td>

      </tr>

    <tr>

      <td height="30" colspan="2" id="searchfunction_property"><div align="right">

        <p>You are logged in as <%=(user.Fields.Item("UserFirstName").Value)%> </a><%=(user.Fields.Item("UserLastName").Value)%></p>

      </div></td>

      </tr>

    <tr>

      <td width="185" valign="top" bgcolor="#024B8F"><!--#include file="includes/mainnav_easi.asp" --></td>

      <td height="420" valign="top" bgcolor="#FFFFFF">

        <div class="highlight">

          <table width="100%" border="0" cellspacing="0" cellpadding="0">

          <tr>

            <td width="413"><h1> <a href="solicitor_estateagency_editproperty.asp"></a><img src="../graphics/menu/addressbook_icon.jpg" alt="Address Book" name="Image1" width="60" height="48" hspace="5" border="0" align="left" id="Image1" />Address Book  </h1>

                <h2 >Add Contact </h2></td>

            <td width="227" align="right">&nbsp;</td>

          </tr>

        </table>

        </div>        

        <div class="propertydetails">

          <form ACTION="<%=MM_editAction%>" METHOD="POST" name="form1" id="form1" onsubmit="YY_checkform('document.form1','cFirstName','#q','0','Please enter the Contact First Name','cSurName','#q','0','Please enter the Contact Surname','cTelHome','#q','0','Please enter the Contact Primary Telephone Number','cTitle','q','1','Please select the Contact Title','cType','q','1','Please select the Contact Category');return document.MM_returnValue">

            <table width="100%" border="0" cellpadding="0" cellspacing="0">

              <tr>

                <td><p>Title: </p></td>

                <td colspan="3">

                  <label>

<select name="cTitle" id="cTitle" onchange="ToggleOther();">

  <option value="NA">Please Select</option>

  <option value="Mr">Mr</option>

  <option value="Mrs">Mrs</option>

  <option value="Ms">Ms</option>

  <option value="Mr &amp; Mrs">Mr &amp; Mrs</option>

  <option value="other">Other</option>

</select>

  <input type="text" id="cTitle_other" name="cTitle_other" size="15" maxlength="11" style="display: none;" />*                  </label>               </td>

              </tr>

              <tr>

                <td width="33%"><p>First Name: </p></td>

                <td width="24%">

                    <input name="cFirstName" type="text" id="cFirstName" size="15" maxlength="30" />

                  *</td>

                <td width="20%"><p>Spouse First Name: </p>

                  </td>

                <td width="23%"><input name="cFirstName2" type="text" id="cFirstName2" size="15" maxlength="30" /></td>

              </tr>

              <tr>

                <td height="22"><p>Surname:</p></td>

                <td colspan="3">

                      <input name="cSurName" type="text" id="cSurName" size="30" maxlength="30" /> 

                  * </td>

              </tr>

              <tr>

                <td height="22"><p>Contact Company: </p></td>

                <td colspan="3">

                  <input name="cCompany" type="text" id="cCompany" size="30" maxlength="30" />                </td>

              </tr>

              <tr>

                <td height="22"><p>House No./ Name: </p></td>

                <td colspan="3">

                    <input name="cAddress1" type="text" id="cAddress1" size="30" maxlength="60" />                </td>

              </tr>

              <tr>

                <td><p>Street Name: </p></td>

                <td colspan="3">

                    <input name="cAddress2" type="text" id="cAddress2"  size="30" maxlength="60" />               </td>

              </tr>

              <tr>

                <td><p>Town:</p></td>

                <td colspan="3">

                    <input name="cTown" type="text" id="cTown" size="30" maxlength="60" />                </td>

              </tr>

              <tr>

                <td><p>Postcode:</p></td>

                <td colspan="3">

                    <input name="cPostCode" type="text" id="cPostCode"  size="10" maxlength="10" />               </td>

              </tr>

              <tr>

                <td>&nbsp;</td>

                <td colspan="3">&nbsp;</td>

              </tr>

              <tr>

                <td><p>Contact Category: </p></td>

                <td colspan="3">

                  <label>

                    <select name="cType" id="cType">

                      <option value="NA">Please Select...</option>

                      <%

While (NOT category.EOF)

%>

                      <option value="<%=(category.Fields.Item("cCategory").Value)%>"><%=(category.Fields.Item("cCategory").Value)%></option>

                      <%

  category.MoveNext()

Wend

If (category.CursorType > 0) Then

  category.MoveFirst

Else

  category.Requery

End If

%>

                    </select>

                    </label>

                *</td>

              </tr>

              <tr>

                <td>&nbsp;</td>

                <td colspan="3">&nbsp;</td>

              </tr>

              <tr>

                <td><p>Telephone No. (Primary) </p></td>

                <td colspan="3">

                    <input name="cTelHome" type="text" id="cTelHome" size="20" maxlength="20" />

                  *</td>

              </tr>

              <tr>

                <td><p>Telephone No. (Work) </p></td>

                <td colspan="3">

                    <input name="cTelWork" type="text" id="cTelWork" size="20" maxlength="20" />               </td>

              </tr>

              <tr>

                <td><p>Telephone No. (Primary Mobile) </p></td>

                <td colspan="3">

                    <input name="cTelMobile" type="text" id="cTelMobile" size="20" maxlength="20" />                </td>

              </tr>

              <tr>

                <td><p>Telephone No. (Additional Mobile) </p></td>

                <td colspan="3"><input name="cTelMobile2" type="text" id="cTelMobile2" size="20" maxlength="20" />                </td>

              </tr>

              <tr>

                <td><p>E-mail Address:</p></td>

                <td colspan="3">

                    <input name="cEmail" type="text" id="cEmail" size="30" maxlength="100" />               </td>

              </tr>

              <tr>

                <td><p>E-mail Address: (Secondary) </p></td>

                <td colspan="3"><input name="cEmail2" type="text" id="cEmail2" size="30" maxlength="100" />                </td>

              </tr>

              <tr>

                <td>&nbsp;</td>

                <td colspan="3">

                  <div align="left">

                    <input name="Add Property" type="submit" class="button" onclick="YY_checkform('document.form1');return document.MM_returnValue" value="Submit" />

                    </div></td></tr>

            </table>

            

            

          

            

           

         
 

            <input type="hidden" name="MM_insert" value="form1">

          </form>

          <p>&nbsp;</p>

          <p>
 

 </p>

        </div>      

        <br /></td>

    </tr>

  </table>

</div>

</div>

<!--#include file="includes/footer.asp" -->

</body>

</html>
 

<%

category.Close()

Set category = Nothing

%>

<%

user.Close()

Set user = Nothing

%>

Open in new window

0
Comment
Question by:grantballantyne
  • 2
4 Comments
 
LVL 70

Expert Comment

by:Jason C. Levine
Comment Utility
Hi Grant,

The easiest thing to do to prevent the data from going in is to set a unique index on all three of the name fields.  That will generate an error when duplicate data is inserted and you can then trap the error via coding and produce a nice message.
0
 

Author Comment

by:grantballantyne
Comment Utility
Jason

Thanks for the reply.

If I was, as you suggest, to set a unique index on all three of the fields does would this mean that if someone tried to enter the same value on just one of the three fields that an error would be returned.

If so, you will appreciate that this will not work as there will be many records that are added where the values of any of the fields can be the same.  

I guess i need a way to preventing the insertion if all three fields are the same.


Grant
 
0
 
LVL 70

Accepted Solution

by:
Jason C. Levine earned 500 total points
Comment Utility
No, you misunderstood.

ALTER TABLE `test` ADD UNIQUE `NAMES` ( `FNAME` , `MIDNAME` , `LNAME` )

That will create a unique index made up of the three name fields combined.
0
 
LVL 13

Expert Comment

by:AielloJ
Comment Utility
Grant:

What you're trying to achieve is a major challenge because of the way people enter data.  Someone may enter their title of Senior Customer Representative spelled out fully or with any number of abbreviations and / or punctuation.  For the example I gave you could have: "Sr Cust Rep", "Sr. Customer Rep", and a number of other ways to enter just the cTitle field.  The same happens with the first name when they enter "Bob", or "Rob", for "Robert".  You usually have better luck with surnames, as most people will spell them right.   If this isn't a medical, or other type system, where privacy isn't an overwhelming consideration, you might look for a match on the first letter of the first name, and the surname, and ask the user if this is their record if you find a match.

I noticed you have email addresses and telephone numbers in your database. If it's possible for them to login or identify themselves with something like an email address it's much easier.
0

Featured Post

6 Surprising Benefits of Threat Intelligence

All sorts of threat intelligence is available on the web. Intelligence you can learn from, and use to anticipate and prepare for future attacks.

Join & Write a Comment

Suggested Solutions

I still run into .cgi files every now and then. In some instances, I actually prefer the simplicity of a .cgi script to other options. Since I use DreamWeaver extensively, what I needed was a way to open .cgi scripts in Dreamweaver. And I wanted to …
This demonstration started out as a follow up to some recently posted questions on the subject of logging in: http://www.experts-exchange.com/Programming/Languages/Scripting/JavaScript/Q_28634665.html and http://www.experts-exchange.com/Programming/…
Access reports are powerful and flexible. Learn how to create a query and then a grouped report using the wizard. Modify the report design after the wizard is done to make it look better. There will be another video to explain how to put the final p…
In this tutorial you'll learn about bandwidth monitoring with flows and packet sniffing with our network monitoring solution PRTG Network Monitor (https://www.paessler.com/prtg). If you're interested in additional methods for monitoring bandwidt…

744 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

Need Help in Real-Time?

Connect with top rated Experts

15 Experts available now in Live!

Get 1:1 Help Now