Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / "Database not in edit or insert mode" Error (( / 25 сообщений из 27, страница 1 из 2
17.12.2004, 12:43
    #32832090
maxtar
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
"Database not in edit or insert mode" Error ((
Код: plaintext
1.
2.
3.
4.
5.
OraQuery4->SQL->Text="select * from preps where preps_name='"+DBGridEh1->Fields[0]->Text+"'";
OraQuery4->ExecSQL();
OraQuery4->First();
DBGridEh1->Fields[ 2 ]->Text=OraQuery4->FieldByName("preps_pack_vew")->AsString;
//Edit1->Text=OraQuery4->FieldByName("preps_pack_vew")->AsString;
OraQuery4->Close();

В Обычный едит вставляет, а в грид не хочет (
...
Рейтинг: 0 / 0
17.12.2004, 12:49
    #32832117
zalexaka
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
"Database not in edit or insert mode" Error ((
DBGridEh1 у вас привязан к датасету, который не в едит ор инсерт моде.
Отсюда и ошибка.
ЗЫ
странный у вас какой то подход в работе с DB-aware компонентами, иль я чё не понимаю
...
Рейтинг: 0 / 0
17.12.2004, 12:55
    #32832125
maxtar
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
"Database not in edit or insert mode" Error ((
Возможно и странный подход но другого подхода найти не смог! Этот квери возращает одну лишь всего запись для вставки в поля грида уже определенных значений из другой таблицы! А сам грид связан с другим датасетом!
Пробовал все где видел в свойствах ЕДИТ или ИНСЕРТ поставить в тру (тоже странный подход) )) Но никаких сдвигов (
...
Рейтинг: 0 / 0
17.12.2004, 12:56
    #32832132
Steppenwulf
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
"Database not in edit or insert mode" Error ((
OraQuery4->First();
OraQuery4->Edit();
...
Рейтинг: 0 / 0
17.12.2004, 12:57
    #32832133
13th_apostle
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
"Database not in edit or insert mode" Error ((
zalexakaстранный у вас какой то подход в работе с DB-aware компонентами, иль я чё не понимаю
а в чем именно выражается странность? сорри, просто у меня примерно тот же подход. и если он не оптимальный, хотелось бы знать =)).
...
Рейтинг: 0 / 0
17.12.2004, 13:00
    #32832142
zalexaka
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
"Database not in edit or insert mode" Error ((
maxtarВозможно и странный подход но другого подхода найти не смог! Этот квери возращает одну лишь всего запись для вставки в поля грида уже определенных значений из другой таблицы! А сам грид связан с другим датасетом!
Пробовал все где видел в свойствах ЕДИТ или ИНСЕРТ поставить в тру (тоже странный подход) )) Но никаких сдвигов (
сдвиг произойдёт когда вы перед:
Код: plaintext
DBGridEh1->Fields[ 2 ]->Text=OraQuery4->FieldByName("preps_pack_vew")->AsString;
вызовете Insert или Edit метод датасета к которому привязан ваш DBGridEh1.
Удачи.
...
Рейтинг: 0 / 0
17.12.2004, 13:01
    #32832146
maxtar
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
"Database not in edit or insert mode" Error ((
автор
OraQuery4->First();
OraQuery4->Edit();

Никаких изменений! Да и Не причем тут это! Квери тока возврщает строку которая в обычные Едитбокс вставляется а в грид не хочет! Причем руками если изменять данные в гриде то ничего не говорит!
...
Рейтинг: 0 / 0
17.12.2004, 13:31
    #32832218
maxtar
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
"Database not in edit or insert mode" Error ((
2Zalexaka
Сдвиг произошол... ошибка больше не вылетает... только тупит както. Курсор с часами и надписью скуэль висит, все нажимается работает, но через некоторое время вылетает с другой ошибкой, и в памяти до 48мегов вырастает... ->Edit() Может както нужно закрывать?

А вообще Есть ли другой способ сделать то что я делаю. Недавно писал, видимо не совсем понятно написал. Нужно заполнять грид наполовину из другой таблицы, и получается что при каждой новой строке приходится обращаться к базе. Как это при плохом коннекте то будет?

Вопросов куча..... (
...
Рейтинг: 0 / 0
17.12.2004, 15:20
    #32832608
softwarer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
"Database not in edit or insert mode" Error ((
maxtarВозможно и странный подход но другого подхода найти не смог! Этот квери возращает одну лишь всего запись для вставки в поля грида уже определенных значений из другой таблицы! А сам грид связан с другим датасетом!
Хм. Видите ли, есть паттерн Model - View - Controller. Так вот, DBGrid - это View, а Ваши изменения данных нужно выполнять в модели, то есть в DataSet-е, питающем грид.

maxtarА вообще Есть ли другой способ сделать то что я делаю. Недавно писал, видимо не совсем понятно написал. Нужно заполнять грид наполовину из другой таблицы, и получается что при каждой новой строке приходится обращаться к базе. Как это при плохом коннекте то будет?
Если сейчас Вы сформулировали хорошо - то правильным будет написать SQL-запрос, который возвращает нужный Вам набор "слитых" записей из двух таблиц.
...
Рейтинг: 0 / 0
17.12.2004, 15:51
    #32832691
maxtar
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
"Database not in edit or insert mode" Error ((
автор
Хм. Видите ли, есть паттерн Model - View - Controller. Так вот, DBGrid - это View, а Ваши изменения данных нужно выполнять в модели, то есть в DataSet-е, питающем грид.


Это понятно. Вопрос в том, что в грид нужно ввести какието данные чтобы записать в таблицы, половина данных должна вставиться из другой таблицы в зависимости от значения первого поля, но строго одна строка, другая половина вводится вручную и высчитывается из того что ввели вручную и из того что вставилось из второй таблицы! Ух! Запутал наверное опять. Вот, а всталять тем образом, которй я изложил выше, не дает.

авторЕсли сейчас Вы сформулировали хорошо - то правильным будет написать SQL-запрос, который возвращает нужный Вам набор "слитых" записей из двух таблиц.

Так сейчас и есть! Информация из этого запроса служит для рассчета значений других ячеек в соответствии с тем что введено вручную! А получается что для каждой строки будет отсылаться запрос на сервер (связь может быть модемная). Вопрос в том сколько будет ждать пользователь после выбора значения!

Большое спасибо за ответы! И извините если окончательно запутал )
...
Рейтинг: 0 / 0
17.12.2004, 16:49
    #32832822
maxtar
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
"Database not in edit or insert mode" Error ((
Господа, в общем один вопрос. Как вставить в ячейку грида значение из другого датасета, не в базу, не в датасет, просто чтобы это значение отображалось?
...
Рейтинг: 0 / 0
17.12.2004, 16:59
    #32832842
softwarer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
"Database not in edit or insert mode" Error ((
maxtar softwarerХм. Видите ли, есть паттерн Model - View - Controller.

Это понятно. Вопрос в том, что в грид нужно ввести какието данные чтобы записать в таблицы,
Уже не так. Данные в любом случае вводятся в модель - в DataSet. Он может получить их запросом, после чего в них могут быть внесены изменения, методом Edit/Assignment/Post.

Давайте я попробую описать две вещи, а Вы решите, какую из них Вы имеете в виду.

Во-первых, в лучшем случае Вы имеете в виду операцию lookup. Выглядит это примерно так: у Вас есть данные в гриде, Вы их редактируете, и нажимаете, допустим, на кнопку "Договор". Выскакивает список договоров, Вы выбираете нужный, и в результате в Ваши данные подставляются id договора, а также куча вторичных полей - номер, тип, контргагент, дата и так далее - все, что Вы хотите показать в гриде по этому договору.

Делается это именно что описанным выше образом - Edit(если нужен) -копирование значения полей - Post (если нужен).

В худшем же случае Вы имеете в виду следующее: Вам нужно получить сводную информацию (например, из таблиц "Договор" и "Контрагент"), Вы сделали запрос к таблице "Договор" и теперь к каждой ее строке хотите присобачить результат запроса к таблице "Контрагент".

Это делается именно что sql-запросом к двум таблицам.
...
Рейтинг: 0 / 0
17.12.2004, 17:01
    #32832846
softwarer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
"Database not in edit or insert mode" Error ((
maxtarГоспода, в общем один вопрос. Как вставить в ячейку грида значение из другого датасета, не в базу, не в датасет, просто чтобы это значение отображалось?
Никак. DBGrid отображает данные, находящиеся в датасете. Точка.

На самом деле, конечно, можно. Есть много инструментов для решения задач. Опишите задачу, которую Вы решаете - не "как вставить", а что Вы вообще хотите сделать.
...
Рейтинг: 0 / 0
17.12.2004, 17:56
    #32832939
maxtar
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
"Database not in edit or insert mode" Error ((
авторВо-первых, в лучшем случае Вы имеете в виду операцию lookup. Выглядит это примерно так: у Вас есть данные в гриде, Вы их редактируете, и нажимаете, допустим, на кнопку "Договор". Выскакивает список договоров, Вы выбираете нужный, и в результате в Ваши данные подставляются id договора, а также куча вторичных полей - номер, тип, контргагент, дата и так далее - все, что Вы хотите показать в гриде по этому договору .

Почти! Ввод товаров в накладную:
Есть грид, но он пустой. В первом поле находится комбобокс, значения пиклиста которого загоняются при открывании формы запросом к таблице товаров (в которой как раз и находятся все характеристики цена, производитель и тд) и выбором одного столбца с наименованием. Пользователь вводя в накладную новую позицию выбирает из этого комбобокса значение, тоесть наименование товара, и после того как он выходит из ячейки, другие ячейки грида, такие как цена за единицу, имя упаковки, сколько штук в упаковке и тп, должны принять значения соответстнно записи в таблице с товарами. А еще есть такие ячейки, в которые нужно вводить руками, например "количество заказываемого товара", и после ввода в это поле считается ячейка общей суммы за эту позицию, а уже потом можно заносить все в таблицу.
Таблиц тут три. Первая "накладная" содержит информацию о самой накладной, такую как: ее номер, кому, от кого, и т.д.
Вторая "запись в накландой" содержит как раз товары из таблицы товаров, и связанная с "накладная" по полю номера накладной.

Вот такая вот ситуаци! Очень благодарен Вам за участие в решении моей проблемы!
...
Рейтинг: 0 / 0
17.12.2004, 18:26
    #32832990
softwarer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
"Database not in edit or insert mode" Error ((
Тогда ситуация такова. На уровне "для чайников" борландеры предлагают для этого хрень, которая называется lookup fields. Делается она примерно так: делаете dataset с запросом к таблице товаров, а в dataset-е позиций накладной в визуальном редакторе создаются эти самые поля, которым указан lookup dataset и что и как из него выбирать.

Механизм вообще-то дрянной, переоткрывающий lookup dataset по каждому чиху и соответственно, сильно тормозящий. В то же время, полагаю, его можно использовать, если данные из таблицы товаров загнать в память - например, использовав TClientDataSet.

Более же обычное решение - именно что то, что я написал в предыдущем письме. То есть примерно то же, что делаете Вы, но работа непосредственно с DataSet-ом. И нужно обратить внимание на состояние датасета и логику, которую Вы хотите "зашить". Тут есть два варианта: либо операция "выбрать товар" должна быть недоступна, пока не начато редактирование, либо же код должен проверять состояние датасета, и при необходимости делать Edit.
...
Рейтинг: 0 / 0
20.12.2004, 14:49
    #32835019
maxtar
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
"Database not in edit or insert mode" Error ((
С гридом все понятно... Но так и остался вопрос открытым, как присваивать ячейкам значения не изменяя набора данных. Так сказать подготовить данные к вставке в таблицу! Можно ли для этих целей использовать StringGrid?
...
Рейтинг: 0 / 0
20.12.2004, 17:14
    #32835495
maxtar
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
"Database not in edit or insert mode" Error ((
Все нормально... изменяя ОраКвери сам! Просто код висел на отрисовке ячейки и он вис... Повесил на ОнАпдэйт, теперь тормозит сам запрос, тоесть выполняется, но с предыдущим значением Where. Собственно вот этот код:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
void __fastcall TForm4::DBGridEh1Columns0UpdateData(TObject *Sender,
      AnsiString &Text, Variant &Value, bool &UseText, bool &Handled)
{
/////////////////////Âñòàâêà ñâîéñòâ ïðåïàðàòà â ïîëÿ/////////////////////////
OraQuery4->SQL->Text="select * from preps where preps_name='"+DBGridEh1->Fields[0]->Text+"'";
OraQuery4->ExecSQL();
OraQuery4->First();
Edit1->Text=OraQuery4->SQL->Text;
OraQuery2->Edit();
OraQuery2->FieldByName("NAKL_KOROB_VIEW")->Text=OraQuery4->FieldByName("preps_pack_vew")->AsString;
OraQuery2->FieldByName("NAKL_ITEM_COST")->Text=OraQuery4->FieldByName("preps_cost")->AsFloat;
//OraQuery2->Prepare();
OraQuery4->SQL->Clear();
OraQuery4->Close();
/////////////////////////////////////////////////////////////////////////////
}

И еще один вопрос! Как скажется на скорости работы обращение к базе при вводе каждой новой строки?
...
Рейтинг: 0 / 0
21.12.2004, 10:51
    #32836314
Alex_VC
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
"Database not in edit or insert mode" Error ((
Не знаю, как делает большинство, а я делаю примерно так:
1) При добавлении нового материала (или изменении существующей позиции)
вызывается диалоговое окошко, в котором заполняются (изменяются) необходимые реквизиты . В поле, где необходимо указать материал, вводится сторка (контекстная). Далее по этому контексту строки выбирается список материалов (если в комбобокс грузить сразу весь справочник, то будет тормозить, если справочник большой) из которого пользователь выбирает необходимый. При выборе материала догружаются доп данные по материалу в поля диалогового окошка (через sql-запрос)
2) Для сохранения данных в БД использую хранимую процедуру, в которую передаю необходимые параметры. В хранимой процедуре также осуществляется необходимый контроль за коррекностью введенных данных.
3) В случае успешной транзакции изменения данных, обновляю рекордсет (ну и грид тоже с последующим позиционированием на добавленной(измененной) записи)
...
Рейтинг: 0 / 0
21.12.2004, 11:33
    #32836452
maxtar
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
"Database not in edit or insert mode" Error ((
2 Alex_VC
Все тоже самое, только в гриде! Вопрос в том как долго будут именно догружаться при, допустим, плохой модемной связи (~24 кб\с). Очень интересно было бы услышать от Вас (если конечно используется удаленное соединение).
Мне кажется что это наиболее правильно... Но тетеньки за 4 года настолько привыкли, что по иному, мою программу не имеет смысла доводить до конца.

2 all
Вы уж меня простите но вопрос за вопросом.
На рисунке (если присоединился) Поле 1 является первичным ключом для таблицы с общей информации по накладной, Поле 2 это форейн кей в таблице с записями в накладной. При добавлении новой накладной сначала вводится информация общая, а позиции вводятся в грид. Проблема в том что общая информация не заносится в таблицу с накладными, в то время как при вводе в грид записи вставляются сразу, из-за чего возникает нарушение целостности по общему ключу, типа нет записи с таким NAKL_NUM. Пуду очень благодарен за советы! И извените если все это флуд! Спросить больше не укого!
...
Рейтинг: 0 / 0
21.12.2004, 13:20
    #32836802
Guest?
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
"Database not in edit or insert mode" Error ((
я не понел ты добавление прямо на гриде делаеш ?
лучше всего по моему метод который описал Алекс_ВС .. а грид я бы на твоем месте только для чтения сделал бы .. поменьше проблем будет ;) (можно дополнительно еще и таблицу только для чтения сделать но через модемную связь думаю добавить новые данные тогда медленнее будуть .. и тем более нужно кешировать данные а потом апдейт сделать ;))
с уважением
...
Рейтинг: 0 / 0
21.12.2004, 14:13
    #32836972
maxtar
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
"Database not in edit or insert mode" Error ((
авторя не понел ты добавление прямо на гриде делаеш ?
Да! Вот и возникают вопросы. Это совсем плохая практика? Лучше делать диалоговое окно на каждую строку? А в нем уже все подсчеты делать? Вообще, так делает ктонибудь? Ой ужас сколько вопросов.... Там ведь что вводится руками так это только количество коробок, откуда геморой может быть? Все, я окончательно запутался! Может кто скажет как реализуется данная задача. Она ведь, на мой взгляд, самая распространенная!
Спасибо!
...
Рейтинг: 0 / 0
21.12.2004, 16:22
    #32837411
softwarer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
"Database not in edit or insert mode" Error ((
maxtarС гридом все понятно... Но так и остался вопрос открытым, как присваивать ячейкам значения не изменяя набора данных. Так сказать подготовить данные к вставке в таблицу! Можно ли для этих целей использовать StringGrid?
Можно, но редко когда нужно. Поскольку именно набор данных представляет кэш, готовящий данные к вставке в удаленную таблицу. Можно повторить этот код самостоятельно, но смысла в этом я не вижу.

maxtarИ еще один вопрос! Как скажется на скорости работы обращение к базе при вводе каждой новой строки?
При вводе - скорее всего, непринципиально. Проблемы будут при обращениях для отображения информации.

Кстати, я вроде бы уже говорил насчет параметров. Так Вы здорово тормозите сервер и закладываете возможность ошибки, включая взлом Вашей программы через SQL Injection).

maxtarДа! Вот и возникают вопросы. Это совсем плохая практика? Лучше делать диалоговое окно на каждую строку?
Зависит от данных и требуемого функционала. В общем, чем больше навешано в этом месте - тем больше смысла делать отдельное окно.
...
Рейтинг: 0 / 0
22.12.2004, 07:46
    #32838089
Guest?
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
"Database not in edit or insert mode" Error ((
я бы сделал отдельно ;) проблем будеть меньше ...
...
Рейтинг: 0 / 0
22.12.2004, 10:45
    #32838441
Alex_VC
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
"Database not in edit or insert mode" Error ((
Насчет скорости работы по удаленному (модемному) соединению: тут либо надо использовать что-то типа терминального сервера: у пользователя установлен терминал, запускающий Вашу программу на сервере (по сетке гоняются только экраны, все вычисления - на сервере), либо написать свое приложение типа клиент-сервер с оговоренными выше способностями, ну или организовать это дело в виде web-приложения (все формы - в виде страничек, - обработка - на сервере). Все это - в режиме реального времени.
Можно организовать оффлайн (например, через какие-то буфера, которые потом подкачиваются в основную БД). Но здесь возникает проблема с синхронизацией данных (долговременные транзакции, их обработка и т.д.).
Вообщем, заморочки будут везде.
...
Рейтинг: 0 / 0
22.12.2004, 11:17
    #32838563
Guest?
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
"Database not in edit or insert mode" Error ((
кстати можеш для клиент сервера юзать Interbase обычно поставляется вместе с бильдером какая то версия .. но если подключений будеть больше 5 нужна будеть тебе лицензию приобрезти..

из того что сами делали ;)
или какую то прогу писали что бы обработал запросы на стороне сервера (обычно) редко как страницы на веб сервере ;)
...
Рейтинг: 0 / 0
Форумы / C++ [игнор отключен] [закрыт для гостей] / "Database not in edit or insert mode" Error (( / 25 сообщений из 27, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]