Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 2 292

/ вопрос решён /

Здравствуйте! Уважаемые эксперты нужна помощь по работе INterBase
пытаюсь значения с Dbgrid2 закинуть в базу gdb. Нужно сделать в цикле!
Проблема - создает одну строчку показывает ее в привязанной Dbgrid1, записывает туда данные, но не сохраняет в конечной базе. Плюс к этому не продолжает цикл выдает ошибку. Посоветуйте, что можно сделать

procedure TForm1.Button1Click(Sender: TObject);
begin
Query1.Active:=true;
IBTable1.Active:=true;
//while dbgrid2.DataSource.DataSet.Eof<>true do begin
IBTable1.Insert;
IBTable1.Fields[0].AsString:=dbgrid2.Fields[0].AsString;
IBTable1.Fields[1].AsInteger:=dbgrid2.Fields[1].asInteger;
IBTable1.Fields[2].AsString:=dbgrid2.Fields[2].AsString;
IBTable1.Fields[3].AsDateTime:=dbgrid2.Fields[3].AsDateTime;
//dbgrid2.DataSource.DataSet.Next;
//end;
IBTable1.post;
IBTable1.Active:=false;
showmessage('sdfgdgfdg');
end;

grom_rk Вопрос решён, но можно продолжить его обсуждение в мини-форуме

Вопрос задал: grom_rk (статус: Посетитель)
Вопрос отправлен: 10 января 2009, 22:15
Состояние вопроса: решён, ответов: 2.

Ответ #1. Отвечает эксперт: Вадим К

Здравствуйте, grom_rk!
Важная ошибка номер раз:
с DBGrid'a данные брать нельзя. Он только для отображения. То что вы нашли обходной путь ещё не значит, что так можно.
Данные надо брать с компонентов типа Table/Query, с которого через DataSource берет их и грид.
Важная ошибка номер два:
Судя по коду, новую запись вставили, поля в ней заполнили, а кто скажет "записывай, готово" вовремя? Когда происходит Next, то текущая не подтверждённая запись удаляется. У Вас то Post (Это и есть то подверждение) есть, но он мало того, что после Next находиться, так ещё и вне цикла... Нужно его поставить как минимум перед Next. И конечно, обращаться к этим методам не через DBGrid, а напрямую.
Мелкая, хоть и не ошибка, но засмеют:

while dbgrid2.DataSource.DataSet.Eof<>true do begin
Это называется "индуский код". И говорит о том, что не знаете базового синтаксиса паскаля. Самого базового. Судя по коду, его можно сократить, итого код будет выглядеть где то так:
procedure TForm1.Button1Click(Sender: TObject);
begin
  Query1.Active:=true;
  IBTable1.Active:=true;
  while not Query1.Eof do begin
    IBTable1.Insert;
    IBTable1.Fields[0].AsString:=Query1.Fields[0].AsString;
    IBTable1.Fields[1].AsInteger:=Query1.Fields[1].asInteger;
    IBTable1.Fields[2].AsString:=Query1.Fields[2].AsString;
    IBTable1.Fields[3].AsDateTime:=Query1.Fields[3].AsDateTime;
    IBTable1.Post;
    Query1.Next;
  end;
  showmessage('sdfgdgfdg');
end;
Предупреждаю, это набросок кода. и его стоит расценивать только как руководство к действию.
И маленькое замечание. к полям лучше обращаться по имени, а не по индексу. Надёжность повышается. А то потом придётся ломать голову, как эти данные туда попали...

Ответ отправил: Вадим К (статус: Академик)
Время отправки: 11 января 2009, 00:17
Оценка за ответ: 5

Ответ #2. Отвечает эксперт: ANBsoft

Здравствуйте, grom_rk!
Я так понимаю, что это продолжения вопроса 2291, я сбросил там пример импортера , а здесь приведу только тело цикла (привязку компонентов посмотрите в проекте):
Query.First;
while Not Query.EOF do begin
IBQuery.Insert;
//Далее заполняете все нужные Вам поля
IBQuery.FieldByName('FlagDel').AsInteger:=Query.FieldByName('Vhod').AsInteger;
//и так все нужные поля ...
IBQuery.Post;
Query.Next;
end;
IBQuery.Close;
IBQuery.Open;

Ответ отправил: ANBsoft (статус: Студент)
Время отправки: 11 января 2009, 00:48
Оценка за ответ: 5

Комментарий к оценке: Огромное спасибо, Александр Николаевич!!! Вы решили проблему (IMPORT.zip) за мизерное кол.-во времени, когда как мы мучились с ним целый день... Все работет!...
Правда были маленькие проблемы с кодировкой русских шрифтов, но они разрешились быстро...

Вы сумели с точностью оценить ситуацию, РАХМЕТ (спасибо на нашем языке :)

Мини-форум вопроса

Всего сообщений: 4; последнее сообщение — 11 января 2009, 01:09; участников в обсуждении: 2.
grom_rk

grom_rk (статус: Посетитель), 11 января 2009, 00:37 [#1]:

все равно не работает.
1. В DBgride показывает только одну вставленную строчку, которая еще не сохраняется в gdb базе.
2. После первой строчки цикл останавливается с ошибкой!!!
Вадим К

Вадим К (статус: Академик), 11 января 2009, 00:51 [#2]:

С какой ошибкой. У меня иногда с телепатией сложно. Хотя возможно вы транзакции сделали неавтоматические - тут уже отдельная история.
Галочка "подтверждения прочтения" - вселенское зло.
grom_rk

grom_rk (статус: Посетитель), 11 января 2009, 01:02 [#3]:

Ошибка:

Проект вызвал исключение исключение класса EIBInterbaseError с сообщением 'arithmetic exception, numeric overflow, or string truncation
Cannot transliterate character between character sets'. Процесс остановлен. Используйте Шаг и Запуск для продолжения.
Вадим К

Вадим К (статус: Академик), 11 января 2009, 01:09 [#4]:

Ну так проблема у Вас персонально, код не при чем. Что именно не понравилось - надо смотреть, хотя интербейз уже подсказал - либо кодировка не совпадает, либо не может преобразовать что то. Например пробуете сохранить строку, которая длинее, чем место под неё в базе.
Галочка "подтверждения прочтения" - вселенское зло.

31 января 2011, 19:33: Статус вопроса изменён на решённый (изменил модератор Ерёмин А.А.): Автоматическая обработка (2 и более ответов с оценкой 5)

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 22 февраля 2025, 11:57
Выполнено за 0.03 сек.