Question

Help figuring out this logic.

Asked by: aman0711

Hi Experts,

          I need your help in figuring out this problem.

              So on this new web module, we have a section where admin can track how many users
              logged on to the website in a given frame of time.

              For this I have a java code, which captures users ID and LOGIN TIME and dump in a
              table(Snapshot attached).
              When the user logs in the second time, LAST_LOGIN_TIME and LAST_LOGIN_TIME_2(time before
              current login) updates using Java code.

              Now the problem I am facing is, how to implement a logic for counting, "How many users logged
              on to the website in a given frame of time (supllied from Web Interface)".

              Your help is highly needed.

This Question has been solved and asker verified All Experts Exchange premium technology solutions are available to subscription members.

Subscribe now for full access to Experts Exchange and get

Instant Access to this Solution

  • Plus...
  • 30 Day FREE access, no risk, no obligation
  • Collaborate with the world's top tech experts
  • Unlimited access to our exclusive solution database
  • Never be left without tech help again

Subscribe Now

Asked On
2009-10-30 at 12:03:22ID24859109
Tags

Oracle

,

SQL

,

Java

Topics

PL / SQL

,

Oracle Database

,

Java Programming Language

Participating Experts
4
Points
500
Comments
43

Trusted by hundreds of thousands everyday for fast, accurate and reliable tech support.

  • "The time we save is the biggest benefit of Experts Exchange to Warner Bros. What could take multiple guys 2 hours or more each to find is accessed in around 15 minutes on Experts Exchange." Mike Kapnisakis, Warner Bros.
  • "Our team likes having a resource that is more secure than just using Google and most experts using this service really know their stuff. It's nice to look here first versus using Google." Dayna Sellner, Lockheed Martin
  • "Anytime that I've been stumped with a problem, 9 out of 10 times Experts Exchange has either the accepted solution or an open discussion of the potential solution to the problem." Kenny Red, eBay Inc.

See what Experts Exchange can do for you.

Got a question?

We've got the answer.

Experts Exchange has been collecting answers to technology questions since 1996…3 million and counting! If you have a question, chances are we already have your answer.

Screenshot of Experts Exchange Knowledgebase

Need individual assistance?

Our experts are ready to help.

If you can't find the exact answer you're looking for, ask our exclusive community of 50,000 experts. You’ll get a personalized answer from a trusted professional.

Screenshot of Experts Exchange Knowledgebase

Want to learn from the best?

Read articles from industry experts.

Thousands of free tech tips, tricks, how-to’s and tutorials are available in our peer reviewed articles section. See for yourself how smart our experts are, no login required.

Screenshot of an Article

Working on a long term project?

Store your work and research.

Save solutions to your questions, answers you’ve discovered through searching plus helpful articles in your personal knowledgebase for easy future access.

Screenshot of Experts Exchange Knowledgebase

Access the answers to your technology questions today.

Subscribe Now

30-day free trial. Register in 60 seconds.

What Makes Experts Exchange Unique?

Members of the expert community talk about why the experience at Experts Exchange is different than what you will find anywhere else.

Trusted by the world's most respected brands.

image of each brand's logo

Faithfully serving IT professionals since 1996.

Experts Exchange Logo

Try it out and discover for yourself.

Subscribe Now

30-day free trial. Register in 60 seconds.

Related Solutions

  1. Frames
    I want to load a frame at a particular point in the web page. But I want it to be a certain width and height. I don't want to have to break the rest of the page into mulitple frames. I tried using an inline frame, and it works like I would want, except that I can't seem to fi...
  2. SnapShot
    I used to use snapshot whats part of Zenworks for taking a snapshot then making a change to the PC then take another snapshot then extract the difference. Is there a tool that MS do? if so whats it called and were do I get it? Many thanks
  3. What is the most highly compressed video format?
    What is the most highly compressed video format? What is the 'easiest way' to record a screencast of a session on the computer into that format? What is the 'most economical way' to record a screencast of a session on the computer into that format?
  4. java Logic
    Hi Experts, I need slight help with to figure out logic for the following problem: We built a web portal and we have a horizontal navigation panel in the header of the site. (Snapshot attached) Now what I want is: the ADMIN link sh...

Free Tech Articles

  1. WARNING: 5 Reasons why you should NEVER fix a computer for free.
    It is in our nature to love the puzzle. We are obsessed. The lot of us. We love puzzles. We love the challenge. We thrive on finding the answer. We hate disarray. It bothers us deep in our soul. W...
  2. SCCM OSD Basic troubleshooting
    SCCM 2007 OSD is a fantastic way to deploy operating systems, however, like most things SCCM issues can sometimes be difficult to resolve due to the sheer volume of logs to sift through and the dispe...
  3. Migrate Small Business Server 2003 to Exchange 2010 and Windows 2008 R2
    This guide is intended to provide step by step instructions on how to migrate from Small Business Server 2003 to Windows 2008 R2 with Exchange 2010. For this migration to work you will need the fo...
  4. Create a Win7 Gadget
    This article shows you how to create a simple "Gadget" -- a sort of mini-application supported by Windows 7 and Vista. Gadgets can be dropped anywhere on the desktop to provide instant information, ...
  5. Outlook continually prompting for username and password
    There have been a lot of questions recently regarding Outlook prompting for a username and password whilst using Exchange 2007. There are a few reasons why this would happen and I will try to cover t...
  6. Backup Exchange 2010 Information Store using Windows Backup
    There seems to be quite a lot of confusion around the ability to backup Exchange 2010 using the built in Windows Backup feature. This stems from the omission of this feature prior to Exchange 2007 s...

Cloud Class Webinars

  1. Avoiding Bugs in Microsoft Access
    Alison Balter takes and in-depth look at avoiding bugs in Access. In this webinar you will learn about using the immediate window to debug your applications, invoking the debugger, using breakpoints to troubleshoot, stepping through code, setting the next statement to execute, ...
  2. Top 10 Best New Features in Visio 2010
    Scott Helmers gives live demonstrations of the top 10 new features in Visio 2010. This webinar will teach you how to create compelling diagrams by adding shapes to the page with a single click, linking the shapes in a diagram to data in Excel (or SQL Server, or SharePoint), ...
  3. IT Consultant Business Secrets Revealed
    Michael Munger, Experts Exchange tech pro and IT consultant, pulls back the curtain on his very successful businesses and answers question on every IT consultant and business owner should know about. He shares secrets on what he did to solve the 5 most common problems in IT, ...
  4. Disaster Recovery and Business Continuity
    Quest CTO, Mike Billon, gives an overview of the steps involved in building a dunamic disaster recovery plan. Through case studies and an examination of software/hardware tooles for monitoring and testing, you'll gain a better understandin of where you are, where you want ...
  5. Organize Your Visio Diagrams with Containers and Lists
    Scott Helmers uses cross functional flowcharts, wireframe diagrams, data graphic legends and seating charts to teach you: how to ustilize all three new structured diagram components in Visio 2010, the best practices for organizeing shapes in previous version of Visio, how to organize ...
  6. How to Us Objects, Properties, Events and Methods in Microsoft Access
    Alison Dalter gives an in-depbth look at objects, properties, events and methods in Microsoft Access. In this webinar you will learn about using the object browser, referring to objects, working with properties and methods, working with object variables, understanding the ...

Join the Community

Give a Little. Get a Lot.

Join the community of experts here and help other tech pros by answering question in your area of expertise. You can earn FREE access to all Experts Exchange's premium features and resources.

Join the Community

Answers

 

by: mrjoltcolaPosted on 2009-10-30 at 12:10:41ID: 25705965

I do not think I would update the previous records, I would simply log every login to the table and then write whatever queries against that log to produce the necessary report.

Then your case above simply becomes:

select user_id, name, max(login_time), count(1) from tracking
  group by user_id, name

 

by: mrjoltcolaPosted on 2009-10-30 at 12:11:54ID: 25705976

And this is why.

>>When the user logs in the second time, LAST_LOGIN_TIME and LAST_LOGIN_TIME_2(time before
              current login)


That is denormalization that is not good for the design and presents problems in itself.

 

by: kadabaPosted on 2009-10-30 at 12:13:10ID: 25705980

try something like this...

select count(*) from table_name where last_login_time >= start time frame and last_login_time_2 <= end time frame

                                              
1:

Select allOpen in new window

 

by: aman0711Posted on 2009-10-30 at 12:13:51ID: 25705992

Hello Sir,

                Thanks for your input. So you mean to say, instead of keep updating the same row again and again and using some sort of Counter.

               I should, create a record every time, user logs in?

 

by: aman0711Posted on 2009-10-30 at 12:14:33ID: 25705998

Hi Kadaba,

                 Just this query would do?

 

by: mrjoltcolaPosted on 2009-10-30 at 12:17:04ID: 25706014

Yes. Because there are other requirement that might come down the road, like tracking if a user's IP address changes, or tracking login history in a granular detail that your current schema cannot manage. You are using a single record as a "2 - login rotating queue". Don't do that. Use each login as a new record, just like Oracle auditing does it.

 

by: mrjoltcolaPosted on 2009-10-30 at 12:18:11ID: 25706021

I've designed lots of these systems where auditing is a concern. Trust me, it will make your life easier.

 

by: mrjoltcolaPosted on 2009-10-30 at 12:19:50ID: 25706034

So if you take my advice and fix the table:

>> "How many users logged on to the website in a given frame of time (supllied from Web Interface)".


Would be:

select count(distinct(user_id)) from tracking where login_time between ? and ?

 

by: aman0711Posted on 2009-10-30 at 12:20:18ID: 25706036

Hello Sir,

              Experience really counts a lot :-)
              Even though I didnt mention, you already picked the requirement. They have a requirement of Histroy as you mentioned. I have to maintain a history back 12 months

 

by: kadabaPosted on 2009-10-30 at 12:21:08ID: 25706047

The point mrjoltcola is trying to make is that

say use with id 1 logs in
you will update the last_login_time
and when he logs in you will update the last_login_time_2

The second time he logs in you will be updating the same row and you will lose the count..

 

by: aman0711Posted on 2009-10-30 at 12:21:33ID: 25706049

Sure,
          I will follow your advice,

         Can you do it step by step?  please :)

        First step.. you want me to drop LAST_LOGIN_TIME_2 column?

 

by: aman0711Posted on 2009-10-30 at 12:23:10ID: 25706056

@ Kadaba,

                Thanks for clearing it up :-)
     
               Actually one of my colleague suggested me to use 2 tables:

             1- First one that I posted above.
             2- Use another table, that would take a snapshot from this table and do processing on number of counts.

 

by: hieloPosted on 2009-10-30 at 12:24:01ID: 25706061

>> I should, create a record every time, user logs in?
Correct. WIth what you have now, if I logged in on June 1 and then again on Oct 1, you will not be able to answer the question ""How many users logged on to the website in a given frame of time". Since you will only know that the last time the user logged in was Oct 1 and you will know that there have been 2 total logins since the beginning, but you won't now if it were between Sept 1 - Oct 1, or Jan 1 or Oct 1, etc.

You need a separate table

Tracker
Person_id | login_date

if you execute:
SELECT COUNT(*) as total FROM Tracker WHERE (login_date BETWEEN '2009-06-01' AND '2009-10-01') AND Person_id=3

 

by: aman0711Posted on 2009-10-30 at 12:25:15ID: 25706069

This is my present java code:

package com.si.dao;
 
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
 
import com.si.dao.*;
 
public class UserData {	
 
	//prod
	String url = "jdbc:oracle:thin:@abc.xyz.com:1522:tl002";
	String user = "user1";
	String password = "pass1";
	String driver = "oracle.jdbc.driver.OracleDriver";
 
 
	 Connection conn= null;
     PreparedStatement pstmt = null;
     Statement stmt = null;
 	 ResultSet rs = null;
	
     DbConn db = null;
	 
	
	
	public String getUserAccessType(String userId) {
		
		String accessType = null;
		
		String qry = "SELECT ACCESS_TYPE FROM SIWEB_USERS WHERE lower(ID) = lower('" + userId.toLowerCase() + "') ";
		
		String updateQry_2 = "update SIWEB_USERS set LAST_LOGIN_TIME_2 = LAST_LOGIN_TIME WHERE lower(ID) = lower('" + userId.toLowerCase() + "') ";
		String updateQry = "update SIWEB_USERS set LAST_LOGIN_TIME = sysdate WHERE lower(ID) = lower('" + userId.toLowerCase() + "') ";
	
		
		System.out.println("qry:" + qry);
		
		try {
			 db = new DbConn();
			 conn = db.getConnection(url, user, password);
				
			stmt = conn.createStatement();
			rs = stmt.executeQuery(qry);
						
			if (rs.next()) {				
				accessType = rs.getString(1);				
			}
			
			//update userinfo added on 083109
			int r = stmt.executeUpdate(updateQry_2);			
			int t = stmt.executeUpdate(updateQry);
 
		} catch (SQLException sqle) {
			sqle.printStackTrace();
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			try {
				rs.close();
		    	db.closeResources(stmt, conn);
							
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
		return accessType;
	}
	
	//new method to check valid user
	
   public boolean isValidUser(String userId) {
		
		boolean valid = false;
		
		String qry = "select ID from SIWEB_USERS where lower(ID) = '" + userId.toLowerCase() + "'";
		
	
		
		try {
		    stmt = conn.createStatement();
			rs = stmt.executeQuery(qry);
						
			if (rs.next()) {				
				valid = true;				
			}
 
		} catch (SQLException sqle) {
			sqle.printStackTrace();
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			try {
				rs.close();
				stmt.close();
				conn.close();
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
	
		return valid;
	}
 
	public static void main(String[] args) {
			
		UserData bd = new UserData();		
		//String user_access_type = bd.getUserAccessType("PP1592");
		String user_access_type = bd.getUserAccessType("at7138");
		System.out.println(">>>user access type=" + user_access_type);		
	}
}

                                              
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
91:
92:
93:
94:
95:
96:
97:
98:
99:
100:
101:
102:
103:
104:
105:
106:
107:
108:
109:
110:
111:
112:
113:
114:
115:

Select allOpen in new window

 

by: kadabaPosted on 2009-10-30 at 12:25:32ID: 25706072

you could drop both columns

have a new table usage_tracking
with user id as the foreign key constraint
have log_in colum and log_out column
and insert a record when user logs in and update he record when use logs out

so you could get the distinct count

 

by: aman0711Posted on 2009-10-30 at 12:26:52ID: 25706080

Hi hielo,

                Thanks for guiding me :-)

                Can you please tell me "why I need a separate table?"

 

by: hieloPosted on 2009-10-30 at 12:28:13ID: 25706090

>> Actually one of my colleague suggested me to use 2 tables:
Exactly!

>>1- First one that I posted above.
Not EXACTLY like that. That table does NOT need LAST_LOGIN_TIME and LAST_LOGIN_TIME_2

You only need LAST_LOGIN_TIME on the SECOND table.

Read my previous comment for the second table

 

by: aman0711Posted on 2009-10-30 at 12:28:16ID: 25706091

Hi Kadaba,

                    there is no provision for logout. I guess the default set by our organization is 30mins session timeout.

                   So I can only capture login

 

by: hieloPosted on 2009-10-30 at 12:29:47ID: 25706101

>>Can you please tell me "why I need a separate table?"
your requirement is "...a given frame of time". I explained this issue on my first post. Read again - carefully.

 

by: aman0711Posted on 2009-10-30 at 12:32:14ID: 25706116

Seniors,

               I got the basic logic and its very clear in my mind now. BUT:

               I am confused which approach to follow, like mrjoltcola said, only oen table would do everything.

              Hielo said, I need two tables.

              So please correct me on this one:

             First Table:

            ID, FNAME, LNAME, ACCESS_TYPE, LOGIN TIME

            Second Table:

            Not sure what to put in for second one.
     

 

by: kadabaPosted on 2009-10-30 at 12:32:22ID: 25706118

oh alright no session listener.. please go ahead with what hielo suggested.

 

by: aman0711Posted on 2009-10-30 at 12:34:08ID: 25706133

@ hielo,

              You are right about the requirement, but isnt the first approach will fix everything: where we are inserting a record for every login?


              Please forgive me if I am stuck somewhere
             

 

by: mrjoltcolaPosted on 2009-10-30 at 12:34:33ID: 25706137

hielo and I are recommending the same thing. His 2 table recommendation is essentially to track the last login time of the user in an efficient manner, without the need to run a datewarehouse type query to find the last login. All other requirements can be satisfied by the tracking table.

You might put LAST_LOGIN_TIME into your actual USERS table.

 

by: aman0711Posted on 2009-10-30 at 12:38:04ID: 25706159

Oh now I got it.

Sorry hielo and mrjoltcola :)

2 table approach will make the application little more modular with simple queries?

So table 1:

ID, FNAME, LNAME, ACCESS_TYPE, LAST_LOGIN_TIME

what would go under Table 2?

and then I need to a procedure to update the second table

 

by: mrjoltcolaPosted on 2009-10-30 at 12:39:07ID: 25706171

A typical implementation in my web apps follows something like this:

procedure loginUser(userId integer) is
declare
  loginTime timestamp := systimestamp;
begin

update USERS set last_login_time = loginTime where user_id = userId;
insert into access_log(user_id, login_time) values(userId, loginTime);
end;
/

 

by: mrjoltcolaPosted on 2009-10-30 at 12:41:02ID: 25706178

Update, I edited my post above as I caught a typo right after posting.

 

by: CEHJPosted on 2009-10-30 at 12:46:19ID: 25706216

I would probably store the session id too. If a user has simulataneous logins, you could otherwise have problems.

Also, given the correct session management, you could simply compare the table against sessions that are current

 

by: aman0711Posted on 2009-10-30 at 13:09:35ID: 25706391

Hi charles,

                Thanks for the pointer. These folks dont really care about session. Its a very basic app.

@ hielo, mrjoltcola, kadaba, Charles,

           Thank you all for your input. I will start with this new table structure now,(Of course you will see tons of questions on that now :-) ), one last help on this stuff:

         There is a part in my team who strongly believes that Using 2 table approach is complete waste, when just 1 table can do everything.
           Can you please provide my some pointers for this argument against them :-) lol

 

by: hieloPosted on 2009-10-30 at 13:17:43ID: 25706446

>>There is a part in my team who strongly believes that Using 2 table approach is complete waste, when just 1 table can do everything.
Then perhaps that part of your team is not understanding/interpreting "...a given frame of time" the same way I do. With my approach you would be able to find answer the following questions:
How many times did Joe Login Between Jan 1 and Mar 1?
How many times did Joe Login Between Jan 1 and Jun 1?
How many times did Joe Login Between Jul 1 and Oct 1?
How many times has Joe logged int?
When was the last time Joe Logged in?

With the one table approach you will just be able to answer:
How many times has Joe logged int?
When was the last time Joe Logged in?

 

by: aman0711Posted on 2009-10-30 at 13:19:42ID: 25706460

Thanks hielo. I will open other questions pertaining to this development. please provide your pointers.

 

by: mrjoltcolaPosted on 2009-10-30 at 13:27:33ID: 25706524

Or:

Where did Joe login from?
Did Joe change IP addresses?
Has Joe logged in from multiple places at the same time?

These are security concerns for auditing tables.

As the "multiple" tables, I think you may be misunderstanding us. Noone is saying you need 2 separate "tracker" tables. A single audit tracker table is sufficient to answer ALL questions above. But adding also a LAST_LOGIN_TIME to the USER table also helps in some queries to skip scanning the audit table for certain things. It makes finding the last login time for a user efficient, because it is in the USER record, which is accessed already and probably pulled into session.

 

by: aman0711Posted on 2009-10-30 at 13:33:00ID: 25706565

Thank you mrjoltcola,

                 As always you and other experts have always been great help for me here. I have bugging you with dumb questions for an year now :-)

                and Yes you are right, I am confused over 2 tables.

                Sorry :-)

                So Tracker table will have all the columns needed. Correct? (My table already has that mostly, right?, and I can drop last_login_time_2 field from that)

               Now the user table will be populated using a procedure? Right?

               and this table will have ID, Name, Last login Time and the Count. Correct?

             uffff... Sorry for all this trouble. I feel bad


 

by: mrjoltcolaPosted on 2009-10-30 at 13:48:24ID: 25706683

Well I wouldn't just drop the last_login_time2 column, I would rename last_login_time to login_time, so it is clear of intent.

PL/SQL procedure, Java, Perl, whatever, doesn't matter, as long as it is correct. A procedure is a good idea.

 

by: aman0711Posted on 2009-10-30 at 13:57:58ID: 25706744

Thank you Sir.

Thanks to all of you :)

I will start with it now,,,, :)

 

by: aman0711Posted on 2009-10-30 at 14:23:22ID: 25706906

Hi Folks,

              sorry for stretching this question for this long. I will close it now, and maybe open a new one.

              So I created these two tables. Is it fine as the first step?

 

by: mrjoltcolaPosted on 2009-10-30 at 14:29:11ID: 25706933

Rather than USER_SNAPSHOT I'd go with USER_LOGIN_HISTORY or SIWEB_USER_LOGINS, something like that. And again, LAST_LOGIN is the wrong name for the field in the history table. Just call it LOGIN_DATE. It is not the last login, it is just a login for that specific time. The "last login" will be the max in that table, or will be LAST_LOGIN from the USER table.

Also, no need to have FNAME and LNAME in the history table. You get that by joining to the user table.

 

by: hieloPosted on 2009-10-30 at 14:38:18ID: 25706985

>>Rather than USER_SNAPSHOT I'd go with USER_LOGIN_HISTORY
I agree.

>>Also, no need to have FNAME and LNAME in the history table
Again, I agree. Just to clarify, he is referring to USER_LOGIN_HISTORY.

Additionally, in USER_LOGIN_HISTORY I would get rid of the COUNT column. You can always execute a query for a particular user/ID to get that number/value. So you should just have:

USER_LOGIN_HISTORY
  ID
  LOGIN_DATE

 

by: aman0711Posted on 2009-10-30 at 14:39:09ID: 25706989

Oh ok... Thank you sir :-)

Will do the necessary modifications as you suggested. I will read on procedures tonight, and try to write one to populate the HISTORY table.
Will post when I get stuck.. again thanks a ton. :)

 

by: aman0711Posted on 2009-10-30 at 14:43:26ID: 25707011

Hi hielo,

            Sorry I didnt see your comment before posting.

            So I got rid of FNAME, LNAME and COUNT.

            and Now SIWEB_LoGIN_HISTORY has:

            ID
            LOGIN DATE

 

by: hieloPosted on 2009-10-30 at 16:26:51ID: 25707429

OK, now go complete your project :)

 

by: aman0711Posted on 2009-10-30 at 20:23:39ID: 25708215

Thanks :-)

  Will close this question soon, and I really really appreciate all the inputs you folks put in

 

by: aman0711Posted on 2009-11-02 at 12:30:32ID: 25723400

folks,

       I will close this question...

       Posted another question for step 2 of the problem here :)

     http://www.experts-exchange.com/Database/Oracle/PL_SQL/Q_24865074.html

 

by: aman0711Posted on 2009-11-02 at 12:31:53ID: 31648185

Thank you so much Seniors :)

20120131-EE-VQP-002

3 Ways to Join

30-Day Free Trial

The Experts

98% positive feedback on 31,087 answers since March 2000. angeliii is a Microsoft Most Valuable Professional for his work with MS SQL Server & Develoment.

He has also proven his knowledge of Visual Basic Programming, PHP Scripting and Oracle Databases.

The Experts

97% positive feedback on 10,752 answers since July 2000. lrmoore has more than 18 years experience in the networking industry.

The six-time Mircosoft MVPs specialties include firewalls, virtual private networking, and network management.

Testimonials

"...and excellent source for support... Kind of like having your very own IT dept." Electriciansnet

Testimonials

"I was apprehensive at signing up at first. However... it has already made my life as an IT administrator much easier." JaCrews

Testimonials

"WOW! You guys have great, active, and knowledgeable people on here." moore50

Business Clients

Business Clients

In the Press

"If you’ve got a question... Experts Exchange can supply an answer.”

In the Press

"...an invaluable aid for both IT professionals and those who require tech support."

In the Press

"where IT professionals provide quick answers on just about any topic"

Business Account Plans

Loading Advertisement...