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

Вернуться   Форум программистов > Delphi > БД в Delphi
Регистрация

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


Донат для форума - использовать для поднятия настроения себе и модераторам

А ещё здесь можно купить рекламу за 25 тыс руб в месяц! ) пишите сюда - alarforum@yandex.ru

Ответ
 
Опции темы
Старый 18.11.2007, 20:14   #1
GloomyVitek
 
Регистрация: 18.11.2007
Сообщений: 4
Репутация: 19
Печаль Проблема при редактировании данных

Доброго времени суток.
Дана БД в Access'е - "Управление информацией о продукте". Т.е. куча таблиц, в которых хранится инфа о прдукте, его классе, месте хранения и т.в.т.
Кинул я компоненты на форму для доступа к БД, натравил их на мою базу, связал таблицы ч/з объектный инспектор, создал форму для редактирования и тут обнаружились следующие проблемы:
1.при редактировании существующей записи БД в списке компонента DBLookupComboBox1 отображается только 1 элемент (хотя в ListSource указана "ссылка" на таблицу со списком элементов);
2.при попытке добавить в эту таблицу (на которую натравлено свойство ListSource компонента DBLookupComboBox1) выдает следующее "Project Project1.exe raised exception class EDatabaseError with message 'Fild 'EdIzmId' cannot bemodifed". Таблица EdIzm с полями EdIzmId и EIEdIzm.

В чем проблема не пойму...
Т.К. таблиц куча информацию по продукту я получаю ч.з. ADOQuery. (Может существует какое-то ограничение, т.к к одной таблице сначала я обращаюсь ч/з запрос, потом по найденному id продукта произвожу редактирование - но уже ч/з ADOTable (с запросами не хотелось связываться из-за их ограничений в Delphi).
GloomyVitek вне форума   Ответить с цитированием
Старый 18.11.2007, 21:50   #2
konkurent
Форумчанин
 
Регистрация: 10.04.2007
Сообщений: 51
Репутация: 39

icq: 498425545
По умолчанию

из ошибки следует что поле 'EdIzmId' не может быть изменено....
в остальном "....информацию по продукту я получаю ч.з. ADOQuery...
потом по найденному id продукта произвожу редактирование - но уже ч/з ADOTable...." приведите фрагмент кода как вы это делаете.
"(с запросами не хотелось связываться из-за их ограничений в Delphi)"
а вот здесь я не соглашусь...тем более под Акцесс через АДО с ADOQuery с ограничениями не сталкивался..Другое дело БДЕ и таблицы дбф..здесь приходиться изварачиваться.
__________________
e-mail=konkurent@gala.net
isq=498425545
konkurent вне форума   Ответить с цитированием
Старый 21.11.2007, 18:06   #3
GloomyVitek
 
Регистрация: 18.11.2007
Сообщений: 4
Репутация: 19
По умолчанию

Цитата:
Сообщение от konkurent Посмотреть сообщение
из ошибки следует что поле 'EdIzmId' не может быть изменено....
в остальном "....информацию по продукту я получаю ч.з. ADOQuery...
потом по найденному id продукта произвожу редактирование - но уже ч/з ADOTable...." приведите фрагмент кода как вы это делаете.
"(с запросами не хотелось связываться из-за их ограничений в Delphi)"
а вот здесь я не соглашусь...тем более под Акцесс через АДО с ADOQuery с ограничениями не сталкивался..Другое дело БДЕ и таблицы дбф..здесь приходиться изварачиваться.
Вот основной запрос по которому я извлекаю данные по продукту:
Код:
SELECT *
FROM NomPoz,EdIzm,Marx,KonstrIzm,HranNomPoz,Oper,RabCentr,TipKI,
        KlassProd,Sklad,SostProd           
WHERE NPEdIzmId=EdIzmId 
        AND NPMarxId=MarxId
        AND MOperId=OperId
        AND MRabCentrId=RabCentrId 
        AND NPKonstrIzmId=KonstrIzmId
        AND KITipId=TipId
        AND NPHranId=HranId
        AND HKlassId=KlassId
        AND HSkladId=SkladId
        AND HSostId=SostId
Данные эти я отображаю в DBGrid'е. Для отображения информации только по конкретному продукту использую процедуру:
Код:
procedure TDataModule2.NomPozDataSourceDataChange(Sender: TObject;
  Field: TField);
begin
  DataModule2.SpecQuery.Active:=false;
  DataModule2.MarxQuery.Active:=false;
  DataModule2.SpecQuery.Parameters.ParamByName('NomPozIdSP').Value:=DataModule2.NomPozQueryNomPozId.AsInteger;
  DataModule2.MarxQuery.Parameters.ParamByName('NomPozIdMP').Value:=DataModule2.NomPozQueryNomPozId.AsInteger;
  DataModule2.SpecQuery.Active:=true;
  DataModule2.MarxQuery.Active:=true;
end;

запрос с параметром следующий:
SELECT *
FROM NomPoz,Marx,Oper,RabCentr
WHERE NomPozId LIKE :NomPozIdMP
     AND NPMarxId=MarxId
     AND MOperId=OperId
     AND MRabCentrId=RabCentrId
Когда я говорил про ограничения при работе с запросами в Delphi, я имел в виду запросы на редактирование, вставку данных в связанных таблицах...
Прога простая, вот только видимо руки не те...
Исходники с БД прикладываю в архиве 'DB.rar' (без exe'шника).

для оформления кода используйте тег [CODE] кнопка # расширенный режим
Вложения
Тип файла: rar DB.rar (47.6 Кб, 15 просмотров)

Последний раз редактировалось Alex21; 21.11.2007 в 18:44.
GloomyVitek вне форума   Ответить с цитированием
Старый 21.11.2007, 18:45   #4
D-mon
Форумчанин
 
Регистрация: 22.06.2007
Адрес: Украина, г. Киев
Сообщений: 414
Репутация: 55
По умолчанию

Как по мне(суто моё мнение, как человека который работает с БД) у тя много лишних таблиц. Попробуй уменьшить их количество и посмотришь что проблема решиться сама собой. И в запросах я бы те посоветовал использовать left|rigth|inner join а не
Цитата:
WHERE NPEdIzmId=EdIzmId
AND NPMarxId=MarxId
AND MOperId=OperId
AND MRabCentrId=RabCentrId
AND NPKonstrIzmId=KonstrIzmId
AND KITipId=TipId
AND NPHranId=HranId
AND HKlassId=KlassId
AND HSkladId=SkladId
AND HSostId=SostId
Легче для понимания и быстрей в работе.
__________________
Нет невыполнимых задач, всё дело времени...
D-mon вне форума   Ответить с цитированием
Старый 21.11.2007, 21:17   #5
GloomyVitek
 
Регистрация: 18.11.2007
Сообщений: 4
Репутация: 19
По умолчанию

Цитата:
Сообщение от D-mon Посмотреть сообщение
Как по мне(суто моё мнение, как человека который работает с БД) у тя много лишних таблиц. Попробуй уменьшить их количество и посмотришь что проблема решиться сама собой.
Таблиц действительно много, но, я думаю, дело не в их количестве... Ошибка возникает при попытке, именнно, добавить новую запись в подчиненную (EdIzm) (дочернюю - если я правильно выразился) таблицу, связанную с основной (NomPoz). Это нужно для того, что если при выборе в DBLookupComboBox в списке нет необходимого элемента, можно было его туда оперативно добавить.
Что вы имели в виду
Цитата:
Сообщение от D-mon Посмотреть сообщение
И в запросах я бы те посоветовал использовать left|rigth|inner join а не
вложенные запросы или что-то еще?
GloomyVitek вне форума   Ответить с цитированием
Старый 22.11.2007, 11:38   #6
D-mon
Форумчанин
 
Регистрация: 22.06.2007
Адрес: Украина, г. Киев
Сообщений: 414
Репутация: 55
По умолчанию

Для соединения таблиц правильней использовать синтаксис
Я бы писал так (как пример):
Код:
Select T1.*, T2.* from Table1
left join (select * from Table2)T2 on T1.id=T2.id
left join (select * from Table3)T3 on T2.id=T3.id
а не where. Соединение таблиц таким образом
Цитата:
SELECT *
FROM NomPoz,EdIzm,Marx,KonstrIzm,HranNom Poz,Oper,RabCentr,TipKI,
KlassProd,Sklad,SostProd
WHERE NPEdIzmId=EdIzmId
AND NPMarxId=MarxId
AND MOperId=OperId
AND MRabCentrId=RabCentrId
AND NPKonstrIzmId=KonstrIzmId
AND KITipId=TipId
AND NPHranId=HranId
AND HKlassId=KlassId
AND HSkladId=SkladId
AND HSostId=SostId
дольше работает.
__________________
Нет невыполнимых задач, всё дело времени...
D-mon вне форума   Ответить с цитированием
Старый 22.11.2007, 11:53   #7
D-mon
Форумчанин
 
Регистрация: 22.06.2007
Адрес: Украина, г. Киев
Сообщений: 414
Репутация: 55
По умолчанию

И ещё одно. Названия столбцам таблиц надо давать такие что бы было понятно всем. А то очень сложно понять и разодраться в структуре и дать правильный совет.
И желательно сделать так:
1. 1-на таблица главная, где будут храниться все "ид" параметров из вспомогательных таблиц.
2. Все остальные таблицы будут хранить параметры.
__________________
Нет невыполнимых задач, всё дело времени...
D-mon вне форума   Ответить с цитированием
Старый 23.11.2007, 19:05   #8
GloomyVitek
 
Регистрация: 18.11.2007
Сообщений: 4
Репутация: 19
По умолчанию

Цитата:
Сообщение от D-mon Посмотреть сообщение
Для соединения таблиц правильней использовать синтаксис
Я бы писал так (как пример):
Код:
Select T1.*, T2.* from Table1
left join (select * from Table2)T2 on T1.id=T2.id
left join (select * from Table3)T3 on T2.id=T3.id
а не where. Соединение таблиц таким образом

дольше работает.
Я использовал такой запрос с WHERE потому, что другой я и не знал
Буду благодарен если, если посоветуешь к.-либо не шибко мудреный учебник по SQL (единственное что я изучил, так это справочник по этому языку, который шел на CD с книжкой Библия программиста (Delphi) М. Е. Фленова).
Насчет:
1. имена таблиц я писал по-русски на "транслите", единственная особенность в том, что ч=q, ш=x, щ=xq, ы=w (понимаю изврат, но мне нравится, система называется РИНТ-русский интернет); (EdIzm - единицы измерения, Marx - технологический маршрут, NomPoz - номенклатурная позиция и т.п.)
2. названия полям давал по следующему принципу "ключевое поле" как
"название_таблицыId" (EdIzmId ЕдиницаИзмеренияId), а к названию последующих полей просто добавлял первую(е) букву(ы) имени таблицы (EINaimen поле наименование таблицы ЕдиницыИзмерения). Это все, чтобы при записи запросов не путаться с полями разных таблиц (таблица.поле). Хотя возможно я и неправ.
3.Главную таблицу и дополнительные я пытался составить именно по такому принципу (в главной все ключи, а свойства и т.п. в подчиненых => куча таблиц).
Я благодарен за все советы. Но проблема все же остается. Прога простая, но дело в том, что программист я неочень. До этого я писал БД, но там работа осуществлялась ч.з. BDE и все с грехом пополам работало.
В Access'е я думал проще, но в чем эти грабли - не пойму.
Цитата:
1.при редактировании существующей записи БД в списке компонента DBLookupComboBox1 отображается только 1 элемент (хотя в ListSource указана "ссылка" на таблицу со списком элементов);
2.при попытке добавить в эту таблицу (на которую натравлено свойство ListSource компонента DBLookupComboBox1) выдает следующее "Project Project1.exe raised exception class EDatabaseError with message 'Fild 'EdIzmId' cannot bemodifed". Таблица EdIzm с полями EdIzmId и EIEdIzm.
GloomyVitek вне форума   Ответить с цитированием
Старый 24.11.2007, 19:54   #9
Speeker
Форумчанин
 
Аватар для Speeker
 
Регистрация: 01.12.2006
Адрес: г. Ровно Украина
Сообщений: 239
Репутация: 288

icq: 252342562
skype: Speeker77
По умолчанию

посмотри правиль но ли ты "натравил" DBLookupComboBox1 у меня все работает, с аксесовскими таблицами (как по мне) действительно легче работать
__________________
Програмисты - единственные люди, которым платят за исправления их же ошибок
Speeker вне форума   Ответить с цитированием
Ответ

Опции темы

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

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

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

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Проблема с модулями и дин.структурами данных velgelmina Помощь студентам 1 16.05.2007 06:43
Кракозябры при редактировании таблиц Balvenie БД в Delphi 1 23.04.2007 16:18


23:04.


Powered by vBulletin® Version 3.8.11
Copyright ©2000 - 2019, Jelsoft Enterprises Ltd.