BOOL CUGODatabaseMng: :D eleteDir(DWORD BUGO_Id)
{
ASSERT(m_pDatabaseMng);
if (!m_pDatabaseMng)
return FALSE;
BOOL bParent = TRUE;
BOOL bDelParent = TRUE;
try
{
std::list<DWORD> lstIds;
CString sSQL;
sSQL.Format(_T("SELECT ID FROM BUGO WHERE PARENT_ID=%d"), BUGO_Id);
ADODB::_RecordsetPtr spRS = m_pDatabaseMng->OpenRecordset(sSQL);
long nRecordCount = spRS->GetRecordCount();
for (long nRecord = 0; nRecord < nRecordCount; ++nRecord)
{
lstIds.push_back((long)spRS->GetFields()->GetItem(_T("ID"))->GetValue());
spRS->MoveNext();
}
if (nRecordCount > 1)
{
bParent = TRUE; // проверка наличия вложенных каталогов
}
spRS->Close();
for (std::list<DWORD>::iterator it = lstIds.begin(); it != lstIds.end(); ++it)
{
if (bParent)
bDelParent = FALSE; //если есть вложенные каталоги, то родительская не удаляется
if (!DeleteDir(*it))
return FALSE;
}
if (bDelParent)
{
sSQL.Format(_T("DELETE FROM BUGO WHERE ID=%d"), BUGO_Id);
VERIFY(m_pDatabaseMng->ExecuteSQL(sSQL));
return TRUE;
}
}
catch (_com_error& e)
{
if (AfxMessageBox(CString(_T("Удаление каталога невозможно!\n")) + (LPCTSTR)e.Description() + CString(_T("\nПродолжить удаление?")),MB_OKCANCEL) == IDOK)
{
return TRUE;
}
else return FALSE;
}
return FALSE;
}
Данный код работает на корректное удаление директорий только до уровня вложенности 2, а надо бы до любого, как мне это провернуть? Помогите пожалуйста, если что-то необходимо, то поясню очень быстро.
Не очень понятно, чего хочется добиться. Судя по коду, в дереве BUGO удаляться будут только те кортежи, у которых нету парентов. А вот это условие вообще не понятно:
Почему сравнение не с нулём? Ведь если этот запрос нашёл хоть один кортеж, то текущий BUGO уже является парентом. Или один чайлд имеют все BUGO, но он хранит какие-то системые данные?
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
Согласен можно сравнить и с нулем, это значение показывает количество у него подкаталогов, если 0 то нету если нет то есть.
Вообще необходимо сделать чтобы в дереве BUGO: по нажатию ОК из catch удалялись все каталоги которые возможно, а при нажатии ОТМЕНА удалялись все каталоги до первого который нельзя удалить.
Требуется модерация форумов и новостей. Хорошая подработка со свободным графиком. Почасовая оплата 280 рублей в час. Пишите на email: service24int@gmail.com
vasilenko_konstantin, API функции тут не при чём. Директории в базе данных хранятся. По коду же видно...
4ygynOK, вообще-то я не могу понять в чём проблема тогда. Никаких ограничителей на вложенность вызовов в коде нету. Не пробовал дебажить? В дебагере проблема не видна?
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.