PBDDAttribute.m


max21 Unternehmensgruppe
#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
Foto