#import "Aprica.h"
// Aprica2
// copyright Pirmin Braun 1997-2007 - pirmin@pirmin.de
// all Rights reserved;
@implementation PBDDAttribute
ACCESSm(vlcontent, setVlcontent)
- (NSString *)doku0;{return doku0;}- (void)setDoku0:(NSString *)s;
{// wenn in Doku ein Alt-Key angegeben ist in Form von z.B. (Alt-s), diesen setzen;
NSRange r;
if(s==doku0)return;
[doku0 release];
doku0 = [s retain];
[self setAltKey:EON];
r = [s rangeOfString:@"(Alt-"];
if(r.length){ [self setAltKey:[[s substringFromIndex:r.location + r.length]secureSubstringToIndex:1]];
}
}
ACCESSm(altKey, setAltKey)
ACCESSm(expression, setExpression)
ACCESSm(guiName, setGuiName)
ACCESSClassmNR(myDD, setMyDD, PBDD)
ACCESSClassmNR(myTable, setMyTable, PBDDTable)
ACCESSm(isDescriS, setIsDescriS)
ACCESSm(isCombiSuchS, setIsCombiSuchS)
ACCESSm(dbName, setDbName)
ACCESSm(reference, setReference)
ACCESSm(suffix, setSuffix)
ACCESSm(refdTableName, setRefdTableName)
ACCESSm(targetModulName,setTargetModulName)
ACCESSm(initialValue, setInitialValue)
ACCESSm(custom, setCustom)
ACCESSm(doku1, setDoku1)
ACCESSm(guiName1, setGuiName1)
ACCESSm(gruppenstring, setGruppenstring)
ACCESSClassm(pbexpression, setPbexpression, PBExpression)
ACCESSm(scriptName, setScriptName)
- (NSString *)pid;
{ return [NSSWF @"%@-%@",[self masterkey],dbName];
}
- (NSString *)masterkey;
{ return [myTable dbName];
}
- (id)initWithCoder:(NSCoder *)coder;
{ if(!([self init]))return nil;
[self setMyDD: [coder decodeObject]];
[self setMyTable: [coder decodeObject]];
[coder decodeValueOfObjCType:@encode(BOOL) at:&isDB]; // Feld in Datenbank
[coder decodeValueOfObjCType:@encode(BOOL) at:&isProtected]; // geschuetzt
[coder decodeValueOfObjCType:@encode(BOOL) at:&isMandatory]; // pflicht
[coder decodeValueOfObjCType:@encode(BOOL) at:&isVisible]; //ob es an Oberflaeche erscheinen soll
[coder decodeValueOfObjCType:@encode(int) at:&keyTyp]; //Enum: N=None, P=Primary, U=Uniq; ;
[coder decodeValueOfObjCType:@encode(int) at:&dataTyp]; //Enum: char, money, int, float, date, bool
[coder decodeValueOfObjCType:@encode(int) at:&length]; //characters inkl. komma
[coder decodeValueOfObjCType:@encode(int) at:&targetTyp]; //selObj, tvc, tvc delegate, global asso value provider
[coder decodeValueOfObjCType:@encode(int) at:&nak]; //Nachkommastellen f. Formatierung; nur bei float;
[self setGuiName:[coder decodeObject]]; //UI Name
[self setGuiName1:[coder decodeObject]]; //UI Name NLS
[self setDbName:[coder decodeObject]]; //key fuer ...named-Methoden als Attr.
[self setSuffix:[coder decodeObject]]; //Suffix; wird wenn an einer Referenz angegeben, an deren Elemente weitergegeben
[self setReference:[coder decodeObject]]; //bei Verwendung gefuellt mit dbName einer abstract table;
[self setRefdTableName:[coder decodeObject]]; //relation
[self setTargetModulName:[coder decodeObject]]; //f. Lookup u. Verfolgung Link
[self setIsDescriS:[coder decodeObject]]; //0...9, J,N ; wird sortiert
[self setIsCombiSuchS:[coder decodeObject]]; //0...9, J,N ; wird sortiert
[self setDoku0:[coder decodeObject]]; //doku in Ursprungssprache
[self setDoku1:[coder decodeObject]]; //doku NLS
[self setExpression:[coder decodeObject]]; //wird ausgewertet, um anzeigewert zu beschaffen
[coder decodeValueOfObjCType:@encode(BOOL) at:&html]; //escapeHTML = NO;
[coder decodeValueOfObjCType:@encode(BOOL) at:&isDuplicate]; //teil der combi-Suche; Wert beim duplizieren mit kopieren
[coder decodeValueOfObjCType:@encode(BOOL) at:&alwaysOn];
[self setInitialValue:[coder decodeObject]]; //Initialisierungswert bei neuem EO
[self setVlcontent:[coder decodeObject]]; // neue VL-Werte mit Bezeichnung
[coder decodeValueOfObjCType:@encode(BOOL) at:&isRoot];
vl = [[coder decodeObject]retain];
[self setGruppenstring:[coder decodeObject]];
pbvloDict = [[coder decodeObject]retain];
return self;
}
- (void)encodeWithCoder:(NSCoder *)coder
{ [coder encodeObject:myDD];
[coder encodeObject:myTable];
[coder encodeValueOfObjCType:@encode(BOOL) at:&isDB];
[coder encodeValueOfObjCType:@encode(BOOL) at:&isProtected];
[coder encodeValueOfObjCType:@encode(BOOL) at:&isMandatory];
[coder encodeValueOfObjCType:@encode(BOOL) at:&isVisible];
[coder encodeValueOfObjCType:@encode(int) at:&keyTyp];
[coder encodeValueOfObjCType:@encode(int) at:&dataTyp];
[coder encodeValueOfObjCType:@encode(int) at:&length];
[coder encodeValueOfObjCType:@encode(int) at:&targetTyp];
[coder encodeValueOfObjCType:@encode(int) at:&nak];
[coder encodeObject:guiName];
[coder encodeObject:guiName1];
[coder encodeObject:dbName];
[coder encodeObject:suffix];
[coder encodeObject:reference];
[coder encodeObject:refdTableName];
[coder encodeObject:targetModulName];
[coder encodeObject:isDescriS];
[coder encodeObject:isCombiSuchS];
[coder encodeObject:doku0];
[coder encodeObject:doku1];
[coder encodeObject:expression];
[coder encodeValueOfObjCType:@encode(BOOL) at:&html];
[coder encodeValueOfObjCType:@encode(BOOL) at:&isDuplicate];
[coder encodeValueOfObjCType:@encode(BOOL) at:&alwaysOn];
[coder encodeObject:initialValue];
[coder encodeObject:vlcontent];
[coder encodeValueOfObjCType:@encode(BOOL) at:&isRoot];
[coder encodeObject:vl];
[coder encodeObject:gruppenstring];
[coder encodeObject:pbvloDict];
}
- (void)initIvars;
{// wird von table aufgerufen, um Model zu refreshen; im anschluss wird immer buildVLArrays aufgerufen
isDB = YES;
html = NO;
isProtected = NO;
alwaysOn = NO;
isMandatory = NO;
isVisible = YES;
isDuplicate = YES;
keyTyp = KT_NONE;
targetTyp = ATTVCSELOBJ;
dataTyp = DT_CHAR;
length = 10;
nak = 0;
[self setIsDescriS:SC_N];
[self setIsCombiSuchS:SC_N];
[self setGuiName:EON];
[self setGuiName1:EON];
[self setDoku0:EON];
[self setInitialValue:EON];
[self setVlcontent:EON];
[self setExpression:EON];
[self setDbName:SC_NewAttr];
[self setReference:EON];
[self setSuffix:EON];
[self setRefdTableName:EON];
[self setTargetModulName:EON];
[self setCustom:@"0"];
[self setGruppenstring:@"xxxxxxxxxx"]; // fuer alle Gruppen
}
- init;
{ if(!(self = [super init]))return nil;
pbvloDict = nil;
vl = nil;
[self initIvars];
return self;
}
- (NSString *)initValue;
{ switch(dataTyp){ case DT_CHAR:
return EON;
case DT_DATE:
return @"00000000";
case DT_DATETIME:
return @"00000000000000";
case DT_MONEY:
return @"0.00";
case DT_FLOAT:
return @"0.00";
case DT_INT:
return @"0";
case DT_BOOL:
return @"N";
}
return EON;
}
- (NSString *)dokuForLang:(int)lang;
{ if(!lang)return doku0;
if(FILLED(doku1))return doku1;
return doku0;
}
- (NSString *)guiNameTrans;
{ return [self guiNameForLang:[[_APP currentSession] lang]];
}
- (NSString *)guiNameForLang:(int)lang;
{ if(!lang)return guiName;
if(FILLED(guiName1))return guiName1;
return guiName;
}
- (NSMutableArray *)vl;{return vl;}- (void)dealloc
{ [pbexpression release];
[scriptName release];
[guiName release];
[dbName release];
[targetModulName release];
[altKey release];
[vl release];
[gruppenstring release];
[initialValue release];
[suffix release];
[custom release];
[doku0 release];
[expression release];
[reference release];
[refdTableName release];
[vlcontent release];
[isDescriS release];
[pbvloDict release];
[doku1 release];
[guiName1 release];
[super dealloc];
}
- (Application *)application;
{ return _APP;
}
+ (NSArray *)ivarNames;
{ static NSArray *a;
// die String-Accessormethoden;
if(!a){ a = [[NSArray arrayWithObjects:SC_dbName,SC_GuiName,@"keyTypS",@"dataTypS",@"targetTypS",@"nakS",@"reference",@"isDBS",@"isCombiSuchS",@"isProtectedS",@"isMandatoryS",@"isVisibleS",@"isDescriS",@"lengthS",@"refdTableName",@"targetModulName",@"doku0",@"expression",@"initialValue",@"isDuplicateS",@"suffix",@"doku1",@"guiName1",@"alwaysOnS",@"vlcontent",@"isHtmlS",@"isRootS",@"gruppenstring",nil]retain];
}
return a;
}
- (NSDictionary *)valuesForKeys:(NSArray *)a;
{ int i,j;
LMD;
for(i=0,j=[a count];i<j;i++){ NSString *k = [a oai:i];
NSObject *o = [self vfk:k];
if(o)[lmd setObject:o forKey:k];
}
return lmd;
}
- (NSMutableDictionary *)values;
{ return (id)[NSMutableDictionary dictionaryWithDictionary:[self valuesForKeys:[PBDDAttribute ivarNames]]];
}
/**/
- (NSString *)description;
{ [self validate];
return [[self valuesForKeys:[PBDDAttribute ivarNames]] description];
}
- (BOOL)isDB;{return isDB;}- (void)setIsDB:(BOOL)yn;{isDB = yn;}- (BOOL)alwaysOn;{ return alwaysOn;}- (void)setAlwaysOn:(BOOL)yn;{alwaysOn=yn;}- (BOOL)isDescri;{return (FILLED(isDescriS) && ![isDescriS iE:SC_N]);}- (BOOL)isProtected;{return isProtected;}- (void)setIsProtected:(BOOL)yn;{isProtected = yn;}- (BOOL)isMandatory;{return isMandatory && ![self isPK];}- (void)setIsMandatory:(BOOL)yn;{isMandatory = yn;}- (BOOL)isVisible;{return isVisible;}- (BOOL)isNotVisible;{return !isVisible;}- (void)setIsVisible:(BOOL)yn;{isVisible = yn;}- (BOOL)isDuplicate;{return isDuplicate;}- (void)setIsDuplicate:(BOOL)yn;{isDuplicate=yn;}- (int)keyTyp;{return keyTyp;}- (void)setKeyTyp:(int)value;{keyTyp = value;}- (int)dataTyp;{return dataTyp;}- (void)setDataTyp:(int)value;{dataTyp = value;}- (int)length;{return length;}- (void)setLength:(int)value;{length = value;}- (int)nak;{return nak;}- (void)setNak:(int)value;{nak = value;}- (int)targetTyp;{return targetTyp;}- (void)setTargetTyp:(int)value;{targetTyp = value;}- (int)inputLength; //f. wert in dbformat in val; vorzeichen zaehlt als Ziffer
{ switch(dataTyp){ case DT_CHAR: return length;
case DT_MONEY: return 16; //10 St. 3 tsd.punkte, dez.punkt, 2 nk
case DT_INT: return 8;
case DT_FLOAT: return length + 1; //f. Dezimalpunkt
case DT_DATE: return 8; //dbformat
case DT_BOOL: return 1;
case DT_DATETIME: return 14; //yyyymmddhhmmss
}
return 0;
}
- (BOOL)isRoot;{return isRoot;}- (void)setIsRoot:(BOOL)yn;{isRoot = yn;}- (BOOL)isDruck;{return isDruck;}- (void)setIsDruck:(BOOL)yn;{isDruck = yn;}- (BOOL)isCombiSuch;
{ return (FILLED(isCombiSuchS) && ![isCombiSuchS isEqual:SC_N]);
}
- (BOOL)isEqual:(PBDDAttribute *)pba;
{ return ([pba isKindOfClass:[PBDDAttribute class]] && [dbName iE:[pba dbName]]);
}
- (unsigned) hash
{ return [dbName hash];
}
- (BOOL)isPK;
{ return keyTyp == KT_PRIM || keyTyp == KT_AUTO || keyTyp == KT_SERI;
}
- (BOOL)isSerialPK;
{ return keyTyp == KT_SERI;
}
- (BOOL)isAutoPK;
{ return keyTyp == KT_AUTO;
}
- (BOOL)isFK; //foreignKey
{ return (FILLED(refdTableName));
}
- (BOOL)html;
{ return html;
}
- (void)setHtml:(BOOL)yn;
{ html = yn;
}
- (BOOL)hasVL;
{ return (vl != nil);
}
- (BOOL)isButton;
{ return (targetTyp==ATBU);
}
- (BOOL)isNumeric;
{ return dataTyp == DT_MONEY || dataTyp == DT_INT || dataTyp == DT_FLOAT;
}
- (NSString *)alignment;
{ if([self isNumeric])return @"right";
return @"left";
}
- (BOOL)isChar;
{ return dataTyp == DT_CHAR || dataTyp == DT_DATE || dataTyp == DT_DATETIME || dataTyp == DT_BOOL;
}
- (int)sortWeight;
{ if(targetTyp == ATTVCPD) return 99;
if(targetTyp == ATBU) return 99;
if(targetTyp == ATPORTLET) return 99;
if([self isPK])return 0;
if([dbName rangeOfString:@"match"].length)return 5;
if([dbName rangeOfString:@"bez"].length)return 10;
if([dbName rangeOfString:@"name"].length)return 10;
if([dbName rangeOfString:@"kurz"].length)return 20;
if([dbName rangeOfString:@"text"].length)return 20;
if([dbName rangeOfString:@"beschr"].length)return 20;
return 50;
}
- (NSComparisonResult)compare:(PBDDAttribute *)pba;
{ return [dbName compare:[pba dbName]];
}
- (NSComparisonResult)compareGui:(PBDDAttribute *)pba;
{ return [[self guiNameForLang:[_SESSION lang]] compareCaseInsensitive:[pba guiNameForLang:[_SESSION lang]]];
}
- (NSComparisonResult)compareBySortWeight:(PBDDAttribute *)pba;
{ if([self sortWeight] < [pba sortWeight])return NSOrderedAscending;
if([self sortWeight] > [pba sortWeight])return NSOrderedDescending;
return NSOrderedSame;
}
- (NSComparisonResult)compareForSequence:(PBDDAttribute *)pba;
{ NSComparisonResult cr = [self compareBySortWeight:pba];
if(cr!=NSOrderedSame)return cr;
return [[self guiName] compare:[pba guiName]];
}
//String-representation
- (NSString *)isHtmlS;{return (html ? SC_J:SC_N);}- (void)setIsHtmlS:(NSString *)yn;{html = [yn iE:SC_J];}- (NSString *)isDBS;{return (isDB ? SC_J:SC_N);}- (void)setIsDBS:(NSString *)yn;{isDB = [yn iE:SC_J];}- (NSString *)alwaysOnS;{return (alwaysOn ? SC_J:SC_N);}- (void)setAlwaysOnS:(NSString *)yn;{alwaysOn = [yn iE:SC_J];}- (NSString *)isRootS;{return (isRoot ? SC_J:SC_N);}- (void)setIsRootS:(NSString *)yn;{isRoot = [yn isEqual:SC_J];}- (NSString *)isDuplicateS;{return (isDuplicate ? SC_J:SC_N);}- (void)setIsDuplicateS:(NSString *)yn;{isDuplicate = [yn isEqual:SC_J];}- (NSString *)isProtectedS;{return (isProtected ? SC_J:SC_N);}- (void)setIsProtectedS:(NSString *)yn;{isProtected = [yn iE:SC_J];}- (NSString *)isMandatoryS;{return ([self isMandatory] ? SC_J:SC_N);}- (void)setIsMandatoryS:(NSString *)yn;{isMandatory = [yn iE:SC_J];}- (NSString *)isVisibleS;{return (isVisible ? SC_J:SC_N);} //f. public Values;- (void)setIsVisibleS:(NSString *)yn;{isVisible = [yn iE:SC_J];}- (void)setIsInternalS:(NSString *)yn;{} //wg. Kompatibilitaet beim Laden belassen- (NSString *)keyTypS;
{ switch(keyTyp){ case KT_NONE: return SC_KT_NONE;
case KT_PRIM: return SC_KT_PRIM;
case KT_AUTO: return SC_KT_AUTO;
case KT_SERI: return SC_KT_SERI;
}
return SC_KT_NONE;
}
- (void)setKeyTypS:(NSString *)v;
{ if([v iE:SC_KT_NONE]){keyTyp = KT_NONE; return;} if([v iE:SC_KT_PRIM]){keyTyp = KT_PRIM; return;} if([v iE:SC_KT_AUTO]){keyTyp = KT_AUTO; return;} if([v isEqual:SC_KT_SERI]){keyTyp = KT_SERI; return;}}
- (NSString *)dataTypS;
{ switch(dataTyp){ case DT_CHAR: return SC_DT_CHAR;
case DT_MONEY: return SC_DT_MONEY;
case DT_INT: return SC_DT_INT;
case DT_FLOAT: return SC_DT_FLOAT;
case DT_DATE: return SC_DT_DATE;
case DT_BOOL: return SC_DT_BOOL;
case DT_DATETIME: return SC_DT_DATETIME;
}
return SC_DT_CHAR;
}
- (void)setDataTypS:(NSString *)v;
{ if([v iE:SC_DT_CHAR]){dataTyp = DT_CHAR; return;} if([v iE:SC_DT_MONEY]){dataTyp = DT_MONEY; return;} if([v iE:SC_DT_INT]){dataTyp = DT_INT; return;} if([v iE:SC_DT_FLOAT]){dataTyp = DT_FLOAT; return;} if([v iE:SC_DT_DATE]){dataTyp = DT_DATE; return;} if([v iE:SC_DT_BOOL]){dataTyp = DT_BOOL; return;} if([v iE:SC_DT_DATETIME]){dataTyp = DT_DATETIME; return;}}
- (NSString *)targetTypS;
{ switch(targetTyp){ case ATTVCSELOBJ: return SC_ATTVCSELOBJ;
case ATTVCPD: return SC_ATTVCPD;
case ATBU: return SC_ATBU;
case ATPORTLET: return SC_ATPORTLET;
}
return SC_ATTVCSELOBJ;
}
- (void)setTargetTypS:(NSString *)v;
{ if([v iE:SC_ATTVCSELOBJ]){targetTyp = ATTVCSELOBJ; return;} if([v iE:SC_ATBU]){targetTyp = ATBU; return;} if([v iE:SC_ATTVCPD]){targetTyp = ATTVCPD; return;} if([v iE:SC_ATPORTLET]){targetTyp = ATPORTLET; return;}}
- (NSString *)lengthS;{return [NSSWF @"%d",length];}- (void)setLengthS:(NSString *)value;{length = [value intValue];}- (NSString *)nakS;{return [NSSWF @"%d",nak];}- (void)setNakS:(NSString *)value;{nak = [value intValue];}//expandieren; in getPKN der table aufgerufen;
- (NSArray *)plainAttributes;
{ PBDDAttribute *attr=nil;
NSArray *a;
LMA;
PBDDTable *t;
int i,j;
if(FILLED(reference)){ //table verwendet if(![self myDD])return nil;
if(!(t=[myDD tableNamed:reference]))return nil;
if(myTable == t)return nil; //endlos-Loop
a = [t plainAttributes];
for(i=0,j=[a count];i<j;i++){ attr = [[[a oai:i]copyWithZone:NULL]autorelease];
//DD und table immer setzen;ausserdem die Flags;
[attr setMyTable:[self myTable]];
[attr setMyDD:[self myDD]];
[lma addObject:attr];
if(FILLED(suffix)){ [attr setDbName:[[attr dbName]stringByAppendingString:suffix]];
if([attr targetTyp]!=ATBU && [attr targetTyp]!=ATPORTLET){ [attr setGuiName:[[attr guiName]stringByAppendingString:suffix]];
}
}
[attr buildVLArrays];
}
}else{ attr = [[self copyWithZone:NULL]autorelease];
[attr setMyTable:[self myTable]];
[attr setMyDD:[self myDD]];
[lma addObject:attr];
if(FILLED([attr refdTableName])){ if(!(t=[myDD tableNamed:[attr refdTableName]])){//Relation weghauen, falls target table nicht existiert oder hidden;
[attr setRefdTableName:EON];
[attr setLength:10];
[attr setDataTyp:DT_CHAR];
}
}
[attr buildVLArrays];
}
return lma;
}
- (void)buildVLArrays;
{// vlcontent enthaelt pro Zeile einen mit | in felder geteilten String: Wert intern, Bezeichnung, Bezeichnung internat.
// kann wiederholt aufgerufen werden
if(FILLED(vlcontent)){ NSArray *a = [vlcontent componentsSeparatedByString:@"\n"];
int i,j=[a count];
[vl release];
[pbvloDict release];
MA(vl);
MD(pbvloDict);
// leerer Eintrag immer an Anfang
[vl addObject:[PBVLO pbvloWithValue:@"" bez0:@"" bez1:@""]];
for(i=0;i<j;i++){ NSString *s = [a oai:i];
NSArray *a1 = [s componentsSeparatedByString:@"|"];
int j1 = [a1 count];
if(j1 < 2)continue;
if(j1 == 2){ [vl addObject:[PBVLO pbvloWithValue:[a1 oai:0] bez0:[a1 oai:1] bez1:[a1 oai:1]]];
}else{ [vl addObject:[PBVLO pbvloWithValue:[a1 oai:0] bez0:[a1 oai:1] bez1:[a1 oai:2]]];
}
}
for(i=0,j=[vl count];i<j;i++){ PBVLO *vlo = [vl oai:i];
[pbvloDict setObject:vlo forKey:[vlo value]];
}
}
}
- (NSString *)valueForBezeichnung:(NSString *)s;
{// liefert internen Schluessel fuer einen Oberflaechen-String einer Valuelist und beruecksichtigt die Session-lang;
if(!FILLED(s))return EON;
if(!vl)return s;
{ int i,j;
NSString *s1 = [s lowercaseString];
for(i=0,j=[vl count];i<j;i++){ PBVLO *pbvlo = [vl oai:i];
if([[[pbvlo bez] lowercaseString]iE:s1])return [pbvlo value];
}
}
return EON;
}
- (NSString *)bezeichnungForValue:(NSString *)s;
{ if(!FILLED(s))return EON;
if(!vl)return s;
{ NSString *bez = [[pbvloDict ofk:s]bez];
if(bez)return bez;
}
return EON;
}
- copyWithZone:(NSZone *)aZone;
{ id theCopy = [[[self class]allocWithZone:aZone]init];
NSArray *a = [PBDDAttribute ivarNames];
int i,j;
for(i=0,j=[a count];i<j;i++){ NSString *k = [a oai:i];
NSString *s = [self vfk:k];
if(s)[theCopy tvfk(s,k)];
}
if(![theCopy targetModulName])[theCopy setTargetModulName:EON];
return theCopy;
}
- (int)charsForGui;
{// gibt an, wieviele Zeichen der Wert an der oberfl. max. haben kann; daraus kann die spaltenbreite berechnet werden
// length ist das Eingabefeld der Feldlaenge
int chars = [self length];
switch(dataTyp){ case DT_CHAR:
break;
case DT_DATE:
chars = 10;
break;
case DT_DATETIME:
chars = 19;
break;
case DT_MONEY:
chars = 16; //1000 er Punkte reinrechnen, nk, dezpunkt
break;
case DT_FLOAT:
if(nak){ chars = chars + (chars - (nak + 1) - 1)/3;
}else{ chars = chars + (chars - 1)/3;
}
break;
case DT_INT:
chars = chars + (chars - 1)/3;
break;
case DT_BOOL:
chars = 1;
break;
}
return chars;
}
- (void)validate;
{// laenge korrigieren; length wird fuer die datenbank und charsforgui verwendet
int l = length;
if(FILLED(reference)){ [self setRefdTableName:EON];
[self setTargetModulName:EON];
[self setLength:0];
return;
}else{//Laenge justieren; gilt f. Datenbank; dezimalpunkt mit einrechnen;
switch(dataTyp){ case DT_CHAR:
if(l<1) [self setLength:10];
return;
case DT_DATE:
[self setLength:8];
return;
case DT_DATETIME:
[self setLength:14];
return;
case DT_MONEY:
[self setLength:11];
[self setNak:2];
return;
case DT_FLOAT:
if((l<(nak?nak+1:1) || l > 38)) [self setLength:10];
return;
case DT_INT:
[self setLength:8];
return;
case DT_BOOL:
[self setLength:1];
return;
}
}
LOGS(@"nicht unterstuetzt fuer diese Datenbank");
}
- (PBDDTable *)relationTable;
{ if(!FILLED(refdTableName))return nil;
return [myDD tableNamedCheap:refdTableName];
}
- (BOOL)isRelation;
{ return ([self relationTable] != nil);
}
- (NSString *)formatStringValue:(NSString *)s;
{ if(!s)s=EON;
if(dataTyp == DT_CHAR) { // Wir passen hier den internen unicode String an. Die DB-Einstellungen sind da nicht relevant.
if (length < 256 && [s length] > length) s = [s secureSubstringToIndex: length-1];
return s;
}
if(dataTyp == DT_BOOL) { // Die Logik is angelehnt an 'C' Skalarwerte. Leere bzw. Null-Felder sind immer 'false' alles andere ist 'true'.
return (!FILLED(s) || [s iE: SC_BOOL_FALSE]) ? SC_BOOL_FALSE : SC_BOOL_TRUE;
}
if(dataTyp == DT_DATE){ PBDate *pbd;
if(!FILLED(s))return EON;
pbd = [PBDate dateWithFreeString:s];
if(!pbd){ return EON;
}
return [[pbd dateAsNSCD]descriptionWithCalendarFormat:ND_FORMAT];
}
if(dataTyp == DT_DATETIME){ return s;
}
if(dataTyp == DT_MONEY)return [NSString dbFromDouble:[s doubleValue] nak:2];
return [NSString dbFromDouble:[s doubleValue] nak:nak];
}
- (BOOL)isAuthorized;
{// angemeldeter Benutzer darf das Attribut sehen
if(!IS_ROOT){ if(isRoot)return NO;
if(![gruppenstring matchesGruppenstring:[[_SESSION ueo] vfk:@"gruppenstring"]])return NO;
}
return YES;
}
- (int)widthForColumn;
{//datum, money, bool: feste spaltenbreiten
// datum 75
// money 80
// BOOL 20
//int, float, char: berechnet aufgrund charsForGui
// 0..10 9px per char
// 11..20 7px per char
// ab 21 6 px per char
int chars,c1,c2,c3;
int width;
int mcw = [[[_APP configDict]ofk:@"maxcolwidth"]intValue]; //wird nur verwendet, wenn keine Custom-Einstellungen in LIF-TV vorhanden
if(mcw < 10)mcw=10;
if(mcw > 40)mcw=40;
if(dataTyp==DT_DATE){ return 75;
}
if(dataTyp==DT_DATETIME){ return 120;
}
if(dataTyp==DT_MONEY){ return 80;
}
if(dataTyp==DT_BOOL){ return 20;
}
if(vl){ return 80;
}
chars = [self charsForGui];
if(chars > mcw)chars =mcw;
if(chars < 3)chars=3;
//zusammengesetzte funktion
c1 = MIN(10,chars);
c2 = MIN(20,chars) - 10;
c3 = chars - 20;
width = c1 * 9;
if(c2 > 0)width += c2 * 5;
if(c3 > 0)width += c3 * 3;
if(dataTyp==DT_FLOAT && width > 80){ return 80;
}
return width;
}
@end