I want to add a attribute to a class, when call aaOApi_AddClassAttribute, the return code is 80003.
Do the aaApi_GetLastError* functions not give you the full error information?
You can call something like this when you want to examine the error stack:
LONG PWlastError() { LONG status = aaApi_GetLastErrorId(); LPCWSTR errorMessage = aaApi_GetLastErrorMessage(); LPCWSTR errorDetail = aaApi_GetLastErrorDetail(); wcout << L"Status: " << status << endl; if(NULL != errorMessage) wcout << L"Error: " << errorMessage << endl; if(NULL != errorDetail) wcout << L"Detail: " << errorDetail<< endl; return status; }
yes, I can get the error message by this way (Adding an attribute in a class failed). I want to know how can I add the attribute in a class success?
Here is the code:
HAAODSATTR lpAttr = NULL;AttrID lAttrId = 1143;LONG lIndex = -1;HAAODSCLASS lpClass = NULL;aaOApi_FindClassByName(pszClassName, &lpClass)if (!aaOApi_AddClassAttribute(lpAttr, lAttrId, lIndex, lpClass))
Working with the "ProjectWise ODS API" group of functions is not one of my "strong points", but I found a function from a project that might give you better insight on how to use this function.
extern "C" BOOL CreateNewComponentClass ( LPCTSTR szClassNameP, // i - class name LPAAOdsClass *lppNewClass ) { AFX_MANAGE_STATE( AfxGetStaticModuleState() ); // long *lProjArrayP = (long *) calloc(uiCount, sizeof(long)); // should return 0 if unsuccessful long lClassId = GetClassIdFromClassName (szClassNameP); if (lClassId > 0L) return FALSE; LPAAOdsClass lpBaseClass = NULL; if (aaOApi_NewClass (lpBaseClass, lppNewClass)) { if (aaOApi_SetClassName (szClassNameP, *lppNewClass)) { long lAttrId = GetAttrIDFromName (L"EC_InstanceID"); if (lAttrId > 0L) { CString sTableName; sTableName.Format(L"I_%s", szClassNameP); CString sSeqName; sSeqName.Format(L"I_%s_SEQ", szClassNameP); if (aaOApi_AddClassAttribute (NULL, lAttrId, 0L, *lppNewClass)) { LPAAOdsAttr lpAttr = NULL; CString sKeyName; sKeyName.Format(L"%s_Class_UniqueId", szClassNameP); if (SUCCESS == CreateOdsAttribute(sKeyName, sKeyName, AAODS_STRING, 100, AAODS_VISIBILITY_VISIBLE, &lpAttr)) { if (aaOApi_AddClassAttribute (lpAttr, 0L, -1L, *lppNewClass)) { long lSystemClassId = AAODS_CLASS_NORMAL; long lKeyId = aaOApi_GetAttributeId (lpAttr); LPAAOdsQualifier lpQual = NULL; aaOApi_FindQualifierByName (L"ECQUAL_BUSINESSKEY", &lpQual); long lQualId = aaOApi_GetQualifierId (lpQual); aaOApi_AddClassQualifier (*lppNewClass, lQualId, &lKeyId); if (aaOApi_SetClassProps (*lppNewClass, szClassNameP, &lSystemClassId, &lAttrId, NULL, sTableName, sSeqName, NULL, NULL)) { return TRUE; } else { TRACE (L"Error setting class properties\n"); } } else { TRACE (L"Error adding TagClass_UniqueId to class\n"); } } else { TRACE (L"Error finding/creating TagClass_UniqueId\n"); } } else { TRACE (L"Error adding EC_InstanceID attribute to class\n"); } } else { TRACE (L"Error finding EC_InstanceID attribute\n"); } } else { TRACE (L"Error setting class name\n"); } } else { TRACE (L"Error creating new class\n"); } return FALSE; }
Hope it helps!
FWIW, make sure that you always trap for possible errors. In your code snippet, you are not checking to see what aaOApi_FindClassByName() returns.
Thanks for your sample code, after following your sample code, I still encounter the error 80003:
aaOApi_AddClassAttribute failed, status:80003, errorMessage:Adding an attribute in a class failed
And here is the code snippet:
AttrID newAttrId = 0; HAAODSATTR newAttribute; LPCWSTR pszAttrName = L"PROJECT_name_0705"; LPCWSTR pszLabel = L"Test_label_0705"; LPCWSTR pszDesc = L"Test Desc 0705"; LONG lAttrType = AAODS_STRING; LONG dataLength = 255; LONG visibility = AAODS_VISIBILITY_VISIBLE; LPCWSTR dbColumnName = L"PROJECT_column_name_0705"; BOOL isSystemAttr = TRUE;
LPCWSTR pszClassName = L"Building"; HAAODSCLASS odsClass = NULL;
WCHAR valueBuffer[ODS_STRING_BUFFER_SIZE] = { 0 }; WCHAR pszDefaultValue[] = L"abcdefg";
do { if (!aaOApi_FindClassByName(pszClassName, &odsClass)) { LONG status = aaApi_GetLastErrorId();
LPCWSTR errorMessage = aaApi_GetLastErrorMessage(); LPCWSTR errorDetail = aaApi_GetLastErrorDetail(); LPCWSTR pszErrMsg = aaApi_GetMessageByErrorId(status); break; }
if (!aaOApi_CreateAndInitializeAttribute( &newAttrId, &newAttribute, pszAttrName, pszLabel, pszDesc, lAttrType, dataLength, visibility, dbColumnName, isSystemAttr)) { LONG status = aaApi_GetLastErrorId();
HAAODSATTR lpAttr = newAttribute; LONG lAttrId = 0L; LONG lIndex = -1L; HAAODSCLASS lpClass = odsClass; if (!aaOApi_AddClassAttribute(newAttribute, lAttrId, lIndex, lpClass)) { LONG status = aaApi_GetLastErrorId();
LPCWSTR errorMessage = aaApi_GetLastErrorMessage(); LPCWSTR errorDetail = aaApi_GetLastErrorDetail(); LPCWSTR pszErrMsg = aaApi_GetMessageByErrorId(status);
std::wstringstream ss; ss << _T("aaOApi_AddClassAttribute failed, status:") << status; if (errorMessage) { ss << _T("errorMessage:") << errorMessage << std::endl; }
if (errorDetail) { ss << _T("errorDetail:") << errorDetail << std::endl; } if (pszErrMsg) { ss << _T("pszErrMsg:") << pszErrMsg << std::endl; }
::OutputDebugString(ss.str().c_str());
break; }