My best guess is that you want to make sure that no account has more than 4 opportunities that were created via leads that came from the web.
Disclaimer: the following is intentionally not copy/paste code and meant as a guide to get you started. Use it as a guide and if you run into any specific issues you can ask another question for more assistance.
trigger oppTriggerTest on Opportunity (before update, before insert) {
// FIrst step is to get account ids
Set<id> accountIds = new Set<Id>();
for (Opportunity opp : trigger.new) {
if (opp.leadSource = 'Web') { // Make sure we only look at opps that we care about
accountIds.add(opp.Id);
}
}
// Let's make the database do as much of the work as possible
List<AggregateResult> ars = [
SELECT Count(Id) numOfWeb, AccountId
FROM Opportunity
WHERE AccountId IN :accountIds
And LeadSource = 'Web'
GROUP BY AccountId
HAVING Count(Id) >= 4
];
// Lets make a map that's easier to work with
Map<Id, Integer> accountToCount = new Map<id, Integer>();
for (AggregateResult ar : ars) {
accountToCount.put(ar.get('AccountId'), ar.get('numOfWeb'));
}
// Now, lets add an error to opps that violate the rule
for (Opportunity opp : trigger.new) {
if (accountToCount.getcontainsKey(opp.accountId) >= 4) {
opp.addError('Too many web opps for the given account');
}
}
}