[GastForen Programme Print/Bildbearbeitung Adobe InDesign Skriptwerkstatt Tabelle für Leistungsverzeichnis und Angebote

  • Suche
  • Hilfe
  • Lesezeichen
  • Benutzerliste
Print/Bildbearbeitung - Photos, Layout, Design
Themen
Beiträge
Moderatoren
Letzter Beitrag

Tabelle für Leistungsverzeichnis und Angebote

eingangfabrik
Beiträge gesamt: 33

7. Jul 2015, 11:51
Beitrag # 1 von 27
Bewertung:
(6453 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo zusammen,

nach intensiver Suche im Internet und im Forum erstelle ich nun doch einen neuen Thread in der Hoffnung, dass auch andere vor diesem Problem stehen.

Wir müssen oft Leistungsverzeichnisse oder Angebote erstellen mit mehreren Positionen. Eine AVA-Software lohnt sich aber bei weitem nicht und ist uns auch zu unflexibel.
Mit der Software GrandTotal2 habe ich mich ein paar Wochen lang herumgeschlagen, bin aber zu keinem befriedigenden Ergebnis gekommen.
Prinzipiell soll es aber in die Richtung gehen.

Die Idee ist, in inDesign (CS5 für Mac) eine Tabelle zu erstellen, die (per Script) die einfachen Berechnungen ausführt.

Das wurde hier schon einigermaßen ausführlich besprochen:
http://www.hilfdirselbst.ch/..._reply;so=ASC;mh=15;

Ein paar Punkte fehlen mir dabei aber noch:
- Einfügen einer Kopfzeile/ Titelzeile, die nicht in die Berechnungen einbezogen wird.
- Untertitelzeilen in der Tabelle (z.B. Baustelleneinrichtung), die nur den Titel haben und keine Berechnung
- Zwischensummen, Summe der Positionen nach dem vorangehenden Untertitel
- Übertrag unten auf letzter Zeile vor Seitenumbruch mit Summe der Positionen auf der Seite. (Evtl. auch ausserhalb der Tabelle als separates Feld?!)
- Übertrag oben auf Folgeseite (entspricht Übertrag von Vorderseite) (Evtl. auch ausserhalb der Tabelle als separates Feld?!)
- Wiederholen der Kopfzeile nach Seitenumbruch (sollte mit den Tabellen-Bordmitteln gehen, oder?)
- Berechnung der Nettosumme anhand der Positionen oder der Zwischensummen (notfalls Halbierung der Gesamtsumme)
- Nettoeinheitspreis-Positionen, die nicht mitgerechnet werden in der Summe, sondern nur als NEP aufgeführt sind

Einige der Punkte kann man lösen in dem man das Script nur auf ein bestimmtes Format anspringen lässt. Leider habe ich das bisher nicht geschafft.

Im Scripten bin ich noch ein absoluter Neuling. Wenn also jemand eine gute Einführung in das Scripten (Schwerpunkt Berechnungen) hat, bitte verlinken.

Ich erstelle gleich mal eine Beispieltabelle, die ich hier hochlade. (Wenn es klappt) Dabei werde ich aber noch kein Script einfügen.

die fertige Datei kann ich dann auch hochladen und zur Verfügung stellen. Vielleicht hat ja auch jemand anders Bedarf.
Danke schonmal an alle die mithelfen.

MfG
Adrian
X

Tabelle für Leistungsverzeichnis und Angebote

eingangfabrik
Beiträge gesamt: 33

7. Jul 2015, 13:04
Beitrag # 2 von 27
Beitrag ID: #541067
Bewertung:
(6404 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hier noch die Beispieldatei in der dropbox:
https://www.dropbox.com/...eispiel_LV.indd?dl=0
Erstellt in CS5 für OS X.

Hochladen geht nicht, da ich den Anhang speichern soll, aber keinen Button dafür finde.


als Antwort auf: [#541062]

Tabelle für Leistungsverzeichnis und Angebote

eingangfabrik
Beiträge gesamt: 33

7. Jul 2015, 15:49
Beitrag # 3 von 27
Beitrag ID: #541083
Bewertung:
(6353 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hier noch das schon leicht ergänzte Script von dem genannten Link.
Ich weiss nun aber nicht, an welcher Stelle ich definieren muss, dass nur die Zeilen mit dem Format "Position" angesprochen werden...

Code
// simpleBillingLV.js 

var columnMenge=3;
var columnEP=5;
var MWST = 19/100;
var myStyle = "Position";

if (app.selection[0].parent.constructor.name == "Cell"){
var myTable = app.selection[0].parent.parent;
var myLastCol = myTable.columns.length-1;
var myLastRow = myTable.rows.length-1;
var myMenge = 0;
var myEP = 0;

var mySum = 0;
var myPrice = 0;

for (k = 0; k < myLastRow-2; k++) {

myMenge = parseFloat(String(myTable.columns.item(columnMenge-1).cells[k].contents.replace(",", ".") ));
myEP = parseFloat(String(myTable.columns.item(columnEP-1).cells[k].contents).replace(",", ".") );

myPrice = (myMenge*myEP);

myTable.columns.item(columnMenge-1).cells[k].contents = digitFormatter(myMenge);
myTable.columns.item(columnEP-1).cells[k].contents = digitFormatter(myEP);

myTable.columns[myLastCol].cells[k].contents = digitFormatter(myPrice) + " EUR";
mySum += (myTable.columns[myLastCol].cells[k].contents.replace(",", "."))*1 ;

}

myTable.columns[myLastCol].cells[myLastRow-2].contents = digitFormatter(mySum) + " EUR";
myTable.columns[myLastCol].cells[myLastRow-1].contents = digitFormatter(mySum*MWST) + " EUR";
myTable.columns[myLastCol].cells[myLastRow].contents = digitFormatter(mySum*MWST + mySum) + " EUR";
}


function digitFormatter(x) {
return String(Number(x).toFixed(2)).replace(".", ",");
}



als Antwort auf: [#541067]

Tabelle für Leistungsverzeichnis und Angebote

eingangfabrik
Beiträge gesamt: 33

10. Aug 2015, 13:01
Beitrag # 4 von 27
Beitrag ID: #541864
Bewertung:
(6003 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Kann mir jemand bestätigen, dass einem (mehr) geholfen wird, wenn man Premium-Kunde ist?

PS: Das finde ich übrigens komplett ok, wenn es so wäre. Es ist leider nur sehr schwer abschätzbar, ob es sich dann wirklich lohnt, da man nicht weiss, wie viel Feedback man kriegt als Prem.-Member.


als Antwort auf: [#541083]

Tabelle für Leistungsverzeichnis und Angebote

Kai Rübsamen
Beiträge gesamt: 4684

10. Aug 2015, 14:41
Beitrag # 5 von 27
Beitrag ID: #541873
Bewertung:
(5976 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo!

Ich hab deinen Beitrag nur kurz überflogen, kann dir aber auf jeden Fall bestätigen, dass die Hilfe hier nicht von einer Mitgliedschaft abhängt. Wenn hier einer Lust hat, etwas zu schreiben, dann tut er das. Wenn nicht, dann nicht. Eigentlich ein einfaches Prinzip.

Trotzdem ist eine Mitgliedschaft sinnvoll! Du unterstützt damit das Forum (Wartung, Servergebühren usw.) und kannst dann auch Dateien usw. direkt hochladen.

Zu deinem Problem: Ich habe leider in dieser Woche keine Zeit. Solltest du bis nächste Woche keine Antwort erhalten, schreib mir eine PM und wird finden "vielleicht" eine Lösung.


als Antwort auf: [#541864]
(Dieser Beitrag wurde von Kai Rübsamen am 10. Aug 2015, 14:42 geändert)

Tabelle für Leistungsverzeichnis und Angebote

iduser
Beiträge gesamt: 107

10. Aug 2015, 16:00
Beitrag # 6 von 27
Beitrag ID: #541884
Bewertung:
(5955 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo,
Antwort auf: Ich weiss nun aber nicht, an welcher Stelle ich definieren muss, dass nur die Zeilen mit dem Format "Position" angesprochen werden...

Ich geh mal davon aus, dass du damit ein Zellenformat meinst. Die Zeile besitzt keine Eigenschaft "appliedCellStyle", jedoch eine einzelne Zelle.
Das kannst du hier sehen, vorausgesetzt man weis, dass die Eigenschaft "appliedCellStyle" ist. Ansonsten hilft nur suchen und Beschreibung durchlesen
http://jongware.mit.edu/idcs6js/pc_Row.html
http://jongware.mit.edu/idcs6js/pc_Cell.html

Nachfolgend ein Beispiel, wie du Zeilen herausfilterst, in denen die erste Zelle der Zeile das Zellenformat "Position" hast.

Code
// vollständige Tabelle muss markiert sein 
var _table = app.selection[0];

// durchlaufe alle Zeilen
for(var t=0; t<_table.rows.length; t++){
var _oneRow = _table.rows[t];
// wenn erste Zelle der jeweiligen Zeile das Zellformat "Position" besitzt, ...
if(_oneRow.cells[0].appliedCellStyle.name == "Position"){
// ... mach irgendetwas
}
}



Wenn die Voraussetzung nicht streng genug ist, müssen die anderen Zellen in der Zeile (mittels Schleife) auch geprüft werden.

Bezüglich deinem letzten Post, geb ich Kai vollkommen Recht. In der Regel werden die Beiträge recht schnell beantwortet. Je nach Komplexität, Häufigkeit (ggf. eine Ähnlichkeit zu einem anderen Problem) oder auch "Schwierigkeit" des gestellten Problems, kann es passieren, dass es etwas länger dauert, bis man eine oder im seltensten Fall keine Antwort bekommt. Als Beispiel hab ich Martin Fischer im Kopf, welcher auf Grund seines umfangreichen Wissens, für mich sehr herausfordernde Fragen stellt und sie manchmal auch selbst beantwortet, weil kein andere eine Lösung hat, bzw. er dann doch schneller war.

Philipp


als Antwort auf: [#541083]

Tabelle für Leistungsverzeichnis und Angebote

eingangfabrik
Beiträge gesamt: 33

11. Aug 2015, 08:52
Beitrag # 7 von 27
Beitrag ID: #541900
Bewertung:
(5852 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Antwort auf [ Kai Rübsamen ] Wenn hier einer Lust hat, etwas zu schreiben, dann tut er das. Wenn nicht, dann nicht.


So kannte ich das bisher auch, bin aber über den Thread: Erweiterte Leistungen für PremiumMember und InDesign-User gestolpert.

Wenn ich wirklich nicht mehr weiter komme, melde ich mich. Hoffe aber es klappt irgendwie … :-) Danke!


als Antwort auf: [#541873]

Tabelle für Leistungsverzeichnis und Angebote

eingangfabrik
Beiträge gesamt: 33

11. Aug 2015, 08:59
Beitrag # 8 von 27
Beitrag ID: #541901
Bewertung:
(5848 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Antwort auf [ iduser ] Nachfolgend ein Beispiel, wie du Zeilen herausfilterst, in denen die erste Zelle der Zeile das Zellenformat "Position" hast.

Code
// vollständige Tabelle muss markiert sein 
var _table = app.selection[0];

// durchlaufe alle Zeilen
for(var t=0; t<_table.rows.length; t++){
var _oneRow = _table.rows[t];
// wenn erste Zelle der jeweiligen Zeile das Zellformat "Position" besitzt, ...
if(_oneRow.cells[0].appliedCellStyle.name == "Position"){
// ... mach irgendetwas
}
}



Danke. Das sollte mir schon mal weiterhelfen. Die erste Zelle reicht dafür aus, da ich die Zellen über die Formate zeilenweise gleich einstelle. Ich versuche das ganze mal auf die letzte Zelle umzuschreiben.

Es wäre zuverlässiger, wenn ich vor dem Speichern jeweils zur Neuberechnung aufgefordert werde, ohne das die Tabelle markiert werden muss.
Dann habe ich beim Export immer die aktuellste Tabelle.
Mal schauen ob sich dazu was findet…

Danke schonmal.


als Antwort auf: [#541884]

Tabelle für Leistungsverzeichnis und Angebote

eingangfabrik
Beiträge gesamt: 33

11. Aug 2015, 16:02
Beitrag # 9 von 27
Beitrag ID: #541932
Bewertung:
(5661 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Ich habe nun mal angefangen den Code zusammenzutragen und poste ihn mal hier.
Wenn es zu chaotisch und unlogisch ist, bitte melden. Notfalls kann ich den Beitrag dann wieder entfernen um niemanden zu verwirren.

Wäre toll, über ein Feedback, ob ich auf dem richtigen Weg bin.

Das größte Problem sehe ich momentan noch darin, das die Tabelle markiert werden sollte. Suche nach einer Lösung, wo das nicht nötig ist. (Ganz am Anfang des Codes.)
Idealerweise wäre eine Aktualisierung der Tabelle beim Speichern der Datei.
Es wird immer nur eine Tabelle geben pro Datei. (Die Tabelle kann aber über mehrere Seiten führen)

Code
// LV_Berechnung.jsx 
// Script zur Berechnung einer Tabelle eines LV / Angebotes
// mit angepassten Auszügen aus einem Script von Martin Fischer http://www.hilfdirselbst.ch/foren/Zahlen_herauslesen_und_addieren_%28Script%29_P190598.html#190598
//
var myTab = ; // Tabelle ansprechen im Sinne von "app.activeDocument"

var MWST = 19/100;

// Initialisierung
// Definieren der Zeichenformate
//
var aktivePositionSum = 0
var aktivePositionCharStyleName = "aktivePosition"; // Zeichenformat aktive Position

var alternativPositionSum = 0
var alternativPositionCharStyleName = "alternativPosition"; // Zeichenformat alternative Position (NEP)

var zwischenSummeSum = 0
var zwischenSummeCharStyleName = "Zwischensumme"; // Zeichenformat Zwischensumme

var columnMenge = 3; // Mengen stehen in dritter Spalte
var columnEP = 5; // EP steht in fünfter Spalte
var columnGP = 6 // GP steht in sechster Spalte

// Multiplizierung der Menge mit EP, wenn Format = aktivePosition
// Funktioniert so noch nicht!

if (app.selection[0].parent.constructor.name == "aktivePosition"){
var myTable = app.selection[0].parent.parent;
var myLastCol = myTable.columns.length-1;
var myLastRow = myTable.rows.length-1;
var myMenge = 0;
var myEP = 0;

var mySum = 0;
var myPrice = 0;

for (k = 0; k < myLastRow-2; k++) {

myMenge = parseFloat(String(myTable.columns.item(columnMenge-1).cells[k].contents.replace(",", ".") ));
myEP = parseFloat(String(myTable.columns.item(columnEP-1).cells[k].contents).replace(",", ".") );

myPrice = (myMenge*myEP);

myTable.columns.item(columnMenge-1).cells[k].contents = digitFormatter(myMenge);
myTable.columns.item(columnEP-1).cells[k].contents = digitFormatter(myEP);

myTable.columns[myLastCol].cells[k].contents = digitFormatter(myPrice) + " €";
mySum += (myTable.columns[myLastCol].cells[k].contents.replace(",", "."))*1 ;

}

// folgende drei Zeilen werden noch nicht ausgeführt
// sollten die Zeilen ans Ende? Können die Zeilen in "Fusszeilen" in inDesign stehen?
myTable.columns[myLastCol].cells[myLastRow-2].contents = digitFormatter(mySum);
myTable.columns[myLastCol].cells[myLastRow-1].contents = digitFormatter(mySum*MWST);
myTable.columns[myLastCol].cells[myLastRow].contents = digitFormatter(mySum*MWST + mySum);
}

// Einsetzen "NEP" bei alternativPositionen (Code von iduser aus http://www.hilfdirselbst.ch/foren/Tabelle_f%FCr_Leistungsverzeichnis_und_Angebote_P541884.html#541884 )
// durchlaufe alle Zeilen
for(var t=0; t<_table.rows.length; t++){
var _oneRow = _table.rows[t];
// wenn erste Zelle der jeweiligen Zeile das Zellformat "alternativPosition" besitzt, soll in der letzten Spalte "NEP" stehen.
if(_oneRow.cells[0].appliedCellStyle.name == "alternativPosition"){
columnGP = "NEP" // kann so noch nicht funktionieren.
}
}

// Suche nach den Zahlen für die Zwischensumme
// Es soll aber nur bis zur letzten vorherigen Zwischensumme gerechnet werden! Also die Summe der Zeilen über der Zeile mit Format "zwischenSumme" bis zur letzten Zwischensumme.
if (zwischenSummeCharStyle.name){
var zwischenSumme = myTab.search( undefined, false, false, undefined,
{appliedCharacterStyle:zwischenSumeCharStyle}, )

// Summenbildung
zwischenSummeSum = summieren(zwischenSumme);

// Ergebnisses in entsprechende Zelle einfügen ??

}

// von Punkt auf Komma umstellen
function digitFormatter(x) {
return String(Number(x).toFixed(2)).replace(".", ",");
}


Danke schonmal


als Antwort auf: [#541901]

Tabelle für Leistungsverzeichnis und Angebote

iduser
Beiträge gesamt: 107

11. Aug 2015, 17:55
Beitrag # 10 von 27
Beitrag ID: #541939
Bewertung:
(5633 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Antwort auf: Das größte Problem sehe ich momentan noch darin, das die Tabelle markiert werden sollte. Suche nach einer Lösung, wo das nicht nötig ist. (Ganz am Anfang des Codes.)

Das kann man über das Skriptetikett lösen, dabei gibt es verschiedene Möglichkeiten:
1. Du markierst die Tabelle, öffnest das Panel "Skriptetikett" und gibst dort einen eindeutigen Namen ein, der die Tabelle beschreibt, bspw. "Rechnungstabelle_001" (mir ist grad nichts besseres eingefallen)
2. du markierst die Tabelle und führst nachfolgenden Code aus:
Code
app.selection[0].label = "Rechnungstabelle_001"; 


Mit einer der beiden Varianten hast du erstmal das Label gesetzt. Nun kannst du mit bspw.
Code
app.activeDocument.stories.everyItem().tables.itemByName("Rechnungstabelle_001") 

auf die Tabelle zugreifen.
http://jongware.mit.edu/idcs6js/pc_Table.html
Einzige Einschränkung wäre, dass im Dokument nur eine Tabelle mit diesem Label existiert. Ansonsten bekommst du die erst beste geliefert.

=>
Code
var myTab = app.activeDocument.stories.everyItem().tables.itemByName("Rechnungstabelle_001"); 



Antwort auf: if (app.selection[0].parent.constructor.name == "aktivePosition"){...

Das kann so nicht funktionieren, da es in ID kein Object vom Constructor "aktivePosition" gibt. Vorher stand dort wahrscheinlich Cell. Damit prüfst du, ob die Auswahl eine Zelle ist, nur dann macht auch die nachfolgende Zeile
Code
var myTable = app.selection[0].parent.parent; 

einen Sinn. Denn da springts zum Elternelement von der Zelle, welche die Tabelle ist.
(Obwohl bei mir nur einmal parent funktioniert, wahrscheinlich ist das ID-Versionsabhängig)...
Da du aber über das Label deine Tabelle schon hast, kannst du dir die Zeilen eigentlich sparen.

Antwort auf:
Code
columnGP = "NEP" // kann so noch nicht funktionieren. 


Hier müsste eher stehen
Code
_oneRow.cells[columnGP-1].contents = "NEP" 

Damit sprichst du die 5te Zelle der Zeile an. Mit Contents legst du die Zeichenkette fest, welche in der Zelle erscheint.

Mein Ratschlag wäre, dass du die Codeschnipsel separat einmal ausführst und schaust was sie machen bzw. welche Fehlermeldungen erscheinen. Dann kannst du aus deinen Schnipseln das "große" Skript zusammenbauen. So behälst du besser den Überblick, weist wie die einzelnen Teile funktionieren und kannst besser an einem Teilproblem operieren.
Um einen Überlick zu gewinnen schau dir mal die Übersicht von Gregor Fellenz an (http://www.indesignjs.de/...ing_Kurzreferenz.pdf) und schnarch bei Jongware http://www.jongware.com/idjshelp.html in der Objektübersicht samt Eigenschaften und Methoden.

Ich hoffe, damit kommst du erstmal ein Stückchen weiter.
Zu kommentieren des restlichen Teils, fehlt mir gerade die Zeit.

Viel Erfolg,
Philipp

Philipp


als Antwort auf: [#541932]
(Dieser Beitrag wurde von iduser am 11. Aug 2015, 17:57 geändert)

Tabelle für Leistungsverzeichnis und Angebote

eingangfabrik
Beiträge gesamt: 33

12. Aug 2015, 09:52
Beitrag # 11 von 27
Beitrag ID: #541944
Bewertung:
(5536 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Antwort auf: Ich hoffe, damit kommst du erstmal ein Stückchen weiter.
Zu kommentieren des restlichen Teils, fehlt mir gerade die Zeit.


Definitiv! Vielen Dank schon mal!


als Antwort auf: [#541939]

Tabelle für Leistungsverzeichnis und Angebote

eingangfabrik
Beiträge gesamt: 33

12. Aug 2015, 11:24
Beitrag # 12 von 27
Beitrag ID: #541951
Bewertung:
(5508 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
So. Mit dem ersten Schnipsel habe ich mich auseinandergesetzt und komme bereits nicht weiter.

Das Skriptetikett der Tabelle "tableLV01" habe ich überprüft
Die Tabelle hat insgesamt 6 Spalten
Das Zellformat "alternativPosition" habe ich überprüft (Rechtschreibung) und auf 2 Zeilen angewandt.

Getestet habe ich es mit den Spalten 5 und 6 befüllt und auch leer.
In Tabelle mit und ohne Kopf- / Fusszeilen

Fehlermeldung kommt keine beim Ausführen des Codes.

Müsste nach der Kurzübersicht in der ersten Zeile nicht noch die .characters angesprochen werden? An Stelle von .stories? Tables sind ja ein Unterelement von Characters.

Hier mal noch der Code:
Code
var myTab = app.activeDocument.stories.everyItem().tables.itemByName("tableLV01") ; 
var columnGP = 6;

for(var t=0; t<myTab.rows.length; t++){
var _oneRow = myTab.rows[t];

if(_oneRow.cells[0].appliedCellStyle.name == "alternativPosition"){
_oneRow.cells[columnGP-1].contents = "NEP" ;
}
}


Danke und Grüße


als Antwort auf: [#541944]

Tabelle für Leistungsverzeichnis und Angebote

eingangfabrik
Beiträge gesamt: 33

12. Aug 2015, 13:37
Beitrag # 13 von 27
Beitrag ID: #541964
Bewertung:
(5461 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Und weiter geht's mit Misserfolgen:

Es wird mir immer Fehlernummer: 24 ausgegeben.
myTable.columns.item(columnMenge).cells[k].contents.replace ist keine Funktion.
Mit Bezug auf Zeile 15. Wenn ich diese Zeile lösche, kommt dasselbe Problem mit Zeile 21.

Erst mein Script:

Code
var myTable = app.activeDocument.stories.everyItem().tables.itemByName("tableLV01") ;	 
var MWST = 19/100;

var myLastCol = myTable.columns.length-1;
var myLastRow = myTable.rows.length-1;

var columnMenge = 3
var columnEP = myLastRow -1;

var mySum = 0;
var myPrice = 0;

for (k = 0; k < myLastRow-2; k++) {

myPrice = ((myTable.columns.item(columnMenge).cells[k].contents.replace(",", "."))*(myTable.columns.item(columnEP).cells[k].contents.replace(",", ".")));

myTable.columns.item(1).cells[k].contents.replace(".", ",");
myTable.columns.item(2).cells[k].contents.replace(".", ",");

myTable.columns[myLastCol].cells[k].contents = digitFormatter(myPrice);
mySum += (myTable.columns[myLastCol].cells[k].contents.replace(",", "."))*1 ;
}

myTable.columns[myLastCol].cells[myLastRow-2].contents = digitFormatter(mySum);
myTable.columns[myLastCol].cells[myLastRow-1].contents = digitFormatter(mySum*MWST);
myTable.columns[myLastCol].cells[myLastRow].contents = digitFormatter(mySum*MWST + mySum);

function digitFormatter(x) {
// Quelle: http://www.dcljs.de/faq/antwort.php?Antwort=rechnen_runden#6
var k = (Math.round(x * 100) / 100).toString();
k += (k.indexOf('.') == -1)? '.00' : '00';
var p = k.indexOf('.');
return k.substring(0, p) + ',' + k.substring(p+1, p+3);
}


und noch die Vorlage. Die übrigens funktioniert, aber man muss halt einen Cursor in der Tabelle haben.

Code
// simpleBilling.jsx       

var MWST = 19/100;
if (app.selection[0].parent.constructor.name == "Cell"){
var myTable = app.selection[0].parent.parent;
var myLastCol = myTable.columns.length-1;
var myLastRow = myTable.rows.length-1;

var mySum = 0;
var myPrice = 0;
for (k = 0; k < myLastRow-2; k++) {

myPrice = ((myTable.columns.item(1).cells[k].contents.replace(",", "."))*(myTable.columns.item(2).cells[k].contents.replace(",", ".")));

myTable.columns.item(1).cells[k].contents.replace(".", ",");
myTable.columns.item(2).cells[k].contents.replace(".", ",");

myTable.columns[myLastCol].cells[k].contents = digitFormatter(myPrice);
mySum += (myTable.columns[myLastCol].cells[k].contents.replace(",", "."))*1 ;

}

myTable.columns[myLastCol].cells[myLastRow-2].contents = digitFormatter(mySum);
myTable.columns[myLastCol].cells[myLastRow-1].contents = digitFormatter(mySum*MWST);
myTable.columns[myLastCol].cells[myLastRow].contents = digitFormatter(mySum*MWST + mySum);
}


function digitFormatter(x) {
// Quelle: http://www.dcljs.de/faq/antwort.php?Antwort=rechnen_runden#6
var k = (Math.round(x * 100) / 100).toString();
k += (k.indexOf('.') == -1)? '.00' : '00';
var p = k.indexOf('.');
return k.substring(0, p) + ',' + k.substring(p+1, p+3);
}



als Antwort auf: [#541951]

Tabelle für Leistungsverzeichnis und Angebote

iduser
Beiträge gesamt: 107

13. Aug 2015, 21:18
Beitrag # 14 von 27
Beitrag ID: #541995
Bewertung:
(5292 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo,
mit
Code
var myTab = app.activeDocument.stories.everyItem().tables.itemByName("tableLV01") ; 

bekommt man zwar die Tabelle, aber Änderungen werden nicht vorgenommen. Das war mir bis jetzt auch nicht bewusst.

Mit der Variante sollte es aber funktionieren (gerade getestet.). Bestimmt gibts für die Schleife durch die Stories auch nen Einzeiler...
Code
//Diese Variante berücksichtigt keine Tabellen in Fußnoten! 

var _doc = app.activeDocument;
var _allStories = _doc.stories;

// Schleife durch Textabschnitte
for(var s=0; s<_allStories.length; s++){
var myTable = _allStories[s].tables.itemByName("tableLV01");
// Wenn myTable gültig ist, beende Schleife vorzeitig
if(myTable.isValid) break;
}

// Wenn myTable gültig ist, dann ...
if(myTable.isValid){
var columnGP = 6;

for(var t=0; t<myTable.rows.length; t++){
var _oneRow = myTable.rows[t];

if(_oneRow.cells[-1].appliedCellStyle.name == "alternativPosition"){
_oneRow.cells[5].contents = "NEP" ;
}
}
}
else {alert("Tabelle mit dem Label 'tableLV01' existiert nicht.");}


PS: _oneRow.cells[-1] gibt dir die letzte Zelle in der Zeile zurück


als Antwort auf: [#541951]
(Dieser Beitrag wurde von iduser am 13. Aug 2015, 21:21 geändert)

Tabelle für Leistungsverzeichnis und Angebote

Kai Rübsamen
Beiträge gesamt: 4684

13. Aug 2015, 22:24
Beitrag # 15 von 27
Beitrag ID: #541996
Bewertung:
(5260 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Antwort auf: Es wird immer nur eine Tabelle geben pro Datei. (Die Tabelle kann aber über mehrere Seiten führen)


Darf ich mal fragen, warum ihr so an dem label festhaltet? Bei EINER Tabelle sollte doch auch das funktionieren:
Code
var curTable = app.activeDocument.stories.everyItem().tables[0]; 



als Antwort auf: [#541995]
X