| 
| 
 | Вопрос # 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 (статус: Посетитель)Вопрос отправлен: 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 (статус: Посетитель), 11 января 2009, 00:37 [#1]:все равно не работает. 1. В DBgride показывает только одну вставленную строчку, которая еще не сохраняется в gdb базе.
 2. После первой строчки цикл останавливается с ошибкой!!!
 |  
|   | Вадим К (статус: Академик), 11 января 2009, 00:51 [#2]:С какой ошибкой. У меня иногда с телепатией сложно. Хотя возможно вы транзакции сделали неавтоматические - тут уже отдельная история. Галочка "подтверждения прочтения" - вселенское зло. |  
|   | 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) Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте. |