Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > БД в Delphi
Регистрация

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

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 15.10.2012, 14:51   #1
lutdan
Пользователь
 
Регистрация: 08.01.2008
Сообщений: 47
Вопрос Нужен совет как реализовать изменение+добавление

БД Access. На форме есть StringGrid(GridResult) который выводит данные из adoQuery. Необходимо составить условие так чтобы если уже есть запись в стрингриде, то изменять строки в БД, а если мы добавили еще одну строку просто ее добавляем, а те просто обновляем (Update).
Например. Есть задание (ID=3) для которого нужны детали: Det1,det2,det3. Мы успешно их добавили в базу (таблица request_work):
/ID_req_work/Наименование/количество/ ID_ЗАДАНИЯ/
/1 /Det1 / 10 /3 /
/2 /Det2 / 1 /3 /
/3 /Det3 / 1 / 3 /
т.е. получается у Задания 3 детали.
После некоторого времени мы решили добавить одну деталь(Det4) и изменить количество Det1 на 20 штук. Ввели необходимые данные и нажимаем кнопку. ДОЛЖНО получится:
/ID_req_work/Наименование/количество/ ID_ЗАДАНИЯ/
/1 /Det1 / 20 /3 /
/2 /Det2 / 1 /3 /
/3 /Det3 / 1 / 3 /
/1 /Det4 / 2 /3 /
Получается мы перезаписали старые записи(Det1,det2,det3) и добавили (det4).
Вот и как это реализовать?

Провобoвал реализовать так:
PROVAREQUESTWORK-Query запрос для проверки есть ли такие записи в базе.
idWork- это уникальный номер необходимой детали. (данные берутся с столбца 0 StringGrida)
idRequest-это уникальный номер задания (ID_ЗАДАНИЯ) для которой нужны детали (данные берутся с поля где указан номер работы(dbEdit))
Код:
 n,i:integer;
s:string;
idWR,j, t, w, f, id_requiest :integer;
idWork,idRequest,idRequestWork:string;
begin
...

 if check.Checked=false then exit else
            begin
//ВЫБИРАЕМ ВСЕ ЗАПИСИ для нашего задание (на примере их должно быть 3)
          for j:=0 to FormEditIspolnitel.Gridresult.RowCount do
             begin
             //  idWork:=GridResult.Cells[0,j];  //не происходит чтение,только последнюю строку
               idRequest:= form1.IDZAYAVKI.field.text;
               DataModule2.PROVAREQUESTWORK.Active:=false;
               DataModule2.PROVAREQUESTWORK.SQL.Clear;
               DataModule2.PROVAREQUESTWORK.SQL.Add('Select id,id_req,id_work,ch from request_work where (id_req like :id_request)');
               DataModule2.PROVAREQUESTWORK.Parameters.ParamByName('id_request').Value:=idRequest;
              // DataModule2.PROVAREQUESTWORK.Parameters.ParamByName('id_worknorm').Value:=idWork;
            //   ShowMessage(DataModule2.PROVAREQUESTWORK.SQL.Text);
               DataModule2.PROVAREQUESTWORK.Active:=True;
             end;

// если записи не найдены , то просто добавляем строку
if DataModule2.PROVAREQUESTWORK.RecordCount = 0 then
     begin
           DataModule2.ADOQuery1.Active:=False;
            DataModule2.ADOQuery1.SQL.Clear;
            DataModule2.ADOQuery1.SQL.Add('SELECT * FROM request_work');
            DataModule2.ADOQuery1.Active:=True;
//делаем ID записи
            If DataModule2.ADOQuery1.RecordCount=0 then
                begin
                      idWR:=1;
                end
           else
                begin
                   for t:= 1 to Gridresult.RowCount-1 do
                   begin
                   w:=0;
                   w:=  w+1;
                   DataModule2.ADOQuery1.Active:=False;
                   DataModule2.ADOQuery1.SQL.Clear;
                   DataModule2.ADOQuery1.SQL.Add('SELECT MAX (id) as MAKS FROM request_work');
                   DataModule2.ADOQuery1.Active:=True;
                   idWR:=DataModule2.ADOQuery1.FieldByName('MAKS').AsInteger;
                   idWR:=idWR+w;
                   id_requiest:=Form1.IDZAYAVKI.Field.value;
                 // showmessage(inttostr(id_requiest)); exit;
                   DataModule2.ADOCommand1.CommandText := 'INSERT INTO request_work (id,id_work,'+
                   'id_req,ch) '+
                   'VALUES ('''+IntToStr(idWR)+''','+gridresult.cells[0,t]+','+inttostr(id_requiest)+','+gridresult.cells[2,t]+');';
                   ShowMessage(DataModule2.ADOCommand1.CommandText);
                   DataModule2.ADOCommand1.Execute;
                 end;
      end 

else  // ОБНОВЛЯЕМ ЕСЛИ ЕСТЬ ЗАПИСИ
       begin        
         for j:=0 to FormEditIspolnitel.Gridresult.RowCount do
       DataModule2.EDIT.CommandText := 'UPDATE request_work '+
                 'SET id_work='+Gridresult.cells[0,j]+',id_req='+form1.IDZAYAVKI.field.text+','+
                 ' id_reg='+gridresult.cells[2,t]+'  WHERE request.id='+Form1.IDZAYAVKI.text +';';
                 ShowMessage(DataModule2.EDIT.CommandText);
                 DataModule2.EDIT.Execute;

//обновляем запись
 DataModule2.NewZayavkiQ.Active:=false;
                 DataModule2.NewZayavkiQ.Active:=true;
lutdan вне форума Ответить с цитированием
Старый 15.10.2012, 14:51   #2
lutdan
Пользователь
 
Регистрация: 08.01.2008
Сообщений: 47
По умолчанию

Естественно код не работает. ну возможно вставляет только (если чуть подправить без Update), но не обновляет записи.
Подскажите ГУРУ.
lutdan вне форума Ответить с цитированием
Старый 15.10.2012, 15:27   #3
lutdan
Пользователь
 
Регистрация: 08.01.2008
Сообщений: 47
По умолчанию

Подумал и решил: Удаляем записи где ID_ЗАДАНИЯ, а потом записывает заново:
Цитата:
if check.Checked=false then exit else
begin
for j:= 1 to Gridresult.RowCount-1 do
begin
// idWork:=GridResult.Cells[0,j]; //не происходит чтение,только последнюю строку
idRequest:= form1.IDZAYAVKI.field.text;
DataModule2.PROVAREQUESTWORK.Active :=false;
DataModule2.PROVAREQUESTWORK.SQL.Cl ear;
DataModule2.PROVAREQUESTWORK.SQL.Ad d('Select id,id_req,id_work,ch from request_work where (id_req like :id_request)');
DataModule2.PROVAREQUESTWORK.Parame ters.ParamByName('id_request').Valu e:=idRequest;
// DataModule2.PROVAREQUESTWORK.Parame ters.ParamByName('id_worknorm').Val ue:=idWork;
ShowMessage(DataModule2.PROVAREQUES TWORK.SQL.Text);
DataModule2.PROVAREQUESTWORK.Active :=True;
idRequestWork:=DataModule2.PROVAREQ UESTWORK.FieldByName('id').AsString ;
end;

DataModule2.DELETE.CommandText := 'DELETE FROM request_work WHERE request_work.id_req='+idRequest+';' ;
ShowMessage(DataModule2.DELETE.Comm andText);
DataModule2.DELETE.Execute;

DataModule2.ADOQuery1.Active:=False ;
DataModule2.ADOQuery1.SQL.Clear;
DataModule2.ADOQuery1.SQL.Add('SELE CT * FROM request_work');
DataModule2.ADOQuery1.Active:=True;
If DataModule2.ADOQuery1.RecordCount=0 then
begin
idWR:=1;
end
else
begin
for t:= 1 to Gridresult.RowCount-1 do
begin
w:=0;
w:= w+1;
DataModule2.ADOQuery1.Active:=False ;
DataModule2.ADOQuery1.SQL.Clear;
DataModule2.ADOQuery1.SQL.Add('SELE CT MAX (id) as MAKS FROM request_work');
DataModule2.ADOQuery1.Active:=True;
idWR:=DataModule2.ADOQuery1.FieldBy Name('MAKS').AsInteger;
idWR:=idWR+w;
id_requiest:=Form1.IDZAYAVKI.Field. value;
// showmessage(inttostr(id_requiest)); exit;
DataModule2.ADDWork.CommandText := 'INSERT INTO request_work (id,id_work,'+
'id_req,ch) '+
'VALUES ('''+IntToStr(idWR)+''','+gridresul t.cells[0,t]+','+inttostr(id_requiest)+','+grid result.cells[2,t]+');';
ShowMessage(DataModule2.ADOCommand1 .CommandText);
DataModule2.ADDWork.Execute;
end;
end;
end;
DataModule2.NewZayavkiQ.Active:=fal se;
DataModule2.NewZayavkiQ.Active:=tru e;
DataModule2.VupolnenueQ.Active:=fal se;
DataModule2.VupolnenueQ.Active:=tru e;
end;
lutdan вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Нужен совет - добавление элементов в грид через выпадающий список на Delphi 2909 Помощь студентам 1 25.07.2012 18:14
Нужен совет, как отловить ошибку? WarHamster Общие вопросы .NET 3 12.07.2012 16:07
задать массив как константу...нужен совет dead-vip Паскаль, Turbo Pascal, PascalABC.NET 5 21.12.2008 16:07
Нужен совет! Как правильно использовать TextBox? Archi Общие вопросы .NET 3 29.12.2007 20:18