JCUnitはPICTよりも制約の取り扱いに長けている(ようだ)
githubにあるPICTレポジトリで報告されているが、PICTには以下のモデルからのテストスイート生成が終わらないという問題がある。
Eingangskanal: EVA_Anlageberatung, EVA_Order, EVA_Sonderweg, EVA_Sparplan, EVA_Neuemission, EVA_Direkteinstieg, HOST_T19000, HOST_T19001, HOST_T19901, HOST_T19750, HOST_T28900, Onlinebanking_PC, Onlinebanking_MSB, Onlinebanking_Neuemission_PC, Onlinebanking_Neuemission_MSB, Onlinebanking_Tablet_PC, Infobroker, commerzbank_de_pib Finanzinstrument: Aktie, Unstrukturierte_Anleihe, strukturierte_Anleihe, Inv.Fonds, OIF, Zertifikat, Optionsschein, Xetra_Gold_ETC, EMISID Produktzyklus: Neuemission_Information, Neuemission_offen, Neuemission_geschlossen, Neuemission_abgerechnet, Sekundaermarkt, n/a Dienstleistungsart: Anlageberatung, beratungsfreies_Geschaeft, n/a Orderart: Kauf(Beratungsdatum_gueltig), Kauf_(ohne_Beratungsdatum), Verkauf, aenderung, Streichung, Storno, Berichtigungsauftrag, n/a Initiator: Kunde, Bank, n/a Auftragserteilung: telefonisch, persoenlich, schriftlich, Haustuergeschaeft, n/a Bereitstellungsdokumente: Beratungsprotokoll_Kunde, Beratungsprotokoll_Interessent, Beratungsprotokoll_Potenzial, Nachtraeglicher_KID-Versand, n/a UDAL-Status: Normalbetrieb, Back_up-Betrieb, PRIIP,ohne_KID, WKN_nicht_vorhanden, WKN_inaktiv/geloescht, defektes_Dokument, Virus, non-PRIIP_auf_Blackliste, PRIIP_auf_Blackliste, UDAL_nicht_verfuegbar, n/a Abruf_Infoblaetter: WA_von_FWW, PIB_von_DOTi, PIB_von_C&M-FIC, PIB_von_PC_PM, KID_von_PC_PM, KID_von_DOTi, KID_von_externem_Hersteller IF [Eingangskanal] = "HOST_T19901" THEN [Orderart] <> "Kauf_(Beratungsdatum_gueltig)" AND [Produktzyklus] <> "Neuemission_offen" AND [Produktzyklus] <> "n/a" AND [Dienstleistungsart] <> "n/a" AND [Orderart] <> "n/a" AND [Initiator] = "n/a" AND [Auftragserteilung] = "n/a" AND [Bereitstellungsdokumente]= "n/a" AND [UDAL-Status] = "n/a"; IF [Eingangskanal] in {"HOST_T19000", "HOST_T19001", "HOST_T19750", "HOST_T28900"} THEN [Produktzyklus] <> "Neuemission_Information" AND [Produktzyklus] <> "Neuemission_offen" AND [Produktzyklus] <> "n/a" AND [Dienstleistungsart] <> "n/a" AND [Orderart] <> "n/a" AND [Initiator] = "n/a" AND [Auftragserteilung] = "n/a" AND [Bereitstellungsdokumente]= "n/a" AND [UDAL-Status] = "n/a"; IF [Eingangskanal] like "EVA_*" THEN [Initiator] <> "n/a" AND [Produktzyklus] <> "n/a" AND [Dienstleistungsart] <> "n/a" AND [Orderart] <> "n/a" AND [Auftragserteilung] <> "n/a" AND [Bereitstellungsdokumente] <> "n/a" AND [UDAL-Status] <> "n/a"; IF [Eingangskanal] IN {"Onlinebanking_PC", "Onlinebanking_MSB", "Onlinebanking_Tablet_PC"} THEN [Produktzyklus] <> "Neuemission_Information" AND [Produktzyklus] <> "Neuemission_offen" AND [Produktzyklus] <> "n/a" AND [Dienstleistungsart] <> "n/a" AND [Orderart] <> "n/a"; IF [Eingangskanal] like "Onlinebanking*" THEN [Dienstleistungsart]="beratungsfreies_Geschaeft" AND [Produktzyklus] <> "n/a" AND [Dienstleistungsart] <> "n/a" AND [Orderart] <> "Storno" AND [Orderart] <> "Berichtigungsauftrag" AND [Orderart] <> "Kauf_(Beratungsdatum_gueltig)" AND [Orderart] <> "n/a" AND [Initiator] = "n/a" AND [Auftragserteilung] = "n/a" AND [Bereitstellungsdokumente] = "n/a" AND [UDAL-Status] <>"Back_up-Betrieb"; IF [Eingangskanal] IN {"EVA_Sonderweg", "EVA_Sparplan", "EVA_Direkteinstieg", "EVA Order"} THEN [Produktzyklus] <>"Neuemission_Information" AND [Produktzyklus] <>"Neuemission_offen" AND [Produktzyklus] <>"n/a" AND [Dienstleistungsart] <>"n/a" AND [Orderart] <>"n/a"; IF [Eingangskanal] IN {"EVA_Sonderweg", "EVA_Sparplan", "EVA_Direkteinstieg"} THEN [Orderart] <>"Storno" AND [Orderart] <>"Berichtigungsauftrag" AND [Orderart] <>"Kauf_(Beratungsdatum_gueltig)" AND [Produktzyklus] <>"n/a" AND [Dienstleistungsart] <>"n/a" AND [Orderart] <>"n/a"; IF [Eingangskanal] in {"EVA_Anlageberatung", "EVA_Neuemission", "EVA_Order"} THEN [Orderart] <>"Storno" AND [Orderart] <>"Berichtigungsauftrag" AND [Produktzyklus] <>"n/a" AND [Dienstleistungsart] <>"n/a" AND [Orderart] <>"n/a"; IF [Eingangskanal] IN {"Infobroker", "commerzbank_de_pib"} THEN [Finanzinstrument] <> "EMISID" AND [Produktzyklus] = "n/a" AND [Dienstleistungsart] = "n/a" AND [Orderart] = "n/a" AND [Initiator] = "n/a" AND [Auftragserteilung] = "n/a" AND [Bereitstellungsdokumente]= "n/a" AND [UDAL-Status] <> "Back_up-Betrieb";
試してみると、実際、2時間半以上かかっても終わらず現在も計算中だ。PICTの作者であるJacekによると、計算時間がexponentialになっちゃうのでしょうがないんだよということだ。それも無理からぬことで、これは要するにSAT問題(NP完全)を解きながらできるだけ小さなテストスイートの生成を行わなければいけないのだから、どうしたもんかなー、と考えこんでしまうところだ。
なのだけれど、現実世界の制約条件ってこのくらいにはなるよね、と思うし、因子数は10、各水準数もそれほど多くなく、総当りでテストケースを作るとしても134,719,200通りしかありえない。さらによく見てみると、因子Abruf_Infoblaetter
は制約に全然関与しない。
このくらいだったらJCUnitではなんとかなるのではないか、と思い試してみた。JCUnitで同じモデルを実装すると以下のようになる。
@RunWith(JCUnit8.class) public class Issue13 { /** * Eingangskanal: * <p> * EVA_Anlageberatung, EVA_Order, EVA_Sonderweg, EVA_Sparplan, EVA_Neuemission, * EVA_Direkteinstieg, HOST_T19000, HOST_T19001, HOST_T19901, HOST_T19750, * HOST_T28900, Onlinebanking_PC, Onlinebanking_MSB, Onlinebanking_Neuemission_PC, * Onlinebanking_Neuemission_MSB, Onlinebanking_Tablet_PC, Infobroker, commerzbank_de_pib */ @ParameterSource public Parameter.Factory<String> eingangskanal() { return Parameters.simple( "EVA_Anlageberatung", "EVA_Order", "EVA_Sonderweg", "EVA_Sparplan", "EVA_Neuemission", "EVA_Direkteinstieg", "HOST_T19000", "HOST_T19001", "HOST_T19901", "HOST_T19750", "HOST_T28900", "Onlinebanking_PC", "Onlinebanking_MSB", "Onlinebanking_Neuemission_PC", "Onlinebanking_Neuemission_MSB", "Onlinebanking_Tablet_PC", "Infobroker", "commerzbank_de_pib" ); } /** * Finanzinstrument: * <p> * Aktie, Unstrukturierte_Anleihe, strukturierte_Anleihe, Inv.Fonds, OIF, * Zertifikat, Optionsschein, Xetra_Gold_ETC, EMISID */ @ParameterSource public Parameter.Factory<String> finanzinstrument() { return Parameters.simple( "Aktie", "Unstrukturierte_Anleihe", "strukturierte_Anleihe", "Inv.Fonds", "OIF", "Zertifikat", "Optionsschein", "Xetra_Gold_ETC", "EMISID" ); } /** * Produktzyklus: * <p> * Neuemission_Information, Neuemission_offen, Neuemission_geschlossen, Neuemission_abgerechnet, * Sekundaermarkt, n/a */ @ParameterSource public Parameter.Factory<String> produktzyklus() { return Parameters.simple( "Neuemission_Information", "Neuemission_offen", "Neuemission_geschlossen", "Neuemission_abgerechnet", "Sekundaermarkt", "n/a" ); } /** * Dienstleistungsart: Anlageberatung, beratungsfreies_Geschaeft, n/a */ @ParameterSource public Parameter.Factory<String> dienstleistungsart() { return Parameters.simple( "Anlageberatung", "beratungsfreies_Geschaeft", "n/a" ); } /** * Orderart: * Kauf(Beratungsdatum_gueltig), Kauf_(ohne_Beratungsdatum), Verkauf, * aenderung, Streichung, Storno, Berichtigungsauftrag, n/a */ @ParameterSource public Parameter.Factory<String> orderart() { return Parameters.simple( "Kauf(Beratungsdatum_gueltig)", "Kauf_(ohne_Beratungsdatum)", "Verkauf", "aenderung", "Streichung", "Storno", "Berichtigungsauftrag", "n/a" ); } /** * Initiator: Kunde, Bank, n/a */ @ParameterSource public Parameter.Factory<String> initiator() { return Parameters.simple( "Kunde", "Bank", "n/a" ); } /** * Auftragserteilung: telefonisch, persoenlich, schriftlich, Haustuergeschaeft, n/a */ @ParameterSource public Parameter.Factory<String> auftragserteilung() { return Parameters.simple( "telefonisch", "persoenlich", "schriftlich", "Haustuergeschaeft", "n/a" ); } /** * Bereitstellungsdokumente: * <p> * Beratungsprotokoll_Kunde, Beratungsprotokoll_Interessent, Beratungsprotokoll_Potenzial, * Nachtraeglicher_KID-Versand, n/a */ @ParameterSource public Parameter.Factory<String> bereitstellungsdokumente() { return Parameters.simple( "Beratungsprotokoll_Kunde", "Beratungsprotokoll_Interessent", "Beratungsprotokoll_Potenzial", "Nachtraeglicher_KID-Versand", "n/a" ); } /** * UDAL-Status: * <p> * Normalbetrieb, Back_up-Betrieb, PRIIP,ohne_KID, WKN_nicht_vorhanden, WKN_inaktiv/geloescht, * defektes_Dokument, Virus, non-PRIIP_auf_Blackliste, PRIIP_auf_Blackliste, UDAL_nicht_verfuegbar, * n/a */ @ParameterSource public Parameter.Factory<String> udalStatus() { return Parameters.simple( "Normalbetrieb", "Back_up-Betrieb", "PRIIP", "ohne_KID", "WKN_nicht_vorhanden", "WKN_inaktiv/geloescht", "defektes_Dokument", "Virus", "non-PRIIP_auf_Blackliste", "PRIIP_auf_Blackliste", "UDAL_nicht_verfuegbar", "n/a" ); } /** * Abruf_Infoblaetter: * <p> * WA_von_FWW, PIB_von_DOTi, PIB_von_C&M-FIC, PIB_von_PC_PM, * KID_von_PC_PM, KID_von_DOTi, KID_von_externem_Hersteller */ @ParameterSource public Parameter.Factory<String> abruf_Infoblaetter() { return Parameters.simple( "WA_von_FWW", "PIB_von_DOTi", "PIB_von_C&M-FIC", "PIB_von_PC_PM", "KID_von_PC_PM", "KID_von_DOTi", "KID_von_externem_Hersteller" ); } //// //1 // //IF [Eingangskanal] = "HOST_T19901" //THEN [Orderart] <> "Kauf_(Beratungsdatum_gueltig)" //AND [Produktzyklus] <> "Neuemission_offen" //AND [Produktzyklus] <> "n/a" //AND [Dienstleistungsart] <> "n/a" //AND [Orderart] <> "n/a" //AND [Initiator] = "n/a" //AND [Auftragserteilung] = "n/a" //AND [Bereitstellungsdokumente]= "n/a" //AND [UDAL-Status] = "n/a"; @Condition(constraint = true) public boolean constraint1( @From("eingangskanal") String eingangskanal, @From("orderart") String orderart, @From("produktzyklus") String produktzyklus, @From("dienstleistungsart") String dienstleistungsart, @From("initiator") String initiator, @From("auftragserteilung") String auftragserteilung, @From("bereitstellungsdokumente") String bereitstellungsdokumente, @From("udalStatus") String udalStatus ) { //noinspection SimplifiableIfStatement if (Objects.equals(eingangskanal, "HOST_T19901")) return ( !Objects.equals(orderart, "Kauf_(Beratungsdatum_gueltig)") && !Objects.equals(produktzyklus, "Neuemission_offen") && !Objects.equals(produktzyklus, "n/a") && !Objects.equals(dienstleistungsart, "n/a") && !Objects.equals(orderart, "n/a") && Objects.equals(initiator, "n/a") && Objects.equals(auftragserteilung, "n/a") && Objects.equals(bereitstellungsdokumente, "n/a") && Objects.equals(udalStatus, "n/a") ); return true; } ////2 // //IF [Eingangskanal] in {"HOST_T19000", "HOST_T19001", "HOST_T19750", "HOST_T28900"} //THEN [Produktzyklus] <> "Neuemission_Information" //AND [Produktzyklus] <> "Neuemission_offen" //AND [Produktzyklus] <> "n/a" //AND [Dienstleistungsart] <> "n/a" //AND [Orderart] <> "n/a" //AND [Initiator] = "n/a" //AND [Auftragserteilung] = "n/a" //AND [Bereitstellungsdokumente]= "n/a" //AND [UDAL-Status] = "n/a"; @Condition(constraint = true) public boolean constraint2( @From("eingangskanal") String eingangskanal, @From("orderart") String orderart, @From("produktzyklus") String produktzyklus, @From("dienstleistungsart") String dienstleistungsart, @From("initiator") String initiator, @From("auftragserteilung") String auftragserteilung, @From("bereitstellungsdokumente") String bereitstellungsdokumente, @From("udalStatus") String udalStatus ) { if (asList("HOST_T19000", "HOST_T19001", "HOST_T19750", "HOST_T28900").contains(eingangskanal)) { return !produktzyklus.equals("Neuemission_Information") && !produktzyklus.equals("Neuemission_offen") && !produktzyklus.equals("n/a") && !dienstleistungsart.equals("n/a") && !orderart.equals("n/a") && initiator.equals("n/a") && auftragserteilung.equals("n/a") && bereitstellungsdokumente.equals("n/a") && udalStatus.equals("n/a"); } return true; } ////3 // //IF [Eingangskanal] like "EVA_*" //THEN [Initiator] <> "n/a" //AND [Produktzyklus] <> "n/a" //AND [Dienstleistungsart] <> "n/a" //AND [Orderart] <> "n/a" //AND [Auftragserteilung] <> "n/a" //AND [Bereitstellungsdokumente] <> "n/a" //AND [UDAL-Status] <> "n/a"; @Condition(constraint = true) public boolean constraint3( @From("eingangskanal") String eingangskanal, @From("orderart") String orderart, @From("produktzyklus") String produktzyklus, @From("initiator") String initiator, @From("auftragserteilung") String auftragserteilung, @From("bereitstellungsdokumente") String bereitstellungsdokumente, @From("udalStatus") String udalStatus ) { if (eingangskanal.startsWith("EVA_")) return !initiator.equals("n/a") && !produktzyklus.equals("n/a") && !orderart.equals("n/a") && !auftragserteilung.equals("n/a") && !bereitstellungsdokumente.equals("n/a") && !udalStatus.equals("n/a"); return true; } ////4 // //IF [Eingangskanal] IN {"Onlinebanking_PC", "Onlinebanking_MSB", "Onlinebanking_Tablet_PC"} //THEN [Produktzyklus] <> "Neuemission_Information" //AND [Produktzyklus] <> "Neuemission_offen" //AND [Produktzyklus] <> "n/a" //AND [Dienstleistungsart] <> "n/a" //AND [Orderart] <> "n/a"; @Condition(constraint = true) public boolean constraint4( @From("eingangskanal") String eingangskanal, @From("orderart") String orderart, @From("produktzyklus") String produktzyklus, @From("dienstleistungsart") String dienstleistungsart ) { if (asList("Onlinebanking_PC", "Onlinebanking_MSB", "Onlinebanking_Tablet_PC").contains(eingangskanal)) return !produktzyklus.equals("Neuemission_Information") && !produktzyklus.equals("Neuemission_offen") && !produktzyklus.equals("n/a") && !dienstleistungsart.equals("n/a") && !orderart.equals("n/a"); return true; } ////5 // //IF [Eingangskanal] like "Onlinebanking*" //THEN [Dienstleistungsart]="beratungsfreies_Geschaeft" //AND [Produktzyklus] <> "n/a" //AND [Dienstleistungsart] <> "n/a" //AND [Orderart] <> "Storno" //AND [Orderart] <> "Berichtigungsauftrag" //AND [Orderart] <> "Kauf_(Beratungsdatum_gueltig)" //AND [Orderart] <> "n/a" //AND [Initiator] = "n/a" //AND [Auftragserteilung] = "n/a" //AND [Bereitstellungsdokumente] = "n/a" //AND [UDAL-Status] <>"Back_up-Betrieb"; @Condition(constraint = true) public boolean constraint5( @From("eingangskanal") String eingangskanal, @From("orderart") String orderart, @From("produktzyklus") String produktzyklus, @From("dienstleistungsart") String dienstleistungsart, @From("initiator") String initiator, @From("auftragserteilung") String auftragserteilung, @From("bereitstellungsdokumente") String bereitstellungsdokumente, @From("udalStatus") String udalStatus ) { if (eingangskanal.startsWith("Onlinebanking")) return dienstleistungsart.equals("beratungsfreies_Geschaeft") && !produktzyklus.equals("n/a") && !dienstleistungsart.equals("n/a") && !orderart.equals("Storno") && !orderart.equals("Berichtigungsauftrag") && !orderart.equals("Kauf_(Beratungsdatum_gueltig)") && !orderart.equals("n/a") && initiator.equals("n/a") && auftragserteilung.equals("n/a") && bereitstellungsdokumente.equals("n/a") && !udalStatus.equals("Back_up-Betrieb"); return true; } ////6 //IF [Eingangskanal] IN {"EVA_Sonderweg", "EVA_Sparplan", "EVA_Direkteinstieg", "EVA Order"} //THEN [Produktzyklus] <>"Neuemission_Information" //AND [Produktzyklus] <>"Neuemission_offen" //AND [Produktzyklus] <>"n/a" //AND [Dienstleistungsart] <>"n/a" //AND [Orderart] <>"n/a"; @Condition(constraint = true) public boolean constraint6( @From("eingangskanal") String eingangskanal, @From("orderart") String orderart, @From("produktzyklus") String produktzyklus, @From("dienstleistungsart") String dienstleistungsart ) { if (asList("EVA_Sonderweg", "EVA_Sparplan", "EVA_Direkteinstieg", "EVA Order").contains(eingangskanal)) return !produktzyklus.equals("Neuemission_Information") && !produktzyklus.equals("Neuemission_offen") && !produktzyklus.equals("n/a") && !dienstleistungsart.equals("n/a") && !orderart.equals("n/a"); return true; } //7 //IF [Eingangskanal] IN {"EVA_Sonderweg", "EVA_Sparplan", "EVA_Direkteinstieg"} //THEN [Orderart] <>"Storno" //AND [Orderart] <>"Berichtigungsauftrag" //AND [Orderart] <>"Kauf_(Beratungsdatum_gueltig)" //AND [Produktzyklus] <>"n/a" //AND [Dienstleistungsart] <>"n/a" //AND [Orderart] <>"n/a"; @Condition(constraint = true) public boolean constraint7( @From("eingangskanal") String eingangskanal, @From("orderart") String orderart, @From("produktzyklus") String produktzyklus, @From("dienstleistungsart") String dienstleistungsart ) { if (asList("EVA_Sonderweg", "EVA_Sparplan", "EVA_Direkteinstieg").contains(eingangskanal)) return !orderart.equals("Storno") && !orderart.equals("Berichtigungsauftrag") && !orderart.equals("Kauf_(Beratungsdatum_gueltig)") && !produktzyklus.equals("n/a") && !dienstleistungsart.equals("n/a") && !orderart.equals("n/a"); return true; } //8 //IF [Eingangskanal] in {"EVA_Anlageberatung", "EVA_Neuemission", "EVA_Order"} //THEN [Orderart] <>"Storno" //AND [Orderart] <>"Berichtigungsauftrag" //AND [Produktzyklus] <>"n/a" //AND [Dienstleistungsart] <>"n/a" //AND [Orderart] <>"n/a"; @Condition(constraint = true) public boolean constraint8( @From("eingangskanal") String eingangskanal, @From("orderart") String orderart, @From("produktzyklus") String produktzyklus, @From("dienstleistungsart") String dienstleistungsart ) { if (asList("EVA_Anlageberatung", "EVA_Neuemission", "EVA_Order").contains(eingangskanal)) return !orderart.equals("Storno") && !orderart.equals("Berichtigungsauftrag") && !produktzyklus.equals("n/a") && !dienstleistungsart.equals("n/a") && !orderart.equals("n/a"); return true; } //9 // //IF [Eingangskanal] IN {"Infobroker", "commerzbank_de_pib"} //THEN [Finanzinstrument] <> "EMISID" //AND [Produktzyklus] = "n/a" //AND [Dienstleistungsart] = "n/a" //AND [Orderart] = "n/a" //AND [Initiator] = "n/a" //AND [Auftragserteilung] = "n/a" //AND [Bereitstellungsdokumente]= "n/a" //AND [UDAL-Status] <> "Back_up-Betrieb"; @Condition(constraint = true) public boolean constraint9( @From("eingangskanal") String eingangskanal, @From("finanzinstrument") String finanzinstrument, @From("orderart") String orderart, @From("produktzyklus") String produktzyklus, @From("dienstleistungsart") String dienstleistungsart, @From("initiator") String initiator, @From("auftragserteilung") String auftragserteilung, @From("bereitstellungsdokumente") String bereitstellungsdokumente, @From("udalStatus") String udalStatus ) { if (asList("Infobroker", "commerzbank_de_pib").contains(eingangskanal)) return !finanzinstrument.equals("EMISID") && produktzyklus.equals("n/a") && dienstleistungsart.equals("n/a") && orderart.equals("n/a") && initiator.equals("n/a") && auftragserteilung.equals("n/a") && bereitstellungsdokumente.equals("n/a") && !udalStatus.equals("Back_up-Betrieb"); return true; } @Test public void test( @From("eingangskanal") String eingangskanal, @From("finanzinstrument") String finanzinstrument, @From("orderart") String orderart, @From("produktzyklus") String produktzyklus, @From("dienstleistungsart") String dienstleistungsart, @From("initiator") String initiator, @From("auftragserteilung") String auftragserteilung, @From("bereitstellungsdokumente") String bereitstellungsdokumente, @From("udalStatus") String udalStatus, @From("abruf_Infoblaetter") String abruf_Infoblaetter ) { System.out.printf("%s,%s,%s,%s,%s,%s,%s,%s,%s,%s%n", eingangskanal, finanzinstrument, orderart, produktzyklus, dienstleistungsart, initiator, auftragserteilung, bereitstellungsdokumente, udalStatus, abruf_Infoblaetter ); } }
結局生成には2時間弱かかったが、テストスイートは以下のとおりになる。
// eingangskanal, finanzinstrument, orderart, produktzyklus, dienstleistungsart, initiator, auftragserteilung, bereitstellungsdokumente, udalStatus, abruf_Infoblaetter EVA_Anlageberatung,Aktie,Kauf(Beratungsdatum_gueltig),Neuemission_Information,Anlageberatung,Kunde,telefonisch,Beratungsprotokoll_Kunde,Normalbetrieb,WA_von_FWW EVA_Anlageberatung,Unstrukturierte_Anleihe,Kauf_(ohne_Beratungsdatum),Neuemission_offen,beratungsfreies_Geschaeft,Bank,persoenlich,Beratungsprotokoll_Interessent,Back_up-Betrieb,PIB_von_DOTi EVA_Anlageberatung,strukturierte_Anleihe,Verkauf,Neuemission_geschlossen,Anlageberatung,Bank,schriftlich,Beratungsprotokoll_Potenzial,PRIIP,PIB_von_C&M-FIC EVA_Anlageberatung,Inv.Fonds,aenderung,Neuemission_abgerechnet,Anlageberatung,Kunde,Haustuergeschaeft,Nachtraeglicher_KID-Versand,ohne_KID,PIB_von_PC_PM EVA_Anlageberatung,OIF,Streichung,Sekundaermarkt,Anlageberatung,Kunde,telefonisch,Beratungsprotokoll_Interessent,WKN_nicht_vorhanden,KID_von_PC_PM EVA_Anlageberatung,Zertifikat,Kauf(Beratungsdatum_gueltig),Neuemission_offen,beratungsfreies_Geschaeft,Kunde,schriftlich,Nachtraeglicher_KID-Versand,WKN_inaktiv/geloescht,KID_von_DOTi EVA_Anlageberatung,Optionsschein,Kauf(Beratungsdatum_gueltig),Neuemission_geschlossen,beratungsfreies_Geschaeft,Kunde,persoenlich,Beratungsprotokoll_Kunde,defektes_Dokument,KID_von_externem_Hersteller EVA_Anlageberatung,Xetra_Gold_ETC,Kauf(Beratungsdatum_gueltig),Neuemission_abgerechnet,beratungsfreies_Geschaeft,Bank,telefonisch,Beratungsprotokoll_Potenzial,Virus,PIB_von_PC_PM EVA_Anlageberatung,EMISID,Kauf(Beratungsdatum_gueltig),Sekundaermarkt,beratungsfreies_Geschaeft,Bank,Haustuergeschaeft,Beratungsprotokoll_Kunde,non-PRIIP_auf_Blackliste,PIB_von_C&M-FIC EVA_Anlageberatung,Aktie,Kauf_(ohne_Beratungsdatum),Neuemission_geschlossen,Anlageberatung,Kunde,Haustuergeschaeft,Beratungsprotokoll_Interessent,PRIIP_auf_Blackliste,KID_von_DOTi EVA_Anlageberatung,Aktie,Verkauf,Neuemission_offen,beratungsfreies_Geschaeft,Bank,telefonisch,Nachtraeglicher_KID-Versand,UDAL_nicht_verfuegbar,KID_von_PC_PM EVA_Order,Unstrukturierte_Anleihe,Verkauf,Neuemission_abgerechnet,Anlageberatung,Kunde,persoenlich,Beratungsprotokoll_Kunde,Normalbetrieb,PIB_von_DOTi EVA_Order,Aktie,aenderung,Sekundaermarkt,beratungsfreies_Geschaeft,Kunde,schriftlich,Beratungsprotokoll_Potenzial,Back_up-Betrieb,WA_von_FWW EVA_Order,Inv.Fonds,Kauf(Beratungsdatum_gueltig),Neuemission_Information,beratungsfreies_Geschaeft,Bank,telefonisch,Beratungsprotokoll_Interessent,PRIIP,KID_von_externem_Hersteller EVA_Order,strukturierte_Anleihe,Kauf_(ohne_Beratungsdatum),Neuemission_Information,beratungsfreies_Geschaeft,Kunde,telefonisch,Nachtraeglicher_KID-Versand,ohne_KID,PIB_von_C&M-FIC EVA_Order,Zertifikat,Kauf_(ohne_Beratungsdatum),Neuemission_geschlossen,Anlageberatung,Bank,Haustuergeschaeft,Beratungsprotokoll_Potenzial,WKN_nicht_vorhanden,WA_von_FWW EVA_Order,OIF,Kauf_(ohne_Beratungsdatum),Neuemission_abgerechnet,Anlageberatung,Bank,schriftlich,Beratungsprotokoll_Kunde,WKN_inaktiv/geloescht,PIB_von_PC_PM EVA_Order,Xetra_Gold_ETC,Streichung,Neuemission_offen,Anlageberatung,Bank,Haustuergeschaeft,Beratungsprotokoll_Kunde,defektes_Dokument,KID_von_DOTi EVA_Order,Optionsschein,Kauf_(ohne_Beratungsdatum),Sekundaermarkt,Anlageberatung,Kunde,persoenlich,Nachtraeglicher_KID-Versand,Virus,KID_von_PC_PM EVA_Order,Aktie,Streichung,Neuemission_abgerechnet,Anlageberatung,Kunde,persoenlich,Beratungsprotokoll_Potenzial,non-PRIIP_auf_Blackliste,KID_von_externem_Hersteller EVA_Order,EMISID,Verkauf,Neuemission_Information,Anlageberatung,Kunde,persoenlich,Beratungsprotokoll_Potenzial,PRIIP_auf_Blackliste,PIB_von_PC_PM EVA_Order,Unstrukturierte_Anleihe,Kauf(Beratungsdatum_gueltig),Neuemission_Information,Anlageberatung,Kunde,schriftlich,Beratungsprotokoll_Interessent,UDAL_nicht_verfuegbar,PIB_von_DOTi EVA_Sonderweg,strukturierte_Anleihe,aenderung,Neuemission_geschlossen,beratungsfreies_Geschaeft,Bank,telefonisch,Beratungsprotokoll_Interessent,Normalbetrieb,PIB_von_DOTi EVA_Sonderweg,Inv.Fonds,Verkauf,Sekundaermarkt,Anlageberatung,Kunde,Haustuergeschaeft,Beratungsprotokoll_Kunde,Back_up-Betrieb,KID_von_PC_PM EVA_Sonderweg,Aktie,Kauf_(ohne_Beratungsdatum),Neuemission_abgerechnet,Anlageberatung,Kunde,persoenlich,Nachtraeglicher_KID-Versand,PRIIP,WA_von_FWW EVA_Sonderweg,Unstrukturierte_Anleihe,Streichung,Neuemission_geschlossen,beratungsfreies_Geschaeft,Bank,schriftlich,Beratungsprotokoll_Potenzial,ohne_KID,KID_von_PC_PM EVA_Sonderweg,Optionsschein,Kauf(Beratungsdatum_gueltig),Neuemission_abgerechnet,beratungsfreies_Geschaeft,Bank,schriftlich,Beratungsprotokoll_Interessent,WKN_nicht_vorhanden,PIB_von_C&M-FIC EVA_Sonderweg,Xetra_Gold_ETC,Verkauf,Neuemission_geschlossen,Anlageberatung,Kunde,persoenlich,Beratungsprotokoll_Interessent,WKN_inaktiv/geloescht,WA_von_FWW EVA_Sonderweg,OIF,Verkauf,Neuemission_geschlossen,beratungsfreies_Geschaeft,Kunde,telefonisch,Nachtraeglicher_KID-Versand,defektes_Dokument,KID_von_DOTi EVA_Sonderweg,Zertifikat,Verkauf,Neuemission_geschlossen,Anlageberatung,Kunde,telefonisch,Beratungsprotokoll_Kunde,Virus,KID_von_externem_Hersteller EVA_Sonderweg,Unstrukturierte_Anleihe,aenderung,Neuemission_geschlossen,Anlageberatung,Kunde,telefonisch,Nachtraeglicher_KID-Versand,non-PRIIP_auf_Blackliste,PIB_von_PC_PM EVA_Sonderweg,Unstrukturierte_Anleihe,Kauf(Beratungsdatum_gueltig),Sekundaermarkt,beratungsfreies_Geschaeft,Bank,telefonisch,Beratungsprotokoll_Kunde,PRIIP_auf_Blackliste,KID_von_externem_Hersteller EVA_Sonderweg,EMISID,Kauf_(ohne_Beratungsdatum),Neuemission_geschlossen,Anlageberatung,Kunde,telefonisch,Beratungsprotokoll_Kunde,UDAL_nicht_verfuegbar,KID_von_externem_Hersteller EVA_Sparplan,Inv.Fonds,Kauf_(ohne_Beratungsdatum),Neuemission_geschlossen,Anlageberatung,Kunde,schriftlich,Beratungsprotokoll_Potenzial,Normalbetrieb,KID_von_DOTi EVA_Sparplan,strukturierte_Anleihe,Kauf(Beratungsdatum_gueltig),Neuemission_abgerechnet,beratungsfreies_Geschaeft,Bank,telefonisch,Beratungsprotokoll_Kunde,Back_up-Betrieb,KID_von_PC_PM EVA_Sparplan,Unstrukturierte_Anleihe,aenderung,Sekundaermarkt,Anlageberatung,Kunde,Haustuergeschaeft,Beratungsprotokoll_Kunde,PRIIP,PIB_von_DOTi EVA_Sparplan,Aktie,Verkauf,Sekundaermarkt,Anlageberatung,Kunde,persoenlich,Beratungsprotokoll_Interessent,ohne_KID,PIB_von_PC_PM EVA_Sparplan,Xetra_Gold_ETC,aenderung,Sekundaermarkt,Anlageberatung,Kunde,persoenlich,Nachtraeglicher_KID-Versand,WKN_nicht_vorhanden,KID_von_externem_Hersteller EVA_Sparplan,Optionsschein,Streichung,Sekundaermarkt,Anlageberatung,Kunde,telefonisch,Beratungsprotokoll_Potenzial,WKN_inaktiv/geloescht,PIB_von_DOTi EVA_Sparplan,Zertifikat,aenderung,Neuemission_abgerechnet,Anlageberatung,Kunde,persoenlich,Beratungsprotokoll_Interessent,defektes_Dokument,PIB_von_C&M-FIC EVA_Sparplan,OIF,aenderung,Neuemission_geschlossen,Anlageberatung,Kunde,Haustuergeschaeft,Beratungsprotokoll_Interessent,Virus,WA_von_FWW EVA_Sparplan,strukturierte_Anleihe,Kauf_(ohne_Beratungsdatum),Sekundaermarkt,Anlageberatung,Kunde,persoenlich,Beratungsprotokoll_Interessent,non-PRIIP_auf_Blackliste,KID_von_DOTi EVA_Sparplan,strukturierte_Anleihe,Streichung,Neuemission_abgerechnet,Anlageberatung,Kunde,schriftlich,Nachtraeglicher_KID-Versand,PRIIP_auf_Blackliste,WA_von_FWW EVA_Sparplan,strukturierte_Anleihe,aenderung,Neuemission_abgerechnet,Anlageberatung,Kunde,Haustuergeschaeft,Beratungsprotokoll_Potenzial,UDAL_nicht_verfuegbar,KID_von_DOTi EVA_Neuemission,OIF,Kauf(Beratungsdatum_gueltig),Neuemission_offen,Anlageberatung,Kunde,persoenlich,Beratungsprotokoll_Potenzial,Normalbetrieb,PIB_von_C&M-FIC EVA_Neuemission,Zertifikat,Streichung,Neuemission_Information,beratungsfreies_Geschaeft,Bank,Haustuergeschaeft,Nachtraeglicher_KID-Versand,Back_up-Betrieb,PIB_von_PC_PM EVA_Neuemission,Optionsschein,Verkauf,Neuemission_offen,Anlageberatung,Kunde,telefonisch,Beratungsprotokoll_Kunde,PRIIP,WA_von_FWW EVA_Neuemission,Xetra_Gold_ETC,Kauf_(ohne_Beratungsdatum),Neuemission_Information,Anlageberatung,Kunde,schriftlich,Beratungsprotokoll_Kunde,ohne_KID,PIB_von_DOTi EVA_Neuemission,Aktie,Verkauf,Neuemission_Information,Anlageberatung,Kunde,telefonisch,Beratungsprotokoll_Kunde,WKN_nicht_vorhanden,KID_von_DOTi EVA_Neuemission,Unstrukturierte_Anleihe,aenderung,Neuemission_Information,Anlageberatung,Kunde,Haustuergeschaeft,Beratungsprotokoll_Interessent,WKN_inaktiv/geloescht,KID_von_PC_PM EVA_Neuemission,strukturierte_Anleihe,Kauf_(ohne_Beratungsdatum),Sekundaermarkt,Anlageberatung,Kunde,schriftlich,Beratungsprotokoll_Potenzial,defektes_Dokument,KID_von_externem_Hersteller EVA_Neuemission,Inv.Fonds,Streichung,Neuemission_offen,Anlageberatung,Kunde,persoenlich,Beratungsprotokoll_Kunde,Virus,PIB_von_C&M-FIC EVA_Neuemission,Inv.Fonds,Verkauf,Neuemission_Information,Anlageberatung,Kunde,schriftlich,Beratungsprotokoll_Kunde,non-PRIIP_auf_Blackliste,WA_von_FWW EVA_Neuemission,Inv.Fonds,aenderung,Neuemission_offen,Anlageberatung,Kunde,telefonisch,Beratungsprotokoll_Kunde,PRIIP_auf_Blackliste,PIB_von_DOTi EVA_Neuemission,Inv.Fonds,Streichung,Neuemission_geschlossen,Anlageberatung,Kunde,persoenlich,Beratungsprotokoll_Kunde,UDAL_nicht_verfuegbar,WA_von_FWW EVA_Direkteinstieg,Zertifikat,Streichung,Sekundaermarkt,Anlageberatung,Kunde,Haustuergeschaeft,Nachtraeglicher_KID-Versand,Normalbetrieb,PIB_von_DOTi EVA_Direkteinstieg,OIF,Kauf(Beratungsdatum_gueltig),Neuemission_geschlossen,beratungsfreies_Geschaeft,Bank,telefonisch,Beratungsprotokoll_Kunde,Back_up-Betrieb,KID_von_externem_Hersteller EVA_Direkteinstieg,Xetra_Gold_ETC,Kauf_(ohne_Beratungsdatum),Neuemission_abgerechnet,Anlageberatung,Kunde,persoenlich,Beratungsprotokoll_Interessent,PRIIP,KID_von_PC_PM EVA_Direkteinstieg,Optionsschein,aenderung,Neuemission_geschlossen,Anlageberatung,Kunde,schriftlich,Beratungsprotokoll_Potenzial,ohne_KID,KID_von_DOTi EVA_Direkteinstieg,Unstrukturierte_Anleihe,Verkauf,Neuemission_geschlossen,Anlageberatung,Kunde,telefonisch,Beratungsprotokoll_Kunde,WKN_nicht_vorhanden,WA_von_FWW EVA_Direkteinstieg,Aktie,Kauf(Beratungsdatum_gueltig),Neuemission_geschlossen,Anlageberatung,Kunde,telefonisch,Beratungsprotokoll_Kunde,WKN_inaktiv/geloescht,PIB_von_C&M-FIC EVA_Direkteinstieg,Inv.Fonds,Kauf(Beratungsdatum_gueltig),Neuemission_geschlossen,Anlageberatung,Kunde,telefonisch,Beratungsprotokoll_Kunde,defektes_Dokument,PIB_von_PC_PM EVA_Direkteinstieg,strukturierte_Anleihe,Kauf(Beratungsdatum_gueltig),Neuemission_geschlossen,Anlageberatung,Kunde,schriftlich,Beratungsprotokoll_Kunde,Virus,PIB_von_DOTi EVA_Direkteinstieg,OIF,Kauf(Beratungsdatum_gueltig),Neuemission_geschlossen,Anlageberatung,Kunde,telefonisch,Beratungsprotokoll_Kunde,non-PRIIP_auf_Blackliste,PIB_von_DOTi EVA_Direkteinstieg,OIF,Kauf(Beratungsdatum_gueltig),Neuemission_geschlossen,Anlageberatung,Kunde,telefonisch,Beratungsprotokoll_Kunde,PRIIP_auf_Blackliste,PIB_von_C&M-FIC EVA_Direkteinstieg,OIF,Kauf(Beratungsdatum_gueltig),Sekundaermarkt,Anlageberatung,Kunde,telefonisch,Beratungsprotokoll_Kunde,UDAL_nicht_verfuegbar,PIB_von_C&M-FIC HOST_T19000,Aktie,Storno,Neuemission_geschlossen,Anlageberatung,n/a,n/a,n/a,n/a,PIB_von_DOTi HOST_T19001,Unstrukturierte_Anleihe,Berichtigungsauftrag,Neuemission_abgerechnet,beratungsfreies_Geschaeft,n/a,n/a,n/a,n/a,PIB_von_C&M-FIC HOST_T19901,strukturierte_Anleihe,Kauf(Beratungsdatum_gueltig),Neuemission_Information,Anlageberatung,n/a,n/a,n/a,n/a,PIB_von_PC_PM HOST_T19750,Inv.Fonds,Kauf_(ohne_Beratungsdatum),Sekundaermarkt,Anlageberatung,n/a,n/a,n/a,n/a,WA_von_FWW HOST_T28900,OIF,Verkauf,Neuemission_geschlossen,Anlageberatung,n/a,n/a,n/a,n/a,KID_von_PC_PM Onlinebanking_PC,Optionsschein,Kauf(Beratungsdatum_gueltig),Neuemission_geschlossen,beratungsfreies_Geschaeft,n/a,n/a,n/a,Normalbetrieb,KID_von_externem_Hersteller Onlinebanking_PC,OIF,Streichung,Neuemission_abgerechnet,beratungsfreies_Geschaeft,n/a,n/a,n/a,PRIIP,KID_von_DOTi Onlinebanking_PC,Zertifikat,Kauf(Beratungsdatum_gueltig),Sekundaermarkt,beratungsfreies_Geschaeft,n/a,n/a,n/a,ohne_KID,WA_von_FWW Onlinebanking_PC,strukturierte_Anleihe,Kauf_(ohne_Beratungsdatum),Neuemission_geschlossen,beratungsfreies_Geschaeft,n/a,n/a,n/a,WKN_nicht_vorhanden,PIB_von_DOTi Onlinebanking_PC,Inv.Fonds,Verkauf,Neuemission_geschlossen,beratungsfreies_Geschaeft,n/a,n/a,n/a,WKN_inaktiv/geloescht,PIB_von_C&M-FIC Onlinebanking_PC,Aktie,aenderung,Neuemission_geschlossen,beratungsfreies_Geschaeft,n/a,n/a,n/a,defektes_Dokument,KID_von_PC_PM Onlinebanking_PC,Unstrukturierte_Anleihe,Kauf(Beratungsdatum_gueltig),Neuemission_geschlossen,beratungsfreies_Geschaeft,n/a,n/a,n/a,Virus,KID_von_DOTi Onlinebanking_PC,Xetra_Gold_ETC,Kauf(Beratungsdatum_gueltig),Neuemission_geschlossen,beratungsfreies_Geschaeft,n/a,n/a,n/a,non-PRIIP_auf_Blackliste,PIB_von_C&M-FIC Onlinebanking_PC,Zertifikat,Kauf(Beratungsdatum_gueltig),Neuemission_geschlossen,beratungsfreies_Geschaeft,n/a,n/a,n/a,PRIIP_auf_Blackliste,KID_von_PC_PM Onlinebanking_PC,Zertifikat,Kauf(Beratungsdatum_gueltig),Neuemission_geschlossen,beratungsfreies_Geschaeft,n/a,n/a,n/a,UDAL_nicht_verfuegbar,PIB_von_PC_PM Onlinebanking_PC,EMISID,aenderung,Neuemission_abgerechnet,beratungsfreies_Geschaeft,n/a,n/a,n/a,n/a,KID_von_DOTi Onlinebanking_MSB,Xetra_Gold_ETC,Kauf(Beratungsdatum_gueltig),Neuemission_geschlossen,beratungsfreies_Geschaeft,n/a,n/a,n/a,Normalbetrieb,PIB_von_PC_PM Onlinebanking_MSB,Zertifikat,Kauf_(ohne_Beratungsdatum),Neuemission_abgerechnet,beratungsfreies_Geschaeft,n/a,n/a,n/a,PRIIP,WA_von_FWW Onlinebanking_MSB,OIF,Verkauf,Sekundaermarkt,beratungsfreies_Geschaeft,n/a,n/a,n/a,ohne_KID,KID_von_externem_Hersteller Onlinebanking_MSB,Inv.Fonds,aenderung,Neuemission_geschlossen,beratungsfreies_Geschaeft,n/a,n/a,n/a,WKN_nicht_vorhanden,PIB_von_DOTi Onlinebanking_MSB,strukturierte_Anleihe,Streichung,Neuemission_geschlossen,beratungsfreies_Geschaeft,n/a,n/a,n/a,WKN_inaktiv/geloescht,PIB_von_C&M-FIC Onlinebanking_MSB,Unstrukturierte_Anleihe,Kauf(Beratungsdatum_gueltig),Neuemission_geschlossen,beratungsfreies_Geschaeft,n/a,n/a,n/a,defektes_Dokument,WA_von_FWW Onlinebanking_MSB,Aktie,Kauf(Beratungsdatum_gueltig),Neuemission_geschlossen,beratungsfreies_Geschaeft,n/a,n/a,n/a,Virus,KID_von_PC_PM Onlinebanking_MSB,Optionsschein,Kauf(Beratungsdatum_gueltig),Neuemission_geschlossen,beratungsfreies_Geschaeft,n/a,n/a,n/a,non-PRIIP_auf_Blackliste,PIB_von_PC_PM Onlinebanking_MSB,Optionsschein,Kauf(Beratungsdatum_gueltig),Neuemission_geschlossen,beratungsfreies_Geschaeft,n/a,n/a,n/a,PRIIP_auf_Blackliste,KID_von_DOTi Infobroker,Aktie,n/a,n/a,n/a,n/a,n/a,n/a,Normalbetrieb,KID_von_PC_PM Infobroker,Unstrukturierte_Anleihe,n/a,n/a,n/a,n/a,n/a,n/a,PRIIP,PIB_von_PC_PM Infobroker,OIF,n/a,n/a,n/a,n/a,n/a,n/a,WKN_inaktiv/geloescht,KID_von_externem_Hersteller Infobroker,Zertifikat,n/a,n/a,n/a,n/a,n/a,n/a,defektes_Dokument,PIB_von_DOTi Infobroker,Aktie,n/a,n/a,n/a,n/a,n/a,n/a,Normalbetrieb,WA_von_FWW Infobroker,Aktie,n/a,n/a,n/a,n/a,n/a,n/a,Normalbetrieb,PIB_von_C&M-FIC Infobroker,Aktie,n/a,n/a,n/a,n/a,n/a,n/a,Normalbetrieb,KID_von_DOTi HOST_T19000,Aktie,Storno,Neuemission_geschlossen,Anlageberatung,n/a,n/a,n/a,n/a,KID_von_externem_Hersteller Onlinebanking_Neuemission_PC,strukturierte_Anleihe,Verkauf,Neuemission_offen,beratungsfreies_Geschaeft,n/a,n/a,n/a,WKN_nicht_vorhanden,PIB_von_PC_PM HOST_T19000,EMISID,Storno,Sekundaermarkt,Anlageberatung,n/a,n/a,n/a,n/a,WA_von_FWW HOST_T19000,EMISID,Storno,Sekundaermarkt,Anlageberatung,n/a,n/a,n/a,n/a,KID_von_PC_PM HOST_T19001,EMISID,Berichtigungsauftrag,Neuemission_geschlossen,Anlageberatung,n/a,n/a,n/a,n/a,PIB_von_DOTi EVA_Order,Xetra_Gold_ETC,Streichung,Neuemission_offen,Anlageberatung,Bank,Haustuergeschaeft,Beratungsprotokoll_Kunde,defektes_Dokument,KID_von_externem_Hersteller HOST_T19000,Aktie,Storno,Neuemission_geschlossen,Anlageberatung,n/a,n/a,n/a,n/a,PIB_von_C&M-FIC HOST_T19000,Aktie,Storno,Neuemission_geschlossen,Anlageberatung,n/a,n/a,n/a,n/a,PIB_von_PC_PM HOST_T19000,Aktie,Storno,Neuemission_geschlossen,Anlageberatung,n/a,n/a,n/a,n/a,KID_von_DOTi HOST_T19001,Unstrukturierte_Anleihe,Berichtigungsauftrag,Neuemission_abgerechnet,beratungsfreies_Geschaeft,n/a,n/a,n/a,n/a,WA_von_FWW HOST_T19001,Unstrukturierte_Anleihe,Berichtigungsauftrag,Neuemission_abgerechnet,beratungsfreies_Geschaeft,n/a,n/a,n/a,n/a,PIB_von_PC_PM HOST_T19001,Unstrukturierte_Anleihe,Berichtigungsauftrag,Neuemission_abgerechnet,beratungsfreies_Geschaeft,n/a,n/a,n/a,n/a,KID_von_PC_PM HOST_T19001,Unstrukturierte_Anleihe,Berichtigungsauftrag,Neuemission_abgerechnet,beratungsfreies_Geschaeft,n/a,n/a,n/a,n/a,KID_von_DOTi HOST_T19001,Unstrukturierte_Anleihe,Berichtigungsauftrag,Neuemission_abgerechnet,beratungsfreies_Geschaeft,n/a,n/a,n/a,n/a,KID_von_externem_Hersteller Onlinebanking_Neuemission_PC,Zertifikat,Kauf(Beratungsdatum_gueltig),Neuemission_offen,beratungsfreies_Geschaeft,n/a,n/a,n/a,non-PRIIP_auf_Blackliste,KID_von_PC_PM EVA_Anlageberatung,Unstrukturierte_Anleihe,Kauf_(ohne_Beratungsdatum),Neuemission_offen,beratungsfreies_Geschaeft,Bank,persoenlich,Beratungsprotokoll_Interessent,Back_up-Betrieb,PIB_von_C&M-FIC EVA_Anlageberatung,Unstrukturierte_Anleihe,Kauf_(ohne_Beratungsdatum),Neuemission_offen,beratungsfreies_Geschaeft,Bank,persoenlich,Beratungsprotokoll_Interessent,Back_up-Betrieb,KID_von_DOTi HOST_T19901,strukturierte_Anleihe,Kauf(Beratungsdatum_gueltig),Neuemission_Information,Anlageberatung,n/a,n/a,n/a,n/a,WA_von_FWW HOST_T19901,strukturierte_Anleihe,Kauf(Beratungsdatum_gueltig),Neuemission_Information,Anlageberatung,n/a,n/a,n/a,n/a,PIB_von_DOTi HOST_T19901,strukturierte_Anleihe,Kauf(Beratungsdatum_gueltig),Neuemission_Information,Anlageberatung,n/a,n/a,n/a,n/a,PIB_von_C&M-FIC HOST_T19901,strukturierte_Anleihe,Kauf(Beratungsdatum_gueltig),Neuemission_Information,Anlageberatung,n/a,n/a,n/a,n/a,KID_von_PC_PM HOST_T19901,strukturierte_Anleihe,Kauf(Beratungsdatum_gueltig),Neuemission_Information,Anlageberatung,n/a,n/a,n/a,n/a,KID_von_DOTi HOST_T19901,strukturierte_Anleihe,Kauf(Beratungsdatum_gueltig),Neuemission_Information,Anlageberatung,n/a,n/a,n/a,n/a,KID_von_externem_Hersteller HOST_T19750,Inv.Fonds,Kauf_(ohne_Beratungsdatum),Sekundaermarkt,Anlageberatung,n/a,n/a,n/a,n/a,PIB_von_DOTi HOST_T19750,Inv.Fonds,Kauf_(ohne_Beratungsdatum),Sekundaermarkt,Anlageberatung,n/a,n/a,n/a,n/a,PIB_von_C&M-FIC HOST_T19750,Inv.Fonds,Kauf_(ohne_Beratungsdatum),Sekundaermarkt,Anlageberatung,n/a,n/a,n/a,n/a,PIB_von_PC_PM HOST_T19750,Inv.Fonds,Kauf_(ohne_Beratungsdatum),Sekundaermarkt,Anlageberatung,n/a,n/a,n/a,n/a,KID_von_PC_PM HOST_T19750,Inv.Fonds,Kauf_(ohne_Beratungsdatum),Sekundaermarkt,Anlageberatung,n/a,n/a,n/a,n/a,KID_von_DOTi HOST_T19750,Inv.Fonds,Kauf_(ohne_Beratungsdatum),Sekundaermarkt,Anlageberatung,n/a,n/a,n/a,n/a,KID_von_externem_Hersteller HOST_T28900,OIF,Verkauf,Neuemission_geschlossen,Anlageberatung,n/a,n/a,n/a,n/a,WA_von_FWW HOST_T28900,OIF,Verkauf,Neuemission_geschlossen,Anlageberatung,n/a,n/a,n/a,n/a,PIB_von_DOTi HOST_T28900,OIF,Verkauf,Neuemission_geschlossen,Anlageberatung,n/a,n/a,n/a,n/a,PIB_von_C&M-FIC HOST_T28900,OIF,Verkauf,Neuemission_geschlossen,Anlageberatung,n/a,n/a,n/a,n/a,PIB_von_PC_PM HOST_T28900,OIF,Verkauf,Neuemission_geschlossen,Anlageberatung,n/a,n/a,n/a,n/a,KID_von_DOTi HOST_T28900,OIF,Verkauf,Neuemission_geschlossen,Anlageberatung,n/a,n/a,n/a,n/a,KID_von_externem_Hersteller Onlinebanking_Neuemission_PC,EMISID,Streichung,Neuemission_offen,beratungsfreies_Geschaeft,n/a,n/a,n/a,Normalbetrieb,WA_von_FWW Onlinebanking_Neuemission_PC,EMISID,Streichung,Neuemission_offen,beratungsfreies_Geschaeft,n/a,n/a,n/a,Normalbetrieb,PIB_von_DOTi Onlinebanking_Neuemission_PC,EMISID,Streichung,Neuemission_offen,beratungsfreies_Geschaeft,n/a,n/a,n/a,Normalbetrieb,PIB_von_C&M-FIC Onlinebanking_Neuemission_PC,EMISID,Streichung,Neuemission_offen,beratungsfreies_Geschaeft,n/a,n/a,n/a,Normalbetrieb,KID_von_DOTi Onlinebanking_Neuemission_PC,EMISID,Streichung,Neuemission_offen,beratungsfreies_Geschaeft,n/a,n/a,n/a,Normalbetrieb,KID_von_externem_Hersteller Onlinebanking_Neuemission_MSB,Aktie,Kauf(Beratungsdatum_gueltig),Neuemission_Information,beratungsfreies_Geschaeft,n/a,n/a,n/a,Normalbetrieb,WA_von_FWW Onlinebanking_Neuemission_MSB,Aktie,Kauf(Beratungsdatum_gueltig),Neuemission_Information,beratungsfreies_Geschaeft,n/a,n/a,n/a,Normalbetrieb,PIB_von_DOTi Onlinebanking_Neuemission_MSB,Aktie,Kauf(Beratungsdatum_gueltig),Neuemission_Information,beratungsfreies_Geschaeft,n/a,n/a,n/a,Normalbetrieb,PIB_von_C&M-FIC Onlinebanking_Neuemission_MSB,Aktie,Kauf(Beratungsdatum_gueltig),Neuemission_Information,beratungsfreies_Geschaeft,n/a,n/a,n/a,Normalbetrieb,PIB_von_PC_PM Onlinebanking_Neuemission_MSB,Aktie,Kauf(Beratungsdatum_gueltig),Neuemission_Information,beratungsfreies_Geschaeft,n/a,n/a,n/a,Normalbetrieb,KID_von_PC_PM Onlinebanking_Neuemission_MSB,Aktie,Kauf(Beratungsdatum_gueltig),Neuemission_Information,beratungsfreies_Geschaeft,n/a,n/a,n/a,Normalbetrieb,KID_von_DOTi Onlinebanking_Neuemission_MSB,Aktie,Kauf(Beratungsdatum_gueltig),Neuemission_Information,beratungsfreies_Geschaeft,n/a,n/a,n/a,Normalbetrieb,KID_von_externem_Hersteller Onlinebanking_Tablet_PC,Aktie,Kauf(Beratungsdatum_gueltig),Neuemission_geschlossen,beratungsfreies_Geschaeft,n/a,n/a,n/a,Normalbetrieb,WA_von_FWW Onlinebanking_Tablet_PC,Aktie,Kauf(Beratungsdatum_gueltig),Neuemission_geschlossen,beratungsfreies_Geschaeft,n/a,n/a,n/a,Normalbetrieb,PIB_von_DOTi Onlinebanking_Tablet_PC,Aktie,Kauf(Beratungsdatum_gueltig),Neuemission_geschlossen,beratungsfreies_Geschaeft,n/a,n/a,n/a,Normalbetrieb,PIB_von_C&M-FIC Onlinebanking_Tablet_PC,Aktie,Kauf(Beratungsdatum_gueltig),Neuemission_geschlossen,beratungsfreies_Geschaeft,n/a,n/a,n/a,Normalbetrieb,PIB_von_PC_PM Onlinebanking_Tablet_PC,Aktie,Kauf(Beratungsdatum_gueltig),Neuemission_geschlossen,beratungsfreies_Geschaeft,n/a,n/a,n/a,Normalbetrieb,KID_von_PC_PM Onlinebanking_Tablet_PC,Aktie,Kauf(Beratungsdatum_gueltig),Neuemission_geschlossen,beratungsfreies_Geschaeft,n/a,n/a,n/a,Normalbetrieb,KID_von_DOTi Onlinebanking_Tablet_PC,Aktie,Kauf(Beratungsdatum_gueltig),Neuemission_geschlossen,beratungsfreies_Geschaeft,n/a,n/a,n/a,Normalbetrieb,KID_von_externem_Hersteller commerzbank_de_pib,Aktie,n/a,n/a,n/a,n/a,n/a,n/a,Normalbetrieb,WA_von_FWW commerzbank_de_pib,Aktie,n/a,n/a,n/a,n/a,n/a,n/a,Normalbetrieb,PIB_von_DOTi commerzbank_de_pib,Aktie,n/a,n/a,n/a,n/a,n/a,n/a,Normalbetrieb,PIB_von_C&M-FIC commerzbank_de_pib,Aktie,n/a,n/a,n/a,n/a,n/a,n/a,Normalbetrieb,PIB_von_PC_PM commerzbank_de_pib,Aktie,n/a,n/a,n/a,n/a,n/a,n/a,Normalbetrieb,KID_von_PC_PM commerzbank_de_pib,Aktie,n/a,n/a,n/a,n/a,n/a,n/a,Normalbetrieb,KID_von_DOTi commerzbank_de_pib,Aktie,n/a,n/a,n/a,n/a,n/a,n/a,Normalbetrieb,KID_von_externem_Hersteller Onlinebanking_MSB,Optionsschein,Kauf(Beratungsdatum_gueltig),Neuemission_geschlossen,beratungsfreies_Geschaeft,n/a,n/a,n/a,UDAL_nicht_verfuegbar,WA_von_FWW Onlinebanking_MSB,Zertifikat,Streichung,Neuemission_geschlossen,beratungsfreies_Geschaeft,n/a,n/a,n/a,n/a,PIB_von_DOTi Onlinebanking_Neuemission_PC,Aktie,Kauf(Beratungsdatum_gueltig),Neuemission_Information,beratungsfreies_Geschaeft,n/a,n/a,n/a,PRIIP,PIB_von_PC_PM Onlinebanking_Neuemission_PC,Unstrukturierte_Anleihe,Kauf_(ohne_Beratungsdatum),Neuemission_offen,beratungsfreies_Geschaeft,n/a,n/a,n/a,ohne_KID,KID_von_PC_PM Onlinebanking_Neuemission_PC,Inv.Fonds,aenderung,Neuemission_geschlossen,beratungsfreies_Geschaeft,n/a,n/a,n/a,WKN_inaktiv/geloescht,KID_von_externem_Hersteller Onlinebanking_Neuemission_PC,OIF,Kauf(Beratungsdatum_gueltig),Neuemission_Information,beratungsfreies_Geschaeft,n/a,n/a,n/a,defektes_Dokument,WA_von_FWW Onlinebanking_Neuemission_PC,Zertifikat,Kauf(Beratungsdatum_gueltig),Neuemission_Information,beratungsfreies_Geschaeft,n/a,n/a,n/a,Virus,PIB_von_DOTi Onlinebanking_Neuemission_PC,Xetra_Gold_ETC,Kauf(Beratungsdatum_gueltig),Neuemission_abgerechnet,beratungsfreies_Geschaeft,n/a,n/a,n/a,PRIIP_auf_Blackliste,PIB_von_PC_PM Onlinebanking_Neuemission_PC,Optionsschein,Kauf(Beratungsdatum_gueltig),Neuemission_Information,beratungsfreies_Geschaeft,n/a,n/a,n/a,UDAL_nicht_verfuegbar,KID_von_PC_PM Onlinebanking_Neuemission_PC,Optionsschein,Kauf(Beratungsdatum_gueltig),Neuemission_offen,beratungsfreies_Geschaeft,n/a,n/a,n/a,n/a,KID_von_DOTi Onlinebanking_Neuemission_MSB,EMISID,Kauf_(ohne_Beratungsdatum),Neuemission_offen,beratungsfreies_Geschaeft,n/a,n/a,n/a,PRIIP,WA_von_FWW Onlinebanking_Neuemission_MSB,Unstrukturierte_Anleihe,Verkauf,Neuemission_geschlossen,beratungsfreies_Geschaeft,n/a,n/a,n/a,ohne_KID,PIB_von_DOTi Onlinebanking_Neuemission_MSB,strukturierte_Anleihe,aenderung,Neuemission_abgerechnet,beratungsfreies_Geschaeft,n/a,n/a,n/a,WKN_nicht_vorhanden,PIB_von_C&M-FIC Onlinebanking_Neuemission_MSB,Inv.Fonds,Streichung,Sekundaermarkt,beratungsfreies_Geschaeft,n/a,n/a,n/a,WKN_inaktiv/geloescht,PIB_von_PC_PM Onlinebanking_Neuemission_MSB,OIF,Kauf(Beratungsdatum_gueltig),Neuemission_Information,beratungsfreies_Geschaeft,n/a,n/a,n/a,defektes_Dokument,KID_von_PC_PM Onlinebanking_Neuemission_MSB,Zertifikat,Kauf(Beratungsdatum_gueltig),Neuemission_Information,beratungsfreies_Geschaeft,n/a,n/a,n/a,Virus,KID_von_DOTi Onlinebanking_Neuemission_MSB,Optionsschein,Kauf(Beratungsdatum_gueltig),Neuemission_Information,beratungsfreies_Geschaeft,n/a,n/a,n/a,non-PRIIP_auf_Blackliste,KID_von_externem_Hersteller Onlinebanking_Neuemission_MSB,Xetra_Gold_ETC,Kauf(Beratungsdatum_gueltig),Neuemission_Information,beratungsfreies_Geschaeft,n/a,n/a,n/a,PRIIP_auf_Blackliste,WA_von_FWW Onlinebanking_Neuemission_MSB,Xetra_Gold_ETC,Kauf(Beratungsdatum_gueltig),Neuemission_Information,beratungsfreies_Geschaeft,n/a,n/a,n/a,UDAL_nicht_verfuegbar,PIB_von_DOTi Onlinebanking_Neuemission_MSB,Xetra_Gold_ETC,Kauf(Beratungsdatum_gueltig),Neuemission_Information,beratungsfreies_Geschaeft,n/a,n/a,n/a,n/a,PIB_von_C&M-FIC Onlinebanking_Tablet_PC,Unstrukturierte_Anleihe,Kauf_(ohne_Beratungsdatum),Neuemission_abgerechnet,beratungsfreies_Geschaeft,n/a,n/a,n/a,PRIIP,KID_von_PC_PM Onlinebanking_Tablet_PC,EMISID,Verkauf,Sekundaermarkt,beratungsfreies_Geschaeft,n/a,n/a,n/a,ohne_KID,KID_von_DOTi Onlinebanking_Tablet_PC,strukturierte_Anleihe,aenderung,Neuemission_geschlossen,beratungsfreies_Geschaeft,n/a,n/a,n/a,WKN_nicht_vorhanden,KID_von_externem_Hersteller Onlinebanking_Tablet_PC,Inv.Fonds,Streichung,Neuemission_geschlossen,beratungsfreies_Geschaeft,n/a,n/a,n/a,WKN_inaktiv/geloescht,WA_von_FWW Onlinebanking_Tablet_PC,OIF,Kauf(Beratungsdatum_gueltig),Neuemission_geschlossen,beratungsfreies_Geschaeft,n/a,n/a,n/a,defektes_Dokument,PIB_von_DOTi Onlinebanking_Tablet_PC,Zertifikat,Kauf(Beratungsdatum_gueltig),Neuemission_geschlossen,beratungsfreies_Geschaeft,n/a,n/a,n/a,Virus,PIB_von_C&M-FIC Onlinebanking_Tablet_PC,Optionsschein,Kauf(Beratungsdatum_gueltig),Neuemission_geschlossen,beratungsfreies_Geschaeft,n/a,n/a,n/a,non-PRIIP_auf_Blackliste,PIB_von_PC_PM Onlinebanking_Tablet_PC,Xetra_Gold_ETC,Kauf(Beratungsdatum_gueltig),Neuemission_geschlossen,beratungsfreies_Geschaeft,n/a,n/a,n/a,PRIIP_auf_Blackliste,KID_von_PC_PM Onlinebanking_Tablet_PC,Aktie,Kauf(Beratungsdatum_gueltig),Neuemission_geschlossen,beratungsfreies_Geschaeft,n/a,n/a,n/a,UDAL_nicht_verfuegbar,KID_von_DOTi Onlinebanking_Tablet_PC,Aktie,Kauf(Beratungsdatum_gueltig),Neuemission_geschlossen,beratungsfreies_Geschaeft,n/a,n/a,n/a,n/a,KID_von_externem_Hersteller Infobroker,strukturierte_Anleihe,n/a,n/a,n/a,n/a,n/a,n/a,ohne_KID,PIB_von_C&M-FIC Infobroker,Inv.Fonds,n/a,n/a,n/a,n/a,n/a,n/a,WKN_nicht_vorhanden,PIB_von_PC_PM Infobroker,Optionsschein,n/a,n/a,n/a,n/a,n/a,n/a,Virus,KID_von_externem_Hersteller Infobroker,Xetra_Gold_ETC,n/a,n/a,n/a,n/a,n/a,n/a,non-PRIIP_auf_Blackliste,WA_von_FWW Infobroker,Aktie,n/a,n/a,n/a,n/a,n/a,n/a,PRIIP_auf_Blackliste,PIB_von_DOTi Infobroker,Aktie,n/a,n/a,n/a,n/a,n/a,n/a,UDAL_nicht_verfuegbar,PIB_von_C&M-FIC Infobroker,Aktie,n/a,n/a,n/a,n/a,n/a,n/a,n/a,PIB_von_PC_PM commerzbank_de_pib,Unstrukturierte_Anleihe,n/a,n/a,n/a,n/a,n/a,n/a,PRIIP,KID_von_DOTi commerzbank_de_pib,strukturierte_Anleihe,n/a,n/a,n/a,n/a,n/a,n/a,ohne_KID,KID_von_externem_Hersteller commerzbank_de_pib,Inv.Fonds,n/a,n/a,n/a,n/a,n/a,n/a,WKN_nicht_vorhanden,WA_von_FWW commerzbank_de_pib,OIF,n/a,n/a,n/a,n/a,n/a,n/a,WKN_inaktiv/geloescht,PIB_von_DOTi commerzbank_de_pib,Zertifikat,n/a,n/a,n/a,n/a,n/a,n/a,defektes_Dokument,PIB_von_C&M-FIC commerzbank_de_pib,Optionsschein,n/a,n/a,n/a,n/a,n/a,n/a,Virus,PIB_von_PC_PM commerzbank_de_pib,Xetra_Gold_ETC,n/a,n/a,n/a,n/a,n/a,n/a,non-PRIIP_auf_Blackliste,KID_von_PC_PM commerzbank_de_pib,Aktie,n/a,n/a,n/a,n/a,n/a,n/a,PRIIP_auf_Blackliste,KID_von_DOTi commerzbank_de_pib,Aktie,n/a,n/a,n/a,n/a,n/a,n/a,UDAL_nicht_verfuegbar,KID_von_externem_Hersteller commerzbank_de_pib,Aktie,n/a,n/a,n/a,n/a,n/a,n/a,n/a,WA_von_FWW EVA_Sparplan,EMISID,Kauf(Beratungsdatum_gueltig),Neuemission_geschlossen,Anlageberatung,Kunde,schriftlich,Beratungsprotokoll_Interessent,Back_up-Betrieb,PIB_von_DOTi EVA_Neuemission,EMISID,Kauf(Beratungsdatum_gueltig),Neuemission_abgerechnet,Anlageberatung,Kunde,telefonisch,Nachtraeglicher_KID-Versand,WKN_nicht_vorhanden,PIB_von_C&M-FIC EVA_Direkteinstieg,EMISID,Kauf(Beratungsdatum_gueltig),Neuemission_geschlossen,Anlageberatung,Kunde,telefonisch,Beratungsprotokoll_Kunde,WKN_inaktiv/geloescht,PIB_von_PC_PM HOST_T19000,Unstrukturierte_Anleihe,Kauf(Beratungsdatum_gueltig),Neuemission_abgerechnet,beratungsfreies_Geschaeft,n/a,n/a,n/a,n/a,KID_von_PC_PM HOST_T19000,strukturierte_Anleihe,Berichtigungsauftrag,Sekundaermarkt,Anlageberatung,n/a,n/a,n/a,n/a,KID_von_DOTi HOST_T19000,Inv.Fonds,Kauf_(ohne_Beratungsdatum),Neuemission_geschlossen,Anlageberatung,n/a,n/a,n/a,n/a,KID_von_externem_Hersteller HOST_T19000,OIF,Verkauf,Neuemission_geschlossen,Anlageberatung,n/a,n/a,n/a,n/a,WA_von_FWW HOST_T19000,Zertifikat,aenderung,Neuemission_geschlossen,Anlageberatung,n/a,n/a,n/a,n/a,PIB_von_DOTi HOST_T19000,Optionsschein,Streichung,Neuemission_geschlossen,Anlageberatung,n/a,n/a,n/a,n/a,PIB_von_C&M-FIC HOST_T19000,Xetra_Gold_ETC,Storno,Neuemission_abgerechnet,beratungsfreies_Geschaeft,n/a,n/a,n/a,n/a,PIB_von_PC_PM HOST_T19001,Aktie,Kauf(Beratungsdatum_gueltig),Neuemission_geschlossen,Anlageberatung,n/a,n/a,n/a,n/a,KID_von_DOTi HOST_T19001,strukturierte_Anleihe,Storno,Sekundaermarkt,Anlageberatung,n/a,n/a,n/a,n/a,KID_von_externem_Hersteller HOST_T19001,Inv.Fonds,Kauf_(ohne_Beratungsdatum),Neuemission_geschlossen,Anlageberatung,n/a,n/a,n/a,n/a,WA_von_FWW HOST_T19001,OIF,Verkauf,Neuemission_geschlossen,Anlageberatung,n/a,n/a,n/a,n/a,PIB_von_DOTi HOST_T19001,Zertifikat,aenderung,Neuemission_geschlossen,Anlageberatung,n/a,n/a,n/a,n/a,PIB_von_C&M-FIC HOST_T19001,Optionsschein,Streichung,Neuemission_geschlossen,Anlageberatung,n/a,n/a,n/a,n/a,PIB_von_PC_PM HOST_T19001,Xetra_Gold_ETC,Berichtigungsauftrag,Neuemission_geschlossen,Anlageberatung,n/a,n/a,n/a,n/a,KID_von_PC_PM HOST_T19901,Aktie,Berichtigungsauftrag,Neuemission_Information,beratungsfreies_Geschaeft,n/a,n/a,n/a,n/a,KID_von_externem_Hersteller HOST_T19901,Unstrukturierte_Anleihe,Storno,Neuemission_Information,Anlageberatung,n/a,n/a,n/a,n/a,WA_von_FWW HOST_T19901,Inv.Fonds,Kauf_(ohne_Beratungsdatum),Neuemission_geschlossen,Anlageberatung,n/a,n/a,n/a,n/a,PIB_von_DOTi HOST_T19901,OIF,Verkauf,Neuemission_abgerechnet,Anlageberatung,n/a,n/a,n/a,n/a,PIB_von_C&M-FIC HOST_T19901,Zertifikat,aenderung,Sekundaermarkt,Anlageberatung,n/a,n/a,n/a,n/a,PIB_von_PC_PM HOST_T19901,Optionsschein,Streichung,Neuemission_Information,Anlageberatung,n/a,n/a,n/a,n/a,KID_von_PC_PM HOST_T19901,Xetra_Gold_ETC,Kauf(Beratungsdatum_gueltig),Neuemission_Information,Anlageberatung,n/a,n/a,n/a,n/a,KID_von_DOTi HOST_T19901,EMISID,Kauf(Beratungsdatum_gueltig),Neuemission_Information,Anlageberatung,n/a,n/a,n/a,n/a,KID_von_externem_Hersteller HOST_T19750,Aktie,Kauf(Beratungsdatum_gueltig),Neuemission_geschlossen,beratungsfreies_Geschaeft,n/a,n/a,n/a,n/a,WA_von_FWW HOST_T19750,Unstrukturierte_Anleihe,Verkauf,Neuemission_abgerechnet,Anlageberatung,n/a,n/a,n/a,n/a,PIB_von_DOTi HOST_T19750,strukturierte_Anleihe,aenderung,Neuemission_geschlossen,Anlageberatung,n/a,n/a,n/a,n/a,PIB_von_C&M-FIC HOST_T19750,OIF,Storno,Neuemission_geschlossen,Anlageberatung,n/a,n/a,n/a,n/a,PIB_von_PC_PM HOST_T19750,Zertifikat,Berichtigungsauftrag,Neuemission_geschlossen,Anlageberatung,n/a,n/a,n/a,n/a,KID_von_PC_PM HOST_T19750,Optionsschein,Streichung,Neuemission_geschlossen,Anlageberatung,n/a,n/a,n/a,n/a,KID_von_DOTi HOST_T19750,Xetra_Gold_ETC,Kauf(Beratungsdatum_gueltig),Neuemission_geschlossen,Anlageberatung,n/a,n/a,n/a,n/a,KID_von_externem_Hersteller HOST_T19750,EMISID,Kauf(Beratungsdatum_gueltig),Neuemission_geschlossen,Anlageberatung,n/a,n/a,n/a,n/a,WA_von_FWW HOST_T28900,Aktie,Kauf(Beratungsdatum_gueltig),Neuemission_abgerechnet,beratungsfreies_Geschaeft,n/a,n/a,n/a,n/a,PIB_von_DOTi HOST_T28900,Unstrukturierte_Anleihe,Kauf_(ohne_Beratungsdatum),Sekundaermarkt,Anlageberatung,n/a,n/a,n/a,n/a,PIB_von_C&M-FIC HOST_T28900,strukturierte_Anleihe,aenderung,Neuemission_geschlossen,Anlageberatung,n/a,n/a,n/a,n/a,PIB_von_PC_PM HOST_T28900,Inv.Fonds,Storno,Neuemission_geschlossen,Anlageberatung,n/a,n/a,n/a,n/a,KID_von_PC_PM HOST_T28900,Zertifikat,Streichung,Neuemission_geschlossen,Anlageberatung,n/a,n/a,n/a,n/a,KID_von_DOTi HOST_T28900,Optionsschein,Berichtigungsauftrag,Neuemission_geschlossen,Anlageberatung,n/a,n/a,n/a,n/a,KID_von_externem_Hersteller HOST_T28900,Xetra_Gold_ETC,Kauf(Beratungsdatum_gueltig),Neuemission_geschlossen,Anlageberatung,n/a,n/a,n/a,n/a,WA_von_FWW HOST_T28900,EMISID,Kauf(Beratungsdatum_gueltig),Neuemission_geschlossen,Anlageberatung,n/a,n/a,n/a,n/a,PIB_von_DOTi Onlinebanking_MSB,EMISID,Kauf(Beratungsdatum_gueltig),Neuemission_geschlossen,beratungsfreies_Geschaeft,n/a,n/a,n/a,defektes_Dokument,PIB_von_C&M-FIC EVA_Anlageberatung,Optionsschein,Kauf(Beratungsdatum_gueltig),Neuemission_Information,Anlageberatung,Kunde,Haustuergeschaeft,Beratungsprotokoll_Kunde,Back_up-Betrieb,PIB_von_PC_PM EVA_Anlageberatung,Xetra_Gold_ETC,Kauf(Beratungsdatum_gueltig),Neuemission_Information,Anlageberatung,Kunde,telefonisch,Beratungsprotokoll_Kunde,Back_up-Betrieb,KID_von_PC_PM EVA_Anlageberatung,EMISID,Kauf(Beratungsdatum_gueltig),Neuemission_Information,Anlageberatung,Kunde,telefonisch,Beratungsprotokoll_Kunde,Virus,KID_von_DOTi HOST_T19000,Inv.Fonds,Berichtigungsauftrag,Neuemission_geschlossen,Anlageberatung,n/a,n/a,n/a,n/a,KID_von_externem_Hersteller HOST_T19000,OIF,Berichtigungsauftrag,Neuemission_geschlossen,Anlageberatung,n/a,n/a,n/a,n/a,WA_von_FWW HOST_T19000,Zertifikat,Storno,Neuemission_geschlossen,Anlageberatung,n/a,n/a,n/a,n/a,PIB_von_DOTi HOST_T19000,Optionsschein,Storno,Neuemission_geschlossen,Anlageberatung,n/a,n/a,n/a,n/a,PIB_von_C&M-FIC Onlinebanking_Neuemission_PC,Aktie,Kauf(Beratungsdatum_gueltig),Sekundaermarkt,beratungsfreies_Geschaeft,n/a,n/a,n/a,Normalbetrieb,PIB_von_PC_PM
制約のないモデルだとPICTは目を瞠るような速さでテストの生成を行う。因子数100、各因子の水準数2の場合、文字通り一瞬で生成が終わる(テストケース数16)。JCUnitは30秒ほどかかりテストケース数は18となるので、さすが老舗は違うなと舌を巻いたのだが、制約の取り扱いについてはJCUnitの方が少しだけ優れていると言えるようになったようだ。
0.6.4リリース
前回のポストで報告したように、JUCnit 0.6.3やそれを使ったアプリケーションはJDK 1.7.0_79ではコンパイルできない。 2016-04-05 - jcunit's blog
これはJDK 1.7.0_80で修正されたjavacの以下のバグが原因だ。
http://bugs.java.com/view_bug.do?bug_id=8013485
このバグを踏んだ場合、以下のコンパイルエラーが生じる。
annotation com.github.dakusui.jcunit.runners.standard.annotations.Checker is missing value for the attribute <clinit>
この問題を回避するため、以下の修正を含むJCUnit 0.6.4をリリースした。
上のエラーに遭遇したら、こちらを使ってみて欲しい。 以下がmaven coordinate
<dependency> <groupId>com.github.dakusui</groupId> <artifactId>jcunit</artifactId> <version>[0.6.4,)</version> <scope>test</scope> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> <scope>test</scope> </dependency>
JDK 1.6.0_45, JDK 1.8.0_25等でで発生しないことは確認してあるが、このバグがどの時点で混入したかは今のところ不明である。 不本意な内容の修正であるが、現在のメインストリームと考えられるJDK 1.7.0でやっと1年前に修正されたバグであり、現実の問題としてJDKのアップデート(すら)が困難な環境にある人々はそれなりに多くいると考えられるので、実施することにした。
0.6.0リリース。
長い道のりであったが、0.6.0をリリースした。 Maven coordinateは以下のとおり。
<dependency> <groupId>com.github.dakusui</groupId> <artifactId>jcunit</artifactId> <version>[0.6.0,)</version> <scope>test</scope> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> <scope>test</scope> </dependency>
古いJUnitを使っていると実行時にエラーが出るようなので、JUnitについての依存もバージョンを指定するほうがよいようだ。 今回の新機能は以下の通り。
- レポート機能
- テストスイート再利用機能 - 以前からあったのはテストスイートの再利用というよりは、SUTの出力に対するCapture/replay機能。作者本人が混同してしまっていた。混乱を招いてしまった方には申し訳ありません。
- ネガティブテストの自動生成機能
自分で言うのもなんだが、かなり「使える」水準になってきたと思う。 特にネガティブテストの自動生成は便利だ。
ということで、以前見つけた正規表現逆生成ライブラリxeger
のテストを作ってみた。こちら
@RunWith(JCUnit.class) public class XegerTest { @FactorField(stringLevels = { ".", "A", "[A]", "[AB]", "[A-C]" }) public String characterClass1; @FactorField(stringLevels = { "?", "*", "+", "{1,2}", "{1,3}", "{2,3}" }) public String quantifier1; @FactorField(stringLevels = { "a", "[a]", "[ab]", "[a-c]" }) public String characterClass2; @FactorField(stringLevels = { "?", "*", "+", "{1,2}", "{1,3}", "{2,3}" }) public String quantifier2; /** * 0 ... characterClass1 * 1 ... quantifier1 * 2 ... characterClass2 * 3 ... quantifier2 */ @FactorField(stringLevels = { "{0}{1}{2}{3}", " ({0}{1}{2}){3}", " ({0}{1}|{2}){3}", " (({0}|{2}){1}){3}" }) public String structure; @Test public void shouldGenerateTextsThatMatchOriginalRegex() { String regex = this.composeRegex(); Xeger generator = new Xeger(regex, new Random(1)); for (int i = 0; i < 100; i++) { String text = generator.generate(); assertTrue( String.format("Generated text '%s' didn't match regex '%s", text, regex), Pattern.compile( regex ).matcher(text).matches()); } } @Test public void shouldBeRepeatable() throws InterruptedException { int tries = 100; int seed = 1; String regex = this.composeRegex(); List<String> first = new ArrayList<String>(tries); { Xeger generator1 = new Xeger(regex, new Random(seed)); for (int i = 0; i < tries; i++) { first.add(generator1.generate()); } } TimeUnit.MILLISECONDS.sleep(1); List<String> second = new ArrayList<String>(tries); { Xeger generator2 = new Xeger(regex, new Random(seed)); for (int i = 0; i < tries; i++) { second.add(generator2.generate()); } } assertTrue( String.format("Xeger didn't return the same result in spite that the same pattern and seed were given:(pattern=%s, seed=%s)", regex, seed), first.equals(second)); } String composeRegex() { return MessageFormat.format( this.structure, this.characterClass1, this.quantifier1, this.characterClass2, this.quantifier2 ); } }
こんな風にテストを作るといい感じに2つほどバグが見つかる。
また、今回からドキュメントはWikiにまとめることにした。
機能追加、改善の要望がもしあれば、
Issues · dakusui/jcunit · GitHub
またはこのブログのコメントにでも寄せてほしい。
0.6.0-alpha
JCUnit 0.6.0 alphaをリリースしてみた。 今回の主要な変更は以下の通り。
- カバレッジレポーティング機能
- FSM(有限状態機械)の入力履歴検査機能 (InteractionHistory)
- リファクタリング
- 各種プラグインの構造改善
- リクエストのあった生成されたテストスイートの再利用機能
MavenのCoordinateは以下の通り。
<dependency> <groupId>com.github.dakusui</groupId> <artifactId>jcunit</artifactId> <version>0.6.0-alpha</version> </dependency>
今回から、ドキュメントはgithub wikiで管理・公開することにした。
Home · dakusui/jcunit Wiki · GitHub
まだリンク切れがあるが、正式公開までに直したい。
Mapの変更
コードのある場所でTreeMap
をLinkedHashMap
に変えてみた。
すると、
benchmark1_3$4 :(testcases, remainders, time(sec))=( 9, 0, 0.0) benchmark2_3$13 :(testcases, remainders, time(sec))=( 24, 0, 0.03) benchmark3_4$15_3$17_2$20 :(testcases, remainders, time(sec))=( 39, 0, 3.053) benchmark4_4$1_3$30_2$35 :(testcases, remainders, time(sec))=( 30, 0, 6.654) benchmark5_2$100 :(testcases, remainders, time(sec))=( 18, 0, 17.904) benchmark6_10$20 :(testcases, remainders, time(sec))=( 244, 0, 2.58)
以前、行った比較は以下で
横に並べてみるとこうなる
# | Task | TreeMap | LinkedHashMap |
---|---|---|---|
1 | 3(4) | 9 | 9 |
2 | 3(13) | 25 | 24 |
3 | 4(15)+3(17)+2(20) | 41 | 39 |
4 | 4(1)+3(30)+2(35) | 31 | 30 |
5 | 2(100) | 18 | 18 |
6 | 10(20) | 273 | 244 |
わずかながらテストスイートのサイズが小さくなっている。 原因はいろいろ考えられるが、興味深いことだ。
問題がないことを確信できたら、LinkedHashMapに変更することにしよう。
IntelliJはParameterizedテストランナーを特別扱いする
@Suite
のついたテストクラスはまとめていろんなクラスにあるテストを実行する。このいろんなクラスというのはSuite
の「子」としてJUnitに扱われる。
@Suite
とアノテーションがつけられたクラスの中のあるメソッドをIntelliJのテスト結果画面から選択すると、選ばれたメソッドが属するクラスの選ばれたメソッドを実行する。このとき、@Suite
がついたクラス(親側のクラス)はもう関係ない。
このアプローチがうまく行くのは「子」が静的なクラスだからだ。
@RunWith(Suite.class) @Suite.SuiteClasses({ExampleSuite.Test1.class, ExampleSuite.Test2.class}) public class ExampleSuite { public static class Test1 {
ためしに、こういのを作ってみるといい。static
修飾子をTest1
から取り去るとテストが動かなくなってしまうのがわかる。
ところでParameterizedもSuiteの一種なのだ。 だが、通常のSuiteと異なり、
// Parameterized.Parameters new Object[]{ {"test1", "hello", "world"}, // 0 {"test2", "scott", "tiger"} // 1 }
のような二重配列の中の一個一個の配列(=テストケース)例えば{"test1", "hello", "world"}
が「子」に対応するだ。これらからParameterized#createRunnersForChildren
によってテストランナーが生成され、Parameterizedオブジェクトに登録される。
そして、これを一個一個別の静的クラスにすることはできない。動的に静的なクラスを作ることはできませんよね?
IntelliJは@Parameterized
テストのメソッドを個別に実行するように要求されると、実行クラスはSuiteとなる親のクラス(つまり@Parameterizedがついたクラス)、メソッドは指定されたものを実行する。
これだけでは一体、何番目のテストケースを実行するのかわからない。
ではどうするか?プログラム引数として[0]
とか[1]
とかを渡すのだ。
これがJUnitの側で解釈されて何番目のテストケースが実行されるかが決まる。
なるほど。
で、JCUnit。JCUnitのランナーはこのParameterized
ランナーの仕組みに"則って"作られている。"則って"というのは真似して、という意味だ。Parameterized
を継承していないのだ
だから、JCUnitのテスト結果画面から、テストメソッドを一個だけ選んで実行しようとしても動かない。IntelliJがParameterizedだと認識してくれないから、プログラム引数に[1]
とか[10]
とかをくれないのだ。
Parameterized#createRunnersForChildren
をオーバーライドすればそれで仕事は終わりなのに、なぜか?
createRunnersForChildren
がprivate
だからだ。ふざけんな。
じゃ、どうするか?ずいぶん前にぐちゃぐちゃ工夫したのだが、実行したいテストメソッド名がtestMethod
だとしたらIntelliJの実行ダイアログでメソッド名の欄をtestMethod[10]
とかに変更してみてほしい。10番目のテストが実行されるはずだ。
しかし、ブログは書いてみるもので、アタマが整理されてうまいインチキを思いついた。 試してみてうまく行ったら、後日報告することにしたい。