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

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

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

Здесь нужно купить рекламу за 20 тыс руб в месяц! ) пишите сюда - alarforum@yandex.ru
Без учёта ботов - 20000 человек в день, 350000 в месяц.

Ответ
 
Опции темы
Старый 27.07.2013, 14:41   #1
incoming
 
Регистрация: 27.07.2013
Сообщений: 6
Вопрос StringGrid и Вставка в БД

Доброго времени!

Проблема следующая:
Имеется StringGrid, фиксированный заголовок с обозначением имен столбцов (FixedRows = 1). Нужно, чтобы изо всех строк сетки данные добавлялись в таблицу, не захватывая заголовок сетки. Работаю с FireBird 2.5, XE-2, IBX.
Строки в сетку добавляю так:

Код:
if sg.RowCount > 1 then
    sg.RowCount := sg.RowCount + 1;
Пытаюсь в цикле вызвать хранимую процедуру (простой insert) с параметрами так:

Код под один столбец. В реале их 4.

Код:
    DM.IBSQL1.SQL.Text:=  'execute procedure L_INS(:res)';
    DM.IBSQL1.Transaction.StartTransaction;
    DM.IBSQL1.Prepare;

    for i := 0 to sg.RowCount - 2 do
    begin
      DM.IBSQL1.ParamByName('res').AsInteger :=   StrToInt(sg.Cells[i, 1]);
      DM.IBSQL1.ExecQuery;
    end;
    DM.IBSQL1.Transaction.Commit;
Одна запись добавляется. При добавлении новой строки в сетку и заполнении ее цифрой получаю "Is not a valid integer value".

Как правильно реализовать запись в цикле ? Помогите разобраться.

Заранее благодарен.
incoming вне форума Ответить с цитированием
Старый 27.07.2013, 20:32   #2
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,260
По умолчанию

ну, для начала:
Цитата:
Код:
 for i := 0 to sg.RowCount - 2 do
    begin
      DM.IBSQL1.ParamByName('res').AsInteger :=   StrToInt(sg.Cells[i, 1]);
в StringGrid свойстве Cells сначала указывается СТОЛБЕЦ, потом уже строка.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 27.07.2013, 21:11   #3
incoming
 
Регистрация: 27.07.2013
Сообщений: 6
По умолчанию

Когда заполняю сетку из четырех колонок значениями 1 2 3 4, то этот код выводит их по порядку, как мне и нужно, для сопоставления строк для параметров компонента.

Код:
for i := 0 to sg.ColCount - 1 do
      for j:= 1 to sg.RowCount - 1 do
      begin
       // параметры
      ShowMessage(sg.Cells[i, j]);

      end;
Когда добавляю в сетку еще одну строку, получается:
1 2 3 4
5 6 7 8

код выводит такую очередность сообщений: 1-5, 2-6, 3-7, 4-8

Подскажите, что нужно сделать, чтобы данные из сетки читались построчно, т. е. сначала читаются первая строка с ячейками, после переходило на следующую строку и продолжало читать.
Нужно это для добавления данных в таблицу, в которой 4 колонки. Не могу врубиться. ((
incoming вне форума Ответить с цитированием
Старый 27.07.2013, 21:50   #4
northener
ПШП
Участник клуба
 
Регистрация: 15.07.2013
Сообщений: 1,629
По умолчанию

Цитата:
Сообщение от incoming Посмотреть сообщение
Подскажите, что нужно сделать, чтобы данные из сетки читались построчно, т. е. сначала читаются первая строка с ячейками, после переходило на следующую строку и продолжало читать.
Поменять эти два цикла местами.
northener вне форума Ответить с цитированием
Старый 27.07.2013, 22:57   #5
incoming
 
Регистрация: 27.07.2013
Сообщений: 6
По умолчанию

Спасибо за советы. С выводом сообщения работает )) Но вот теперь с параметрами облом (( Делаю следующее:
Код:
DM.IBSQL1.SQL.Text:=  'execute procedure L_INS(:res, :numfl)';
DM.IBSQL1.Transaction.StartTransaction;

for i := 1 to sg.RowCount - 1 do

      for j:= 0 to sg.ColCount - 1 do
        begin
        
          DM.IBSQL1.ParamByName('res').AsInteger :=   StrToInt(sg.Cells[j, i]);
          DM.IBSQL1.ParamByName('numfl').AsInteger :=   StrToInt(sg.Cells[j, i]);

          {ShowMessage(sg.Cells[j, i]); // Работает как нужно}
  

          DM.IBSQL1.ExecQuery;
        end;

      DM.IBSQL1.Transaction.Commit;
При этом получается, что оба параметра имеют одно значение, после оба параметра имеют второе значение. Записи в таблицу пишутся не так, и еще множатся.

То есть получается:

В сетке:


В БД:



Что нужно сделать, чтобы параметры правильно заполнялись ?
incoming вне форума Ответить с цитированием
Старый 28.07.2013, 00:28   #6
northener
ПШП
Участник клуба
 
Регистрация: 15.07.2013
Сообщений: 1,629
По умолчанию

Значит нужно выкинуть внутренний цикл.
Код:
for i := 1 to sg.RowCount - 1 do
      begin
        
        DM.IBSQL1.ParamByName('res').AsInteger :=   StrToInt(sg.Cells[0, i]);
        DM.IBSQL1.ParamByName('numfl').AsInteger :=   StrToInt(sg.Cells[1, i]);

        DM.IBSQL1.ExecQuery;
      end;
northener вне форума Ответить с цитированием
Старый 28.07.2013, 13:24   #7
incoming
 
Регистрация: 27.07.2013
Сообщений: 6
По умолчанию

Большое спасибо, работает !!! ))
incoming вне форума Ответить с цитированием
Ответ

Здесь нужно купить рекламу за 20 тыс руб в месяц! ) пишите сюда - alarforum@yandex.ru
Без учёта ботов - 20000 человек в день, 350000 в месяц.

Опции темы


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
StringGrid: вставка картинок Grass-snake Общие вопросы Delphi 2 25.10.2011 14:00
Вставка данных в шаблон документа в ячейку Excel из StringGrid artemavd Общие вопросы Delphi 4 29.05.2011 13:49
stringgrid+колесо мыши=>stringgrid.onclick aalleexxaa Общие вопросы Delphi 5 16.02.2011 16:58
Вставка столбца в StringGrid artemavd Общие вопросы Delphi 8 29.07.2008 16:48
Вставка в stringgrid combobox-а. Иван1 Компоненты Delphi 3 25.05.2007 08:12


Проекты отопления, пеллетные котлы, бойлеры, радиаторы
интернет магазин respective.ru
Пеллетный котёл Emtas
котлы EMTAS
Здесь нужно купить рекламу за 7 тыс руб в месяц! )
пишите сюда - alarforum@yandex.ru
ИКС 840