Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.06.24;
Скачать: CL | DM;

Вниз

Как проверить таблицу на запись   Найти похожие ветки 

 
Ulugbek   (2007-03-30 10:20) [0]

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


 
Sergey13 ©   (2007-03-30 10:24) [1]

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


 
ЮЮ ©   (2007-03-30 10:25) [2]

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

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


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


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

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


 
ЮЮ ©   (2007-03-30 10:30) [4]

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


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

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


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

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


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


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

Jan po podrobnee plz


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

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


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

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

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


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

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;


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

База Оракл


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

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


 
ЮЮ ©   (2007-03-30 11:36) [13]

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

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

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


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


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

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


 
Sergey13 ©   (2007-03-30 11:49) [15]

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

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


 
ЮЮ ©   (2007-03-30 12:08) [16]

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

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;



Страницы: 1 вся ветка

Текущий архив: 2007.06.24;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.027 c
15-1180069318
кпк_шник
2007-05-25 09:01
2007.06.24
Помогите выбрать машинку


15-1180414575
vajo
2007-05-29 08:56
2007.06.24
Чем можно скопировать с DVD бонус саундтреков


15-1180348711
s_t_d
2007-05-28 14:38
2007.06.24
Кириллица в TURBO PASCAL 7.1


2-1180446877
access
2007-05-29 17:54
2007.06.24
из Аксес в Делфи и обратно в Аксес


3-1175167503
nick_van_rijn
2007-03-29 15:25
2007.06.24
ошибка начала транзакции