Gast Max1809 Geschrieben 21. Dezember 2010 Geschrieben 21. Dezember 2010 Hi, ich hab da ne Frage, und zwar wollte ich bzw. will ich Datensätze meiner SQL Datenbank in VS 2010 exportieren in eine txt.Datei - nach bestimmten Vorgaben ( ich meine damit : alle Zeilen in der txt.Datei müssen den selben Abstand haben, weil beim Importieren ich von Zeilen ausgehe -> also ab Stelle 0-20 ist die Bezeichnung -> ab 20-22 ist das Kürzel usw. ) und genau das will ich programmieren. Ich habs schon soweit das ich mit dem StreamWriter eine txt.Datei erstelle und dort die Bezeichnung + Kürzel reinschreiben kann. Nur das mit den Abständen kriege ich nicht hin. Denn wenn ich das so mache : zeile = gruppe.BEZEICHNUNG+ " " + gruppe.KUERZEL; Dann ist das ungenau, denn die Bezeichnungen sind verschieden lang, so kann ein Kürzel von der Stelle 20 beginnen oder auch 25 usw. Beispiel: PC und Zubehör AA Schrank AG Zitieren
Klotzkopp Geschrieben 21. Dezember 2010 Geschrieben 21. Dezember 2010 String zeile = String.Format("{0,-20}{1,-3}", gruppe.BEZEICHNUNG, gruppe.KUERZEL) Siehe Composite Formatting. Zitieren
Gast Max1809 Geschrieben 21. Dezember 2010 Geschrieben 21. Dezember 2010 Hey super! Danke Ich habe noch eine Frage, ich holle mir jetzt die Datensätze über eine Linq Anweisung ( IQueryable ) .... dann schreibe ich sowas wie : foreach (DtoGruppe gruppe in qGruppe) { zeile = string.Format("{0,-3}{1,-70}", gruppe.KUERZEL, gruppe.BEZEICHNUNG); } Doch ich habe auch zu einzelnen Gruppen, sogenannte Gruppenfelder. Letzendlich sollte es so aussehen: AAPC und Zubehör AAAMonitor AAPC und Zubehör AABFestplatte AAPC und Zubehör AACHauptspeicher AAPC und Zubehör AADLaufwerk 1 AAPC und Zubehör AAELaufwerk 2 Vorne sind Kürzel + Bezeichnung <- habe ich jetzt auch genau so Danke sehr nochmal .... und jetzt fehlen halt die Gruppenfelder. Abstand kriege ich hin, aber wie holle ich sie mir aus der DB ? Wenn ich in die foreach der Gruppe noch eine foreach der Gruppenfelder einbaue, sieht es erstmal so aus : foreach (DtoGruppe gruppe in abfrageGruppe) { foreach (DtoGruppenFeld gruppenFeld in abfrageGruppenfeld) { // befüllen der txt.Datei //zeile = String.Format("bezeichnung = {0}, kuerzel = {1:hh}", gruppe.BEZEICHNUNG + gruppe.KUERZEL); zeile = string.Format("{0,-3}{1,-70}{2,-3}{4,-70}", gruppe.KUERZEL, gruppe.BEZEICHNUNG, gruppenFeld.KUERZEL, gruppenFeld.BEZEICHNUNG ); writer.WriteLine(zeile); } } Und ich bekomme diese Fehlermeldung : Der Index, basierend auf 0 (null), muss größer als oder gleich Null sein, und kleiner als die Größe der Argumentenliste. Zitieren
Klotzkopp Geschrieben 21. Dezember 2010 Geschrieben 21. Dezember 2010 Die Indexkomponente ist die erste Zahl in einem Format Item (das Ding mit der geschweiften Klammer). Schau dir mal genau die Werte an, die du da angibst. Zitieren
Gast Max1809 Geschrieben 21. Dezember 2010 Geschrieben 21. Dezember 2010 Okey, mein Fehler. zeile = string.Format("{0,-2}{1,-70}{2,-2}{4,-70}", gruppe.KUERZEL, gruppe.BEZEICHNUNG, gruppenFeld.KUERZEL, gruppenFeld.BEZEICHNUNG ); Hätte anstatt der 4, eine 3 hinschreiben sollen - jetzt funktionierts jedenfalls fast ^^ Jetzt wird die Textdatei sehr sehr lang, sollte eig. so aussehen : AAPC und Zubehör AAAMonitor AAPC und Zubehör AABFestplatte AAPC und Zubehör AACHauptspeicher AAPC und Zubehör AADLaufwerk 1 AAPC und Zubehör AAELaufwerk 2 AAPC und Zubehör AAFSchnittstelle 1 AAPC und Zubehör AAGSchnittstelle 2 AAPC und Zubehör AAHDruckerfabrikat ABStuhl ABAArt des Stuhl ABStuhl ABBMaterial ABStuhl ABCFarbe ABStuhl ABDArmlehne (J/N) Bei mir siehts so aus : AAPC und Zubehör AAAMonitor AAPC und Zubehör AABFestplatte AAPC und Zubehör AACHauptspeicher AAPC und Zubehör AGDSchließmechanismus AAPC und Zubehör AADLaufwerk 1 AAPC und Zubehör AAELaufwerk 2 AAPC und Zubehör AAFSchnittstelle 1 AAPC und Zubehör AAGSchnittstelle 2 AAPC und Zubehör AAHDruckerfabrikat AAPC und Zubehör ABAArt des Stuhl AAPC und Zubehör ABBMaterial AAPC und Zubehör ABCFarbe AAPC und Zubehör ABDArmlehne (J/N) Also, irgendwie muss ich das so hinbekommen, dass nur die Gruppenfelder der einzelnen Gruppe hinzugefügt werden, irgendwie nach dem Kürzel prüfen o.ä ? Weil die Gruppenfelder beginnen ja alle mit AA oder AB je nach der Gruppe wo sie dazugehörren ... Zitieren
Klotzkopp Geschrieben 21. Dezember 2010 Geschrieben 21. Dezember 2010 Du musst die Gruppenfeld-Abfrage so anpassen, dass nur die aktuelle Gruppe benutzt wird. Zitieren
Gast Max1809 Geschrieben 21. Dezember 2010 Geschrieben 21. Dezember 2010 Hey super Bin noch ein Anfänger, von daher sorry ^^ Aber du hilfst mir wirklich wunderbar ... Jetzt habe ich folgenden Code der auch so super funktioniert : foreach (DtoGruppe gruppe in abfrageGruppe) { IQueryable<DtoGruppenFeld> abfrageGruppenfeld = from gruppenFeld in dmc.DbGruppenFelder where gruppenFeld.KUERZEL.Substring(0,2) == gruppe.KUERZEL select gruppenFeld; foreach (DtoGruppenFeld gruppenFeld in abfrageGruppenfeld) { // befüllen der txt.Datei zeile = string.Format("{0,-2}{1,-70}{2,-2}{3,-70}", gruppe.KUERZEL, gruppe.BEZEICHNUNG, gruppenFeld.KUERZEL, gruppenFeld.BEZEICHNUNG ); writer.WriteLine(zeile); } } Wenn da aber nicht doch ein "kleiner" Fehler wäre -> mit dem Code fallen leider die paar ( sind sehr wenige ) Gruppen weg die eben KEIN Gruppenfeld haben. Nur habe ich bisher nie eine if Bedingung o.ä in eine foreach geschrieben ... bin grad am überlegen wie ich das noch dazubauen kann. Zitieren
Klotzkopp Geschrieben 21. Dezember 2010 Geschrieben 21. Dezember 2010 mit dem Code fallen leider die paar ( sind sehr wenige ) Gruppen weg die eben KEIN Gruppenfeld haben.Welcher Text soll für diese Gruppen denn in der Datei stehen? Sollen die Spalten für die Gruppenfelder einfach leer bleiben? Du kannst das übrigens auch mit einer einzigen Abfrage machen. Stichwort JOIN. Zitieren
Gast Max1809 Geschrieben 21. Dezember 2010 Geschrieben 21. Dezember 2010 Jap es bleibt dann einfach leer. Beispiel: AJRecorder/Videogeräte AKRollos/Verschattungen ALSchulbedarf Und bei mir fallen jetzt z.B.AJRecorder und AKRollos weg. Join sagt mir garnix, ehrlich gesagt. Zitieren
Klotzkopp Geschrieben 21. Dezember 2010 Geschrieben 21. Dezember 2010 Join sagt mir garnix, ehrlich gesagt.Joins sind ein elementarer Bestandteil von SQL. Damit kannst du Abfragen über mehrere Tabellen machen. Dein Problem mit den Gruppen ohne Gruppenfelder ließe sich damit auch ganz einfach lösen. Zeig doch mal, wie deine beiden Abfragen jetzt aussehen. Zitieren
Gast Max1809 Geschrieben 21. Dezember 2010 Geschrieben 21. Dezember 2010 Jop, habe bisher nie Join Abfragen gelernt bzw. gebraucht. Momentan siehts so aus : StreamWriter writer; string zeile; // Datensätze aus DB hollen DatenContainer dmc = new DatenContainer(); IQueryable<DtoGruppe> abfrageGruppe = from gruppen in dmc.DbGruppen select gruppen; // erstellen der txt.Datei writer = File.CreateText(pfad); foreach (DtoGruppe gruppe in abfrageGruppe) { IQueryable<DtoGruppenFeld> abfrageGruppenfeld = from gruppenFeld in dmc.DbGruppenFelder where gruppenFeld.KUERZEL.Substring(0,2) == gruppe.KUERZEL select gruppenFeld; foreach (DtoGruppenFeld gruppenFeld in abfrageGruppenfeld) { // befüllen der txt.Datei zeile = string.Format("{0,-2}{1,-70}{2,-2}{3,-70}", gruppe.KUERZEL, gruppe.BEZEICHNUNG, gruppenFeld.KUERZEL, gruppenFeld.BEZEICHNUNG ); writer.WriteLine(zeile); } } Zitieren
Klotzkopp Geschrieben 21. Dezember 2010 Geschrieben 21. Dezember 2010 Die LINQ-Syntax ist mir nicht geläufig, deswegen kann ich hier jetzt nicht konkret weiterhelfen. Den OUTER JOIN, den man hier braucht, bekommt man wohl nur so hin: Outer Join Sample - Hooked on LINQ Zitieren
Gast Max1809 Geschrieben 21. Dezember 2010 Geschrieben 21. Dezember 2010 Ich hab mir das mit Join angeschaut, aber ich wills trotzdem erstmal mit LINQ versuchen. Irgendwie muss ich doch der Abfrage sagen, dass ich auch die Gruppen will die eben nicht gleich dem Kürzel der Gruppenfelder sind. Also auch die Gruppen die KEIN Gruppenfeld haben bzw. wo Gruppenfeld null ist. Zitieren
Klotzkopp Geschrieben 21. Dezember 2010 Geschrieben 21. Dezember 2010 Ich hab mir das mit Join angeschaut, aber ich wills trotzdem erstmal mit LINQ versuchen.Das widerspricht sich nicht. Man kann JOINS mit LINQ machen, nur weiß ich nicht, wie das geht, weil ich noch nie LINQ benutzt habe. Irgendwie muss ich doch der Abfrage sagen, dass ich auch die Gruppen will die eben nicht gleich dem Kürzel der Gruppenfelder sind. Also auch die Gruppen die KEIN Gruppenfeld haben bzw. wo Gruppenfeld null ist.Du bekommst diese Gruppen ja auch in der äußeren Abfrage. Aber die innere Abfrage liefert für diese Gruppen keine Ergebnisse, und erzeugt daher auch keine Ausgabe. Zitieren
Gast Max1809 Geschrieben 21. Dezember 2010 Geschrieben 21. Dezember 2010 Du bekommst diese Gruppen ja auch in der äußeren Abfrage. Aber die innere Abfrage liefert für diese Gruppen keine Ergebnisse, und erzeugt daher auch keine Ausgabe. Jop stimmt, aber wie löse ich das ? Zitieren
Klotzkopp Geschrieben 21. Dezember 2010 Geschrieben 21. Dezember 2010 Das ist jetzt nicht besonders sauber, aber du könntest dir über eine bool-Variable merken, ob du für eine Gruppe eine Gruppenfeld-Ausgabe gemacht hast. Falls du nach der inneren Schleife feststellst, dass das für die aktuelle Gruppe nicht geschehen ist, kannst du eine Ausgabe ohne Gruppenfeld hinterherschieben. Zitieren
Gast Max1809 Geschrieben 21. Dezember 2010 Geschrieben 21. Dezember 2010 Kapier ich jetzt nicht ganz, aber ich könnte doch auch mir die Gruppen merken - in einer Liste oder so - und dann nochmals prüfen gegen die Liste, und wenn die Gruppe nicht in der Liste dann hinschreiben ? Zitieren
Gast Max1809 Geschrieben 21. Dezember 2010 Geschrieben 21. Dezember 2010 Okey, ich habe jetzt 2 Listen. 1.Liste hat alle Gruppen die reingeschrieben wurden. 2.Liste hat alle Gruppen. Jetzt will ich folgendes machen : Für jedes Element welches in Liste 2 ist aber nicht in Liste 1 soll etwas getan werden. Wie schreibe ich das als Code? Zitieren
Klotzkopp Geschrieben 21. Dezember 2010 Geschrieben 21. Dezember 2010 Das ist meiner Meinung nach viel zu kompliziert. foreach (DtoGruppe gruppe in abfrageGruppe) { IQueryable<DtoGruppenFeld> abfrageGruppenfeld = from gruppenFeld in dmc.DbGruppenFelder where gruppenFeld.KUERZEL.Substring(0,2) == gruppe.KUERZEL select gruppenFeld; bool gefunden = false; foreach (DtoGruppenFeld gruppenFeld in abfrageGruppenfeld) { // befüllen der txt.Datei zeile = string.Format("{0,-2}{1,-70}{2,-2}{3,-70}", gruppe.KUERZEL, gruppe.BEZEICHNUNG, gruppenFeld.KUERZEL, gruppenFeld.BEZEICHNUNG ); writer.WriteLine(zeile); gefunden = true; } if(!gefunden) { // Zeile ohne Gruppenfeld ausgeben } }[/code] Zitieren
Gast Max1809 Geschrieben 21. Dezember 2010 Geschrieben 21. Dezember 2010 Hey super. Vielen dank Hoffentlich krieg ich das nach ner Zeit auch so gut hin & schnell :-D Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.