would be "nicer" if you wrap your html in a <div class="box">
but like what you have it you can use prev or next depending where the click happens:
$(".oberpunkte").change(function(){
alert($(this).next('input').val())
});
$('#123').on('click',function(){
alert($(this).prev('input').val());
});
UPDATE with a div.box as parent
In my opinion this is a nicer solution. Cause doesn't matter where you click we can check from $(this)
where is the closest box and then get the value we're looking for...
<script type="text/javascript">
$("#123, .oberpunkte").on('click', function(){
alert($(this).closest('.box').children('.needToFind').val())
});
</script>
<div class="box">
<input type='checkbox' class='oberpunkte' name='checkbox' value='typo 3'/>
<input class="needToFind" type='text' name='text' value='typo3txt'/>
<input type='button' name='test' id='123' value='Alert'/>
</div>
<div class="box">
<input type='checkbox' class='oberpunkte' name='checkbox' value='typo 3'/>
<input class="needToFind" type='text' name='text' value='123456'/>
<input type='button' name='test' id='123' value='Alert'/>
</div>
<div class="box">
<input type='checkbox' class='oberpunkte' name='checkbox' value='typo 3'/>
<input class="needToFind" type='text' name='text' value='xxxxxx'/>
<input type='button' name='test' id='123' value='Alert'/>
</div>