![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
INSERT, поля суммы и даты [D6, dBase, FoxPro, Paradox]
Yurij-7 © (2005-11-28 18:45:00)Уважаемые мастера, помогите разобраться в следующем,
есть кверик с которого берем данные и потом другим квериком эти данные заносим в таблицу, с символьными полями все понятно а вот с датой и суммой начались проблемы ... все это делаю так:
var
j : integer;
fio, address : string;
birthday : tdatetime;
temp:string;
begin
.....
begin
fio := Query1.FieldByName('fio').AsString;
address := Query1.FieldByName('address').AsString;
birthday := Query1.FieldByName('birthday').asdatetime;
Query3.DatabaseName := dbPath;
Query3.SQL.Clear;
temp:='insert into client (fio, address, birthday ) '+'values ( "'+fio+'" , "'+address+'" , '+ birthday+' )';
Query3.SQL.Add(temp);
Query3.ExecSQL;
но пишет о несоотвествии типов, помогите пжл разобраться.
Yurij-7 (2005-12-01 17:54:00) [1]msguns © (01.12.05 12:20) [23]
Спасибо огромное !
msguns (2005-12-01 12:20:00) [2]Прошу прощения, не в ту ветку пример.
В ответ на [21]
Query3.DatabaseName := dbPath;
Query3.SQL.Clear;
Query3.SQL.Add('UPDATE client SET fio=:f, address=:a, birthday=:b '+
'WHERE ID=:id');
Query3.ParamByName('f').AsString := Edit1.Text;
Query3.ParamByName('a').AsString := Edit2.Text;
Query3.ParamByName('b').AsDateTime := DataTimePicker1.Date;
Query3.ParamByName('id').AsInteger := Query1.FieldByName('ID').AsInteger;
Query3.ExecSQL;
msguns (2005-12-01 12:14:00) [3]Пример "сложного" (связанного) апдэйта:
UPDATE FONDS1 INNER JOIN FONDSR ON (FONDSR.Letter=FONDS1.Letter) AND
(FONDSR.FondNumber=FONDS1.FondNumber) AND
(FONDSR.FondType=FONDS1.FondType) AND
(FONDSR.Category=FONDS1.Category) AND
SET FONDSR.AFID = FONDS1.FID, FONDSR.AArcID = FONDS1.ArcID,
FONDSR.ACountry = FONDS1.Country, FONDSR.ASDate = FONDS1.StartDate,
FONDSR.AEDate = FONDS1.EndDate, FONDSR.AFSize = FONDS1.FondSize,
FONDSR.AQDI = FONDS1.DontInvent, FONDSR.AQMF = FONDS1.MicroFished,
FONDSR.AQS = FONDS1.Secret, FONDSR.AAvl = FONDS1.Availability,
FONDSR.APassT = FONDS1.PassTo, FONDSR.APassL = FONDS1.PassLetter,
FONDSR.APassN = FONDS1.PassNumber, FONDSR.AJoinL = FONDS1.JoinLetter,
FONDSR.AJoinN = FONDS1.JoinNumber, FONDSR.AUtil = FONDS1.UtilDate,
FONDSR.ALossID = FONDS1.LossCauseID, FONDSR.ALossDt = FONDS1.LossDate,
FONDSR.ALossDc = FONDS1.LossDoc;
Yurij-7 (2005-12-01 10:45:00) [4]Просто во многих книгах пишут о самых простых запросах, и мало уделяют времени для параметрических запросов ... а где об этом можно почитать поподробней? может есть статья?
яндекс уж очень много выдает ......
Anatoly Podgoretsky (2005-11-30 19:57:00) [5]Можно со всемм четырьмя видами запросов.
Yurij-7 (2005-11-30 17:45:00) [6]А неподскажите можно ли параметрические запросы использовать с UPDATE ?
Yurij-7 (2005-11-30 17:29:00) [7]разобрался, всем спасибо.
evvcom (2005-11-30 08:52:00) [8]
> Yurij-7 (29.11.05 15:13) [13]
> evvcom © (29.11.05 13:57) [11]
> я с вами согласен, но вопрос в date он почемуто не текущую
> дату ставит
А ты правой кнопкой по своему Date и Find Declaration кликни. В SysUtils ли ты попадешь?
Yurij-7 (2005-11-29 17:21:00) [9]Спасибо, так заработало, авот просто для себя несмог разобраться, как текущую дату записать в поле ТБД, ну например у меня получилось так:
Query1.SQL.Add('insert into primer (birthday) values ( :birthday )');
Query1.ParamByName ('birthday').Asdate := strtodate (edit2.Text);
Query1.ExecSQL;
а вот можно както без двойного преобразования даты в строку и обратно?
Спасибо.
msguns (2005-11-29 17:00:00) [10]
begin
Query3.DatabaseName := dbPath;
Query3.SQL.Clear;
Query3.SQL.Add('INSERT INTO client (fio, address, birthday) values (:f,:a,:b)');
Query3.PramByName('f').AsString := Query1.FieldByName('fio').AsString;
Query3.PramByName('a').AsString := Query1.FieldByName('address').AsString;
Query3.PramByName('f').AsDateTime := Query1.FieldByName('birthday').AsDateTime;
Query3.ExecSQL;
Yurij-7 (2005-11-29 16:23:00) [11]ну может подскажите хоть где это почитать можно??
Yurij-7 (2005-11-29 15:13:00) [12]evvcom © (29.11.05 13:57) [11]
я с вами согласен, но вопрос в date он почемуто не текущую дату ставит
Yurij-7 (2005-11-29 13:57:00) [13]ставил AsDate - результат тотже (((
evvcom (2005-11-29 13:57:00) [14]Поскольку используется BDE-компоненты, то можно делать так:
Query.UpdateObject := UpdateSQL; // настроенный объект TUpdateSQL
Query.CashedUpdates := True;
Query.Open;
...
Query.Edit;
Query.FieldByName('birthday').AsDate := date;
Query.Post;
и, например, в обработчиках QueryAfterPost и QueryAfterCancel сделать Query.ApplyUpdates и Query.CancelUpdates соответственно.
Плюсы:
1. Не надо переоткрывать запрос, чтобы увидеть сделанные изменения.
2. Можно редактировать прямо в гриде или при помощи стандартных DB-компонент.
3. Наверное, еще что-то есть...
Desdechado (2005-11-29 13:42:00) [15]AsDate и AsDateTime - не одно и то же
Yurij-7 (2005-11-29 13:29:00) [16]делаю так:
Query1.SQL.Add('insert into primer (birthday) values ( :birthday )');
Query1.ParamByName('birthday').AsDateTime := date;
а ставит 30/12/1899 вместо текущей (((
может БДЕ глючит?
Спасибо
evvcom (2005-11-29 11:43:00) [17]
> Совет: если возможно, переделай на параметры.
Безо всяких возможно, а переделай и не передавай дату через стринги.
Какие компоненты доступа?
Возможно 2-ой кверик и вовсе не нужен, просто надо 1-ый сделать редактируемым, если он еще ReadOnly.
Yurij-7 (2005-11-29 11:35:00) [18]спасибо шас попробую разобраться
Desdechado (2005-11-29 10:55:00) [19]какой тип присвоишь, такой и будет
или, если не присвоишь тип, то будет определяться по типу значения параметра
а в конце будет приводиться к типу, который в БД
в твоих интересах не перемешивать их
а еще почитать справку, там все есть
Yurij-7 (2005-11-29 10:39:00) [20]а вот когда я перейду на параметры то получаеться ненужно както поособому выделять параметр текстовый или числовой ?