////////////////////////////////////////// // Syntax der fdl, edl, vardef, script: // // Kommentar // # Kommentar // einruecken, um Struktur zu verdeutlichen /* Beginn Kommentar */ Ende Kommentar // subScript:name leitet ein Teil-Script ein; dieses wird so behandelt, als waere es // unter dem Namen name im selben Directory; spart Files ein; // // Operanden // ========= // Operanden sind Parameter der eingebauten Funktionen (z.B. v,...) // Operanden werden durch kommata getrennt // Kommata in Operanden daher mit escapen // Operanden werden vom Parser an spaces in expressions und operatoren // aufgebrochen // soll das unterbleiben, kann mit der parser fuer den folgenden // operand abgeschaltet werden // Wert eines Operanden wird so ermittelt: // operand: [formatting]expr // escape: vorangestelltes " bewirkt, dass der gesamte operand // woertlich genommen wird; // bei den befehlen system,log,v,vs und dem operator "=" werden // alle Folge-Operanden woertlich mit angehaengt; // formatting: , , , , , , // auf NN Zeichen kuerzen, ,,,, // , // den Inhalt des Variantenattributes mit dbName gleich // dem auf folgenden String aus currentSelObj holen; // Spezialfall; kein parsing wg. spaces u. "." im Namen; // Jahr zweistellig // Jahr vierstellig // year/week // -> Monat 2-stellig // -> Monat Abkürzung // weekOfYear // uppercase, lowercase // oder ' (Intars 5.1 nur noch ') literally, Begriff danach bis // zum nächsten Komma wörtlich nehmen // uebersetzen; sprache wird mit lang op1 festgelegt // bei spf verwenden, wenn der formatstring mit % anfaengt; // kombinierbar, Reihenfolge egal; // expr: (expr) //klammern, um abarbeitung zu beeinflussen // expr operator expr //spaces sind wichtig // [prefix]exprVal[dataOption] // operator: {=,+,-,*,/,m} m ist Rest der modulo division // prefix: $... eigene Variable // %... Variable aus Datasource; dabei speziell: // %* = datasource; // sonst (nix): Konstante; wird durch "," ersetzt // exprVal: name[.keys] // keys: key[.key] // key: [{$,}]name[$name]... // mit "$" werden interne Variable referenziert, // aus deren Werten der // eigentliche key zusammengesetzt wird // z.B. prefix$a$b$suffix // bedeutet, dass key der Name eines // Varianten-Attributes ist; // geht nur bei EOs, die auch ein Attributprofil // haben // name: plain string // dataOption: {.*bez,.*eo} // .*bez -> Bezeichnung bei valueForKey // .*eo -> EO liefern statt dem foreign Key, // falls letztes Keypath-Element eine Relation ist; // bei Relationen: .descri am Ende f. Bezeichnung // // Zuweisungs-Befehle: // =================== // $name,op,op1,... op = {=,=:,+,-,*,/,m} oder special op (s. unten); // das Ergebnis wird mit setObject:ForKey:name in // das varDict bzw. localVarDict geschrieben; // das Ergebnis kann auch ein EO,NSArray,NSDictionary // etc. sein; // name selbst kann wiederum eine Variable im key-path // format sein; // z.B. $$a,=,test setzt die Variable, // deren Name in $a steht; // oder: $a.b.c.d.e,=,f // entspricht: // [[[[[[varDict ofk:@"a"]vfk:@"b"]vfk:@"c"]vfk:@"d"] takeValue:f forKey:@"e"] // oder: $a.b.$c.d.e,=,f // entspricht: // [[[[[[varDict ofk:@"a"]vfk:@"b"]vfk:[varDict ofk:@"c"]]vfk:@"d"] // takeValue:f forKey:@"e"] // bei EOs werden Relationen verfolgt; // Variablen in Subroutinen werden im localVardict // gehalten, wenn sie mit l_ anfangen; // das localVardict ist nur in der jeweiligen Subroutine // bekannt // der '=' operator weist den Wert direkt zu // der '=:' operator erwartet ein EO-Feld als ersten Operanden // und laesst das Ergebnis passend zum Attribut // formatieren // (Texte werden auf Attributlaenge gekuerzt, numerische // Werte werden laut Kommastellenangaben gerundet.) // %name,op,op1,... wie obiger Befehl; das Ergebnis wird mit // takeValue:ForKey:name // an Datasource zurueckgegeben // special op: // spf,formatstring,variablen... // nur %@ und %...i als platzhalter // lookup,lookupTableName,rowKey,colKey // lookupBegin op1 // eine lookup-Tabelle namens op1 definieren // lookupEnd // matrixBegin op1 // eine matrix namens op1 definieren // zugriff mit $a,oai,$op1,x // matrixEnd //IntarS getNV,nvName,nvKey //IntarS in NamedValues nachschlagen, eindimens. lookup //IntarS getNVL,nvName,nvKey,lang //IntarS in den NamedValues der Language nachschlagen, //IntarS eindimens. lookup // a,... append String(s) bzw. addObject(s) (in Array) // oder addEntries (in Dict) // au,... addUniq (in Array) // ah,... addHex (an MutableData; jew. ein Byte in Hex-notation;) // ss,string,von,laenge // Substring aus string von, // laenge; laenge=e -> bis ende; // anfang bei 0 // find,string,suchstring,{start,option} // suchstring in string ab Position start suchen; // liefert position innerhalb string // oder -1 falls nicht gefunden; // option: re = regular Expr., // ci = case insensitive // newEO,entityName erzeugt neues EO // newArray,count erzeugt neues MutableArray // newArrayE,op1... erzeugt neues MutableArray aus den aufgezaehlten Elementen // newDict,count erzeugt neues MutableDictionary // newData,count erzeugt neues MutableData // newString,count erzeugt einen MutableString // count,o // liefert die Anzahl Elemente im Array // oder Dictionary bzw. laenge eines Strings // oai,Array,index // liefert das Objekt am Index in Array // ofk,Dict,key // liefert das Objekt fuer den key aus Dictionary // allk,Dict liefert allKeys des Dictionary // allv,Dict liefert allValues des Dictionary // css,string,Separator // liefert ein Array als Ergebnis von // componentsSeparatedByString // cjs,array,Joinstring // liefert einen String als Ergebnis von // componentsJoinedByString // description,o liefert die Description des Objekts o // modul,modulName liefert das Modul namens modulName // swcof,filename stringWithContentsOfFile // attributes,filename // liefert die file-attributes als dictionary // NSFileSize NSFileModificationDate NSFileType // class,className NSClassFromString // nowFormat,format [[NSCalendarDate date]descriptionWithCalendarFormat:format] // DB Zusweisungs-Befehle // ====================== // soaFrom,op1,... // macht sortorder Array; // op1... sind die feldnamen mit angehaengtem... // if([sm iE:@"d"]){ // sel=EOCompareDescending; // }else if([sm iE:@"a"]){ // sel=EOCompareAscending; // }else if([sm iE:@"an"]){ // sel=@selector(compareNumeric:); // }else if([sm iE:@"n"]){ // sel=@selector(compareNumeric:); // sel=EOCompareAscending; // }else if([sm iE:@"dn"]){ // sel=@selector(compareNumericD:); // } // q,qualifierformat // macht qualifier mit qualifierformat // sqlq,qualifierformat // macht sqlqualifier mit qualifierformat // qand,array macht einen and-qualifier // qor,array macht einen or-qualifier // setFetchCond,qualifier,entityName,soa,handle // liefert J oder N; // nextMDForHandle,handle // liefert das MD bzw. nil, wenn nix mehr da // nextEOForHandle,handle // liefert das EO bzw. nil, wenn nix mehr da // getEOPkValue,entityName,pkValue // getEOsQ,entityName,Qualifier Array of EOs // getEOsQf,entityName,Qualifierformat Array of EOs // getEOQ,entityName,Qualifier einzelnes EO // getEOQf,entityName,Qualifierformat einzelnes EO // getEOsQSoa,entityName,Qualifier,sortorderArray // singleValueSQL,sql // macht getSingleValueAsResultFrom:sql // singleRecordSQL,sql // macht getDictAsResultFrom:sql // arraySQL,sql // macht getArrayAsResultFrom:sql, // liefert ein array of dictionaries // arraySQLs,sql // macht getArrayAsResultFrom:sql, // liefert ein array of strings; // DB Operationen // ============== // sql op1 fuehrt das SQL Kommando in op1 aus; // updat_eo eo // delet_eo eo // insrt_eo eo // dbnr i Datenbanknr auf i setzen; gilt fuer alle folgenden Operationen; // 0 setzt auf normale DB des Mandanten; // // Foundation // ========== // roai Array,index removed das Objekt am Index in Array // ioai Array,index,o inserted das Objekt o am Index in Array // sort Array,soa sortiert Array mittels sortorderarray soa // rao Coll removed alle Objekte aus Array oder Dictionary // rofk Dict,key removed das Objekt fuer den key aus Dictionary // braucht man nicht: sofk Dict,o,key setObject:o forKey:key // geht mit $Dict.key,=,o // ps target,selector.. performSelector: (withObject:) // wenn eine void-Methode des Target aufgerufen wird // allgemeine bridge zu ObjC // system op1 Systemcommando ausfuehren // ps target,selector... performSelector: (withObject:) (withObject:) // psr target,selector... performSelector: (withObject:) (withObject:) // mit Returnwert // $_lastMethodReturnValue // $_rv Synonym fuer $_lastMethodReturnValue // 'nil' als parameter erkannt: // psr $r,selector:,nil // invk target,selector... allgemeine bridge zu ObjC; // liefert den Returnwert der Methode // in $_lastMethodReturnValue; kann fuer methoden // mit skalaren und floating-point // parameter und returnwerte verwendet werden. // Hat jedoch mehr overhead als ps/psr. // 'nil' als parameter erkannt: // invk $r,selector:,nil // lang op1 script-Sprache abweichend von User-Sprache setzen; z.B. fuer Druck ausl. Kunden // wirkt sich auf aus // wtf op1,path,enc Schreibt den String op1 in die Datei path mit encoding (z.B. CP1252) // // Business-Logik // ============== // suchexternal modul,q fuehrt Suchexternal mit Qualifier q aus // fieldOn op,... enabled die Felder op,.... in datasource, wenn sonst nichts dagegen spricht // fieldOff op,... disabled die Felder op,... // markError op,... setzt die Felder op,... auf Status "Fehler" // allFieldsOn alle Felder aufmachen, wenn sonst nichts dagegen spricht // allFieldsOff alle Felder zumachen // fieldInvisible op,... Felder verschwinden lassen // fieldVisible op,... Felder anzeigen // allFieldsVisible alle Felder sichtbar, wenn sonst nichts dagegen spricht // createButton on|off // deleteButton on|off // duplicateButton on|off // // Drucken // ======= // pages n setzt max. Anzahl seiten, bevor Druck abbricht; // default 1000 // newPage neue Seite; mind. 1 mal erforderlich; // default DinA 4 hoch // newPageQuer DIN A 4 quer // newPageA5Quer DIN A 5 quer // newPageWH 2100,1300 frei definierbare Seite, z.B. f. Umschlaege, Etiketten // scale op1 Skalierung festlegen; 1 = 1mm, 10 = 1/10 mm // wirkt auf alle folgenden Koordinaten und Abmessungen // o op1,op2 offset; Koordinatensystem verschieben; kumulativ // f op1[,op2] Font[,Size] // s op1 font-size // lc op1 line color in sw // lcrgb op1,op2,op3 line color in rgb 0...100 // lc255 op1,op2,op3 line color in rgb 0...255 // lw op1 line width // lsn linesytle normal (durchgezogen) // ub underline begin // ue underline end // ls x1,x2 linestyle gestrichelt: x1 durchgezogen, x2 luecke // fc op1 fill color in sw // fcrgb op1,op2,op3 fill color in rgb 0...100 // fc255 op1,op2,op3 fill color in rgb 0...255 // rf x,y,w,h rahmen filled // rl x,y,w,h rahmen leer // kf x,y,r kreis filled; mittelpunkt, Radius // kl x,y,r kreis leer; mittelpunkt, Radius // l x,y,o,l Linie; o = {x,y} -> waagrecht/senkrecht; l = laenge // wenn x = 'a' -> append mode // lvb x1,y1,x2,y2 2 pt. verbinden; mit current lineWidth u. grayStroke // v x,y,o,op1,... Value; o = {l,r,c,dxxx} -> links/rechtsbuendig/center/drehung; // op1,... werden mit space verknuepft; // dxxx = Drehung um xxx Grad; impliziert linksbuendig; // wenn x = 'a' -> append mode // center nur in Aprica; // vc x,y,o,op1,... v compact, wie v, aber ohne space zwischen den // aufgezaehlten operanden // vw x,y,o,w,op1,... v width, wie v, aber zusaetzlich Maximalbreite w // als weiterer Parameter // b x,y,w,1,o,op1,... box, die mit Fliesstext gefuellt wird; o = {l,r,b}; // b = blocksatz; op1..n werden mit space verkuepft; // bf x,y,w,1,o Folgebox; druckt das, was in vorherige Box nicht // reingepasst hat. der fruehere h-Parameter ist // moeglichst mit "1" anzugeben // Fliesstext kann Inline-Kommandos "f " und "s " zur Formatierung beinhalten. // Die Kommandos muessen in einer Zeile fuer sich stehen. // .inline f Helvetica-Bold // .inline s 12 // g x,y,w,op1 Grafik; im jpeg-Format; wird proportional auf Breite w // skaliert; op1 = abs. Pfad wenn mit / beginndend, sonst // Bildname relativ zum PDF-Image Path // y ist untere Kante // gh x,y,h,op1 Grafik; im jpeg-Format; wird proportional auf Hoehe h // skaliert, sonst wie g-Kommando // render PDF selbst rendern u. in file schreiben; // Application rendert dann nicht mehr // dont_render Application davon abhalten, das pdf rendern zu wollen // %application.currentPDFEmpfaenger,%application.currentPDFVorgang fuellen, falls Druck archiviert werden soll; // es wird dann ein document erzeugt und em Empfaenger zugeordnet; // // Export // ====== // v op1,... einfach ausgeben; // vs op1,... jeweils fieldSeparator dazwischen und in den Werten // diesen escapen // vf value,length,pad,align // vx op1,name xml tag mit name um op1 generieren; in op1 <,>,& escapen; // ec op1 escape Character festlegen f. field- u. row-Separator; // escape character wird mit sich selbst escaped; // fs op1 fieldseparator festlegen // rs op1 rowSeparator festlegen // rscr rowSeparator carriage return festlegen // rsn rowSeparator newline festlegen // flush synchronize file // close close file // ers row Separator ausgeben // efs field Separator ausgeben // ot tag open tag, einruecken // closet close most recent tag // enc encoding (siehe IntarS.h für legale Werte) // // Programmfluss: // ============== // import op1 anderes Script an dieser Stelle importieren; // debug, nodebug debugging ein/aus; im debugmodus wird jedes // statement gelogged; // log op1 Operand op1 loggen // logi op1 Operand op1 an Oberflaeche als Meldung ausgeben // if op1,op,op2 Bedingte Ausf.; // op = {eq,ne,==,!=,>,<,>=,<=,FILLED,!FILLED, // exists,contains,like,prefix,suffix,in}; // eq,ne -> string-Vergleich, sonst double // wenn !FILLED(op2) wird bei !FILLED(op1) auf // Gleichheit erkannt; // " " == "" == nil == EONull // FILLED testet jedes Objekt egal welcher Klasse // auf gefuellt; // op2 ist dummy, kann leer bleiben // exists testet, ob es ein File namens op1 gibt // contains testet ob op1 (array/set) den op2 enthaelt // like macht einen Vergleich mit WildCards: * und ? // prefix, suffix testet, ob op1 den pre/suffix op2 hat // ! bedeutet generell negieren; // 'in' akzeptiert ein array von werten statt op2 // else else // endif ende des letzten offenen if-blocks // while op1,op,op2 while-Schleife; argumente wie bei if // continue zum while-Statement springen // break while-Schleife abbrechen; // endwhile ende der letzten offenen while-Schleife // foreach op1,op2[,op3] Iterator; op1=Name of current Objekt, op2=Array, op3=Name optionaler Index; // endfor ende der letzten offenen foreach Schleife // continuefor zum endfor springen // breakfor hinter das endfor springen; // end Programmende; optional // gosub op1 Unterprogramm aufrufen // sub name Beginn Unterprogramm // endsub Ende Unterprogramm // return Unterprogramm verlassen; optional // execute op1 // anderes Script namens op1 aufrufen; // gleiches parmdict, gleicher datasource; // evt. Ergebnis in $scriptRC, varDict in $_lastMethodReturnValue // executeString op1 op2 // anderes Script, das in op2 liegt, mit Name op1 aufrufen; // gleiches parmdict, gleicher datasource; // evt. Ergebnis in $scriptRC, varDict in $_lastMethodReturnValue // autorelease localPool zwischendurch releasen und neu instantiieren; // dies passiert sonst nach jeweils 3000 verarbeiteten Statements automatisch; // // // Dialogverarbeitung // ================== // experimentell; geht vorerst nur mit top-level scripts; // diaConfirm op1 gibt op1 in einer Alertbox aus und verlangt Bestaetigung/Ablehnung; // Ergebnis in $_rv; J = bestaetigt; N = abgelehnt; // op1 kann auch ein komplexes html sein; // diaAlert op1 gibt eine Alertbox aus mit Nachricht op1, die nur bestaetigt werden kann; // // Obsolet // ======= // Autodruck, Autoexport, AutoAction: //Syntax des Namens: $modulname/A_{1,n,a}{e,s}{l,s}Name //1 = einzelnes EO, n = mehrere EOs, a = immer //e = Editierberecht.; s = sichtbar //l = long; s = short; nur bei Druck und Action; erklaerung liefert, falls als erste Zeile vorhanden die Hilfe/Doku fuer die Funktion // Environment // =========== // folgende Variablen werden schon vorab vom System gesetzt: // $_user angemeldeter Benuzter // $_actionName zuletzt aufgerufene Action bei Attribute-Buttons // %session.ueo User-EO; ... .vorname .nachname // %application.currentPDFVorgang // weiterer Teil in Filenamen fuer PDF-Archiv; optional // $_app Applikationsname // $_path kompletter Pfad, wo das export/druck-file // hingeschrieben wird // $_path_back_slash ditto mit backslashes // $_name Name des Exports ohne extension // $_fn_ext Filename u. extension des pdf oder export-Files // $_url URL des erzeugten Files // $_ts timestamp // $_date lesbar formatiertes Datum // $_datetime lesbar formatiertes Datum mit Uhrzeit // $_datetimeNum Datum mit Uhrzeit numerisch, getrennt durch _ // $_globalCfgPath, $_GLOBALCONFIGPATH $NEXT_ROOT/Local/Library/$Appname // $_mandantPath, $_MANDANTPATH MANDANTPATH // $_ALLINSTANCESDIR // $_INSTANCETEMPDIR // $_time Uhrzeit HH:MM // $_mm Monat // $_dd Tag // $_yy Jahr // $_yyyy Jahrhundertjahr // $_today Datum im dbFormat // $_lastMethodReturnValue // %application.mandant die Mandanten-nr. ohne _K_ // rueckgabewert des letzen methodenaufrufs und des // expression-scripts von attributen // %datasource Datasource, i.a. das modul; wenn man direkt methoden // des moduls aufrufen will // $_myFM Filemanager // $_lastFont der zuletzt gesetzte Font // $_lastSize Groesse des zuletzt verwendeten Font // $_defines Defines von diversen Werten die in IntarS.h gesetzt sind. // %application.myDD // // folgende Variablen werden nach dem Export vom System ausgewertet: // $scriptRC wenn "N" geliefert wird, wird dies als Ablehnung // durch das Event-Script gewertet // _afos,_fatext,_stuelipos fuer Variantenaufloesung // im resultDict, das vom Script zurueckgegeben wird, // sind alle Variablen enthalten // Namenskonventionen ================== Parameter, die uebers parmdict geschleust werden: p_... Environment, Systemvariablen: _... lokale Variablen in subroutines: l_... Konstanten ========== \n newLine "\n newLine \t tab "\t tab \r\n windows cr lf "\r\n windows cr lf MySQL Funktionen ================ CSV-Export mit mySQL $sql,=,"SELECT _dieFelder_ INTO outfile '_dasZielInclPfadUndEndung_' FIELDS TERMINATED BY ';' ENCLOSED BY '"' LINES TERMINATED BY '\r\n' FROM _dieTabelle_ $dummy,arraySQL,$sql Falls das UTF8 stört uns man Unix hat: system iconv -c -f utf8 -t CP1252 _dasZielInclPfadUndEndung_ > _dasZielInclPfadUndEndungInCP1252_ Datumsberechnungen mit MySQL Funktionen: // 6 Monate auf heute-Datum addieren: $sql,=,"select DATE_ADD(CURRENT_DATE,INTERVAL 6 MONTH) $s,singleValueSQL,$sql // 6 Tage vor dem creation date des selObj: $d,=,%selObj.cdate $sql,=,"select DATE_SUB(%@,INTERVAL 6 DAY) $sql,spf,$sql,$d $s,singleValueSQL,$sql // Datums-Differenz $sql,=,"select TO_DAYS(date1) - TO_DAYS(date2) $s,singleValueSQL,$sql // Zeit-Differenz $sql,=,"select TIME_TO_SEC(time1) - TIME_TO_SEC(time2) $s,singleValueSQL,$sql $s,=,$s / 3600 // Datumsbestandteile: YEAR(date) MONTH(date) DAYOFMONTH(date) WEEK(date,1) Kalenderwoche mit Montag als erstem Tag der Woche WEEKDAY(date) Wochentag: 0=Montag // weitere interessante MySQL Funktionen: SOUNDEX(str) Aussprache MD5(str) Pruefsumme PASSWORD(str) Passwortverschluesselung LAST_INSERT_ID([expr]) der letzte vergebene auto-Increment Wert ENCODE(str,pass_str) str mit pass_str verschluesseln DECODE(crypt_str,pass_str) Gegenpart zu ENCODE() CURRENT_TIME liefert Uhrzeit als HH:MM:SS CURRENT_DATE aktuelles Datum ////////////////////////////////////////// // Beispiele %bla ds nach "bla" fragen %*.bla currentSelObj nach "bla" fragen %currentPos.artikelnr.bla den Wert bla des Artikels der currentposition; %currentPos.artikelnr.fasel.*bez die Bezeichnung des Wertes fasel des Artikels der currentposition; fasel muss nv oder relation sein %application.today von der WOApp today erfragen und fuer gui formatieren (%*.kundennr.vertreter.provision * %currentPos.preis) / 100 den Provisionswert der momentanen Position ////////////////////////////////////////// // CR, LF raus $s,=,$s.stringByDeletingCarraigeReturnCtrlO ////////////////////////////////////////// // der Filemanager psr $_myFM,directoryContentsAtPath:,$path $a,=,$_lastMethodReturnValue ////////////////////////////////////////// // string in File schreiben // UTF-8 kodiert ps $s,writeToFile:,C:/temp/alles.rtf // kodiert mit preferred encoding ps $s,writeToFilePE:,C:/temp/alles.rtf ////////////////////////////////////////// // array in File schreiben // array anlegen; 10 ist schaetzwert fuer erwartete groesse $ma,newArray,10 // array fuellen mit strings $j,=,10 $i,=,0 while $i,<,$j $s,spf,'Eintrag Nr. %i,$i $ma,a,$s $i,+,1 endwhile // array eintraege in einen string zusammenfueren, verkuepft mit newline $s,cjs,$ma,\n // string wegschreiben // writeToFile: ist eine Methode von NSString ps $s,writeToFile:,'C:/temp/bspWriteToFile.txt ////////////////////////////////////////// // externe Anwendung starten, asynchron $cmd,=,"open c:/windows/notepad.exe system $cmd ////////////////////////////////////////// // Modul besorgen $e,modul,ArtikelstammV if $e,!FILLED, logi "keine Berechtigung f. ArtikelstammV end endif ////////////////////////////////////////// // Qualifier mit Qualifierformat erzeugen $qf,=,"artikel = '%@' and auftragsart = '01' and komplett = 'N' and storno = 'N' and aendern = 'N' and (bestellmenge - gebuchtemenge) > (mengebest + mengeres) $qf,spf,$qf,$eo.artikel $q,sqlq,$qf ////////////////////////////////////////// // Klassenmethode $q,class,EOQualifier psr $q,orQualiFromArray:forDbName:,$ta,artikel ////////////////////////////////////////// // ein Modul suchen lassen suchexternal $e,$_lastMethodReturnValue ////////////////////////////////////////// // Anzeige neu aufbauen ps %datasource,neuSuchen ////////////////////////////////////////// // test, ob ein EO markiert $eo,=,%selObj if $eo,!FILLED, logi "bitte genau einen Satz auswaehlen end endif ////////////////////////////////////////// // Abfrageresultat ausgeben $sql,spf,'select sum(erwert_fc) from lagerbeweg where co_nr = '%@',%selObj.co_nr $sum,singleValueSQL,$sql $log,spf,'sum of container so far is %@ %@,$sum,%selObj.fc_erwert logi $log ////////////////////////////////////////// // anderes script aufrufen und parameter uebergeben %parmDict.p_eo,=,$xtcifc execute 'xtComm InterfaceE/_AuftragAnlegen ////////////////////////////////////////// // Module fernsteuern ps %datasource,undo ps %datasource,create if %notInsertingS,eq,J logi "could not create new transaction end endif if %selObj,!FILLED, logi "could not create new transaction end endif %selObj.bestellpos,=,$eo.primaryKey ps %datasource,newValue:identifier:,$eo.primaryKey,bestellpos execute Lagerbeweg21E/didTakeValues %selObj.komplett,=,J ps %datasource,save if %notInsertingS,eq,N logi "could not save end endif ////////////////////////////////////////// // Waehrungsrechnung psr %application,'srateForCur:date:,%selObj.fc_erwert,%selObj.d_fc_erwert if $_lastMethodReturnValue,==,0.0 $l_log,spf,' found no rate for %@ and date %@,%selObj.fc_erwert,%selObj.d_fc_erwert logi $l_log endif %selObj.erwert_rate,=,$_lastMethodReturnValue ////////////////////////////////////////// // Parameterfelder verwenden // container-Felder; kommen ueber's parmDict ins varDict; // Container-Felder zur Dokumentation in Buchungssatz schreiben %selObj.co_wert_fc,=,$p_co_wert_fc %selObj.co_tr_ineu,=,$p_co_tr_ineu %selObj.co_tr_exeu,=,$p_co_tr_exeu ////////////////////////////////////////// // ein typischer Reorg erklaerung setzt initial das neue Flag hatstueli $anz,singleValueSQL,'select count(*) from artikelstamm $log,spf,'starte Verarbeitung von %i artikelstaemmen,$anz log $log $soa,newArray,1 $q,q,"'1'='1' $jn,setFetchCond,$q,artikelstamm,$soa,1 if $jn,eq,J $eo,nextEOForHandle,1 while $eo,FILLED, //test, ob es eine stuelipos fuer den artikel gibt $sql,spf,'select masterkey from stueckliste where masterkey = '%@',$eo.artikel $s,singleValueSQL,$sql if $s,FILLED, $eo.hatstueli,=,J else $eo.hatstueli,=,N endif updat_eo $eo $i,+,1 $m,=,$i $m,m,1000 if $m,==,0 $log,spf,'%i verarbeitet von %i,$i,$anz log $log endif $eo,nextEOForHandle,1 endwhile endif $log,spf,'%i verarbeitet. Fertig.,$i log $log end ////////////////////////////////////////// // eine Inputschnittstelle // excel als csv speichern // dabei wertefelder unbeding im englishen format speichern, weil // openoffic zu bloed ist und ein comma reinmacht, ohne Feldtrenner erklaerung Import Inventurbestand $path,spf,'%@/inventur2005_18.csv,$_mandantPath $file,swcof,$path if $file,!FILLED, $log,spf,'Importfile %@ nicht gefunden,$path logi $log end endif $a,css,$file,\n $j,count,$a $i,=,0 while $i,<,$j $line,oai,$a,$i $a2,=,$line.csvFields $j1,count,$a2 if $j1,>=,8 $artikel,oai,$a2,0 $ib,oai,$a2,7 $sql,=,"update artikelstamm set invbest = '%@', datumlinv = '%@', invdiff = invbest - lagerbest, lagerbest = '%@' where artikel = '%@' $sql,spf,$sql,$ib,%application.today,$ib,$artikel $dummy,singleValueSQL,$sql endif $i,+,1 $m,=,$i $m,m,1000 if $m,==,0 $log,spf,'%i verarbeitet von %i,$i,$j log $log endif endwhile logi "Import beendet. end ////////////////////////////////////////// // lfd. Fortschritt $m,=,$i $m,m,1000 if $m,==,0 $log,spf,'%i verarbeitet,$i log $log endif ////////////////////////////////////////// // Autodruck Angebot, Auftrag etc. $soa,soaFrom,sortierfolge $qf,spf,'masterkey = '%@' and storno = 'N',%selObj.primaryKey $q,q,$qf $positionen,getEOsQSoa,auftragspos,$q,$soa $j,count,$positionen $posCount,=,0 while $posCount,<,$j $currentPosition,oai,$positionen,$posCount gosub checkSeitenUmbruch gosub printPosition $posCount,+,1 endwhile ////////////////////////////////////////// // fliesstext drucken mit fixedSpace Zeichensatz s $fts if %currentPosition.postext,FILLED, f Courier $textbreite,=,$betragSpalte - $bezSpalte b $bezSpalte,$ty,$textbreite,1,l,%currentPosition.postext while %application.hasRestString,eq,J $ty,+,$cr1 f Helvetica gosub checkSeitenUmbruch f Courier s $fts bf $bezSpalte,$ty,$textbreite,1,l endwhile $ty,+,$cr1 f Helvetica endif ////////////////////////////////////////// // Spaltendefinition $titles,=,"Kundennr,Firma,Umsatz,Zahlungseingang $cols,=,"100,400,1200,1600 $align,=,"l,l,r,r gosub spaltendefinition // arrays machen aus strings sub spaltendefinition $titles,css,$titles, $cols,css,$cols, $align,css,$align, endsub // Spaltenueberschriften $l_j,count,$titles $l_i,=,0 while $l_i,<,$l_j $l_title,oai,$titles,$l_i $l_col,oai,$cols,$l_i $l_align,oai,$align,$l_i v $l_col,$ty,$l_align,$l_title $l_i,+,1 endwhile // Spalten verwenden $l_i,+,1 $l_col,oai,$cols,$l_i $l_align,oai,$align,$l_i v $l_col,$ty,$l_align,$eo.firma ////////////////////////////////////////// // PDF Cacheing // den pfad eines evt. gecachten PDF bauen $siga,newArray,10 $s,spf,'%@/PDF_Archiv/ABC,$_mandantPath $siga,a,$s $siga,a,$p_roherl_a $siga,a,$p_proz_a $siga,a,$p_proz_b $siga,a,$p_andere_kz $siga,a,$p_vertreter $siga,a,$p_jahr $siga,a,$p_periode_v $siga,a,$p_periode_b $siga,a,'.pdf $signatur,cjs,$siga,_ // File-Attribute besorgen $atr,attributes,$signatur if $atr,FILLED, $date,=,$atr.NSFileModificationDate $s,ss,$date.description,0,10 $sql,spf,'select TO_DAYS(CURRENT_DATE) - TO_DAYS('%@'),$s $days,singleValueSQL,$sql if $days,<,$p_daysToCache //das zuletzt erzeugte PDF ist noch nicht zu alt //daher nehmen, nix rendern $sys,spf,'cp %@ %@,$signatur,$_path system $sys dont_render end endif endif // selber rendern, in cache kopieren, damit es das naechste mal gefunden wird render $sys,spf,'cp %@ %@,$_path,$signatur system $sys ////////////////////////////////////////// // in Export-Schnittstelle das File zum Download anbieten ... erzeugen flush // nach close kann file umbenannt werden close // das ergebnis per url anbieten // es liegt im %application.allInstancesDir // dieses ist in apache per alias erreichbar // .csv anhaengen, damit es autom. in excel geoeffnet werden kann $newName,=,$_path $newName,a,'.csv $newUrl,=,$_url $newUrl,a,'.csv $system,spf,'mv %@ %@,$_path,$newName system $system $anker,=,"erzeugtes File $anker,spf,$anker,$newUrl // p_erg_url ist ein non-DB Attribut vom Typ TVCPD; in lif angeben %parmDict.p_erg_url,=,$anker ////////////////////////////////////////// // SQL-Qualifier $wc,=,"auftrags_nr = '%@' and l_rechn_datum >= '%@-%@-01' and l_rechn_datum < ADDDATE('%@-%@-01', INTERVAL 1 MONTH) $wc,spf,$wc,%selObj.rechn_nr,%selObj.jahr,%selObj.periode,%selObj.jahr,%selObj.periode $q,sqlq,$wc ////////////////////////////////////////// // Zugriff auf mehrere Datenbanken; in Config Server, User, PW eintragen; dbnr 1 insrt_eo %selObj dbnr 0 ////////////////////////////////////////// // Font und Groesse bewahren b $rx,$ty,$fliesstextBreite,1,l,%anschreiben $ty,+,$cr while %application.hasRestString,eq,J $f,=,$_lastFont $ls,=,$_lastSize gosub checkSeitenUmbruch f $f s $ls bf $rx,$ty,$fliesstextBreite,1,l $ty,+,$cr endwhile ////////////////////////////////////////// // getNV // im NamedValues fusstypaufschlag|c|70 fusstypaufschlag|cm|70 fusstypaufschlag|r|50 fusstypaufschlag|yw|150 fusstypaufschlag|ya|150 // im script: $fta,getNV,fusstypaufschlag,Fusstyp $_preis,+,$fta ////////////////////////////////////////// // Zeichensatz fuer saemtliche Zeichen $font,=,Arial#20Unicode#20MS $fontb,=,"Arial#20Unicode#20MS,Bold f $font f $fontb ////////////////////////////////////////// // Verzweigung von Hand machen als Action if %selObj,!FILLED, logi "bitte genau einen Kunden auswaehlen end endif // Modul besorgen $e,modul,GeschpartnerE if $e,!FILLED, logi "keine Berechtigung f. Geschaeftspartner end endif $qf,=,"mastergeschp = '%@' $qf,spf,$qf,%selObj.pid $q,q,$qf suchexternal $e,$q end ////////////////////////////////////////// // Kopf/Positionen duplizieren erklaerung dupliziert das Angebot und zaehlt die Version in der Kopie um 1 hoch $eo,=,%selObj if $eo,!FILLED, logi "bitte genau ein Angebot auswaehlen end endif // vorherigen Abbruch aufrauemen: invk %application,unlockTables // aufbereitungsschema des key: 2050-8004-00-1 $s,=,$eo.primaryKey $s1,ss,$s,0,10 $s2,ss,$s,12,2 $sql,spf,'select max(version) from auftragskopf where auftragnr like '%@__%@' and auftragsart = '06',$s1,$s2 $v,singleValueSQL,$sql $v,+,1 psr $eo,eo_copy $newEO,=,$_lastMethodReturnValue if $newEO,!FILLED, logi "Erstellen neue Version fehlgeschlagen end endif // der neue Key: $s_new,spf,'%@%02i%@,$s1,$v,$s2 $newEO.auftragnr,=,$s_new // nicht nochmal selbst vergeben $newEO.version,=,$v $newEO.values.no_auto_key,=,J insrt_eo $newEO // positionen noch kopieren $qf,spf,'masterkey = '%@',$s $q,q,$qf $a,getEOsQ,auftragspos,$q $i,=,0 $j,count,$a $i,=,0 while $i,<,$j $pos,oai,$a,$i psr $pos,eo_copy $newEO,=,$_lastMethodReturnValue if $newEO,!FILLED, continue endif $newEO.masterkey,=,$s_new insrt_eo $newEO $i,+,1 endwhile // Anzeige neu aufbauen ps %datasource,neuSuchen ////////////////////////////////////////// // lookup definieren lookupBegin Basispreis typ_u_m Preis Preis2 D1 2363.00 2400.00 D2 2237.00 2450.00 D3 2237.00 2460.00 D4 2432.00 2480.00 lookupEnd ////////////////////////////////////////// // feld- und button-Steuerung invk %datasource,setCreate_ButtonIsDisabled:,J invk %datasource,setDuplicate_ButtonIsDisabled:,J invk %datasource,setDelete_ButtonIsDisabled:,J $asso,=,%fassosByName.frage if $asso,FILLED, invk $asso,setIsProtectedPba:,J endif ////////////////////////////////////////// // Valuelist umsteuern // die PBWOAsso zum Feld holen: $asso,=,%fassosByName.vfelder01 if $asso,FILLED, // alle Eintraege der VL holen; das sind EOs nvpbase bzw. nvpmandant invk %application,allPBNVForName:,$asso.vlName $l_nvs,=,$_rv $l_ma,newArray,10 $l_i,=,0 $l_j,count,$l_nvs // array durchgehen und nur die nehmen, die man will while $l_i,<,$l_j $l_nv,oai,$l_nvs,$l_i if $l_nv.nvvalue,eq,was_weiss_ich // nur die eintraege nehmen, die man will $l_ma,a,$l_nv endif $l_i,+,1 endwhile // eigenen zusaetzlichen eintrag machen $l_nv,newEO,nvpmandant $l_nv.nvvalue,=,bla $l_nv.nvbez,=,'das ist bla $l_ma,a,$l_nv // der PBWOAsso die neue liste setzen invk $asso,setVl:,$l_ma.nvvalue endif ////////////////////////////////////////// // Test auf Feldaenderungen, auch nach Update if %selObj.changedValues.mengebez,FILLED, // Actions ein/ausblenden invk %datasource,hideActionNamed:,zahlungseingangKpl invk %datasource,showActionNamed:,zahlungseingangKpl ////////////////////////////////////////// erklaerung Prueft Kto.Nr. aufgrund BLZ und ermittelt Institut zur BLZ if %selObj,!FILLED, logi "bitte genau 1 Satz auswaehlen end endif if %selObj.blz,!FILLED, logi "BLZ nicht gefuellt end endif if %selObj.ktonr,!FILLED, logi "ktonr nicht gefuellt end endif invk %selObj.blz,length if $_lastMethodReturnValue,!=,8 logi "BLZ nicht 8-stellig end endif psr %application,institutFuerBlz4:,%selObj.blz %selObj.bank,=,$_lastMethodReturnValue if %selObj.bank,!FILLED, logi "falsche BLZ end endif invk %application,isValidKtonr:forBLZ:,%selObj.ktonr,%selObj.blz if $_lastMethodReturnValue,eq,N logi "falsche KtoNr else logi "KtoNr stimmt endif