Syntax IntarScript 5.1: // 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; wird nur fuer Event-Scripts genommen; nicht bei Button-Scripts Operanden ========= Operanden sind Parameter von IntarScript Befehlen. Es gibt Zuweisungs- und Verarbeitungsbefehle. Operanden werden durch kommata getrennt Kommata in Operanden daher mit escapen Operanden werden vom Parser an spaces in expressions und operatoren aufgebrochen Wert eines Operanden wird so ermittelt: operand: [formatting]expr formatting: , , , , , , auf NN Zeichen kuerzen, ,,,, , Jahr zweistellig Jahr vierstellig year/week -> Monat 2-stellig -> Monat Abkürzung weekOfYear uppercase, lowercase rechtsbündig, Moneyformat, auf Laenge NN mit Spaces gefüllt rechtsbündig, string, auf Laenge NN mit Spaces gefüllt linksbündig, string, auf Laenge NN mit Spaces gefüllt uebersetzen; sprache wird mit lang op1 festgelegt ' Begriff bis zum nächsten Komma wörtlich nehmen " Begriff bis zum Zeilenende wörtlich format-Prefixe sind 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 globale Variable (scope ist ganzes Script) $l_... eigene lokale Variable (scope ist Subroutine) %... Variable aus Datasource sonst (nix): Konstante; wird durch "," ersetzt exprVal: name[.keys] keys: key[.key] bei EOs werden Relationen verfolgt; bei allen anderen Objekten wird mit valueForKey der keyPath abgearbeitet key: [$]name[$name]... mit "$" werden interne Variable referenziert, aus deren Werten der eigentliche key zusammengesetzt wird z.B. prefix$a$b$suffix name: plain string dataOption: {.*bez,.*eo} .*bez -> Bezeichnung bei valueForKey .*eo -> liefert EO statt des foreign Keys, falls letztes Keypath-Element eine Relation ist; Zuweisungs-Befehle: =================== ziel,operator,op1,... operator = {=,=:,+,-,*,/,m} oder special op (s. unten); ziel ist eine Variable in Syntax eines Operanden ohne formatting und dataOption 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.) 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 cat,... concatenate Operanden zu einem String 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 newFile,filename erzeugt neue NSFileHandle 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] d+,amount,interval addiert auf Ziel die Anzahl amount von interval auf interval = {y,m,d,w,wd,H,M,S} w=week, wd=workday d-,amount,interval zieht von Ziel die Anzahl amount von interval ab dd,nd_1,nd_2 liefert als Ergebnis die Differenz nd_1 - nd_2 in Sekunden nd_1 und nd_2 muessen Format normalizedDate haben; DB Zusweisungs-Befehle ====================== soaFrom,op1,... macht sortorder Array; op1... sind die feldnamen mit angehaengtem... :d descending :a ascending :an ascending numerisch :dn descending numerisch q,qualifierformat macht sqlqualifier mit qualifierformat sqlq,qualifierformat macht sqlqualifier mit qualifierformat qand,array macht einen and-qualifier qor,array macht einen or-qualifier allq macht einen all-qualifier nothingq macht einen nothing-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; Verarbeitungsbefehle ==================== 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 system op1 Systemcommando ausfuehren invk target,selector... allgemeine bridge zu ObjC; liefert den Returnwert der Methode in $_rv; '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,f,enc Schreibt den String op1 in die Datei oder Filehandle f mit encoding (z.B. CP1252); default ist UTF8 Business-Logik ============== suchexternal modul,q fuehrt Suchexternal mit Qualifier q aus fieldOn op,... enabled die Felder op,.... in datasource 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; mit Wildcard '*' fieldVisible op,... Felder anzeigen; mit Wildcard '*' allFieldsVisible alle Felder sichtbar, wenn sonst nichts dagegen spricht createButton on|off deleteButton on|off duplicateButton on|off registerInvisible op,... Register verschwinden lassen registerVisible wieder alle Register anzeigen optionStd optionAdd optionRem say clear scratchpad löschen say x,y,{l,r},value,... value(s) an x,y in scratchpad schreiben sayw x,y,{l,r},w,value,... value(s) an x,y in breite w in scratchpad schreiben Drucken ======= 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 lc# op1 line color in hex rrggbb 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 fc# op1 fill color in hex rrggbb 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 ? ... Druck im lineprinter Modus ?b ... Druck bold im lineprinter Modus [varDict setObject:@"0" forKey:@"?line"]; [varDict setObject:@"10" forKey:@"?size"]; [varDict setObject:@"100" forKey:@"?leftMargin"]; [varDict setObject:@"120" forKey:@"?topMargin"]; [varDict setObject:@"40" forKey:@"?cr"]; [varDict setObject:@"Courier" forKey:@"?font"]; 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 dem Empfaenger zugeordnet; 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 FILLEDNUM testet zusätzlich auf != 0 exists testet, ob es ein File namens op1 gibt contains testet ob op1 (NSString/NSDictionary/NSArray/NSSet) einen der Operanden enthält; ist ein Operand ein Array, wird sein Inhalt getestet; 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; module, die vor dia... Befehlen mit "modul" geholt wurden, sind danach nicht mehr verfügbar!! Daher im Bedarfsfall Module erst danach holen; 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; 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 $_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 %application.myDD folgende Variablen werden nach der Ausführung vom System ausgewertet: $scriptRC wenn "N" geliefert wird, wird dies als Ablehnung durch das Event-Script gewertet im resultDict, das vom Script zurueckgegeben wird, sind alle Variablen enthalten Namenskonventionen ================== Environment, Systemvariablen: _... a,a1 Array allgemein ma Mutable Array md Mutable Dictionary s String allgemein i,j Integer allgemein d Dictionary eo EO k Key p_ Parameter allgemein q Qualifier qf Qualifierformat ..f Formatstring allgemein sql Sql Befehl v Value bu_... Button po_... Portlet 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 // ====================================================================== // CR, LF raus $s,=,$s.stringByDeletingCarraigeReturnCtrlO // der Filemanager invk $_myFM,directoryContentsAtPath:,$path $a,=,$_rv // string in File schreiben // UTF-8 kodiert wtf $s,C:/temp/alles.rtf // kodiert mit preferred encoding invk $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 wtf $s,'C:/temp/bspWriteToFile.txt // Modul besorgen $e,modul,vid_lager if $e,!FILLED, logi "keine Berechtigung f. Artikelstamm 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 // oder: $q,q,$qf // Klassenmethode $q,class,EOQualifier invk $q,orQualiFromArray:forDbName:,$ta,artikel // ein Modul suchen lassen suchexternal $e,$_lastMethodReturnValue // Anzeige neu aufbauen invk %datasource,neuSuchen // test, ob ein EO ausgewaehlt ist $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 invk %datasource,undo invk %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 invk %datasource,newValue:identifier:,$eo.primaryKey,bestellpos execute Lagerbeweg21E/didTakeValues %selObj.komplett,=,J invk %datasource,save if %notInsertingS,eq,N logi "could not save end endif // Waehrungsrechnung invk %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 %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 $anz,singleValueSQL,'select count(*) from vid_lager $log,spf,'starte Verarbeitung von %i artikelstaemmen,$anz log $log $soa,newArray,1 $q,q,"'1'='1' $jn,setFetchCond,$q,vid_lager,$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 vid_stueli where masterkey = '%@',$eo.artikelnum $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 $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 $i,=,0 foreach line,$a $a2,=,$line.csvFields $j1,count,$a2 if $j1,>=,8 $artikel,oai,$a2,0 $ib,oai,$a2,7 $sql,=,"update vid_lager set invbest = '%@', datumlinv = '%@', invdiff = invbest - lagerbest, lagerbest = '%@' where artikelnum = '%@' $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 // fliesstext drucken mit fixedSpace Zeichensatz f Courier,10 $textbreite,=,$betragSpalte - $bezSpalte b $bezSpalte,$ty,$textbreite,1,l,$currentPosition.postext while %application.hasRestString,eq,J $ty,+,$cr gosub checkSeitenUmbruch f Courier,10 bf $bezSpalte,$ty,$textbreite,1,l endwhile // Spaltendefinition $titles,newArrayE,Kundennr,Firma,Umsatz,Zahlungseingang $cols,newArrayE,100,400,1200,1600 $align,newArrayE,l,l,r,r // 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 // 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 // oder: $q,q,$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,$ls bf $rx,$ty,$fliesstextBreite,1,l $ty,+,$cr endwhile // Zeichensatz fuer saemtliche Zeichen $font,=,Arial#20Unicode#20MS $fontb,=,"Arial#20Unicode#20MS,Bold f $font f $fontb // abhaengig von Gruppe Editierberechtigung setzen/wegnehmen if %session.isRoot,==,0 invk %datasource,setHasEditierBerecht:,N if %session.isGruppe0,!=,0 // editieren erlauben invk %datasource,setHasEditierBerecht:,J end endif if %session.isGruppe1,!=,0 // editieren erlauben invk %datasource,setHasEditierBerecht:,J end endif // ... usw. endif // Register-Berechtigungen // Matrix der Register-Berechtigungen // Registername Gruppe/Flag // jew. hoechste Berechtigung des Benutzers f. 1 Register ermitteln // X = volle Berechtigung // P = sehen // - = Register weg // nicht aufgefuehrte Register haben volle Berechtigung // Gruppen: // 0 Konstruktion // 1 Einkauf // 2 Vertrieb // 3 Lager // 4 Dispo // 5 Produktionsleitung // 6 Produktion // 7 Chef // 8 Controlling // 0 1 2 3 4 5 6 7 8 9 matrixBegin register Ident X P P P P P P X X - Bemerkung X X X X X X X X X X TULV X - X X X X X X X X VK-Preise X - X X X X X X X X Stuecklistenfunktionen X - - P - X P X - X Konstruktion X - X X X X X X X X Fertigung X - X X X X X X X X >Stueckliste X - X X X X X X X X >Einkauf X X - - P P - X P - matrixEnd // importieren in didBuildUp lookupBegin berecht_grad kz grad X 2 P 1 - 0 x 2 p 1 lookupEnd foreach rega,$register $j,=,$rega.count $i,=,1 // fuehrende Tabs ueberlesen while $i,<,$j $ber,oai,$rega,$i if $ber,FILLED, break endif $i,+,1 endwhile $gnr,=,0 // 0 = weg 1 = protected 2 = editing $max_ber,=,0 while $i,<,$j $ber,oai,$rega,$i $gname,spf,'gruppe%i,$gnr if %session.ueo.$gname,eq,J $ber,lookup,berecht_grad,$ber,grad if $ber,>,$max_ber $max_ber,=,$ber endif endif $gnr,+,1 $i,+,1 endwhile $regName,=,$rega.firstObject if $regName,prefix,'> // eine Untertabelle if $max_ber,==,0 $rega_ind,=,0 foreach action,%registerActions if $action.guiName,eq,$regName roai %registerActions,$rega_ind breakfor endif $rega_ind,+,1 endfor endif else // normales Register if $max_ber,==,0 // Register weg $rega_ind,=,0 foreach boxName,%boxNameArray if $boxName,eq,$regName roai %boxNameArray,$rega_ind breakfor endif $rega_ind,+,1 endfor else if $max_ber,==,1 // Felder im Register protected $assos,=,%boxDict.$regName foreach asso,$assos invk $asso,setIsProtectedPba:,J endfor endif endif endif endfor // Verzweigung von Hand machen als Action if %selObj,!FILLED, logi "bitte genau einen Kunden auswaehlen end endif // Modul besorgen $e,modul,vid_kunde if $e,!FILLED, logi "keine Berechtigung f. Kunden end endif $qf,=,"kundennumm = '%@' $qf,spf,$qf,%selObj.pid $q,q,$qf suchexternal $e,$q end // 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 // Test auf Feldaenderungen nach Update if %selObj.changedValues.mengebez,FILLED, // Konto/BLZ Pruefung 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