public ReportResult getFilteredReport(String[] spielerNamen, String startString, String endeString) throws ParseException {

		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd", Locale.GERMAN);
		Date start = sdf.parse(startString);
		Date ende = null;

		if (endeString == null) {
			ende = new Date();
		} else {
			ende = sdf.parse(endeString);
		}

		Map<String, Spieler> spielerMap = new HashMap<String, Spieler>();
		Map<String, Team> teamMap = new HashMap<String, Team>();

		List<Spiel> spiele = getSpieleFiltered(Arrays.asList(spielerNamen), start, ende);
		List<GespieltesSpiel> spielErgebnis = new ArrayList<GespieltesSpiel>();
		for (Spiel spiel : spiele) {
			spielErgebnis.add(new GespieltesSpiel(calculateElo(spiel, spielerMap, teamMap), true));
		}

		List<Spieler> spielerSorted = new ArrayList<Spieler>(spielerMap.values());
		Collections.sort(spielerSorted, new Comparator<Spieler>() {
			public int compare(Spieler o1, Spieler o2) {
				return -1 * (o1.getPunktzahl().getPunktzahl() - o2.getPunktzahl().getPunktzahl());
			}
		});

		List<RanglistenEintrag> rangliste = new ArrayList<RanglistenEintrag>();
		int rang = 1;
		for (Spieler spieler : spielerSorted) {
			rangliste.add(new RanglistenEintrag(spieler.getId(), rang, spieler.getName(), spieler.getPunktzahl().getPunktzahl(), spieler
					.getAnzahlSpiele(), spieler.getAnzahlSiege()));
			rang++;
		}

		List<Team> teamSorted = new ArrayList<Team>(teamMap.values());
		Collections.sort(teamSorted, new Comparator<Team>() {
			public int compare(Team o1, Team o2) {
				return -1 * (o1.getPunktzahl().getPunktzahl() - o2.getPunktzahl().getPunktzahl());
			}
		});

		List<RanglistenEintrag> teamRangliste = new ArrayList<RanglistenEintrag>();
		int teamRang = 1;
		for (Team team : teamSorted) {

			int anzahlSpiele = team.getPunktzahlHistorie().size() - 1;
			int anzahlSiege = 0;

			for (EloPunktzahl punktzahl : team.getPunktzahlHistorie()) {
				if (punktzahl.getZuwachs() > 0) {
					anzahlSiege++;
				}
			}

			teamRangliste.add(new RanglistenEintrag(team.getId(), teamRang, team.getSpieler1().getName() + "/" + team.getSpieler2().getName(),
					team.getPunktzahl().getPunktzahl(), anzahlSpiele, anzahlSiege));
			teamRang++;
		}

		Collections.reverse(spielErgebnis);
		ReportResult result = new ReportResult(rangliste, teamRangliste, spielErgebnis);
		return result;
	}