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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 30.11.2011, 17:49   #1
Blood_ghosT
Пользователь
 
Регистрация: 29.07.2011
Сообщений: 92
По умолчанию

17:49
Доброго времени формучане!

Существует Access и Delphi!

Помогите решить проблему с проверкой таблицы на наличие данных!
Существует таблица оформление продажи и склад, при оформлении товара надо выполнять проверку таблицу оформление продажи на наличие товара в таблице! то есть при добавлении нового товара делаем запрос, который проверяет, есть ли уже такой товар в таблице. Если нет, то добавляем полностью запись, а если уже есть - просто увеличивает количество.
Я делал через ADOQuery! пробовал через фильтрацию Where в SQL! не смог помогите пожалуйста!!
Вот код:

Код:
procedure TfrmAmount.btnOkfrmAmountClick(Sender: TObject);
begin
frmConnection.qSells.Active:=false;
frmConnection.qSells.SQL.Clear;
frmConnection.qSells.SQL.Add('Select Naimenov, Naimenov,  Zavnumber, Edizmerenie, Amount, Price, Sumprice');
frmConnection.qSells.SQL.Add('from Sells');
frmConnection.qSells.Active:=true;
  begin
  if frmConnection.qSells.FieldByName('Naimenov').AsString=Naimenov then
       begin
       frmConnection.qSells.Edit;
       frmConnection.qSells.FieldByName('Naimenov').AsString:=frmConnection.qSells.FieldByName('Naimenov').AsString;
frmConnection.qSells.FieldByName('Zavnumber').AsInteger:=ZavNum;

frmConnection.qSells.FieldByName('Edizmerenie').AsString:=EdIzmer;

frmConnection.qSells.FieldByName('Price').AsCurrency:=Price;
frmConnection.qSells.FieldByName('Sumprice').AsCurrency:=Sumprice; 
      frmConnection.qSells.FieldByName('Amount').AsInteger:=frmConnection.qSells.FieldByName('Amount').AsInteger+strtoint(spinedit1.Text);
       frmConnection.qSells.Post
       end
       else
      frmConnection.qSells.Insert;
      frmConnection.qSells.FieldByName('Naimenov').AsString:=Naimenov;
      frmConnection.qSells.FieldByName('Zavnumber').AsInteger:=ZavNum;
      frmConnection.qSells.FieldByName('Amount').AsInteger:=strtoint(spinedit1.Text);
      frmConnection.qSells.FieldByName('Edizmerenie').AsString:=EdIzmer;
      frmConnection.qSells.FieldByName('Price').AsCurrency:=Price;
      frmConnection.qSells.FieldByName('Sumprice').AsCurrency:=Sumprice;
      frmConnection.qWarehouse.Edit;
      frmConnection.qWarehouse.FieldByName('Amount').AsInteger:=frmConnection.qWarehouse.FieldByName('Amount').AsInteger - strtoint(spinedit1.Text);
      frmConnection.qSells.Post;
      frmConnection.qWarehouse.Post;
      if frmConnection.qWarehouse.FieldByName('Amount').AsInteger=0 then frmConnection.qWarehouse.Delete;
      frmAmount.Close;
      frmWarehouse.Show;
      end;
  end;
У меня первичный ключ на Naimenov, поэтому ошибка?если да то как решить данную проблему!
плохо знаю SQL по этому с ним не смог!поэтому сделал через ADOQuery

20:43
Ну хотя бы на истинный путь направьте!

Красные жирные циферки видны ?
Это время, когда вы отправляли свои сообщения друг за другом, подряд.
У нас есть кнопка "Правка".
Читаем правила раздела.
По правилам это приравнивается к флуду.

Последний раз редактировалось mihali4; 01.12.2011 в 03:18.
Blood_ghosT вне форума Ответить с цитированием
Старый 30.11.2011, 21:21   #2
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Что бы на истинный путь направить, скажите хотя бы что не получается. Два раза прочитал, так и не понял в чем проблема, какая ошибка и где
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 30.11.2011, 21:54   #3
Blood_ghosT
Пользователь
 
Регистрация: 29.07.2011
Сообщений: 92
По умолчанию

Сори если не правильно пояснил ошибку!Делаю программу склад!БД=Аксес!
Моя кнопка добавляет в таблицу оформление заказа товар из таблицы склад если добавить один раз товар то код работает!А если еще раз добавить тот же товар то он будет заноситься как не то же товар а как новый!
Хотелось бы что бы при добавлении нового товара, который уже существует в таблице, количество просто увеличивалось, а не заносилось как новый товар!

данное условие
Код:
 if frmConnection.qSells.FieldByName('Naimenov').AsString=Naimenov then
проверяет на наличие товара! но выходит ошибка что qSells не знает что делать то ли заносить то ли редактировать!

Надеюсь на этот раз я все правильно пояснил!
Blood_ghosT вне форума Ответить с цитированием
Старый 30.11.2011, 22:38   #4
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Для начала - идентификация товара только по наименованию конечно дубово-дубово. Почему не быть товару с одним и тем же наименованием, но с разной ценой? Да и наименование ручками вводится наверно, одной буквой ошибся при вводе - и уже в базе не найдет такого наименоваия даже для существующего товара.

дальше
Код:
...
frmConnection.qSells.SQL.Clear;
frmConnection.qSells.SQL.Add('Select Naimenov, Naimenov,  Zavnumber, Edizmerenie, Amount, Price, Sumprice'); //зачем два раза Naimenov?
frmConnection.qSells.SQL.Add('from Sells');
frmConnection.qSells.Active:=true;
  begin  //begin лишний
  if frmConnection.qSells.FieldByName('Naimenov').AsString=Naimenov then
...
       frmConnection.qSells.Post
       end
       else begin  //begin потеряли
      frmConnection.qSells.Insert;
...
add

Цитата:
if frmConnection.qSells.FieldByName('N aimenov').AsString=Naimenov
Эта проверка даст False даже при сравнении 'Б' и 'б'. Используйте AnsiUpperCase при сравнении

add

evg_m прав, даже не заметил что в первом запросе WHERE нет
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию

Последний раз редактировалось Аватар; 01.12.2011 в 00:14.
Аватар вне форума Ответить с цитированием
Старый 01.12.2011, 00:05   #5
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

Чтобы знать что такого товара нет его надо искать, а не просто сравнивать первый попавшийся с искомым так написано у тебя в программе.
Для этого можно использовать разные методы.
1. SQL искать с помощью Access
Код:
frmConnection.qSells.SQL.:='Select Naimenov, Naimenov,  Zavnumber, Edizmerenie, Amount, Price, Sumprice' #13
 + 'from Sells'#13
 + 'where Naimenov =:Naimtovar';
frmConnection.qSells.Parammeters.ParamByname('naimtovar').value:=Naimenov;
frmConnection.Open;
if not frmConnection.IsEmpty then begin 
//товар есть
// но товар может оказаться и не один
end
else begin
//товара нет
end;
2. тащить всю таблицу в программу (как сейчас)
Код:
frmConnection.Open;
if frmConnection.locate('naimenov', naimenoc, []) then begin
// будет найдена первая запись
end
else begin
// не нашли
end;
3. искать самостоятельно перебирая записи.
Код:
frmConnection.Open;
while not frmConnection.EOf do begin
  if ............ then begin
  // нашли товар
  end; 
  frmConnection.next;
end;
// о том что товара нет мы узнаем только перебрав ВСЕ записи.
if frmConnection.EOF then begin
// не нашли
end;
программа — запись алгоритма на языке понятном транслятору

Последний раз редактировалось evg_m; 01.12.2011 в 00:08.
evg_m вне форума Ответить с цитированием
Старый 01.12.2011, 11:17   #6
Blood_ghosT
Пользователь
 
Регистрация: 29.07.2011
Сообщений: 92
По умолчанию

Спасибо парни за помощь вроде код работает!!

Код:
procedure TfrmAmount.btnOkfrmAmountClick(Sender: TObject);
begin
frmConnection.qSells.Active:=false;
frmConnection.qSells.SQL.Clear;
frmConnection.qSells.SQL.Add('Select Naimenov, Zavnumber, Edizmerenie, Amount, Price, Sumprice');
frmConnection.qSells.SQL.Add('from Sells');
frmConnection.qSells.Active:=true;

  if frmConnection.qSells.Locate('Naimenov', Naimenov,[])
  then
    begin
       frmConnection.qSells.Edit;
       frmConnection.qSells.FieldByName('Naimenov').AsString:=frmConnection.qSells.FieldByName('Naimenov').AsString;
       frmConnection.qSells.FieldByName('Zavnumber').AsInteger:=ZavNum;
       frmConnection.qSells.FieldByName('Amount').AsInteger:=frmConnection.qSells.FieldByName('Amount').AsInteger+strtoint(spinedit1.Text);
       frmConnection.qSells.FieldByName('Edizmerenie').AsString:=EdIzmer;
       frmConnection.qSells.FieldByName('Price').AsCurrency:=Price;
       frmConnection.qSells.FieldByName('Sumprice').AsCurrency:=Sumprice;
       frmConnection.qWarehouse.Edit;
       frmConnection.qWarehouse.FieldByName('Amount').AsInteger:=frmConnection.qWarehouse.FieldByName('Amount').AsInteger - strtoint(spinedit1.Text);
       frmConnection.qSells.Post;
       frmConnection.qWarehouse.Post;
       if frmConnection.qWarehouse.FieldByName('Amount').AsInteger=0 then frmConnection.qWarehouse.Delete;
       frmAmount.Close;
       frmWarehouse.Show;
       end
       else
       begin
      frmConnection.qSells.Insert;
      frmConnection.qSells.FieldByName('Naimenov').AsString:=Naimenov;
      frmConnection.qSells.FieldByName('Zavnumber').AsInteger:=ZavNum;
      frmConnection.qSells.FieldByName('Amount').AsInteger:=strtoint(spinedit1.Text);
      frmConnection.qSells.FieldByName('Edizmerenie').AsString:=EdIzmer;
      frmConnection.qSells.FieldByName('Price').AsCurrency:=Price;
      frmConnection.qSells.FieldByName('Sumprice').AsCurrency:=Sumprice;
      frmConnection.qWarehouse.Edit;
      frmConnection.qWarehouse.FieldByName('Amount').AsInteger:=frmConnection.qWarehouse.FieldByName('Amount').AsInteger - strtoint(spinedit1.Text);
      frmConnection.qSells.Post;
      frmConnection.qWarehouse.Post;
      if frmConnection.qWarehouse.FieldByName('Amount').AsInteger=0 then frmConnection.qWarehouse.Delete;
      frmAmount.Close;
      frmWarehouse.Show;
      end;
  end;
Правда че то третьим способом не получилось!
Blood_ghosT вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Транспонирование множества данных из разных книгах или из разных листов на 1 лист посредством макроса Тантана Microsoft Office Excel 6 18.12.2014 13:04
Лабораторка C++: Создать класс "угол на полскости" и выполнить проверку работоспособности. Zidane_13 Помощь студентам 0 13.01.2011 22:18
Запись в поля DateTime в БД Visual FoxPro посредством ADO Аватар БД в Delphi 2 13.12.2010 11:44
Как организовать проверку на наличие значения при UPDATE? vladtr SQL, базы данных 2 24.02.2010 14:47
Как в Методе гаусса создать обратную(At) матрицу!выполнить проверку! vdv08 Помощь студентам 1 29.10.2008 15:46