2016-08-30 5 views
0

Meine Validierungslinienfunktion scheint nur beim zweiten Klicken auf Hinzufügen zu funktionieren. Wenn also der Betrag 500 ist und ich den Rabatt auf 100 setze, sollte er beim Hinzufügen des Buttons 400 sein. Es funktioniert nicht. Wenn ich erneut auf die Zeile klicke, scheint der Rabatt doppelt zu gelten - Betrag wird 300. Wie kann ich das beheben?NetSuite - OnValidateLine funktioniert nicht

function OnValidateLine(type, name) { 
 
    var count = nlapiGetLineItemCount('expense') 
 
    var total = nlapiGetFieldValue('usertotal') 
 

 
    for (var x = 1; x <= count; x++) { 
 
    var amount = nlapiGetCurrentLineItemValue('expense', 'amount'); 
 
    var discount = nlapiGetCurrentLineItemValue('expense', 'custcolptc_discount'); 
 
    if (discount) { 
 
     nlapiSetCurrentLineItemValue('expense', 'amount', amount - discount) 
 
    } 
 
    return true; 
 
    } 
 
    return true; 
 
}

+0

Gibt es einen Grund, nicht die typischen Rabattartikel von NetSuite zu verwenden, anstatt dafür zu kodieren? Sind sie nicht auf Spesenlinien anwendbar? Es scheint hier keine tatsächliche Validierung zu geben, also haben Sie erwogen, stattdessen "fieldChanged" zu verschieben? Sie können das Update jederzeit auslösen, wenn sich das Feld * Betrag * oder * Rabatt * ändert. Es scheint jedoch, dass es noch viele weitere Szenarien und Anwendungsfälle geben wird, die Sie mit dieser Logik umgehen müssen. – erictgrubaugh

+0

NetSuite hat keine Rabattfunktion für Lieferantenrechnungen, wie es für Rechnungen tut, weshalb ich das programmieren musste. Ich muss Rabatt auf Line-Ebene anwenden. Einige unserer Anbieter bieten uns Rabatte, so dass wir einen Weg brauchen, um dies von der Rechnung zu reduzieren. Mein Code funktioniert aber nur ab der 2. Zeile auf Stationen. OK - Ich werde das Feld ändern versuchen. – MG2016

+0

Habe gerade bemerkt, dass du nie 'x' oder' count' liest. Sie sollten die 'for'-Schleife überhaupt nicht brauchen, da Sie nur eine einzige Zeile ändern. – erictgrubaugh

Antwort

2

Sie sind eigentlich nicht mit der Schleife etwas zu tun.

Auch die Art, wie Sie dies tun, ist mit Problemen behaftet.

Sie sollten wahrscheinlich in dem recalc Fall tun dies eher als eine Validierung Ereigniszeile.

Wenn ich dies tat, würde ich einen ‚synthetischen‘ Aufwands neigen zu verwalten, die die Summe der berechneten Rabatte sind. So wie Sie dies gerade tun, wenn jemand die Kostenbeschreibung ändert, wird der Rabatt zweimal angewendet. Wenn Sie eine Rabattlinie verwenden, dann werden Sie nur die Rabatte zusammenfassen und die Rabattlinie hinzufügen oder aktualisieren.

Typisch für ein Client-Skript müssten Sie den Zeiger für jede Zeile vorzurücken bei Ihnen suchen. Im ungetesteten Beispiel unter dem 'ID-Feld'? wäre memo oder account columns (Sie müssen das Konto trotzdem einstellen):

var totalDiscount = 0; 
var discountExpenseAt = 0; 
for(var i = nlapiGetLineItemCount('expense'); i> 0; i--){ 
    if(nlapiGetLineItemValue('expense', 'id field?', i) == 'discount identifier') { 
discountExpenseAt = i; 
continue; 
} 
    totalDiscount += parseFloat(nlapiGetLineItemValue('expense', 'custcolptc_discount', i)) ||0; 
} 
if(totalDiscount) { 
if(discountExpenseAt){ 
nlapiSelectCurrentLineItem('expense', discountExpenseAt); 
nlapiSetCurrentLineItemValue('expense', 'amount', totalDiscount.toFixed(2)); 
nlapiSetCurrentLineItemValue('expense', 'id field?', 'discount identifier'); 
nlapiCommitCurrentLineItem('expense'); 
} 
+0

Danke - Ich habe meinen Code aktualisiert und die Schleife entfernt, von der ich nicht wusste, dass sie nichts tut! Ich denke, ich habe, was ich jetzt brauche - danke für das Code-Snippet. – MG2016