You use next-hop-self if the other routers don't have a route to the "real" (from BGP's default perspective) next hop. Remember, BGP passes the next-hop address unchanged between ibgp peers or in the case of multiaccess networks will change the next hop based on the most efficient routing (this feature is not specific to BGP, it's IP).
eg RTD is in AS 1. RTC is in AS2 and RTA are in AS 3. All share a common subnet on a frame network. RTA and RTC have a PVC together, RTC and RTD have a PVC together. RTD has a route x and advertises the route. RTC advertises that route to RTA with a nexthop of RTD (this is because the network between RTA, RTC and RTD is a multiaccess network and it makes more sense for RTA to use RTD as a next hop to reach x rather than making an extra hop via RTC).
The problem is that RTA does not have a direct PVC to RTD, and cannot reach the next hop. In this case routing will fail. So put next-hop-self on RTC (only on RTC) so that RTA can now access x.
Hope that helps.
Steve