object addieren

stefansvw

New member
Hallo zusammen,

ich erstelle

var werte = new Array();
werte[0] = new Object();

weise dann einen Wert zu
while(true) {
...
if(werte[0][LibPrd] == undefined)
werte[0][LibPrd] = parseInt(Qty);
else
werte[0][LibPrd] += parseInt(Qty);
...

LibPrd ist ein assotiativer Begriff und Qty der Wert (2,3,5,7,...)

die Werte werden nun alle richtig ausgegeben. Nun mag ich von diesen Werten einen Gesamtwert bilden (2+3+5+7+,...).

Was machte ich ?

Array.prototype.array_add = function() {
return eval(this.join("+"));
};

for(var p in produkte[0]) {
var ges = array_add(werte[0][p]);
}

Ergebniss:
Objekt erwartet

Was mache ich noch falsch ????

Viele Grüße
Stefan
var ges = array_add(
 
Was machte ich ?

Array.prototype.array_add = function() {
return eval(this.join("+"));
};
eval ist im Prinzip verpöhnt, hier aber elegant, trotzdem natürlich fehlerträchtig, da dies nur mit Zahlen und Strings funktioniert.
Aber dir scheinen prototypen nicht geläufig zu sein, hier werden allen Arrays diese Methoden zugefügt (auch nachträglich), d.h. du kannst mit
PHP:
deinArray.array_add()
zugreifen. ich würde die Funktion aber einfach sum() nennen.

PHP:
Array.prototype.sum = function() {
  return eval(this.join("+"));
};
 
eval ist im Prinzip verpöhnt, hier aber elegant, trotzdem natürlich fehlerträchtig, da dies nur mit Zahlen und Strings funktioniert.
Aber dir scheinen prototypen nicht geläufig zu sein, hier werden allen Arrays diese Methoden zugefügt (auch nachträglich), d.h. du kannst mit
PHP:
deinArray.array_add()
zugreifen. ich würde die Funktion aber einfach sum() nennen.

PHP:
Array.prototype.sum = function() {
  return eval(this.join("+"));
};


habe ich doch genau so gemacht.
Also den prototyp in sum umbenannt und danach die oben genannte wertzuweisung.

Der wert ist zuvor:

alert(werte[0][p]); //2,3,4,5

also Zahlen. Habe ich ja bei der zuweisung durch parseInt erzwungen

Was mache ich den noch falsch?
 
schreibe mal die komplette schleife hin

for(var p in produkte[0]) {

for(var i=0; i < 3; i++) {
if (werte[p] == undefined)
werte[p] = 0;
}

sHTML = sHTML + "<tr class='tdtable'>";
sHTML = sHTML + "<td style='border-bottom: solid 1px; border-right: solid 1px' valign='bottom' align='center'>"+ p +"</td>";
sHTML = sHTML + "<td style='border-bottom: solid 1px; border-left: solid 1px' valign='bottom' align='center'>" + werte[0][p] + "</td>";
sHTML = sHTML + "<td style='border-bottom: solid 1px; border-left: solid 1px' valign='bottom' align='center'>" + werte[1][p] + "</td>";
sHTML = sHTML + "<td style='border-bottom: solid 1px; border-left: solid 1px' valign='bottom' align='center'>" + werte[2][p] + "</td>";
sHTML = sHTML + "</tr>";
alert(werte[0][p]);
var ges_akt = sum(werte[0][p]);
var ges_last = sum(werte[1][p]);
var ges_vlast = sum(werte[2][p]);

}
 
werte.sum(werte[0][p]);

habe ich auch schon probiert nun sagt er das hier

return eval(this.join("+"));

ein ']' fehlt
 
komplett schaut es so aus

Array.prototype.sum = function() {
return eval(this.join("+"));
};

var werte = new Array();
werte[0] = new Object(); //2006
werte[1] = new Object(); //2007
werte[2] = new Object(); //2008

if (Ch_Date >= first_day) { // 2008
if(werte[0][LibPrd] == undefined)
werte[0][LibPrd] = parseInt(Qty);
else
werte[0][LibPrd] += parseInt(Qty);
} else // 2007
// -------------------------------------------------------------
if (Ch_Date >= last_year && Ch_Date < first_day){
if(werte[1][LibPrd] == undefined)
werte[1][LibPrd] = parseInt(Qty);
else
werte[1][LibPrd] += parseInt(Qty);
} else // 2006
// -------------------------------------------------------------
if (Ch_Date >= sec_year && Ch_Date < last_year) {
if(werte[2][LibPrd] == undefined)
werte[2][LibPrd] = parseInt(Qty);
else
werte[2][LibPrd] += parseInt(Qty);
}
// ---------------------------------------------

for(var p in produkte[0]) {

for(var i=0; i < 3; i++) {
if (werte[p] == undefined)
werte[p] = 0;
}

sHTML = sHTML + "<tr class='tdtable'>";
sHTML = sHTML + "<td style='border-bottom: solid 1px; border-right: solid 1px' valign='bottom' align='center'>"+ p +"</td>";
sHTML = sHTML + "<td style='border-bottom: solid 1px; border-left: solid 1px' valign='bottom' align='center'>" + werte[0][p] + "</td>";
sHTML = sHTML + "<td style='border-bottom: solid 1px; border-left: solid 1px' valign='bottom' align='center'>" + werte[1][p] + "</td>";
sHTML = sHTML + "<td style='border-bottom: solid 1px; border-left: solid 1px' valign='bottom' align='center'>" + werte[2][p] + "</td>";
sHTML = sHTML + "</tr>";

var ges_akt = werte.sum();
var ges_last = werte.sum();
var ges_vlast = werte.sum();

}

...
 
Dann nützt dir deine Funktion nichts, da sie - wie schon gesagt - nur Zahlen und String addieren kann. Um Objekte zu addieren musst du enstprechend deiner Vorgabe eine funktion schreiben. Soweit ich das sehe willst du einfach alle Werte aller keys summieren.

Dazu müßten deine Funktionen ungefähr so aussehen:

[EDIT]: Da hat noch was gefehlt!

PHP:
Object.prototype.sum = function() {
var sum = 0;
for(var a in this) if(this.hasOwnProperty(a))sum += this[a];
return sum;
};

Array.prototype.sum = function() {
var sum = 0;
for(var a in this) if(this.hasOwnProperty(a)) sum += this[a].sum();
return sum;
};
 
Zuletzt bearbeitet:
korrekt.

Habe dein Funktion benutzt und nun kommt folgendes raus

0[object Object][object Object][object Object]function() { var sum = 0; for(var a in this) sum += this[a]; return sum; }
 
wenn Du noch einen Tipp hast schreibe mir am besten hin. Mache gerade Feierabend, würde noch gerne mit Dir weiterposten aber mein Kollege will nach Hause. Ich bedanke mich recht herzlich bei Dir.
 
Zuallererst einmal vielen Dank für Dein Hilfe.

Nur leider klappte es noch nicht so ganz :-(

Vorher:

Bezeichnung | 2008 | 2007
------------------------------
Prod1 | 3 | 5
Prod2 | 6 | 3
------------------------------
ges | undefined | undefined


nun nach dem Prototyp

var ges_akt = werte.sum();
var ges_last = werte.sum();
var ges_vlast = werte.sum();

Bezeichnung | 2008 | 2007
------------------------------
sum | function() { var sum = 0; for(var a in this) if(this.hasOwnProperty(a))sum += this[a]; return sum; }|function() { var sum = 0; for(var a in this) if(this.hasOwnProperty(a))sum += this[a]; return sum; }
Prod1 | 3 | 5
Prod2 | 6 | 3
------------------------------
ges | 17 | 17

aussehen sollte es eigentlich so:

Bezeichnung | 2008 | 2007
------------------------------
Prod1 | 3 | 5
Prod2 | 6 | 3
------------------------------
ges | 9 | 8


ich schreibe Dir mal das ges Script hier rein:


Object.prototype.sum = function() {
var sum = 0;
for(var a in this) if(this.hasOwnProperty(a))sum += this[a];
return sum;
};

Array.prototype.sum = function() {
var sum = 0;
for(var a in this) if(this.hasOwnProperty(a)) sum += this[a].sum();
return sum;
};

function datum(x) {
var jahr = x.substring(0,4);
var monat = x.substring(4,6);
var tag = x.substring(6,8);

var dat = ""+ tag +"."+ monat +"."+ jahr +"";

return dat;
}

var werte = new Array();
werte[0] = new Object(); //2006
werte[1] = new Object(); //2007
werte[2] = new Object(); //2008

var produkte = new Array();
produkte[0] = new Object();

var akt_dat_tmp = new Date();
var akt_dat = akt_dat_tmp.getYear();

var first_day = akt_dat + "0101";
var last_year = (akt_dat-1) + "0101";
var sec_year = (akt_dat-2) + "0101";


var viewEx = ocxBase.CreateView("EX");

var RubNumin = ocxBase.GetARub("EX.NUMIN");
ExNumin = ocxBase.GetRubVal(RubNumin, 0);

var viewTvm = ocxBase.CreateView("TV");

var RubMatuti = ocxBase.GetARub("TV.MATUTI"); // Matuti
var RubNom = ocxBase.GetARub("TV.NOM"); // Nachname (ADM)
var RubPreNom = ocxBase.GetARub("TV.PRENOM"); // Vorname (ADM)

TvmMatuiti = ocxBase.GetRubVal(RubMatuti, 0);
TvmNom = ocxBase.GetRubVal(RubNom, 0);
TvmPreNom = ocxBase.GetRubVal(RubPreNom, 0);

var view = ocxBase.CreateView("SQ");

var rc = ocxBase.ViewFirstRecord(view);

var RubLibPrd = ocxBase.GetARub("SQ.LIBPRD"); // Produkt
var RubQty = ocxBase.GetARub("SQ.QTEMVT"); // Quantität
var RubCharge = ocxBase.GetARub("SQ.NUMLOT"); // Charge
var RubDate = ocxBase.GetARub("SQ._DATEMVT"); // Ddatum
var RubNumSq = ocxBase.GetARub("SQ.NUMIN"); // Numin
var RubMatuti = ocxBase.GetARub("SQ.MATUTI"); // Matuti

Matuti = ocxBase.GetRubVal(RubMatuti, 0);

ocxBase.DefRubListVal(view,"SQ.NUMIN", ExNumin, 1); // 25.5.07 rpowner statt matuti!!
ocxBase.DefRubListVal(viewTvm,"TV.MATUTI", Matuti, 1); // 25.5.07 rpowner statt matuti!!

while(rc == 0) {

LibPrd = ocxBase.GetRubVal(RubLibPrd, 0);
Qty = ocxBase.GetRubVal(RubQty, 0);
Charge = ocxBase.GetRubVal(RubCharge, 0);
Ch_Date = ocxBase.GetRubVal(RubDate, 0);
Matuti = ocxBase.GetRubVal(RubMatuti, 0);

if (Qty.charAt(0) == "-")
Qty = Qty.substring(1, Qty.length)

produkte[0][LibPrd] = 0;
// -------------------------------------------------------------
if (Ch_Date >= first_day) { // 2008
if(werte[0][LibPrd] == undefined)
werte[0][LibPrd] = parseInt(Qty);
else
werte[0][LibPrd] += parseInt(Qty);
} else // 2007
// -------------------------------------------------------------
if (Ch_Date >= last_year && Ch_Date < first_day){
if(werte[1][LibPrd] == undefined)
werte[1][LibPrd] = parseInt(Qty);
else
werte[1][LibPrd] += parseInt(Qty);
} else // 2006
// -------------------------------------------------------------
if (Ch_Date >= sec_year && Ch_Date < last_year) {
if(werte[2][LibPrd] == undefined)
werte[2][LibPrd] = parseInt(Qty);
else
werte[2][LibPrd] += parseInt(Qty);
}
// -------------------------------------------------------------

rc = ocxBase.ViewNextRecord(view);

}

/* --------------------------------------------------- Stammdatenblatt --------------------------------------------------------- */

var sHTML = ""; // definition der Ausgabe-Variable

startseite();

function startseite() {

navigation();
header1();

for(var p in produkte[0]) {

for(var i=0; i < 3; i++) {
if (werte[p] == undefined)
werte[p] = 0;
}
alert(werte[0][p]);
sHTML = sHTML + "<tr class='tdtable'>";
sHTML = sHTML + "<td style='border-bottom: solid 1px; border-right: solid 1px' valign='bottom' align='center'>"+ p +"</td>";
sHTML = sHTML + "<td style='border-bottom: solid 1px; border-left: solid 1px' valign='bottom' align='center'>" + werte[0][p] + "</td>";
sHTML = sHTML + "<td style='border-bottom: solid 1px; border-left: solid 1px' valign='bottom' align='center'>" + werte[1][p] + "</td>";
sHTML = sHTML + "<td style='border-bottom: solid 1px; border-left: solid 1px' valign='bottom' align='center'>" + werte[2][p] + "</td>";
sHTML = sHTML + "</tr>";
}

var ges_akt = werte.sum();
var ges_last = werte.sum();
var ges_vlast = werte.sum();

footer(ges_akt,ges_last,ges_vlast);
}

// Tabelle für den Kopf

function header1() {
sHTML = sHTML + "<table align='center' class='prettytable' width='98%'>";
sHTML = sHTML + " <tr>";
sHTML = sHTML + " <td style='border-bottom: solid 1px; border-right: solid 1px' valign='bottom' align='center'>Produkt</td>";
sHTML = sHTML + " <td style='border-bottom: solid 1px; border-left: solid 1px' valign='bottom' align='center'>" + akt_dat + "</td>";
sHTML = sHTML + " <td style='border-bottom: solid 1px; border-left: solid 1px' valign='bottom' align='center'>" + (akt_dat-1) + "</td>";
sHTML = sHTML + " <td style='border-bottom: solid 1px; border-left: solid 1px' valign='bottom' align='center'>" + (akt_dat-2) + "</td>";
sHTML = sHTML + " </tr>";
}

// Fußzeile mit dem gesamt

function footer(w1,w2,w3) {
sHTML = sHTML + "<tr>";
sHTML = sHTML + " <td style='border-bottom: solid 1px; border-right: solid 1px' align='center'><strong>Summe:</strong></td>";
sHTML = sHTML + " <td style='border-bottom: solid 1px' valign='bottom' align='center'>"+ w1 +"</td>";
sHTML = sHTML + " <td style='border-bottom: solid 1px' valign='bottom' style='border-left: solid 1px' align='center'>"+ w2 +"</td>";
sHTML = sHTML + " <td style='border-bottom: solid 1px' valign='bottom' style='border-left: solid 1px' align='center'>"+ w3 +"</td>";
sHTML = sHTML + "</tr>";
}

function navigation () {
sHTML = sHTML + "<table class='maintable' width='98%' align='center'>";
sHTML = sHTML + " <tr>";
sHTML = sHTML + " <td width='20%'> </td>";
sHTML = sHTML + " <td>";
sHTML = sHTML + "<table align='center' width='50%' border='0' cellspacing='0' cellpadding='0'>";
sHTML = sHTML + " <tr>";
sHTML = sHTML + " <td> </td>";
sHTML = sHTML + " <td> </td>";
sHTML = sHTML + " <td> </td>";
sHTML = sHTML + " <td> </td>";
sHTML = sHTML + " <td> </td>";
sHTML = sHTML + " </tr>";
sHTML = sHTML + "</table>";
sHTML = sHTML + "</td>";
sHTML = sHTML + "<td width='2%'> </td>";
sHTML = sHTML + "<td width='15%'>";
sHTML = sHTML + "<table align='right' class='prettytable' width='100%' border='0' cellspacing='0' cellpadding='0'>";
sHTML = sHTML + " <tr>";
sHTML = sHTML + " <td><a href='charge_detail.html'><div class='navi' align='center'>Detail</div></a></td>";
sHTML = sHTML + " </tr>";
sHTML = sHTML + "</table>";
sHTML = sHTML + "</td>";
sHTML = sHTML + "</tr>";
sHTML = sHTML + "</table> ";
}

ocxBase.deleteView(view);
ocxBase.deleteView(viewEx);
ocxBase.deleteView(viewTvm);

eltAction.innerHTML = sHTML;
</SCRIPT>

<BODY>

<DIV id=eltAction></div>
</BODY>
</HTML>
 
Langsam wird mir klar was du willst, in deiner Beschreibung kam das nicht bisher nicht rüber. Deine Datenstruktur ist in etwa so:
PHP:
var arr = [
{ 'LibPrd1': 3, 'LibPrd2': 4},
{ 'LibPrd1': 4, 'LibPrd2': 4}
];

und du willst nicht die Summe aller Werte haben, sondern die der einzelnen Keys. dann ist der ganze ansatz bisher falsch.

wobei aber bei mir mit diesen Daten, das richtig rauskommt: alert(arr.sum()); ist 15 nicht undefined. D.h. deine Daten sind irgendwie anders, es wird also immer schieriger dir zu helfen, da wir mit dem Skript ja nichts anfangen können, da ich nicht weiß was ocxBase ist. Vielleicht kannst du ein lauffähiges Minimalskript zeigen, dann wäre es einfacher.
 
Langsam wird mir klar was du willst, in deiner Beschreibung kam das nicht bisher nicht rüber. Deine Datenstruktur ist in etwa so:
PHP:
var arr = [
{ 'LibPrd1': 3, 'LibPrd2': 4},
{ 'LibPrd1': 4, 'LibPrd2': 4}
];

und du willst nicht die Summe aller Werte haben, sondern die der einzelnen Keys. dann ist der ganze ansatz bisher falsch.


Jawoll, richtig. Habe es wohl ein wenig umständlich erklärt


wobei aber bei mir mit diesen Daten, das richtig rauskommt: alert(arr.sum()); ist 15 nicht undefined. D.h. deine Daten sind irgendwie anders, es wird also immer schieriger dir zu helfen, da wir mit dem Skript ja nichts anfangen können, da ich nicht weiß was ocxBase ist. Vielleicht kannst du ein lauffähiges Minimalskript zeigen, dann wäre es einfacher.

also mit dem object ocxBase (<object id="ocxBase" classid="clsid:0637458F-EF14-11D1-BBE1-00C04FA2E9EE"></object>) wird auf eine Datenbank zugegriffen welche mit ViewFirstRecord und ViewNextRecord von der ersten Zeile bis auf die letzte durchgearbeitet wir.

Hier werden nun die Namen sowie derer Werte (LibPrd=Prod1 -> Qty = 5 Stk -> Ch_Date= 2008) in dieses Array werte[0][LibPrd] geschrieben.

werte[0][LibPrd] += parseInt(Qty);

Heraus kommt z.B. :
2008 -> Prod1, 5,6,7
2008 -> Prod2, 4,3,2

2007 -> Prod1, 2,5,1
2007 -> Prod2, 4,6,1

also

Prod1 |18|8
Prod2 |8|11
ges |24|19

Kannst Du damit was anfangen ?

Viele Grüße
Stefan
 
Zurück
Oben