G
Gelöschtes Mitglied 68249
Gast
Hallo,
ich habe ein kleines Denkproblem mit einem Filter für eine Liste.
Früher haben wir das alles mit einem riesigen SQL Statement erledigt, aber je mehr wir das erweitern, desto schlimmer sieht es aus und desto mehr Fehler haben wir im Ergebnis.
Deswegen möchte ich das in Zukunft im Java machen. Dazu habe ich die Statements, die die Daten sammeln in Listen verpackt und möchte die jetzt so gegeneinander filtern, dass dasselbe Ergebnis herauskommt, wie beim SQL.
Hier erstmal das SQL:
Zur Erklärung,
In dem Fall ist waaObjectList == allewaa und fakturaObjectList == allefaktura.
Also Ergebnis soll sein, dass für den WAA-Auftrag mit der höchsten Nummer und dem höchsten Datum zu einem Hostnamen, der einen relevanten SFT hat und kein Abbau ist, geprüft wird, ob es einen Faktura-Datensatz dazu gibt mit demselben Hostnamen.
Eigentlich könnte man direkt weiter gehen und prüfen, ob es einen Fakturadatensatz zu jedem WAA-Datensatz gibt. Gematcht über den Hostnamen und über waaObject.faktdatumstr mit FakturaObject.fakturaVon.
ich habe ein kleines Denkproblem mit einem Filter für eine Liste.
Früher haben wir das alles mit einem riesigen SQL Statement erledigt, aber je mehr wir das erweitern, desto schlimmer sieht es aus und desto mehr Fehler haben wir im Ergebnis.
Deswegen möchte ich das in Zukunft im Java machen. Dazu habe ich die Statements, die die Daten sammeln in Listen verpackt und möchte die jetzt so gegeneinander filtern, dass dasselbe Ergebnis herauskommt, wie beim SQL.
Hier erstmal das SQL:
SQL:
SELECT DISTINCT
w.hostname [host],
LEFT(w.auftragsnummerzeile, len(w.auftragsnummerzeile) - 4) [auftrag],
w.idp_status [status],
'Kein Fakturadatensatz zum Host' [fehler]
FROM
allewaa w
WHERE
w.sft in ('LISTE_VON_SFT')
AND w.faktdatumstr = (SELECT MAX(faktdatumstr) FROM allewaa AS aw WHERE aw.hostname = w.hostname)
AND w.auftragsnummerzeile = (SELECT MAX(auftragsnummerzeile) FROM allewaa AS mf WHERE mf.hostname = w.hostname)
AND w.art <> 'Abbau'
AND w.hostname NOT IN (SELECT hostname FROM allefaktura)
Zur Erklärung,
- auftragsnummerzeile == Eine Kombination aus Auftragsnummer und der Zeile im Auftrag, vierstellig, damit man diese sortieren kann, um diese sortieren zu können
- faktdatumstr == das Fakturadatum im Format yyyyMMdd, auch damit man es nach Größe sortieren kann
Java:
private static void findMissingFakturaRecord(List<WaaObject> waaObjectList, List<FakturaObject> fakturaObjectList) {
List<String> relevantSft = Arrays.asList("LISTE_VON_SFT");
for(WaaObject waaObject : waaObjectList) {
String waaSft = waaObject.getSft();
if(!relevantSft.contains(waaSft)) continue;
if("abbau".equalsIgnoreCase(waaObject.getArt())) continue;
String waaHost = waaObject.getHostname();
List<FakturaObject> fakturaForHost = fakturaObjectList.stream()
.filter(f -> f.getHostname().equals(waaHost))
.collect(Collectors.toList());
Optional<WaaObject> maxWaaOpt = waaForHost.stream().max(Comparator.comparing(WaaObject::getFaktdatumstr));
if(maxWaaOpt.isEmpty()) {
String orderNo = waaObject.getAuftragsnummerzeile().substring(0,waaObject.getAuftragsnummerzeile().length() - 4);
FakturaError e = new FakturaError(waaHost, orderNo, waaObject.getStatus(),"", ErrorCode.NO_FAKTURA);
fakturaErrorList.add(e);
}
}
}
In dem Fall ist waaObjectList == allewaa und fakturaObjectList == allefaktura.
Also Ergebnis soll sein, dass für den WAA-Auftrag mit der höchsten Nummer und dem höchsten Datum zu einem Hostnamen, der einen relevanten SFT hat und kein Abbau ist, geprüft wird, ob es einen Faktura-Datensatz dazu gibt mit demselben Hostnamen.
Eigentlich könnte man direkt weiter gehen und prüfen, ob es einen Fakturadatensatz zu jedem WAA-Datensatz gibt. Gematcht über den Hostnamen und über waaObject.faktdatumstr mit FakturaObject.fakturaVon.