Annotation of Examples/EnterpriseObjects/UniqueKey/UniqueKey_sybase/MasterDetail.m, revision 1.1

1.1     ! root        1: #import "UniqueKey.h"
        !             2: #import "MasterDetail.h"
        !             3: 
        !             4: 
        !             5: static BOOL _Debug = YES;
        !             6: 
        !             7: @implementation MasterDetail
        !             8: 
        !             9: /******************************************************************************
        !            10: * Create an instance of the UniqueKey object to grab blocks of <count> keys for
        !            11: * our use during insert.  The count is set low so you can see the SQL reserve
        !            12: * blocks of keys.  Up the count to something larger for it to be of use.
        !            13: *
        !            14: * The login information (connection dictionary) has been blanked out, since
        !            15: * you may elect to have the tables in some database other than PEOPLE, so we
        !            16: * elect to run a login panel.  Once the login is complete we can get the
        !            17: * connection dictionary from the adaptor and use that information to allow
        !            18: * UniqueKey to login and create its separate connection for key reservation.
        !            19: *
        !            20: * Many of the method calls in EOF return (id)<some protocol>, so you will notice
        !            21: * several casts to (id) to avoid warnings for nested method calls supported by
        !            22: * the returned object, but not by the protocol.  Alternatively, you can cast to
        !            23: * the exact class you know returned, such as (EODatabaseDataSource*) or
        !            24: * (EODetailDatabaseSource*).
        !            25: ******************************************************************************/
        !            26: - appDidInit:sender
        !            27: {
        !            28:     EOAdaptorChannel *eoAdaptorChannel = [[(id)[employeeController dataSource] 
        !            29:                                                                                                                databaseChannel] adaptorChannel];
        !            30:     EOAdaptor        *eoAdaptor        = [[eoAdaptorChannel adaptorContext] adaptor];
        !            31:     
        !            32:     if(_Debug) [eoAdaptorChannel setDelegate:self];
        !            33: 
        !            34:     employeeEntity       = [[(id)[employeeController dataSource] entity] retain];
        !            35:     equipmentOwnerEntity = [[(id)[equipmentOwnerController dataSource] entity] retain];
        !            36: 
        !            37:     if(![eoAdaptor runLoginPanelAndValidateConnectionDictionary]) [NXApp terminate:self];
        !            38:     [UniqueKey setConnectionDictionary:[eoAdaptor connectionDictionary]];
        !            39:     
        !            40:     employeeUniqueKey = [[[UniqueKey alloc] initWithEntity:employeeEntity count:5] retain];
        !            41:     if(!employeeUniqueKey) [NXApp terminate:self];
        !            42: 
        !            43:     [self setFetchOrderFor:employeeController with:@"LastName" order:EOAscendingOrder];
        !            44:     [self setFetchOrderFor:equipmentOwnerController with:@"Description" order:EOAscendingOrder];
        !            45: 
        !            46:     [employeeController fetch:self];
        !            47:     return self;
        !            48: }
        !            49: 
        !            50: 
        !            51: /******************************************************************************
        !            52: * Set a controller's data source to fetch sorted by a given attribute name
        !            53: * and order.
        !            54: ******************************************************************************/
        !            55: - setFetchOrderFor:(EOController*)controller with:(NSString*)attributeName order:(EOOrdering)order
        !            56: {
        !            57:     id         dataSource = [controller dataSource];
        !            58:     id         attribute  = [[dataSource entity] attributeNamed:attributeName];
        !            59:     NSArray    *orderArray;
        !            60:     
        !            61:     orderArray = [NSArray arrayWithObject:
        !            62:        [EOAttributeOrdering attributeOrderingWithAttribute:attribute ordering:order]];
        !            63:     [dataSource setFetchOrder:orderArray];
        !            64:     return self;
        !            65: }
        !            66: 
        !            67: 
        !            68: /******************************************************************************
        !            69: * Generate unique keys for the new object.  Use the instance of UniqueKey
        !            70: * to dole out a key from its internal buffer.  The UniqueKey object has its
        !            71: * own channel to the DB which it uses to allocate blocks of keys.
        !            72: ******************************************************************************/
        !            73: - (BOOL)controller:(EOController *)controller willInsertObject:object atIndex: (unsigned)newIndex
        !            74: {
        !            75:     if(controller==employeeController)
        !            76:        {
        !            77:        NSNumber       *uniqueKey  = [NSNumber numberWithInt:[employeeUniqueKey nextKey]];
        !            78:        NSArray        *emptyArray = [[[NSArray alloc] init] autorelease];
        !            79: 
        !            80:        [object setObject:uniqueKey      forKey:@"EmpId"];
        !            81:        [object setObject:@"<LastName>"  forKey:@"LastName"];
        !            82:        [object setObject:@"<FirstName>" forKey:@"FirstName"];
        !            83:        [object setObject:@"<Phone>"     forKey:@"Phone"];
        !            84:        [object setObject:emptyArray     forKey:@"toEmpEquipment"];
        !            85:        return YES;
        !            86:        }
        !            87:     return NO;
        !            88: }
        !            89: 
        !            90: 
        !            91: /******************************************************************************
        !            92: * When an employee is deleted from the database, we need to remove that person's
        !            93: * ownership of their equipment.  We use the toEmpEquipment relationship to get
        !            94: * an NSArray of equipment objects and null the EmpId for each.
        !            95: ******************************************************************************/
        !            96: - (BOOL)controller:controller willDeleteObject:object
        !            97: {
        !            98:        NSArray                 *eeArray;
        !            99:        NSEnumerator    *eeEnumerator;
        !           100:        EOGenericRecord *equipment;
        !           101: 
        !           102:     if(controller==employeeController) {
        !           103:        eeArray      = [object objectForKey:@"toEmpEquipment"];
        !           104:                eeEnumerator = [eeArray objectEnumerator];
        !           105:                
        !           106:        while ((equipment = [eeEnumerator nextObject]) != nil)  {
        !           107:                [equipment setObject:[EONull null] forKey:@"EmpId"];
        !           108:                [(id)[employeeController dataSource] updateObject:equipment];
        !           109:        }
        !           110:     }
        !           111:     return YES;
        !           112: }
        !           113: 
        !           114: 
        !           115: /******************************************************************************
        !           116: * Bring up the assign equipment panel and start a modal session.  Construct 
        !           117: * an 'otherEquipment' qualifier to select equipment not currently assigned to
        !           118: * the selected employee.
        !           119: ******************************************************************************/
        !           120: - assignEquipmentToEmployee:sender
        !           121: {
        !           122:     EOGenericRecord    *employee;
        !           123:     NSNumber           *empId;
        !           124:     EOQualifier                *otherEquipment;
        !           125:     NSString           *qualifierString;
        !           126:     
        !           127:        employee = [(id)[equipmentForEmployeeController dataSource] masterObject];
        !           128:        empId    = [employee objectForKey:@"EmpId"];
        !           129: 
        !           130:     qualifierString = [NSString stringWithFormat:@"(EmpId != %@ or EmpId = NULL)",empId];
        !           131:        
        !           132:     otherEquipment = [[[EOQualifier alloc]
        !           133:        initWithEntity:equipmentOwnerEntity qualifierFormat:qualifierString] autorelease];
        !           134:        
        !           135:     [(id)[equipmentOwnerController dataSource] setQualifier:otherEquipment];
        !           136:     [equipmentOwnerController clearSelection];
        !           137:     [equipmentOwnerController fetch];
        !           138:     [[assignEquipmentPanel center] makeKeyAndOrderFront:nil];
        !           139:     [NXApp runModalFor:assignEquipmentPanel];
        !           140:     [assignEquipmentPanel orderOut:self];
        !           141:     [employeeController fetch];
        !           142:     return self;
        !           143: }
        !           144: 
        !           145: - assignEquipmentToEmployeeOK:sender
        !           146: {
        !           147:     EOGenericRecord    *employee;
        !           148:     NSNumber           *empId;
        !           149:     NSArray                    *eoArray;
        !           150:     NSEnumerator       *eoEnumerator;
        !           151:     EOGenericRecord    *equipmentOwner;
        !           152: 
        !           153:        employee                = [(id)[equipmentForEmployeeController dataSource] masterObject];
        !           154:     empId                      = [employee objectForKey:@"EmpId"];
        !           155:     eoArray                    = [equipmentOwnerController selectedObjects];
        !           156:     eoEnumerator       = [eoArray objectEnumerator];
        !           157: 
        !           158:     while((equipmentOwner = [eoEnumerator nextObject]) != nil) {
        !           159:        [equipmentOwner setObject:empId forKey:@"EmpId"];
        !           160:        [(id)[equipmentOwnerController dataSource] updateObject:equipmentOwner];
        !           161:     }
        !           162:     [NXApp stopModal];
        !           163:     return self;
        !           164: }
        !           165: 
        !           166: 
        !           167: /******************************************************************************
        !           168: * Release the equipment shown in the detail view.  Null out the equipment owner's
        !           169: * EmpId for each.
        !           170: ******************************************************************************/
        !           171: - releaseEquipmentForEmployee:sender
        !           172: {
        !           173:     NSArray            *efeArray;
        !           174:     NSEnumerator       *efeEnumerator;
        !           175:     EOGenericRecord    *equipment;
        !           176: 
        !           177:        efeArray                = [equipmentForEmployeeController selectedObjects];
        !           178:     efeEnumerator      = [efeArray objectEnumerator];
        !           179: 
        !           180:     while( (equipment = [efeEnumerator nextObject]) != nil) {
        !           181:        [equipment setObject:[EONull null] forKey:@"EmpId"];
        !           182:        [(id)[equipmentForEmployeeController dataSource] updateObject:equipment];
        !           183:     }
        !           184:     [employeeController fetch];
        !           185:     return self;
        !           186: }
        !           187: 
        !           188: 
        !           189: /******************************************************************************
        !           190: * Echo SQL when debug is enabled.
        !           191: ******************************************************************************/
        !           192: - (EODelegateResponse)adaptorChannel:channel willEvaluateExpression:(NSMutableString *)expression
        !           193: {
        !           194:     NSLog(expression);
        !           195:     return EODelegateApproves;
        !           196: }
        !           197: 
        !           198: - (void)dealloc
        !           199: {
        !           200:        [employeeEntity release];
        !           201:        [equipmentOwnerEntity release];
        !           202:        [employeeUniqueKey release];
        !           203:        [super dealloc];
        !           204:    
        !           205: }
        !           206: 
        !           207: @end

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.