svwler: Arrayproblem

Hallo zusammen,

ich habe Variablen die ich in ein Array ablegen möchte und danach in einer HTML-Tabelle anzeigen will.

Mein Problem ist, dass alle Elemente gefunden werden aber mit push nicht wie erwartet drei Zeilen ausgegeben werden sondern nur eine. Jedes Element überschreibt die Array[2]-Zeile. Ich weiß aber nicht was ich falsch mache.

So das Script:

foundAnz = -1;
  foundPos = -1;

for (zaehlerAuftr = 0; (zaehlerAuftr < aufAnzahl) && (foundAnz == -1);  zaehlerAuftr++) {
           //hier zählt er richtig die Elementanzahl

if (auftragsnr[zaehlerAuftr] == ExNumin)  {
                 foundAnz = 1;
                 foundPos = zaehlerAuftr;
               }
           }

if (foundAnz == -1) {

auftragsnr[aufAnzahl] = ExNumin;
              aufAnzahl++;

//hier ist die foundPos immer die Anzahl der Elemente

foundPos = zaehlerAuftr;
              b_bestand[foundPos] = new Array(ExNumin, ExNomEta, ExPlz, ExOrt, ExGebiet, lastLief, datum_array[0][1], durchQte, durchRytmus, nextLief, anzLief, warning );
           }
           else {
               b_bestand[foundPos][0] = ExNumin;
                b_bestand[foundPos][1] = ExNomEta;
                b_bestand[foundPos][2] = ExPlz;
                b_bestand[foundPos][3] = ExOrt;
                b_bestand[foundPos][4] = ExGebiet;
                b_bestand[foundPos][5] = lastLief;
                b_bestand[foundPos][6] = datum_array[0][1];
                b_bestand[foundPos][7] = durchQte;
                b_bestand[foundPos][8] = durchRytmus;
                b_bestand[foundPos][9] = nextLief;
                b_bestand[foundPos][10] = anzLief;
                b_bestand[foundPos][11] = warning;
           }

//und hier wird nun jedes tr-Array beim foundPos überschrieben.

tr.push("<tr class='text10'><td>"+  b_bestand[foundPos][1] +"</td><td>"+  b_bestand[foundPos][2] +"</td><td>"+  b_bestand[foundPos][3] +"</td><td>"+  b_bestand[foundPos][4] +"</td><td>"+  b_bestand[foundPos][5] +"</td><td>"+  b_bestand[foundPos][6] +"</td><td>"+  b_bestand[foundPos][7] +"</td><td>"+  b_bestand[foundPos][8] +"</td><td>"+  b_bestand[foundPos][9] +"</td><td>"+  b_bestand[foundPos][10] +"</td><td>"+  b_bestand[foundPos][11] +"</td></tr>");

//also er zählt nicht von 0-Anzahl der Elemente

Was mach ich falsch ich verzweifle noch. Die Variablen kommen aus einer DB.

Viele Grüße
Stefan

  1. Mein Problem ist, dass alle Elemente gefunden werden aber mit push nicht wie erwartet drei Zeilen ausgegeben werden sondern nur eine. Jedes Element überschreibt die Array[2]-Zeile. Ich weiß aber nicht was ich falsch mache.

    Was ist die Array[2] Zeile?
    Und wieso sollten mit dem push drei Zeilen ausgegeben werden? ausgegeben sowieso nicht, aber du fügst nur HTML Code für eine Zeile in das Array.

    So das Script:

    ich hab's nicht probiert aber ich bezweifle, dass man damit etwas anfangen kann, der Code läuft nicht.

    for (zaehlerAuftr = 0; (zaehlerAuftr < aufAnzahl) && (foundAnz == -1);  zaehlerAuftr++) {

    Sowas ist sehr unsauber, du verwendest hier global gültige Schleifenzähler, das kann zu unangenehmen Seiteneffekten mit schwer zu findenen Fehlern führen, mein Rat: verwende var!

    b_bestand[foundPos] = new Array(ExNumin, ExNomEta, ExPlz, ExOrt, ExGebiet, lastLief, datum_array[0][1], durchQte, durchRytmus, nextLief, anzLief, warning );
               }
               else {
                   b_bestand[foundPos][0] = ExNumin;
                    b_bestand[foundPos][1] = ExNomEta;
                    b_bestand[foundPos][2] = ExPlz;
                    b_bestand[foundPos][3] = ExOrt;
                    b_bestand[foundPos][4] = ExGebiet;
                    b_bestand[foundPos][5] = lastLief;
                    b_bestand[foundPos][6] = datum_array[0][1];
                    b_bestand[foundPos][7] = durchQte;
                    b_bestand[foundPos][8] = durchRytmus;
                    b_bestand[foundPos][9] = nextLief;
                    b_bestand[foundPos][10] = anzLief;
                    b_bestand[foundPos][11] = warning;
               }

    So ganz klar, warum du hier zwei unterschiedliche Methoden anwendest ist mir das nicht.

    //und hier wird nun jedes tr-Array beim foundPos überschrieben.

    tr.push("<tr class='text10'><td>"+  b_bestand[foundPos][1] +"</td><td>"+  b_bestand[foundPos][2] +"</td><td>"+  b_bestand[foundPos][3] +"</td><td>"+  b_bestand[foundPos][4] +"</td><td>"+  b_bestand[foundPos][5] +"</td><td>"+  b_bestand[foundPos][6] +"</td><td>"+  b_bestand[foundPos][7] +"</td><td>"+  b_bestand[foundPos][8] +"</td><td>"+  b_bestand[foundPos][9] +"</td><td>"+  b_bestand[foundPos][10] +"</td><td>"+  b_bestand[foundPos][11] +"</td></tr>");

    //also er zählt nicht von 0-Anzahl der Elemente

    Was beudetet das?

    Struppi.

    1. Mein Problem ist, dass alle Elemente gefunden werden aber mit push nicht wie erwartet drei Zeilen ausgegeben werden sondern nur eine. Jedes Element überschreibt die Array[2]-Zeile. Ich weiß aber nicht was ich falsch mache.

      Was ist die Array[2] Zeile?
      Und wieso sollten mit dem push drei Zeilen ausgegeben werden? ausgegeben sowieso nicht, aber du fügst nur HTML Code für eine Zeile in das Array.

      also er findet in diesem beispiel 3 Elemente welche ich in diesem Array eintragen will:

      b_bestand[0][0]  -  b_bestand[0][11]
      bis
       b_bestand[n][0]  -  b_bestand[n][11]

      hier werden alle 3 Elemte in

      b_bestand[2][0]  -  b_bestand[2][11]

      geschrieben also 1. eingefügt und das zweite überschreibt es wieder.

      So das Script:

      ich hab's nicht probiert aber ich bezweifle, dass man damit etwas anfangen kann, der Code läuft nicht.

      for (zaehlerAuftr = 0; (zaehlerAuftr < aufAnzahl) && (foundAnz == -1);  zaehlerAuftr++) {

      Sowas ist sehr unsauber, du verwendest hier global gültige Schleifenzähler, das kann zu unangenehmen Seiteneffekten mit schwer zu findenen Fehlern führen, mein Rat: verwende var!

      habe weiter oben in diesem Script alles mit var definiert.

      b_bestand[foundPos] = new Array(ExNumin, ExNomEta, ExPlz, ExOrt, ExGebiet, lastLief, datum_array[0][1], durchQte, durchRytmus, nextLief, anzLief, warning );
                 }
                 else {
                     b_bestand[foundPos][0] = ExNumin;
                      b_bestand[foundPos][1] = ExNomEta;
                      b_bestand[foundPos][2] = ExPlz;
                      b_bestand[foundPos][3] = ExOrt;
                      b_bestand[foundPos][4] = ExGebiet;
                      b_bestand[foundPos][5] = lastLief;
                      b_bestand[foundPos][6] = datum_array[0][1];
                      b_bestand[foundPos][7] = durchQte;
                      b_bestand[foundPos][8] = durchRytmus;
                      b_bestand[foundPos][9] = nextLief;
                      b_bestand[foundPos][10] = anzLief;
                      b_bestand[foundPos][11] = warning;
                 }

      So ganz klar, warum du hier zwei unterschiedliche Methoden anwendest ist mir das nicht.

      Array.Push fügt doch am Ende eines Arrays ein oder mehrere Elemente hinzu und gibt die neue Länge des Arrays aus.

      also müsste ich hier doch dann drei Zeilen haben und nicht eine.

      //und hier wird nun jedes tr-Array beim foundPos überschrieben.

      tr.push("<tr class='text10'><td>"+  b_bestand[foundPos][1] +"</td><td>"+  b_bestand[foundPos][2] +"</td><td>"+  b_bestand[foundPos][3] +"</td><td>"+  b_bestand[foundPos][4] +"</td><td>"+  b_bestand[foundPos][5] +"</td><td>"+  b_bestand[foundPos][6] +"</td><td>"+  b_bestand[foundPos][7] +"</td><td>"+  b_bestand[foundPos][8] +"</td><td>"+  b_bestand[foundPos][9] +"</td><td>"+  b_bestand[foundPos][10] +"</td><td>"+  b_bestand[foundPos][11] +"</td></tr>");

      //also er zählt nicht von 0-Anzahl der Elemente

      Was beudetet das?

      Struppi.

      und so geht es dann weiter im Script:

      tr      = tr.sort();
      var zeilen  = tr.length;
      var mHtml   = "";

      for(var p=0; p <= zeilen-1; p++) {
        if(zeilen > 0) {
          mHtml += ""+ tr[0]+ "";
          tr.shift();
        }
        else  {
          mHtml += "  <tr><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td></tr>";
        }
      }

      var sHtml ="<table class='sample1' id='lien' width='100%' border='0'><tr><td width='43%'><div id='lien' align='left'><a class='link7' href='javascript:window.print()'><img id='lien' border='0' src='print.bmp'><span class='text10'>Seite drucken</span></a></div></td><td width='10%'>&nbsp;</td><td width='47%'></td></tr></table>";

      var tHtml = "";

      tHtml += "<p class='text12b'>";
      tHtml += " <table class='tab' width='100%' border='0' cellspacing='0' cellpadding='5'>";
      tHtml += "   <thead class='text12b' bgcolor='#CCCCCC'>";
      tHtml += "     <th>Überschrift1</th>";
      tHtml += "     <th>Überschrift2</th>";
      tHtml += "     <th>Überschrift3</th>";
      tHtml += "     <th>Überschrift4</th>";
      tHtml += "     <th>Überschrift5</th>";
      tHtml += "     <th>Überschrift6</th>";
      tHtml += "     <th>Überschrift7</th>";
      tHtml += "     <th>Überschrift8</th>";
      tHtml += "     <th>Überschrift9</th>";
      tHtml += "     <th>Überschrift10</th>";
      tHtml += "     <th>Überschrift11</th>";
      tHtml += "   </thead>" + mHtml + "  ";
      mHtml = "";
      tHtml += "  </table>";

      printlink.innerHTML = sHtml;
      looplistCSS.innerHTML = tHtml;

      ...

      1. Mein Problem ist, dass alle Elemente gefunden werden aber mit push nicht wie erwartet drei Zeilen ausgegeben werden sondern nur eine. Jedes Element überschreibt die Array[2]-Zeile. Ich weiß aber nicht was ich falsch mache.

        Was ist die Array[2] Zeile?
        Und wieso sollten mit dem push drei Zeilen ausgegeben werden? ausgegeben sowieso nicht, aber du fügst nur HTML Code für eine Zeile in das Array.

        also er findet in diesem beispiel 3 Elemente welche ich in diesem Array eintragen will:

        b_bestand[0][0]  -  b_bestand[0][11]
        bis
        b_bestand[n][0]  -  b_bestand[n][11]

        hier werden alle 3 Elemte in

        b_bestand[2][0]  -  b_bestand[2][11]

        geschrieben also 1. eingefügt und das zweite überschreibt es wieder.

        Das sagst du, hilft aber nicht weiter. Mir erschließt sich dein Problem nicht, bei so komplexen Fragen ist es meistens sinnvoller ein Beispiel zu bauen, mit dem man Fehler nachvollziehen kann.

        b_bestand[foundPos] = new Array(ExNumin, ExNomEta, ExPlz, ExOrt, ExGebiet, lastLief, datum_array[0][1], durchQte, durchRytmus, nextLief, anzLief, warning );
                   }
                   else {
                       b_bestand[foundPos][0] = ExNumin;
                        b_bestand[foundPos][1] = ExNomEta;
                        b_bestand[foundPos][2] = ExPlz;
                        b_bestand[foundPos][3] = ExOrt;
                        b_bestand[foundPos][4] = ExGebiet;
                        b_bestand[foundPos][5] = lastLief;
                        b_bestand[foundPos][6] = datum_array[0][1];
                        b_bestand[foundPos][7] = durchQte;
                        b_bestand[foundPos][8] = durchRytmus;
                        b_bestand[foundPos][9] = nextLief;
                        b_bestand[foundPos][10] = anzLief;
                        b_bestand[foundPos][11] = warning;
                   }

        So ganz klar, warum du hier zwei unterschiedliche Methoden anwendest ist mir das nicht.

        Array.Push fügt doch am Ende eines Arrays ein oder mehrere Elemente hinzu und gibt die neue Länge des Arrays aus.

        also müsste ich hier doch dann drei Zeilen haben und nicht eine.

        Was für 3 Zeilen?
        In dem von mir gezeigten Code verwendest du zwei unterschiedliche Methoden um ein Array zu erzeugen, was mich wundert.

        tr      = tr.sort();
        var zeilen  = tr.length;
        var mHtml   = "";

        for(var p=0; p <= zeilen-1; p++) {
          if(zeilen > 0) {
            mHtml += ""+ tr[0]+ "";

        Also immer nur die erste Zeile?

        Wie gesagt, mach ein Beispiel ansonsten wird es schwer dir zu helfen.

        Struppi.

      2. Hallo,

        Was ist die Array[2] Zeile?
        Und wieso sollten mit dem push drei Zeilen ausgegeben werden? ausgegeben sowieso nicht, aber du fügst nur HTML Code für eine Zeile in das Array.

        So ist es.

        also er findet in diesem beispiel 3 Elemente

        Welche drei Elemente? Ich sehe keine drei Elemente.
        Es wird erst eine foundPos ermittelt, und dann wird im Array b_bestand an der Position foundPos entweder ein neues Array gespeichert: b_bestand[foundPos] = new Array(...
        oder aber im else-Zweig wird das im Array b_bestand an der Position foundPos bereits gespeicherte Array mit neuen Werten gefüttert:
        b_bestand[foundPos][0] = ExNumin; ...

        Wo sollen jetzt deine drei Elemente sein?

        Array.Push fügt doch am Ende eines Arrays ein oder mehrere Elemente hinzu und gibt die neue Länge des Arrays aus.

        also müsste ich hier doch dann drei Zeilen haben und nicht eine.

        Welche drei Zeilen denn? Es wird im Array tr jeweils ein einziger Eintrag hinzugefügt, und zwar ist das ein ein String, der HTML-Code enthält (genau eine <tr>...</tr>-Zeile):

        tr.push("<tr class='text10'><td>"+  b_bestand[foundPos][1] +"</td><td>"+  b_bestand[foundPos][2] +"</td><td>"+  b_bestand[foundPos][3] +"</td><td>"+  b_bestand[foundPos][4] +"</td><td>"+  b_bestand[foundPos][5] +"</td><td>"+  b_bestand[foundPos][6] +"</td><td>"+  b_bestand[foundPos][7] +"</td><td>"+  b_bestand[foundPos][8] +"</td><td>"+  b_bestand[foundPos][9] +"</td><td>"+  b_bestand[foundPos][10] +"</td><td>"+  b_bestand[foundPos][11] +"</td></tr>");

        //also er zählt nicht von 0-Anzahl der Elemente

        Wer ist "er"? Der Code ist doch deiner, oder? Und richtig, es steht hier nichts von b_bestand[foundPos][0] in obigem Befehl, falls du das meinst.

        Gruß, Don P

      3. Hallo,

        und so geht es dann weiter im Script:

        tr      = tr.sort();
        var zeilen  = tr.length;
        var mHtml   = "";

        for(var p=0; p <= zeilen-1; p++) {
          if(zeilen > 0) {
            mHtml += ""+ tr[0]+ "";
            tr.shift();
          }
          else  {
            mHtml += "  <tr><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td></tr>";
          }
        }

        Das ist Schrott. Umständlich und schwer zu durchschauen.
        Dasselbe erreichst du einfach und durchschaubar mit:

          
        var mHtml = "<tr><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td></tr>";  
        tr.sort();  
        while( tr.length ) { mHtml += tr.shift(); }
        

        Gruß, Don P

        1. Hallo,

          Dasselbe erreichst du einfach und durchschaubar mit [...]

          Nur der Vollständigkeit halber: Es ist nicht ganz dasselbe, aber so dann schon:

            
          var mHtml = !tr.length ? "" : "<tr><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td></tr>";  
          tr.sort();  
          while( tr.length ) { mHtml += tr.shift(); }
          

          Gruß, Don P