Форум программистов
 
Расширенный поиск
Контакты: о проблемах с регистрацией, почтой и по другим вопросам пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail.

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

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

Ответ
 
Опции темы
Старый 19.11.2015, 12:16   #1
abtat
Пользователь
 
Регистрация: 23.12.2011
Сообщений: 14
Репутация: 10
Плохо 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 в 12:31.
abtat вне форума   Ответить с цитированием
Старый 19.11.2015, 12:33   #2
Stilet
Белик Виталий :)
Профессионал
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Адрес: Украина, Донецкая область, г. Краматорск
Сообщений: 57,961
Репутация: 6799
По умолчанию

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

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

skype: vapaa_mies
По умолчанию

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

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

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

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

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



Опции темы

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

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Групировка записи 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 18:02




22:55.


Powered by vBulletin® Version 3.8.8 Beta 2
Copyright ©2000 - 2017, Jelsoft Enterprises Ltd.

купить трафик


как улучшить посещаемость, а также решения по монетизации сайтов, видео и приложений

RusProfile.ru


Справочник российских юридических лиц и организаций.
Проекты отопления, пеллетные котлы, бойлеры, радиаторы
интернет магазин respective.ru