Autor Beitrag
Petros
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 131
Erhaltene Danke: 1


Delphi7, Delphi RadStudio 10 Berlin, VSC# 2015, Java 8
BeitragVerfasst: Do 28.09.17 09:24 
Hallo Community,

Folgenes habe ich vor

ich habe 2 schleifen in einer Methode schleife1 soll nur dann wieder durchlaufen wenn schleife 2 komplett durch ist

nehmen wir mal an in der Combo_Box1 gibt es 20 einträge pro eintrag gibt es 5 weitere die dann in Combo_Box2 angezeigt werden
ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
Combo_Box1 => a1, a2, a3 usw.

Combo_Box2 => wenn Combo_Box1 = "a1" ist dann ist in Combo_Box2 => a1_1, a1_2, a1_3 usw drin:

Combo_Box2 => wenn Combo_Box1 = "a2" ist dann ist in Combo_Box2 => a2_1, a2_2, a2_3 usw drin:

usw.


Jetzt habe ich eine methode geschrieben die ich denke vom ansatz her schon richtig ist aber es funktioniert leider nicht denn
Combo_Box1 springt zwar immer +1 hoch aber das in einem tempo das schleife 2 völlig ignoriert bzw übersprungen wird. Hab zumindest das Gefühl.

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
for (int v = 0; v < vid_db_count ; v++) //Schleife 1 
{
  f1();
  f2();
  for (int d = 0; d < did_db_count ; d++) //schleife 2
  {
    f3();
    f4();
    Combo_Box2.SelectedIndex = Combo_Box2.SelectedIndex +1
   }
  Combo_Box1.SelectedIndex = Combo_Box1.SelectedIndex +1
}


Meine frage ist mein Ansatz soweit richtig oder gibt es ne bessere methode um das umzusetzen.

MFG Petros
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4700
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Do 28.09.17 10:01 
Vielleicht erklärst du mal kurz was das soll. Vieleicht kann man sich das dann besser vorstellen.

Im Moment fällt mir kein sinnvoller Einsatz ein von dem was du da tust. Warum sollte man in einer Schleife die Selection einer Combobox ändern? Was hat ein User davon wenn er alle Einträge der ComboBox mal im TextBox Teil der ComboBox ~durchfliegen~ sieht. Wenn der Code fertig ist irgendein Eintrag ausgewählt was vorher in der Schleife passiert ist ist dann völlig egal. Der User hat ja auch keine Chance mit der UI zu interagieren während dieser Code läuft.
Petros Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 131
Erhaltene Danke: 1


Delphi7, Delphi RadStudio 10 Berlin, VSC# 2015, Java 8
BeitragVerfasst: Do 28.09.17 10:54 
OHHHHH das muss ich aber ganz weit aushohlen.

kurz und knapp es wird ein Converter er Konvertiert Daten von einer MongoDB in MYSQL und PostgreSQL.

Sprich es Gibt eine Alte Server DB Anwendung die Daten als JSON ausgibt. Die Dantenbank der Anwendung selbst ist MongoDB (Ja ich kann daten in SQL exportieren hat nur nix gebracht) diese ist aber zum Update und hinzufügen von Daten SO NICHT geeignet da nicht alle einträge in der DB vorhanden sind sondern aus anderen quellen geparst und zusammen geführt wird. Da wir aber selbst Datensätze produzieren sollen diese in die alte DB mit eingefügt werden da dies aber mit der Server DB Anwendung nicht geht ist meine Aufgabe das ganze in eine andere DB zu überführen z.B MYSQL. funktioniert auch soweit MANUELL nur soll das ganze jetzt automatisch eintrag für eintrag machen. Manuell geht das ganze wunderbar. Aber bei einem Datensatz von ca 287000 muss ich extra einen Praktikanten oder Lehrling einstellen der nach jedem Datensatz nen Button klickt.

Beispiel Code zu Erklärung.

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
//1. Ich rufe die Daten ab 
for(..;..;..){
var client = new WebClient ();
var text = client.DownloadString ("http://127.0.0.1:5080/api/search"+"/"+Combo_Box1.Text+"/"+Combo_Box2.Text);
rt_box1.Text = text; //Daten werden Als JSON in die rt_box1 übergeben was f3(); entspricht.
//Die Daten für Combo_Box1 und 2 kommen schon von einer einem MYSQl DB diese habe ich schon vorbeireitet.
f4(); //2. Daten werden entsprechend ausgewertet und alle einträge entsprechend angepasst
f5();// daten werden in die MYSQL DB übergeben

//wenn er mit dem fertig ist soll er vom ItemIndex +1 um 1 hoch gehen um dann mit dem nähstem datensatz weiterzu machen 
 }
Combo_Box2.SelectedIndex = 0 => a1_1
Combo_Box2.SelectedIndex = 1 => a1_2



Ich hoffe ich konte es etwas erklären leider fällt mir sonst kein anderer weg ein die Daten Convertieren
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4700
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Do 28.09.17 12:37 
OK, du hast mehrere Quellen von Daten und ein Ziel und mußt Daten dazwischen zusammenführen und dann gemeinsam ins Ziel schreiben. Das soll automatisch geschehen. Wie und warum ist dann jetzt eine UI während des Vorgangs beteiligt und warum?

Wieso hängt 'nächster Datensatz' irgendwie mit der UI zusammen warum nimmst du nicht einfach den nächsten Datensatz? Warum muß man die UI Ändern um an den nächsten Datensatz zu kommen?
Petros Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 131
Erhaltene Danke: 1


Delphi7, Delphi RadStudio 10 Berlin, VSC# 2015, Java 8
BeitragVerfasst: Do 28.09.17 13:16 
die UI habe ich nur erstellt um zu prüfen ob er auch sauber schritt für schritt alles abarbeitet also nur zur kontrolle,
das Ganze hat nachher nix mehr mit der UI zu tun. Worum es mir eigendlich geht sind die for schleifen denn schleife 1 macht er ja ohne probleme nur die schleife 2 lässt er unberührt bzw überspringt diese.

Die UI Hatte ich nur mit eingebaut um zu Prüfen ob schleife1 1. eintrag nimmt dann in schleife2 die 2. daten erfasst und dann die Daten parst und diese dann in die DB schreibt.

um die DB zu erklären
ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
| Hersteller | Geräte     | Informationen(JSON inhalt aus drittquellen) |
|------------|------------|---------------------------------------------|
|Nokia       | 3210       | Info Text                                   |
|            | 3310       | Info Text                                   |
|            | 3510       | Info Text                                   |
|zte         | Axon 7     | Info Text                                   |
|            | Axon 7 M   | Info Text                                   |
|            | zxv10_w300 | Info Text                                   |

Combo_Box1 = Hersteller
Combo_Box2 = Geräte


meine abfrage läuft soll automatisch so laufen

abfrage aus Hersteller + gerät = JSON Datei die dann in DB eingetragen wird ind das soll er mit alles machen

daher auch meine schleife
H = Hersteller
G = Gerät

1. 1H + 1G
2. 1H + 2G
2. 1H + 3G
wenn fertig dann
1. 2H + 1G
2. 2H + 2G
2. 2H + 3G
usw.

hoffe das ich das jetzt etwas detaillierte erklären konnte.
OlafSt
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 486
Erhaltene Danke: 99

Win7, Win81, Win10
Tokyo, VS2017
BeitragVerfasst: Do 28.09.17 13:32 
Anstatt sowas in Comboboxen zu pumpen (was noch weitere Maßnahmen zur korrekten Anzeige erfordern würde, wodurch das ganze dann sehr langsam wird), schreibt man solche Sachen in ein Logfile.

Oder in ein Memo-Feld, das man mit memo1.Update() aktualisiert. Im Memo kann ja stehen:

ausblenden Quelltext
1:
2:
3:
Nokia, 3210, Info Text
Nokia, 3310, Info Text
Nokia, 3510, Info Text


Das sollte genügen, um eine Kontrolle zu haben.

Echte Profis benutzen für sowas übrigens "Überwachte Ausdrücke" ;)

_________________
Lies, was da steht. Denk dann drüber nach. Dann erst fragen.
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4700
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Do 28.09.17 13:43 
Dann solltest du keinen Pseudocode zeigen. Zwei geschachtelte Schleifen mit Funktionen werden immer richtig funktionieren und mehr zeigt dein Pseudocode nicht. Wenn es da bei dir ein Problem gibt dann liegt der im eigentlichen Code. Und wenn dein eigentlicher Code Richtung UI mehr macht als Sachen in der UI anzuzeigen sondern auch Inhalte wieder ausliest, wie dein zweiter gezeigten Code der auf Combox.Text zugreift, ist das problematisch. Deine Schleifen haben vermutlich keine natürlichen Unterbrechungen, heißt deine UI wird nicht oder unregelmäßig aktualisiert. UI Updates stellst du dir am besten asynchron vor. Wenn du SelectedIndex änderst wird nur eine Nachricht gesendet mehr nicht die dann abgearbeitet wird wenn dein Prozess unterbricht und dann Zeit zum abarbeiten dieser Nachrichten ist und die UI nachgezogen wird.
Petros Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 131
Erhaltene Danke: 1


Delphi7, Delphi RadStudio 10 Berlin, VSC# 2015, Java 8
BeitragVerfasst: Do 28.09.17 14:52 
@user profile iconOlafSt

Ja so hätte ich das auch machen können und auch das ganze noch mit Console.WriteLine(""); try catch usw alles möglich der Converter soll nur einmal mit einem rutsch die daten von A nach B packen mehr nicht

hab das ganze mal in einem einfachen beispiel getestet da hats geklappt

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
public void test(){
for (int i = 0; i < 2; i++) 

  cInfo ("in der 1 schleife");

  for (int v = 0; v < 3; v++) 
  { 
    cInfo ("in der 2 schleife");
  }
  cInfo ("ender der 2 schleife");
}
 cInfo ("ender der 1 schleife");
}

Ergebnis:
in der 1 schleife
in der 2 schleife
in der 2 schleife
in der 2 schleife
ender der 2 schleife
in der 1 schleife
in der 2 schleife
in der 2 schleife
in der 2 schleife
ender der 2 schleife
ender der 1 schleife


und hier Ein auszug von meinem code
ausblenden volle Höhe C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
id_vendorBox ();//zählt die gasamt einträge der Hersteller DB 5141
cInfo ("1");//zeigt mir an wo er grad ist
fill_devicebox ();//füllt die Combobox mit allen Daten die beim abfragen der geräte des herstellers ausgegeben werden  
cInfo ("2");
Com_device_Box.SelectedIndex = 0;//der ersten eintrag damit nicht null
for (int v = 0; v < vid_db_count; v++) //die zahl die von der id_vendorBox kommt
{   
  fill_devicebox (); //lasse Ihn bei jeden neuem Hersteller die Geräte neu einlesen
  cInfo ("3"); //bis hirhin geht er und dann fängt er von vorn an ohne fehlermeldung oder dass, das Fenster einfriert und bleibt in der schleife bis 5141 einträge abgearbeitet sind
  for (int d = 0; d < did_db_count; d++) //anzahl der geräte pro hersteller
  {   
   try {
     cInfo ("Connect to the Server!");
     var client = new WebClient ();
     var text = client.DownloadString ("http://127.0.0.1:5080/api/search"+"/"+Com_vendor_Box.Text+"/"+Com_device_Box.Text);
    rt_box1.Text = text;
    sql_did();//gibt die Aktuelle Device ID aus
    filter_Datum ();//Passt das JSON an
    filter_References ();//Passt das JSON an
    cInfo ("Convert Json to XML");
    var ja = JArray.Parse (rt_box1.Text);
    var x1 = new XDocument (new XElement ("Table1", ja.Select (a => new XElement ("Hersteller", (string)a ["Hersteller"]))));
    var x2 = new XDocument (new XElement ("Table2", ja.Select (a => new XElement ("Device", (string)a ["Device"]))));
    var x3 = new XDocument (new XElement ("Table3", ja.Select (a => new XElement ("Reference", (string)a ["Reference"].ToString ()))));
    rt_box2.Text = "<root>\n" + x1.ToString () + "\n" + x2.ToString () + "\n" + x3.ToString ()"\n</root>";
    filter_correctxml ();//nach Korrigieren nach dem Convertieren
    save_xml ();
    DataSet dsLoead = new DataSet ();
    dsLoead.ReadXml (@"./tmp/xml/tmp.xml");
    dGV01.DataSource = dsLoead.Tables [1];
    cInfo ("von: " + dsLoead.Tables [1].ToString ());
    dGV02.DataSource = dsLoead.Tables [3];
    cInfo ("von: " + dsLoead.Tables [3].ToString ());
    dGV03.DataSource = dsLoead.Tables [5];
    cInfo ("von: " + dsLoead.Tables [5].ToString ());
    insertDB();
    cInfo ("Daten in SQL übergeben");
  }catch (Exception ex) 
 { cInfo ("F2: " + ex.Message); }
 }
  vendor_index_p ();//setzt combobox für hersteller +1 so das der nähste eintrag gnommen wird.
 }
}


PS. wenn mir ein besserer weg eingefallen wäre das umzusetzen hätte ich das so nicht gemacht aber mir viel kein anderer weg ein um das so umzusetzen.


MAN MAN MAN WIE PEINLICH Ich hab meinen fehler schon wieder selbst gefunden der Grund warum er nicht in schleife 2 gegangen ist liegt daran das schleife 2 noch garnicht wusste wie weit hoch er zählen soll sprich meine schleife 2 war immer 0

ausblenden C#-Quelltext
1:
for(int v= 0;d<0;d++)					
OlafSt
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 486
Erhaltene Danke: 99

Win7, Win81, Win10
Tokyo, VS2017
BeitragVerfasst: Fr 29.09.17 01:21 
user profile iconPetros hat folgendes geschrieben Zum zitierten Posting springen:
@user profile iconOlafSt

Ja so hätte ich das auch machen können und auch das ganze noch mit Console.WriteLine(""); try catch usw alles möglich der Converter soll nur einmal mit einem rutsch die daten von A nach B packen mehr nicht

MAN MAN MAN WIE PEINLICH Ich hab meinen fehler schon wieder selbst gefunden der Grund warum er nicht in schleife 2 gegangen ist liegt daran das schleife 2 noch garnicht wusste wie weit hoch er zählen soll sprich meine schleife 2 war immer 0

ausblenden C#-Quelltext
1:
for(int v= 0;d<0;d++)					


Und hättest du es gleich so gemacht, wie ich es vorgeschlagen hatte (das geht auch ohne die nach deiner Ansicht überzähligen WriteLine("") und auch ohne try catch und all das überflüssige Zeug), wäre dir das gleich aufgefallen und hätte dir und uns ne Menge Rätselraten erspart.

Mach es doch gleich richtig, dann findet man Fehler schneller und muß nicht solchen Knieschüssen nachjagen ;)

_________________
Lies, was da steht. Denk dann drüber nach. Dann erst fragen.
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4764
Erhaltene Danke: 1052

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: Fr 29.09.17 08:02 
Ich habe die Frage daher auf "beantwortet" gesetzt.

Außerdem müßte es natürlich
ausblenden C#-Quelltext
1:
for(int d=0; d<0; d++)					

heißen (d statt v).

Und dass die ganze Vorgehensweise so sehr fehleranfällig ist, wurde ja schon gesagt. Selbst (kleine) Konvertierer-Programme sollten nach der 3-Schichten Architektur entwickelt werden (d.h. Trennung von UI, Logik und Datenzugriff).