![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как проверить таблицу на запись [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]Лови исключение и выполняй нужное тебе действие. Или перед действием выполняй проверку на его допустимость. Второй вариант менее надежен при многопользовательской работе с БД.