Цитата:
И поле Dw вообще уберите, оно вам только мешает. Записывайте сразу отрицательное значение для расхода и положительное для прихода.
|
Благодарю за ответы, сейчас добью через код Делфи и буду пытаться делать через запрос, точнее не пытаться а хотелось бы все в нем сделать, но решении задачи с помощью одного метода на середине не брошу)))
Но к сожалению не каждому пользователю объяснишь, что когда РАСХОД, то значение надо ставить со знаком "-", от сюда следует что поле DW необходимо для задачи условия.
Вот код который написал. Осуществляет заполнение расходно-приходной таблицы, с проверкой на пустой ввод:
Код:
begin
try
if Edit1.Text = '' then
begin
ShowMessage('Введите данные');
Edit1.SetFocus;
end else if DM.ADOQuery2.Locate('name', Edit1.Text, []) = True
then begin
ShowMessage('Введите данные');
Edit1.Clear;
Edit1.SetFocus;
end else
if ComboBox1.Text = '' then
begin
ShowMessage('Введите данные');
ComboBox1.SetFocus;
end else
begin
if Edit4.Text = '' then
begin
ShowMessage('Введите данные');
Edit4.SetFocus;
end else if ComboBox2.Text = '' then
begin
ShowMessage('Введите данные');
ComboBox2.SetFocus;
end else
begin
//ShowMessage('dfkz'); -это я так, проверял на работоспособность условий
DM.ADOQuery2.Insert;
DM.ADOQuery2.FieldByName('data').AsDateTime:=DateTimePicker1.DateTime;
DM.ADOQuery2.FieldByName('name').AsString:=Edit1.Text;
DM.ADOQuery2.FieldByName('dw').AsString:=ComboBox1.Text;
DM.ADOQuery2.FieldByName('kol').AsFloat :=StrToInt(Edit4.Text);
DM.ADOQuery2.FieldByName('ed_izm').AsString:=ComboBox2.Text;
DM.ADOQuery2.Post;
end;
end;
except
on e:Exception do
end;
end;
А вот и сам код для вставки в другую таблицу:
Код:
var
Proverka:boolean;
s:extended;
begin
Proverka:=false;
// if DM.ADOQuery2.Modified then begin - правда тут мне надо условие на изменения данных в таблицы поставить
//DM.ADOQuery2.Post; - чтобы пользователь не ввел одни и те же данные 2 и более раз.
// но думаю что в конце кода буду просто очищать таблицу полностью
DM.ADOQuery2.First; //переход на первую запись в tb2
While not DM.ADOQuery2.Eof do begin
DM.ADOQuery3.First; //переход на первую запись в tb1
While not DM.ADOQuery3.Eof do begin
if DM.ADOQuery3.FieldByName('name').AsString=DM.ADoquery2.FieldByName('name').AsString
then begin
if DM.ADOQuery2.FieldByName('dw)').AsBoolean=true then begin // вот это условия не получилось объединить в одном IF, так как он
//ругается на несовместимость типов string and boolean
DM.ADOQuery3.Edit; //открываю для редактирования , если 2 условия выполняется
DM.ADOQuery3.FieldByName('kol').AsFloat:=DM.ADOQuery3.FieldByName('kol').AsFloat+DM.ADOQuery2.FieldByName('kol').AsFloat;
DM.ADOQuery3.Post;
proverka:=true;
end else begin
DM.ADOQuery3.Edit;
DM.ADOQuery3.FieldByName('kol').AsFloat:=DM.ADOQuery3.FieldByName('kol').AsFloat-DM.ADOQuery2.FieldByName('kol').AsFloat;
DM.ADOQuery3.Post;
proverka:=true;
end;
end;
DM.ADOQuery3.next; // если условие выполнилось переходим на следующую запись в tb1
end;
if proverka=false then // тут долго думал, так как без этого условия
//не шла добавка записей из tb2.name , если данные разные
//ну в общем не нужна, тут просто else поставлю, в голове каша с бд, со временем просматривая, что-то изменяю)
begin
DM.ADOQuery3.Insert;
DM.ADOQuery3.FieldByName('data').AsDateTime:=DM.ADOQuery2.FieldByName('data').AsDateTime;
DM.ADOQuery3.FieldByName('name').AsString:=DM.ADOQuery2.FieldByName('name').AsString;
DM.ADOQuery3.FieldByName('dw').AsString:=DM.ADOQuery2.FieldByName('dw').AsString;
DM.ADOQuery3.FieldByName('kol').AsFloat:=DM.ADOQuery2.FieldByName('Kol').AsFloat ;
DM.ADOQuery3.FieldByName('ed_izm').AsString:=DM.ADOQuery2.FieldByName('ed_izm').AsString;
DM.ADOQuery3.Post;
DM.ADOQuery3.next;
end;
DM.ADOQuery2.next; // переход на следующую запись в tb2
end;
Теперь осталось сделать условие на проверку tb2.kol=>tb1.kol, так как отпуск со склада не может быть произведен если на складе нет столько материала!!! И еще одну проверку tb1.name=tb2.name and tb1.ed_izm=tb2.ed_izm - ну это для того чтобы к примеру, у одного поставщика наименование материала отпускается, как в виде БАНОК, а у другого тот же материала в виде ШТ. Но с условием на поле DW долго не думал, так как оно логического поля, а вот тут опять цикл придется ставить.
Если есть какие-нибудь поправки и предложения по оптимизации кода, но пока SQL малость не понятен, изучаю, но если есть направленная литература буду благодарен.