Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > C++ Builder
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 19.11.2015, 11:16   #1
abtat
Пользователь
 
Регистрация: 23.12.2011
Сообщений: 17
Плохо OleException при корректировке записи в MySQL

Уже много лет (сначала на С++6 и базой на Paradox 7, 9, затем на RadStudio C++ Builder2010 и базой на MySQL) у меня работает мое приложение по учету договоров с издателями на книги и контролю их реализации. Договор на книгу описывают две основные таблицы: Contract и Content, изданий – таблицы Edition и та же Content.
Для ускорения получения справок в таблицах договоров и изданий включены показатели объема книги и количества произведений в ней, хотя это и ведет к некоторой избыточности базы.
В модулях предусмотрена возможность корректировки количества произведений и объема договора или издания при изменении его состава, для чего используется достаточно очевидная процедура типа
Код:
	if (BooksModule->ContractTbl->Locate("ContractKey", ObjectKey,  SearchOptions))
		{
		BooksModule->ContractTbl->Edit();
		BooksModule->ContractTblContractVolume->Value += BooksModule->ContentTblVolume->Value;
		BooksModule->ContractTblContractItems->Value +=1;
		ContractCanPost = true;
		BooksModule->ContractTbl->Post();
		ContractCanPost = false; 
		}
Ошибок при работе этой процедуры не возникало.
Из-за переноса базы данных на другие СУБД и некоторых ошибок в начальном периоде эксплуатации, в записях о старых книгах встречаются ошибки объема и состава. Я решил просканировать таблицу Content и в цикле скорректировать поля Items и Volume в записях таблицы Contract следующей процедурой:
Код:
      while (!BooksModule->ContentTbl->Eof)
	{
	if (BooksModule->ContentTblVolume->IsNull)
		BookVolume = 0;
	else
		BookVolume = BooksModule->ContentTblVolume->Value;
	if (ObjectKey != BooksModule->ContentTblObjectKey->Value)
		{
		if (ObjectKey > 0)
			{
			if (BooksModule->ContractTbl->Locate("ContractKey", ObjectKey, SearchOptions))
				{
				BooksModule->ContractTbl->Edit();
				BooksModule->ContractTblContractVolume->Value = NewVolume;     //*
				BooksModule->ContractTblContractItems->Value = NewItems;         //*
				ContractCanPost = true;
				BooksModule->ContractTbl->Post();
				ContractCanPost = false;
				}
			else
				{
				ShowMessage("Запись договора с ContractKey = " + IntToStr(ObjectKey) + " не найдена");
				}
			}
			NewItems = 0, NewVolume = 0;
			ObjectKey = BooksModule->ContentTblObjectKey->Value;
		}
	NewItems +=1;
	NewVolume += BookVolume;
	BooksModule->ContentTbl->Next();
	}
Если две строчки, помеченные справа //*, существуют, то программа на первом же договоре выставляет ошибку класса EOleException “Не удается найти строку для обновления. Некоторые значения могли быть изменены со времени последнего чтения“. Даже одна строчка корректировки Items вызывает ошибку. Проверял вариант, когда поправки не копятся в отдельных переменных, а суммируются прямо в полях ContractTblContractVolume и ContractTblContractItems. Та же самая ошибка.
Никак не могу понять, в чем может быть причина. В том же модуле, на несколько сотен строк кода раньше при регистрации новой записи таблицы Content эти же поля таблицы Contract корректируются без ошибок кодом, приведенным в начале сообщения. Помогите, кто может!

Я проверял на двух PC под 32-разрядными Windows XP и Windows 7, использовал Rad Studio C++ Builder 2010, MySQL 5.5.25, mysql-connector-ODBC-5.1.6. Поля для Items – short, для Volume – Currency 5.2.

Последний раз редактировалось Stilet; 19.11.2015 в 11:31.
abtat вне форума Ответить с цитированием
Старый 19.11.2015, 11:33   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,792
По умолчанию

А можно узнать, почему ты решил не прибегать в SQL?

И ремарка: BooksModule->ContractTbl->Post(); из цикла я бы вынес вообще. и ContractCanPost убрал бы.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 19.11.2015, 11:54   #3
Vapaamies
Ваш К. О.
Участник клуба
 
Аватар для Vapaamies
 
Регистрация: 26.12.2012
Сообщений: 1,755
По умолчанию

Цитата:
Уже много лет
Вступление многообещающее. Попкорн не пью, запасся чаем. Clipper неистребим.
Vapaamies вне форума Ответить с цитированием
Старый 02.12.2015, 15:22   #4
abtat
Пользователь
 
Регистрация: 23.12.2011
Сообщений: 17
По умолчанию

[QUOTE=Stilet;1553718]А можно узнать, почему ты решил не прибегать в SQL?

Не хотелось писать SQL выражения UPDATE для каждого типа правки, тем более, что создание новых записей каждой таблицы через состояние INSERT компонента TADOTable и одиночная корректировка через состояние EDIT того же компонента идут без замечаний, а в цикле ничего не получается

а относительно организации цикла это несущественно, так как я пробовал разные варианты организации, но это не помогло. Проверил также вместо ->Value использовать ->AsCurrency для объема и ->AsInteger для количества. Также не помогло. Я хотел бы понять, можно ли вообще использовать компонент TADOTable из закладки dbGo для корректировки базы, если да, то с какими ограничениями, если нет, то зачем этот компонент. В документации по MySQL и по C++ Builder я ничего найти не смог.
abtat вне форума Ответить с цитированием
Старый 03.12.2015, 11:17   #5
abtat
Пользователь
 
Регистрация: 23.12.2011
Сообщений: 17
По умолчанию

Цитата:
Сообщение от evg_m Посмотреть сообщение
---------------
ну и что, профессионалы, что-нибудь мне посоветовали бы, а то только зубоскальство
abtat вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Групировка записи MYSQL scalpel PHP 4 09.04.2013 23:06
Ошибка при записи в БД (MySQL) xew БД в Delphi 4 30.03.2012 11:15
Ошибка при удалении записи из БД MySQL DEamON_M БД в Delphi 6 25.02.2012 22:00
Добавление записи в MySql Lokos БД в Delphi 1 23.06.2011 04:52
готовый код!нужна помошь в проверке(корректировке) -ushёl- Помощь студентам 23 13.03.2009 17:02