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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 09.07.2008, 18:52   #1
Yuran
Форумчанин
 
Регистрация: 18.02.2008
Сообщений: 198
По умолчанию Сохранить данные в таблице (IBQery)

Здрасе.

Нужно изменить запись в таблице в поле типа TDateTime

Делаю так

Base1.Active:=false;
IBT1.Active:=false;
with Base1 do
begin
edit;
sql.Clear;
SQL.Add('UPDATE BAG Set DIAGENG=:D WHERE JOBCARDNO='+JOBCARDNO.Text);
params.ParseSQL(sql.Text,true);
parambyname('D').AsDateTime := StrToDateTime('10.10.2008 10:10:10');
execsql;
close;
end;
IBT1.Active:=True;
Base1.Active:=True;
Count.Active:=true;
ENGIN.Active:=true;
End;
{
Base1.Active:=false;
IBT1.Active:=false;
Base1.sql.Clear;
base1.SQL.Add('UPDATE BAG Set REPAIRDATE=null WHERE JOBCARDNO='+JOBCARDNO.Text);
Base1.ExecSQL;
BTNGO.OnClick(Sender);;
end;
}


И ничего не происходит.
Помогите правильно составить запрос.

Или может использовать не IBQuery
Возможно использовать .Post ???
Если да то подскажите синтаксис
Спасибо!

Да, База ЗДОРОВАЯ, с кучей Таблиц. Моя таблица содержит 63 поля разных типов.
Yuran вне форума Ответить с цитированием
Старый 10.07.2008, 09:33   #2
Andrei
Форумчанин
 
Регистрация: 20.06.2007
Сообщений: 270
По умолчанию

При работе с SQL следует помнить:

1) Команда SELECT формирует локальный набор данных на компьютере пользователя в соответствии с запросом. Иначе говоря, создает локальную таблицу с которой вы работаете. Выполняется она один раз при отрытии набора данных (Query.Active:=true или Query.Open).

2) Команды INSERT, UPDATE, DELETE только отсылают команды серверу на вставку, изменение или удаление записей и никаких данных обратно на компьютер пользователя не возвращают. Именно поэтому в Query есть метод EexecSQL который предназначен для отсылки подобных команд серверу. Чтобы отразить на компьютере пользователя результат работы этих команд необходимо закрыть набор данных (Query.Active:=false или Query.Close) и открыть его вновь с командой SELECT.
-Кукушка, кукушка! Накукуй мне сто лет!
-А накукуй тебе столько?

(с) Библия. Вольный перевод с древнееврейского.
Andrei вне форума Ответить с цитированием
Старый 10.07.2008, 10:05   #3
Yuran
Форумчанин
 
Регистрация: 18.02.2008
Сообщений: 198
По умолчанию

А у меня не так разве?
Yuran вне форума Ответить с цитированием
Старый 10.07.2008, 10:36   #4
Andrei
Форумчанин
 
Регистрация: 20.06.2007
Сообщений: 270
По умолчанию

А в начале кто наборы данных закрывает? см. п.1 предыдущего поста. У вас же теряются все данные из селекта. А потом вы хотите их использовать в запросе на изменение.
Уберите
Base1.Active:=false;
IBT1.Active:=false;
Должно заработать.
-Кукушка, кукушка! Накукуй мне сто лет!
-А накукуй тебе столько?

(с) Библия. Вольный перевод с древнееврейского.

Последний раз редактировалось Andrei; 10.07.2008 в 10:43.
Andrei вне форума Ответить с цитированием
Старый 10.07.2008, 12:14   #5
Yuran
Форумчанин
 
Регистрация: 18.02.2008
Сообщений: 198
По умолчанию

Убрал то что вы сказали и сработало только один раз
Больше не работает

Вот весь код на всякий случай


var
Form1: TForm1;
ENG:array [1..100] of string;
implementation

{$R *.dfm}



procedure TForm1.BTNGOClick(Sender: TObject);
begin
COUNT.Active:=false;
IBT1.Active:=false;
COUNT.SQL.Clear;
COUNT.SQL.Add('Select count(*) as Col from BAG Where JOBCARDNO='+JOBCARDNO.Text);
IBT1.Active:=True;
COUNT.Active:=True;
If Count.Fields[0].AsInteger=0 then
begin
Showmessage('Ремонт с таким номером не найден');
JOBCARDNO.SetFocus;
exit;
end;

Base1.Active:=false;
IBT1.Active:=false;
Base1.SQL.Clear;
Base1.SQL.Add('select * from BAG where JOBCARDNO='+JOBCARDNO.Text);
IBT1.Active:=true;
Base1.Active:=true;

Label1.Caption:=Base1.Fields[0].AsString;
CLIENTFIO.Text:=Base1.Fields[47].AsString;
PHONEIMEI.Text:=Base1.Fields[10].AsString;
RECEPTIONER.Text:=ENG[Base1.Fields[3].AsInteger];
ENGINEER.Text:=ENG[Base1.Fields[4].AsInteger];
if BASE1.FieldByName('FINISHED').AsStr ing='T' then
begin
FINISHED.Caption:='Завершен';
FINISHED.Color:=ClLime;
STATUS.Caption:='Редактирование невозможно';
STATUS.Color:=ClRed;
BTNUNBLOCK.Enabled:=true;
end Else
Begin
FINISHED.Caption:='Не завершен';
FINISHED.Color:=ClYellow;
STATUS.Caption:='Не заблокирован';
STATUS.Color:=ClLime;
BTNUNBLOCK.Enabled:=false;
end;
If base1.Fields[14].AsString='' then
begin
GOOUT.Caption:='Не выдан';
GOOUT.Color:=ClYellow;
end else
begin
GOOUT.Caption:='Выдан';
GOOUT.Color:=ClLime;
end;
end;

procedure TForm1.FormCreate(Sender: TObject);
var i:byte;
begin
for i:=1 to Count.Fields[0].AsInteger do
begin
ENGIN.RecNo:=i;
eng[i]:=ENGIN.Fields[1].AsString;
end;
end;


procedure TForm1.BTNUNBLOCKClick(Sender: TObject);
begin
Base1.sql.Clear;
base1.SQL.Add('UPDATE BAG Set FINISHED=:D WHERE JOBCARDNO='+JOBCARDNO.Text);
base1.params.ParseSQL(base1.sql.Tex t,true);
base1.parambyname('D').asstring :='F';
Base1.ExecSQL;


BTNGO.OnClick(Sender);
end;

end.


Может я лишнего понаписывал???

Да и еще, как составить запрос если мне нужно изменить сразу два поля?

Вот так не получается:
UPDATE BAG Set FINISHED=:D , set REPAIRDATE=:F WHERE JOBCARDNO=значение

Последний раз редактировалось Yuran; 10.07.2008 в 12:17.
Yuran вне форума Ответить с цитированием
Старый 10.07.2008, 13:33   #6
Yuran
Форумчанин
 
Регистрация: 18.02.2008
Сообщений: 198
По умолчанию

Все, разобрался.
Просто после

base1.parambyname('D').asstring :='F';
Base1.ExecSQL;

Дописал

IBTransaction.commit;
Yuran вне форума Ответить с цитированием
Старый 10.07.2008, 13:34   #7
Andrei
Форумчанин
 
Регистрация: 20.06.2007
Сообщений: 270
По умолчанию

Цитата:
Сообщение от Yuran Посмотреть сообщение
Да и еще, как составить запрос если мне нужно изменить сразу два поля?

Вот так не получается:
UPDATE BAG Set FINISHED=:D , set REPAIRDATE=:F WHERE JOBCARDNO=значение
Правильно будет так:

UPDATE BAG Set FINISHED=:D , REPAIRDATE=:F WHERE JOBCARDNO=значение
-Кукушка, кукушка! Накукуй мне сто лет!
-А накукуй тебе столько?

(с) Библия. Вольный перевод с древнееврейского.
Andrei вне форума Ответить с цитированием
Старый 11.07.2008, 11:26   #8
Yuran
Форумчанин
 
Регистрация: 18.02.2008
Сообщений: 198
По умолчанию

Отлично. Всем спасибо
Yuran вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как сохранить данные в xml файл средствами delphi ??? juden Общие вопросы Delphi 1 12.08.2008 10:12
сохранить artemavd Общие вопросы Delphi 3 31.07.2008 19:08
Delphi:обновить данные в таблице. Raccoon Помощь студентам 5 19.05.2008 19:31
Данные сохранить в файл и без перезапуска программы отобразить в grid-e xdevi Помощь студентам 2 29.01.2008 09:17