GrandTotal3 und Javascript

uhlhorn

Aktives Mitglied
Thread Starter
Registriert
24.05.2005
Beiträge
2.457
Hi,

ich möchte die Mengenangabe <qty/> auf eine Nachkommastelle runden. Da Stefan Fürst auf Supportanfragen meist nicht zu antworten pflegt, und das Programm mit 4(!) Nachkommastellen für eine dezimale Zeitangabe einfach unbrauchbar ist, hoffe ich nun, dass ich das mithilfe eines Javascrips lösen kann.

Man kann ja zu einem Feld ein Script angeben. So ändert folgendes Script die Mengenangabe auf "", wenn die Menge 1 ist und die Einheit „Pauschal“ lautet:

Code:
if (grandtotalrecord.quantity() == 1 && grandtotalrecord.unit() == "Pauschal")
	"";
else
	grandtotalrecord.quantity();
(Quelle des Scripts: https://gist.github.com/florianfiegel/1243753)

Das funktioniert auch. Nun möchte ich aber <qty/> runden und habe analog zum ersten Script folgende Zeilen geschrieben (kenne mich aber mit javaScript leider nicht aus):

Code:
if (grandtotalrecord.quantity() !==0)
	0;
else
	var x = grandtotalrecord.quantity();
	var k = (Math.round(x * 100) / 100).toString();
	k += (k.indexOf('.') == -1)? '.00' : '00';
	var p = k.indexOf('.');
	var q = (k.substring(0, p) + ',' + k.substring(p+1, p+3));
	grandtotalrecord.quantity() = q;

Ich vermute, dass der Fehler in der letzten Zeile liegt. Wie übergebe ich einen Wert an GrandTotal?
 

ruerueka

Aktives Mitglied
Registriert
04.04.2004
Beiträge
1.668
Ich kenne GT nicht und habe deinen Code nicht getestet. Aber zu deiner Frage:
Sofern die Funktion nicht Variablen des übergeordneten Scopes überschreibt gibt man den errechneten Wert mit einem return-Statement an den Aufrufer zurück oder setzt es mit einem entsprechenden Funktionsaufruf.
Gibt es keine Dokumentation zu der Javascript-Schnittstelle? Ich würde erwarten, dass du die errechnete Menge mit einer Funktion wie grandtotalrecord.setQuantity( deineErrechneteMenge ) gesetzt werden muss....
Außerdem solltest du unbedingt den Code deines else-Blockes in geschweifte Klammern setzen, da er sonst ab Zeile 2 immer ausgeführt wird, weil der else-Zeig bereits nach der ersten Zeile des Blockes automatisch beendet wird. Einrückung alleine hilft nicht... Man sollte dies IMMER machen - auch bei einzeiligen Statements, wie deinem If-Block. Das jüngste SSL-Desaster von Apple beruhte zB auf so einer Schlamperei...
 

scope

Aktives Mitglied
Registriert
24.01.2005
Beiträge
4.115
Da dein `else`-Block mehrzeilig ist, musst du die Zeilen kapseln — sonst würde nach der Zeile `0;` alle bis auf die erste Zeile des `else`-Blocks auch ausgeführt. Bei dir steht gerade implizit folgendes:

Code:
if (grandtotalrecord.quantity() !==0) {
	0;
} else {
	var x = grandtotalrecord.quantity();
}

var k = (Math.round(x * 100) / 100).toString();
k += (k.indexOf('.') == -1)? '.00' : '00';
var p = k.indexOf('.');
var q = (k.substring(0, p) + ',' + k.substring(p+1, p+3));
grandtotalrecord.quantity() = q;

Das ist natürlich falsch.

Bezogen auf die Übergabe des Wertes: Für mich sieht das so aus als würde der letzte Ausdruck des Scripts den Rückgabewert liefern. Zusammen mit dem vorangegangenen könnte folgendes funktionieren:

Code:
if (grandtotalrecord.quantity() !==0) {
	0;
} else {
	var x = grandtotalrecord.quantity();
	var k = (Math.round(x * 100) / 100).toString();
	k += (k.indexOf('.') == -1)? '.00' : '00';
	var p = k.indexOf('.');
	var q = (k.substring(0, p) + ',' + k.substring(p+1, p+3));
	q;
}
 

uhlhorn

Aktives Mitglied
Thread Starter
Registriert
24.05.2005
Beiträge
2.457
Danke Euch beiden. Das Beispiel von score funktioniert grundsätzlich, auch wenn jetzt alle Werte auf Null sind, aber es wird zumindest ein Wert übergeben. Aber GT rechnet den Betrag trotzdem mit den ursprünglichen Werten. Damit hilft mir das leider nicht weiter.

@ ruerueka: Bei mir ist es in diesem falle keine Schlamperei, denn ich kenne mich mit JavaScript-Programmierung schlicht nicht aus. Es ist einfach nur Unwissen meinerseits.
 

uhlhorn

Aktives Mitglied
Thread Starter
Registriert
24.05.2005
Beiträge
2.457
Ich habe es jetzt mit Automator gelöst. Ich habe einen Dienst erstellt, der Text empfängt und den markierten Text mit dem Ergebnis ersetzt. In Automator läuft ein AppleScript. Damit kann ich jetzt in jeder Position in das Feld „Menge“ klicken und den Dienst aufrufen. Dieser rundet nun den Wert auf eine Nachkommastelle auf.

Wen’s interessiert, hier der AppleScript-Code. Den kann man ja auch als Rundungsdienst an anderen Stellen verwenden. Es funktioniert in jeder Art von Text.

on run {TextZahl}

--set Aus1 to TextZahl

try
  set Zahl to TextZahl as number
on error
  
  -- Folge: Punkt durch Komma ersetzen
  set AppleScript's text item delimiters to "."
  set TextZahl to (text items of TextZahl)
  set AppleScript's text item delimiters to ","
  set TextZahl to (TextZahl as string)
  set AppleScript's text item delimiters to ""
  set Zahl to TextZahl as number
    
end try

set x to 4.11
set x to 10 * Zahl
set y to round x rounding up
set rund to y / 10

set Aus2 to rund as text

--display dialog (Aus1 as text) & " -> " & (Aus2 as text)

return Aus2
end run
 

ruerueka

Aktives Mitglied
Registriert
04.04.2004
Beiträge
1.668
@ ruerueka: Bei mir ist es in diesem falle keine Schlamperei, denn ich kenne mich mit JavaScript-Programmierung schlicht nicht aus. Es ist einfach nur Unwissen meinerseits.
Das weiss ich doch, aber der Autor deiner Vorlage war schlampig, und da solche Vorlagen immer von den armen Endusern benutzt werden, die sich nicht auskennen, ist das fatal. Also bitte nicht persönlich nehmen.
 

uhlhorn

Aktives Mitglied
Thread Starter
Registriert
24.05.2005
Beiträge
2.457
Das weiss ich doch, aber der Autor deiner Vorlage war schlampig,…
Na ja, bei einer Zeile benötigt man die Klammer ja nicht. Aber das stimmt schon, man sollte es immer machen, genau so, wie man vor einer Division immer auf Null prüfen sollte (Division by Zero Error).

Also bitte nicht persönlich nehmen.
Keine Sorge, ich nehme es erstens nicht persönlich, und zweitens kann ich mit Kritik umgehen. ;-)
 
Oben Unten