Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Переделать с использование SQL-запроса 
:(
    Опции темы
NieL
Дата 11.9.2008, 09:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 214
Регистрация: 10.2.2008

Репутация: нет
Всего: 1



Как сделать добавление в 2 таблицы с помощью SQL запроса

Код

function Tdatamodule_Connection.AddItems(SectionIds: string): Integer;
var
  ListSections: TStrings;
  ItemId, i: Integer;
begin
  Result := -1;
  if ConnectionStatus = csConnected then
    with cmp_Table_ do begin
      ListSections := TStringList.Create;
      try
        ListSections.Text := StringReplace(SectionIds, ',', #13#10, [rfReplaceAll]);
        Open;
        try
          // сделать при помощи SQL _запроса ------------------------------------------------------------------------------
          Append;
          FieldByName(const_field_primer_id).Value := ListSections[0];
          FieldByName(const_field_group_id).Value := 16384;
          Post;
          ItemId := FieldByName(const_field_item_id).AsInteger;
          for i := 1 to ListSections.Count - 1 do
              cmp_Query_.SQL.Text := 'INSERT INTO CONTENT (CONTANER_ID, CONTENT_ID, CONTENT_TYPE) VALUES (' + ListSections[i] + ', ' + IntToStr(ItemId) + ', 1)';
//----------------------------------------------------------------
cmp_Query_.ExecSQL;

          Result := ItemId;
        except
          Cancel;
        end;
      finally
        FreeAndNil(ListSections);
      end;
    end
  else
    GetLastError(def_MessageError);
  FSelectionStatus := ssByKey;
end;


PM MAIL   Вверх
morpheyushka
Дата 11.9.2008, 10:11 (ссылка) |  (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Зеленый человек
**


Профиль
Группа: Участник
Сообщений: 563
Регистрация: 26.2.2008
Где: Киев

Репутация: нет
Всего: 8



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

with Query do
 begin
  Close;
  SQL.Clear;
  SQL.Add('exec MyProcedure :Value11, :Value12, :Value13, :Value21, :Value22');
  Parameters.ParamByName('Value11').Value := Peremen1;
  Parameters.ParamByName('Value12').Value := Peremen2;
  Parameters.ParamByName('Value13').Value := Peremen3;
  Parameters.ParamByName('Value21').Value := Peremen4;
  Parameters.ParamByName('Value22').Value := Peremen5;
  ExecSQL;
 end;


 MyProcedure - процедура, которую ты напишешь
 Value11, Value12, Value13... - параметры процедуры
 Peremen1...Peremen5 - то что ты собираешься вставить

Если имена таблиц меняются - можно еще и их передавать попробывать


Ну или как вариант исправить твой код smile 
Код

          for i := 1 to ListSections.Count - 1 do
            begin
              cmp_Query_.Close;
              cmp_Query_.SQL.Clear;
              cmp_Query_.SQL.Text := 'INSERT INTO CONTENT (CONTANER_ID, CONTENT_ID, CONTENT_TYPE) VALUES (' + ListSections[i] + ', ' + IntToStr(ItemId) + ', 1)';
              cmp_Query_.ExecSQL;
            end;


PS Процедура не так сервак загружать будет smile 

Это сообщение отредактировал(а) morpheyushka - 11.9.2008, 10:13


--------------------
user posted image
Спасибо делается вот так!!!
PM MAIL WWW   Вверх
pseud
Дата 11.9.2008, 11:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Экспёрт Тыдыщ
***


Профиль
Группа: Завсегдатай
Сообщений: 1175
Регистрация: 18.5.2007
Где: Минск, Беларусь

Репутация: 16
Всего: 40



morpheyushka, 
Код

  SQL.Add('exec MyProcedure :Value11, :Value12, :Value13, :Value21, :Value22');

опять ты MS SQL вспомнил, а я ща по оракловому напишу или по информиксовому.

NieL, какая СУБД? от этого будет зависеть определение ID записи для заполнения дочерних записей.


--------------------
Испытание чужого терпения можно считать успешным, если оно лопнуло...
PM MAIL   Вверх
NieL
Дата 11.9.2008, 11:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 214
Регистрация: 10.2.2008

Репутация: нет
Всего: 1



СУБД DBISAM
PM MAIL   Вверх
pseud
Дата 11.9.2008, 11:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Экспёрт Тыдыщ
***


Профиль
Группа: Завсегдатай
Сообщений: 1175
Регистрация: 18.5.2007
Где: Минск, Беларусь

Репутация: 16
Всего: 40



Цитата(NieL @  11.9.2008,  11:12 Найти цитируемый пост)
СУБД DBISAM

ну в этом деле я - smile
хорошо бы было, чтоб ты подсказал, как в ней id-шники полей создаются (автоинкрементно, по счетчику, сам, иное)

предположим, что автоинкрементно, тогда вот код (не претендующий на полное согласие со стороны окружающих нас гуру):

Код

function Tdatamodule_Connection.AddItems(SectionIds: string): Integer;
var
  ListSections: TStrings;
  ItemId, i: Integer;
begin
  Result := -1;
  if ConnectionStatus = csConnected then
  begin
    ListSections := TStringList.Create;
    try
      ListSections.Text := StringReplace(SectionIds, ',', #13#10, [rfReplaceAll]);
      with TQuery.Create(Self) do
      try
        SQL.Add('INSERT INTO table1 (primer_id, group_id) values (' + ListSections[0] + ', 16384)');
        ExecSQL;
        SQL.Clear;
        SQL.Add('SELECT MAX(item_id) as max_id FROM table1');
        Active := True;
        ItemId := Fields[0].AsInteger;
        for i := 0 to
...
// дальше сам попытайся



--------------------
Испытание чужого терпения можно считать успешным, если оно лопнуло...
PM MAIL   Вверх
NieL
Дата 11.9.2008, 12:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 214
Регистрация: 10.2.2008

Репутация: нет
Всего: 1



Спасибо. То что нужно
PM MAIL   Вверх
NieL
Дата 11.9.2008, 13:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 214
Регистрация: 10.2.2008

Репутация: нет
Всего: 1



Нет.. через MAX все-таки не получится. Так как с базой может работать несколько пользователей одновременно
PM MAIL   Вверх
pseud
Дата 11.9.2008, 14:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Экспёрт Тыдыщ
***


Профиль
Группа: Завсегдатай
Сообщений: 1175
Регистрация: 18.5.2007
Где: Минск, Беларусь

Репутация: 16
Всего: 40



Цитата(NieL @  11.9.2008,  13:59 Найти цитируемый пост)
Нет.. через MAX все-таки не получится. Так как с базой может работать несколько пользователей одновременно

1. поддреживаются ли процедуры?
2. имеются ли счетчики (в Oracle - это Sequence)?

Добавлено через 5 минут и 26 секунд
кстати вероятность нарваться на запись, добавленную другим пользовтелем между ExecSQL и Active := True
не то что стремится, а тождественна нулю



--------------------
Испытание чужого терпения можно считать успешным, если оно лопнуло...
PM MAIL   Вверх
NieL
Дата 11.9.2008, 14:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 214
Регистрация: 10.2.2008

Репутация: нет
Всего: 1



Процедуры поддерживаюся и счетчики имеются. Видимо без написания хранимой процедуры тут не обойтись.
PM MAIL   Вверх
pseud
Дата 11.9.2008, 14:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Экспёрт Тыдыщ
***


Профиль
Группа: Завсегдатай
Сообщений: 1175
Регистрация: 18.5.2007
Где: Минск, Беларусь

Репутация: 16
Всего: 40



Цитата(NieL @  11.9.2008,  14:10 Найти цитируемый пост)
Процедуры поддерживаюся и счетчики имеются. Видимо без написания хранимой процедуры тут не обойтись.


1. процедура
тогда в процедуре работа проста:
для добавления - SEQUENCE.NEXTVAL
для определения добавленного ID = SEQUENCE.CURVAL

2. значит есть поддержка транзакций?
=> никто не мешает без процедуры:
  - открыть транзакцию
  - вставить запись
  - определить максимум
  - применить транзакцию



--------------------
Испытание чужого терпения можно считать успешным, если оно лопнуло...
PM MAIL   Вверх
NieL
Дата 11.9.2008, 14:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 214
Регистрация: 10.2.2008

Репутация: нет
Всего: 1



Спасибо за советы буду пробовать.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Базы данных и репортинг"
Vit
Петрович

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами


Обязательно указание:

1. Базы данных (Paradox, Oracle и т.п.)

2. Способа доступа (ADO, BDE и т.д.)


  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • Вопросы по SQL и вопросы по базам данных не связанные с Дельфи задавать здесь

FAQ раздела лежит здесь!


Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Vit, Петрович.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Базы данных и репортинг | Следующая тема »


 




[ Время генерации скрипта: 0.0483 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.