Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как проверить таблицу на запись [D7]


Ulugbek ©   (2007-03-30 10:20:00) 

Привет всем уважаемый мастера!
Помогите в одном деле!
Например когда ползователь вводить дату ему сообщалась что есть такое дата в таблице
"хотите занова добавить или заменить итд"
Как это делаеться помогите срочно
Заранее блогодарен


ЮЮ   (2007-03-30 12:08:00) [1]

>Я проста привел пример
Ну если это просто пример, то, например, можно сделать так:

procedure TRepPortL.btnresultClick(Sender: TObject);
var
 isDone: boolean;
begin
 if MessageDlg(' вы хотите формировать'''+DateToStr(DateS.Date)+'''по'''+DateToStr(DateP.Date)+'''',
mtConfirmation, [mbYes, mbNo],0)=MrYes then
begin
  Memo.Clear;
  Memo.Lines.Add('Начало...');
  LoadData(cdsForm,'select t.off_day from off_days t where t.day_status=1 and t.off_day between'''
  +Datetostr(DateS.Date)+''' and '''+DateToStr(DateP.date)+'''');
  ExecSQL('begin trans'); // или как там у вас в Оракле
  isDone := false;
  while not cdsForm.Eof do
  begin
    Memo.Lines.Add('Формирование за дату'+cdsform.fieldByname('off_day').AsString+'');
    isDone := false;
    while not isDone do begin
      // пока не вставим, не уймемся
      try
        ExecSQL('begin portld.PROC_INSERT(''' + cdsform.fieldbyname('off_day').AsString + ''');end;');
        isDone := true;
      except
        // вставить не удалось
        if
          MessageDlg(' хотите занова добавить или заменить итд,
            mtConfirmation, [mbYes, mbNo],0
          )=MrYes
        then begin
          try
            ExecSQL('begin portld.PROC_UPDATE(''' + cdsform.fieldbyname('off_day').AsString + ''');end;');
            isDone := true;
          except
            // а что делать если PROC_UPDATE не прошел? Будем пытаться вставить
          end;
        end
        else
          break; // пользователь отказался от попыток вставить
      end;
      if not isDone then break; // если отказался хоть раз прерываем всю цепочку
    end;
    cdsForm.Next;
  end;
  if isDone then
    ExecSQL('commit')
  else
   ExecSQL('rollback');
  Memo.Lines.Add('Конец');
end;


Sergey13   (2007-03-30 11:49:00) [2]

> [14] Улугбек   (30.03.07 11:40)

А Оракл какой? С 9-ки вроде merge into работает. Вроде как оно, хотя я с 9-ой и выше мало работал - сам не пользовался.


Улугбек   (2007-03-30 11:40:00) [3]


> "хотите занова добавить или заменить итд"реально можно "занова
> добавить"? Зачем тогда такой вопрос? Что значит "или заменить?
> " Смысл что-то менять, если уже есть?

Если уже есть запись то заменить
Я проста привел пример


ЮЮ   (2007-03-30 11:36:00) [4]

Во первых, несколько непонятна логика.
cdsForm может вернуть несколько дат. Часть которых могут пройти, а часть повториться. Что ты намерен делать?
1) разрешать изменять по одной. столько раз, сколько эта ситуация возникнет.
2) что делать при отказе. Не вставлять ни одной или именно ту, что встретили

З.Ы. С Оракл не знаком, но насторащивает commit в цикле без старта тразакции

"хотите занова добавить или заменить итд"
реально можно "занова добавить"? Зачем тогда такой вопрос?
Что значит "или заменить?" Смысл что-то менять, если уже есть?


Улугбек   (2007-03-30 11:31:00) [5]

Как мне решить эту задачу?


Улугбек   (2007-03-30 11:10:00) [6]

База Оракл


Ulugbek   (2007-03-30 11:07:00) [7]

Vot sobstvenno kod
procedure TRepPortL.btnresultClick(Sender: TObject);
begin
  if MessageDlg(' вы хотите формировать'''+DateToStr(DateS.Date)+'''по'''+DateToStr(DateP.Date)+'''',
 mtConfirmation, [mbYes, mbNo],0)=MrYes then
 begin
   Memo.Clear;
   Memo.Lines.Add('Начало...');
   LoadData(cdsForm,'select t.off_day from off_days t where t.day_status=1 and t.off_day between'''
   +Datetostr(DateS.Date)+''' and '''+DateToStr(DateP.date)+'''');
   while not cdsForm.Eof do
     begin
     Memo.Lines.Add('Формирование за дату'+cdsform.fieldByname('off_day').AsString+'');
     ExecSQL('begin portld.PROC_INSERT(''' + cdsform.fieldbyname('off_day').AsString + ''');end;');
     ExecSQL('commit');
     Memo.Lines.Add('Конец');
     cdsForm.Next;
   end;


Jan   (2007-03-30 11:04:00) [8]

какой пример, когда ты вопросы не оформил подобающе?
СУБД, как делаешь, код?


ЮЮ   (2007-03-30 11:04:00) [9]

Кроме dateTimepicker ещё что-нибудь имеется? чтобы узнать какая у тебя БД и что используешь для доступа?
Или код приведи по той кнопочке, что добавляет, ничего не спрашивая.

З.Ы. За конкретной помощью сюда следует обращаться с проблемным кодом. Просто поболтать можно в форуме "Прочее"


Ulugbek   (2007-03-30 11:00:00) [10]


> уникальный индекс по полю + [1]

Jan po podrobnee plz


Jan   (2007-03-30 10:54:00) [11]

уникальный индекс по полю + [1]


Улугбек   (2007-03-30 10:50:00) [12]

Есть dateTime picker ну ползователь хочеть добавить 22,01,2007 эту дату в таблицу но в таблице есть такое запись чтоб ему сообщения была что есть такое запись итд Если нет то добавит
Как это делается хотябы пример покажите плз


ЮЮ   (2007-03-30 10:30:00) [13]

Кстати, филолога в команду не забудь пригласить, а то твои сообщения вообще введут пользователя в ступор :)


Jan   (2007-03-30 10:27:00) [14]


> Например когда ползователь вводить дату ему сообщалась что
> есть такое дата в таблице
> "хотите занова добавить или заменить итд"

что такое дата?


ЮЮ   (2007-03-30 10:25:00) [15]

> Как это делаеться помогите срочно

Код в соответсвующих обработчиках соответсвующих компонентов пишется.
Думаешь, TTable, TDataSource и TDBGrid на форму кинул - и программа готова?


Sergey13   (2007-03-30 10:24:00) [16]

Лови исключение и выполняй нужное тебе действие. Или перед действием выполняй проверку на его допустимость. Второй вариант менее надежен при многопользовательской работе с БД.


Наверх

Титульная страница Поиск, карта сайта Написать письмо