BiTel

Форум BiTel
bgbilling.ru     docs.bitel.ru     wiki.bitel.ru     dbinfo.bitel.ru     bgcrm.ru     billing.bitel.ru     bitel.ru    
Текущее время: 08 июл 2025, 02:47

Часовой пояс: UTC + 5 часов [ Летнее время ]




Начать новую тему Ответить на тему  [ Сообщений: 7 ] 
Автор Сообщение
СообщениеДобавлено: 15 янв 2015, 10:20 
Не в сети

Зарегистрирован: 28 авг 2014, 09:26
Сообщения: 162
Карма: 0
Здравствуйте.

Пытаюсь "в корень" удалить персональный тариф, методом deletePersonalTariff. И вроде как удаляется, но столько мусора остается!! Сам код:
Код:
public void onEvent( Event event1, Setup setup2, ConnectionSet connectionSet3 ) throws Exception {
   print( "Loading ASD ");
   Connection con = setup2.getDBConnection();
   PersonalTariffManager PTM =  new PersonalTariffManager( con );
   PTM.deletePersonalTariff(13896);
}


До удаления ПТ:
Вложение:
0.png


После удаления ПТ:
Вложение:
1.png


Получается метод deletePersonalTariff убирает только одну запись в базе, оставляя за собой кучу мусора! По мойму это не правильно, или я что-то упускаю?


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 15 янв 2015, 11:46 
Не в сети
Разработчик

Зарегистрирован: 08 ноя 2007, 01:05
Сообщения: 8343
Откуда: Уфа
Карма: 238
Это менеджер который удаляет только персональный тариф из одной таблицы. Полной логики по всей очистки там нет..Полная логика есть в нашем action-е, можно его вызвать по http. По хорошему когда-то переделаем его Web-cсервис, тогда будет проще - будете вызывать Web-сервис.

Во такой сейчас у нас код пока в action-е.
Код:
            String error = new TariffTreeBuilder( con ).deleteTree( tariff.getTreeId() );
            if( Utils.notBlankString( error ) )
            {
                throw new BGException( error );
            }
           
            String query = "DELETE FROM contract_tree_link WHERE tree_id=?";
            PreparedStatement ps = con.prepareStatement( query );
            ps.setInt( 1, tariff.getTreeId() );
            ps.executeUpdate();
           
            manager.deletePersonalTariff( id );


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 16 янв 2015, 10:31 
Не в сети

Зарегистрирован: 28 авг 2014, 09:26
Сообщения: 162
Карма: 0
Жаль, конечно, что метод не обходит все "ветки"...

Мне не понятно, зачем ваш код 2 раза удаляет запись из БД?? Для чего?

Потому что у меня deletePersonalTariff( id ), делает String query = "DELETE FROM contract_tree_link WHERE tree_id=?";.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 16 янв 2015, 11:59 
Не в сети
Разработчик

Зарегистрирован: 08 ноя 2007, 01:05
Сообщения: 8343
Откуда: Уфа
Карма: 238
oldb0y писал(а):
Жаль, конечно, что метод не обходит все "ветки"...

Мне не понятно, зачем ваш код 2 раза удаляет запись из БД?? Для чего?

Потому что у меня deletePersonalTariff( id ), делает String query = "DELETE FROM contract_tree_link WHERE tree_id=?";.



Хм..ну совсем...там делается

Код:
DELETE FROM  contract_tree_link  WHERE id=?


Но все равно не совсем понятно зачем вначале удалять по tree_id, потом по id. Этому коду 7 лет ..Причем вначале добавили просто deletePersonalTariff, а потом еще и этот запрос. И произошло это в 2007.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 16 янв 2015, 13:26 
Не в сети

Зарегистрирован: 28 авг 2014, 09:26
Сообщения: 162
Карма: 0
Хм, не совсем понял мысль. Вы согласны что SQL-запрос и метод пытаются удалить одну и ту же запись, просто ищя по разным полям?

Вот как-то так решил проблему с мусором:
Код:
                  String query_d = "SELECT tb0.id,tb1.id FROM contract_tree_link AS tb0 " +
                  "LEFT JOIN module_tariff_tree AS tb1 ON tb0.tree_id = tb1.tree_id " +
                  "WHERE tb0.cid = " + contractId + " AND tb0.title LIKE '%" + like_and_title + "%'";
                  PreparedStatement psd = con.prepareStatement( query_d );
                  ResultSet rsd = psd.executeQuery();

                  int deletePTid = 0;
                  int deleteTree = 0;
                  if( rsd.next() ) { deletePTid = rsd.getInt(1); deleteTree = rsd.getInt(2);}

                  if(deletePTid != 0) {
                     
                     // Удаляем запись тарифного дерева ПТ
                     String dq1 = "DELETE FROM module_tariff_tree WHERE id = ?";
                     PreparedStatement dps1 = con.prepareStatement( dq1 );
                     dps1.setInt( 1, deleteTree );
                     dps1.executeUpdate();

                     // Удаляем непосредственно сами тарифные деревья ПТ
                     String dq2 = "DELETE FROM mtree_node WHERE mtree_id = ?";
                     PreparedStatement dps2 = con.prepareStatement( dq2 );
                     dps2.setInt( 1, deleteTree );
                     dps2.executeUpdate();

                     // Удаляем ПТ
                     PersonalTariffManager PTM =  new PersonalTariffManager( con );
                     PTM.deletePersonalTariff( deletePTid );
                  }


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 16 янв 2015, 14:59 
Не в сети
Разработчик

Зарегистрирован: 08 ноя 2007, 01:05
Сообщения: 8343
Откуда: Уфа
Карма: 238
oldb0y писал(а):
Хм, не совсем понял мысль. Вы согласны что SQL-запрос и метод пытаются удалить одну и ту же запись, просто ищя по разным полям?

Да, согласен. Но не знаю почему так получилось.

oldb0y писал(а):
Вот как-то так решил проблему с мусором:
Код:
                  String query_d = "SELECT tb0.id,tb1.id FROM contract_tree_link AS tb0 " +
                  "LEFT JOIN module_tariff_tree AS tb1 ON tb0.tree_id = tb1.tree_id " +
                  "WHERE tb0.cid = " + contractId + " AND tb0.title LIKE '%" + like_and_title + "%'";
                  PreparedStatement psd = con.prepareStatement( query_d );
                  ResultSet rsd = psd.executeQuery();

                  int deletePTid = 0;
                  int deleteTree = 0;
                  if( rsd.next() ) { deletePTid = rsd.getInt(1); deleteTree = rsd.getInt(2);}

                  if(deletePTid != 0) {
                     
                     // Удаляем запись тарифного дерева ПТ
                     String dq1 = "DELETE FROM module_tariff_tree WHERE id = ?";
                     PreparedStatement dps1 = con.prepareStatement( dq1 );
                     dps1.setInt( 1, deleteTree );
                     dps1.executeUpdate();

                     // Удаляем непосредственно сами тарифные деревья ПТ
                     String dq2 = "DELETE FROM mtree_node WHERE mtree_id = ?";
                     PreparedStatement dps2 = con.prepareStatement( dq2 );
                     dps2.setInt( 1, deleteTree );
                     dps2.executeUpdate();

                     // Удаляем ПТ
                     PersonalTariffManager PTM =  new PersonalTariffManager( con );
                     PTM.deletePersonalTariff( deletePTid );
                  }

я не понял, зачем там сложно ? чем вас

Код:
new TariffTreeBuilder( con ).deleteTree( tariff.getTreeId() );


не устраивает. Проблему в приведенном выше мной куске кода какая? что он пытается делать одно и тоже 2 раза ? - так это не совсем проблема. Или что-то он все-таки не удаляет ? Что именно он не удаляет? Если он что-то не удаляет , то исправим.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 16 янв 2015, 15:48 
Не в сети

Зарегистрирован: 28 авг 2014, 09:26
Сообщения: 162
Карма: 0
stark
Спасибо, что ткнули! Хороший код. Я решил, что эта часть кода не относится к проблеме.

Сейчас, попробую применить.


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 7 ] 

Часовой пояс: UTC + 5 часов [ Летнее время ]


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
cron
POWERED_BY
Русская поддержка phpBB
[ Time : 0.072s | 31 Queries | GZIP : On ]