Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Базы данных и репортинг > Выбрать нужные поля


Автор: AlanFree 1.11.2006, 12:14
У меня есть форма "Приходные накладные". На ней DBGrid, DataSource. Грид отображает данные таблицы Nak_Prih (Id_Tov, Name_Tov, Cena_Opt, Cena_Rozn, Kol_Vo, Sum_Opt, Sum_Rozn)
DbGrid.Columns[0].ButtonStyle:=cbsEllipsis; то есть когда шелкаешь на Id_Tov появляется кнопочка с тремя точками. В Событии этой кнопочке я показываю форму на ней тоде DBGrid, DataSource, ADOQuery
Этот грид отображает тоблицу Tov (Список товаром). Еще свойство dgRowSelect = True то есть в этом гриде строка выделяется вся целеком. Пользователь становится на какуюто запись в этом гриде нажимает "ок" и данные с активной строки должны попасть в изначально пустую таблицу Nak_Prih
Потом второе окно закрывается и пользователь вводит колличество товары в поле  Kol_Vo после этого в полях Sum_Opt, Sum_Rozn должна процитаться сумма.
Как это реализовать? Я так думаю что с помошью запроса...

Код

begin
  With FrmNakPrih.ADOQuery do
  begin
    SQL.Clear;
    SQL.Add('INSERT INTO Nak_Prih'+
    ' (Id_Tov, Name_Tov, Cena_Opt, Cena_Rozn)'+
    '  Values (Tov.Id_Tov, Tov.Name, Tov.Cena_Opt, Tov.Cena_Rozn)'+
    ' From Tov'+
    ' WHERE (Tov.Id_Tov)=:idtov');
    Parameters.ParseSQL(SQL.Text, true);
    Parameters.ParamByName('idtov').Value:=DbGrid.SelectedField.Value;
    Open;
  end;
end;


Но делфи выдает ошибку... Может я не правильно написал запрос? Или Вообще это все надо было по другому делать?

Автор: Rodman 1.11.2006, 12:39
а ты не можешь в VALUES передавать параметры тоже... возможно он не правильно выбирает... 

тогда и без FROM обойдешься... Я так понял что в гриде эти все данные показаны...
Код

INSERT INTO Nak_Prih (Id_Tov, Name_Tov, Cena_Opt, Cena_Rozn) Values (:PrmId_Tov, :PrmName, :PrmCena_Opt, :PrmCena_Rozn);


или 
Код

begin
   With FrmNakPrih.ADOQuery1 do
  begin
    SQL.Clear;
    SQL.Add('SELECT  Tov.Id_Tov, Tov.Name, Tov.Cena_Opt, Tov.Cena_Rozn From Tov WHERE (Tov.Id_Tov)=:idtov');
    Parameters.ParseSQL(SQL.Text, true);
    Parameters.ParamByName('idtov').Value:=DbGrid.SelectedField.Value;
    Open;
  end;


  With FrmNakPrih.ADOQuery do
  begin
    SQL.Clear;
    SQL.Add('INSERT INTO Nak_Prih (Id_Tov, Name_Tov, Cena_Opt, Cena_Rozn) Values (:PrmId_Tov, :PrmName, :PrmCena_Opt, :PrmCena_Rozn)');
    Parameters.ParseSQL(SQL.Text, true);
    Parameters.ParamByName('PrmId_Tov').Value:=FrmNakPrih.ADOQuery1.Fields.Fields[0].asstring;
    Parameters.ParamByName('PrmName').Value:=FrmNakPrih.ADOQuery1.Fields.Fields[1].asstring;
    Parameters.ParamByName('PrmCena_Opt').Value:=FrmNakPrih.ADOQuery1.Fields.Fields[2].asstring;
    Parameters.ParamByName('PrmCena_Rozn').Value:=FrmNakPrih.ADOQuery1.Fields.Fields[3].asstring;
    ExecSQL;
  end;
end;

Автор: Savek 1.11.2006, 13:48
есть более короткий путь:
Код

INSERT INTO Nak_Prih SELECT Id_Tov, Name as Name_Tov, Cena_Opt, Cena_Rozn From Tov WHERE Id_Tov=:idtov

если наименования полей разные, то нужно их сопоставить при помощи "as"

Автор: AlanFree 1.11.2006, 13:54
Rodman,  Спасибо! Работает! Только я не много переделал код. я не стал добовлять еще один ADOQuery на форму FrmNakPrih. На форме поиска товара (FrmSearch) у меня стоит  DBGrid, DataSource и  ADOTable. Код написал такой:
Код

procedure TFrmSearch.OKBtnClick(Sender: TObject);
begin
  With FrmNakPrih.ADOQuery do
  begin
  SQL.Clear;
  SQL.Add('INSERT INTO Nak_Prih (Id_Tov, Name, Cena_Opt, Cena_Rozn) Values (:PrmId_Tov, :PrmName, :PrmCena_Opt, :PrmCena_Rozn)');
  Parameters.ParseSQL(SQL.Text, true);
  Parameters.ParamByName('PrmId_Tov').Value:=ADOTable.Fields.Fields[0].AsString;
  Parameters.ParamByName('PrmName').Value:=ADOTable.Fields.Fields[1].AsString;
  Parameters.ParamByName('PrmCena_Opt').Value:=ADOTable.Fields.Fields[2].AsString;
  Parameters.ParamByName('PrmCena_Rozn').Value:=ADOTable.Fields.Fields[3].AsString;
  ExecSQL;
  SQL.Clear;
  SQL.Add('SELECT* From Nak_Prih');
  Open;
  end;
end;

end.

Работает вроде также...
Но мне еще нужно что бы после этого всего (когда пользователь добавит товар в накладную и введет Значение в поле Kol_Vo) поля  Sum_Opt, Sum_Rozn заполнились автоматически (Sum_Opt=Cena_Opt*Kol_Vo, Sum_Rozn=Cena_Rozn*Kol_Vo) но как это написать в запросе?
Я думаю это тоже должен быть запрос на добавление (INSERT INTO) но как в нем насать умножение?

Автор: Rodman 1.11.2006, 14:18
тем же способой....

Выбираешь нужное поле, домножаешь и потом или INSERT или UPDATE

Автор: AlanFree 2.11.2006, 10:08
вопрос решен

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)