![]() |
Модераторы: bsa |
![]() ![]() ![]() |
|
4ygynOK |
|
|||
Новичок Профиль Группа: Участник Сообщений: 19 Регистрация: 10.10.2013 Репутация: нет Всего: нет |
Все дело в том что не удаляет, поэтому и сражаюсь.
akizelokro, к сожалению использование while тоже ни к чему не привело. |
|||
|
||||
4ygynOK |
|
|||
Новичок Профиль Группа: Участник Сообщений: 19 Регистрация: 10.10.2013 Репутация: нет Всего: нет |
Ну что есть ещё какие-нибудь идеи?
|
|||
|
||||
baldina |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3433 Регистрация: 5.12.2007 Где: Москва Репутация: 15 Всего: 101 |
4ygynOK, все идеи тебе уже высказали.
надо не пальцем в небо тыкать, а двигаться системно. вот такой код
исполни, и напиши:
|
|||
|
||||
4ygynOK |
|
|||
Новичок Профиль Группа: Участник Сообщений: 19 Регистрация: 10.10.2013 Репутация: нет Всего: нет |
База до выполнения:
ID PARENT_ID NAME NUMBER_ 0 0 Библиотека 11 63 0 Э3 54 64 0 Э4 55 65 0 Э7 56 66 63 Test 1 67 66 Test1 1 68 66 Test2 2 69 66 Test3 3 70 68 1 1 71 68 2 2 База после выполнения: ID PARENT_ID NAME NUMBER_ 0 0 Библиотека 11 63 0 Э3 54 64 0 Э4 55 65 0 Э7 56 67 66 Test1 1 68 66 Test2 2 69 66 Test3 3 70 68 1 1 71 68 2 2 Исключение вызывается 6 раз, на BUGO_Id = 67, 70, 71, 68, 69, 66(не вызывается просто происходит удаление) и 63. Везде кроме 66 есть связанные записи, у 66 есть только подкаталоги со связанными записями.(Сделал в базе привязанную запись к 66, теперь удаляет, но все равно 6 раз выскакивает окно с ошибкой из catch). В отладчике во вкладке Autos перед удалением: BUGO_Id 67 unsigned long sSQL "DELETE FROM BUGO WHERE ID=67" ATL::CStringT<char,StrTraitMFC_DLL e E_FAIL} _ com_error & после нажатия ОК во всплывающем окне из catch: AfxMessageBox returned 1 int + e {E_FAIL} _com_error & + this 0x03b802cc {m_pDatabaseMng=0x00467b6c m_pUGODBFolder=0x03b802fc m_Steck=[0]() ...} KE_DB::CUGODatabaseMng * const Для 66 записи из отладчика: за 2 шага BUGO_Id 66 unsigned long + m_pDatabaseMng 0x00467b6c ID=66" + this 0x03b802cc {m_pDatabaseMng=0x00467b6c m_pUGODBFolder=0x03b802fc m_Steck=[0]() ...} KE_DB::CUGODatabaseMng * const за 1 шаг ATL::CHeapPtrBase<tagDBPROPSET,ATL::CComAllocator>::operator tagDBPROPSET * returned 0x01a1d1a8 {rgProperties=0x454c4544 cProperties=1176520020 guidPropertySet={...} } tagDBPROPSET * KE_DB::CDatabaseMng::ExecuteSQL returned true bool + m_pDatabaseMng 0x00467b6c + sSQL "DELETE FROM BUGO WHERE ID=66" + this 0x03b802cc const после вот что возвращается: KE_DB::CUGODatabaseMng::DeleteDir returned 1 int + it 66 + lstIds [1](66) + this 0x03b802cc * const Красных строчек нигде больше нет. способ вызова функции (что в параметрах) - это откуда тебе сказать? возникают ли исключения, и если да - каков текст ошибки(исключение вызывается 6 раз при таком коде, текст ошибки : "Удаление каталога невозможно!\n")) + (LPCTSTR)e.Description()="Невозможно выполнить каскадную операцию, поскольку наичие свзянных записей в таблице Images приведет к нарушению целостности данных." + CString(_T("\nПродолжить удаление? |
|||
|
||||
baldina |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3433 Регистрация: 5.12.2007 Где: Москва Репутация: 15 Всего: 101 |
да уж...
с чего все начинается? DeleteDir(0) или DeleteDir(67) или еще как-то?
что это за таблица? если БД имеет ограничения, операции с базой должны им удовлетворять, например, прежде чем удалять из искомой таблицы, удалить из images (к логике работы DeleteDir() это относится боком) В структуре БД явно есть косячок: 66 удаляется, оставляя висеть дочерние 67-69. Итого: разговор переходит от DeleteDir(), логика которой концептуально верна, к обсуждению структуры базы. Поэтому рассказывай какие там таблицы и как они связаны. Добавлено через 4 минуты и 15 секунд 4ygynOK, сделай копию базы, оторви от этой таблицы все связи, убедись что все работает (должно!) далее - добавь связь id <- parent_id. это предотвратит удаление родителей без удаления детей. DeleteDir() изменять не надо, она это уже учитывает далее - восстанавливай связи по одной, внося изменения в DeleteDir() - добавляя код удаления связанных данных. Добавлено через 4 минуты и 58 секунд после каждого изменения проверяй, что оно все еще работает |
||||
|
|||||
4ygynOK |
|
|||
Новичок Профиль Группа: Участник Сообщений: 19 Регистрация: 10.10.2013 Репутация: нет Всего: нет |
Вечером все выложу, если сможешь зайдешь глянешь.
|
|||
|
||||
4ygynOK |
|
||||
Новичок Профиль Группа: Участник Сообщений: 19 Регистрация: 10.10.2013 Репутация: нет Всего: нет |
Начинается все в зависимости от того на какую папку ты нажимаешь, собственно начинается все с её ID-шника.
Сразу оговорюсь БД Access. Для нас я понимаю больше всего важны 3 таблицы BUGO(с которой мы работаем),UGO(именно с этой таблицей единственная связь таблицы BUGO, столбец ID из BUGO связывается с BUGO_ID из UGO - связь один ко многим), и таблица IMAGES cвязанная с таблицей UGO тоже связь один ко многим по столбцам ID в UGO и UGO_REFERENCE в IMAGES. |
||||
|
|||||
4ygynOK |
|
|||
Новичок Профиль Группа: Участник Сообщений: 19 Регистрация: 10.10.2013 Репутация: нет Всего: нет |
||||
|
||||
4ygynOK |
|
||||
Новичок Профиль Группа: Участник Сообщений: 19 Регистрация: 10.10.2013 Репутация: нет Всего: нет |
тогда удаляется сразу все. если разорвать эту связь.
честно не знаю как связать 2 столбца в одной таблице. Остальное в процессе. Присоединённый файл ( Кол-во скачиваний: 2 ) ![]() |
||||
|
|||||
baldina |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3433 Регистрация: 5.12.2007 Где: Москва Репутация: 15 Всего: 101 |
чувствую себя тупицей.... ТЫ на какую папку нажимаешь? результаты какого теста приводились? впрочем, сейчас это уже неактуально так же, как и в разных. наверно стоит начать хотя бы с минимального изучения БД, хотя бы в рамках Access, а потом уже программы для автоматизации писать... а то вдруг в результате какой-нибудь самолет пойдет под откос, или ракета с ядерной боеголовкой не туда наведется т.е. таки работает функция, дело не в рекурсии и тд и тп немного больше: почти все))))) не пугайся, не все, лишь 6: BUGO, UGO, IMAGES, CLAMPS_REFERENCES, OTHER_PRODUCES, FASTENER_IMAGES в БД почти на всех связях установлено ограничение (контроль целостности), но мало где - каскадное обновление/удаление. каскадное удаление решило бы проблему, но рекомендовать его включить нельзя, т.к. задача не ясна и неизвестно чем это аукнется. лучший способ - попросить разработчика этой БД написать корректный запрос на удаление данных по BUGO_ID, им и пользоваться вместо
походу разработчика не достать, придется писать самому. причем одним DELETE из всех таблиц сразу не удалить, только по одной. однако это уже вопросы раздела Access. а с С++ мы покончили: не считая проблем с sql, DeleteDir() работоспособная Это сообщение отредактировал(а) baldina - 15.10.2013, 00:37 |
||||
|
|||||
4ygynOK |
|
|||
Новичок Профиль Группа: Участник Сообщений: 19 Регистрация: 10.10.2013 Репутация: нет Всего: нет |
Что в итоге получается: данный код не рабочий, он в принципе покрывает только частные случаи выкладываю тот что работает:
данный код нормален, но удалять только может при вложенности до 2 каталогов. Как реализовать, чтобы была больше вложенность используя этот код? Либо можно сделать без добавления в функцию параметра, но это я уже не в курсе. Может подскажете как организовать большую вложенность? |
|||
|
||||
baldina |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3433 Регистрация: 5.12.2007 Где: Москва Репутация: 15 Всего: 101 |
использовать этот код неизменным можно только изменив структуру БД - сделав удаление каскадным для всех связанных таблиц.
не изменяя БД заставить работать функцию можно только заменив
на последовательность удалений из связанных таблиц, т.е. реализовав каскадное удаление вручную. других, простых путей нет. и дело тут не в коде, он не содержит ограничений, а в необходимости удаления из БД, которое одним DELETE корректно не сделать. Это сообщение отредактировал(а) baldina - 15.10.2013, 15:40 |
|||
|
||||
4ygynOK |
|
|||
Новичок Профиль Группа: Участник Сообщений: 19 Регистрация: 10.10.2013 Репутация: нет Всего: нет |
Сказали что мне надо обрабатывать 3 ситуации, отсюда и 3 возвращаемых результата
1 - объект удален, а значит продолжаем удаление дальше, включая родительский объект 2 - объект не удален, но удаление продолжать (пользователь нажал "продолжить"), а значит продолжаем удаление, но родительский не удаляем 3 - объект не удален и удаление прервать (пользователь нажал "не продолжать") - прервать вообще операцию удаления. и все это надо запихнуть в этот код
Вот как-то так. Мозги набекрень. |
|||
|
||||
4ygynOK |
|
|||
Новичок Профиль Группа: Участник Сообщений: 19 Регистрация: 10.10.2013 Репутация: нет Всего: нет |
При всем при этом вот этот код хороший:
но как сказал мне на него начальник он некрасивый и работает только до каталогов вложенности 2. и надо сделать чтобы работал при любой вложенности. либо сделать с одним параметром DeleteDir(DWORD BUGO_Id) но тогда необходимо возвращать 3 значения. |
|||
|
||||
4ygynOK |
|
|||
Новичок Профиль Группа: Участник Сообщений: 19 Регистрация: 10.10.2013 Репутация: нет Всего: нет |
Спасибо всем, решение прилагаю:
|
|||
|
||||
![]() ![]() ![]() |
Правила форума "C/C++: Для новичков" | |
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Для новичков | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |