Форум: "Начинающим";
Текущий архив: 2010.01.17;
Скачать: [xml.tar.bz2];
ВнизСобытие в DBGrid или в DataSet ?? Найти похожие ветки
← →
Анна (2009-11-25 16:49) [0]С помощью ADOQUERY создаю временную табл и помещаю туда данные, с 2 полями формата DATETIME
ADOQ1.Close;
ADOQ1.SQL.Clear;
ADOQ1.SQL.Add("IF (object_id(""tempdb..#prochee"") is null) create table #prochee (datetime datetime,FIO_director varchar(20),Post_person varchar(30),FIO_person varchar(20),Phone_person varchar(20),Date_document datetime,Notes varchar(500)");
ADOQ1.SQL.Add(" PRIMARY KEY (datetime))");
ADOQ1.ExecSQL;
ADOQ1.Close;
ADOQ1.SQL.Clear;
ADOQ1.SQL.Add("IF (select count(*) from #prochee)=0 insert into #prochee");
ADOQ1.SQL.Add("select a.datetime,a.FIO_director,a.Post_person,a.FIO_person,a.Phone_person,a.Date_docum ent,a.Notes from start_tabl a,own");
ADOQ1.SQL.Add("WHERE a.id_own=own.id_own and");
ADOQ1.SQL.Add(" own.iki_own="+leftstr(sp_own.Text,pos(" ",sp_own.Text)-1));
ADOQ1.SQL.Add("and (datetime ="+ quotedstr(formatdatetime("yyyymmdd",strtodate(sp_dat.text)))+"or datetime="+quotedstr(formatdatetime("yyyymmdd",znach_dat))+")");
ADOQ1.SQL.Add("and a.tops=""S""");
ADOQ1.ExecSQL;
дальше эту врем табл связываю с DBGrid. При редактировании ячейки грида, где надо занести дату, набираю просто текст ("hhhh") и перехожу на след ячейку. При переходе не могу найти событие, в котором бы нужно обработать введеную дату на корректность. Перепробовала почти все события (ADOQ1AfterEdit,ADOQ1AfterInsert,ADOQ1BeforePost...) не успевает ни в одно событие заходить, ругается: Class EConvertErrow with message "pppp" is not valid date and time" Какое событие нужно обработать, чтобы не допустить вставки некорректной даты в временную табл.?
← →
Сергей М. © (2009-11-25 16:51) [1]TField.SetText
← →
Анна (2009-11-25 16:52) [2]Спасибо, завтра попробую утром. Отпишусь. Сейчас надо в сад за ребенком...
← →
Anatoly Podgoretsky © (2009-11-25 16:57) [3]> Анна (25.11.2009 16:49:00) [0]
Validate
← →
Anatoly Podgoretsky © (2009-11-25 16:59) [4]> Анна (25.11.2009 16:49:00) [0]
И используй параметры
← →
Анна (2009-11-26 10:51) [5]
> Anatoly Podgoretsky © (25.11.09 16:57) [3]
я зациклилась с этой датой...:(((
не знаю какой параметр указать в validdate и в какой момент (или на какое событие?) вызывать эту процедуру
ADOQ1.FieldByName("date_document").Validate(); ?
И Как потом выйти на событие onValidate ?
Напишите пож-та поподробнее.
← →
Anatoly Podgoretsky © (2009-11-26 11:14) [6]> Анна (26.11.2009 10:51:05) [5]
Я тебе точно не скажу, я не работал с onValidate, но там вроде нужно вызвать метод Abort
А событие нужно привязывать к конкретному полю, которое надо предварительно создать, смотри мои рассуждения по этому в сообщение http://delphimaster.net/view/3-1259081869/
И конечно справку
> If the OnValidate event handler does not raise an exception, the data is written to the current record buffer.
← →
Анна (2009-11-26 11:48) [7]
> Anatoly Podgoretsky © (26.11.09 11:14) [6]
Я не могу в инспекторе объектов это поле добавить, т.к оно во временной таблице. Начинаю обманывать инспектор, пишу в нем select Date_document from start_tabl, потом делаю add Fields --- получаю объект ADOQ1Date_document:TDateTime где получаю доступ к методам onvalidate,onsettext...и свойствам (там маска ввода есть) Но при запуске программы ругается, что нет такого поля Date_document что и естественно, ведь в программе у меня табл #prochee. А как динамически в программе все это сделать (без инспектора объектов) не знаю.
ADOQ1Date_document
← →
Sergey13 © (2009-11-26 11:56) [8]А какой смысл в использовании временной таблицы если она заполняется обычным запросом?
← →
Сергей М. © (2009-11-26 12:00) [9]
> Анна (26.11.09 11:48) [7]
После того как ты вызовом метода ADO[Query|Table|DataSet].Open открыла доступ к НД из своей врем.таблицы, св-во ADO[Query|Table|DataSet].Fields[индекс интересующего поля] или метод FieldByName("имя интересующего поля") вернет объект класса TField, у которого есть св-во-событие OnValidate, которому ты тут же можешь назначить свой метод-обработчик.
← →
Anatoly Podgoretsky © (2009-11-26 12:03) [10]Надо в ADOQ1 на форме, дважды щелкнуть по нему и добавить все поля, тогда можно встать курсором на поле и оно появится в инспекторе, там уже можно создать обработчик. Если же список полей не появится, то можно создать обработчик для любого поля и в рантайм можно будет его присвоить нужному полю. Предварительно отключив от временного поля.
FieldByName("FieldName").OnValidate := имя созданого обработчика без параметров;
Рекоменду также разделить ADOQ1 на два независимох компонента AdoCommand и AdoDataset.
Смущает также, что использовано ADOQ1.ExecSQL;
во втором случае, а не ADOQ1.Open
← →
Анна (2009-11-26 13:23) [11]
> Сергей М. © (26.11.09 12:00) [9]
> Anatoly Podgoretsky © (26.11.09 12:03) [10]
Спасибо большое!!!
← →
Анна (2009-11-26 14:11) [12]Сделала так:
ADOQ1.Close;
ADOQ1.SQL.Clear;
ADOQ1.SQL.Add("select * from #prochee");
ADOQ1.Open;
ADOQ1.FieldByName("Date_document").OnValidate:=myvalidate;
ADOQ1.FieldByName("Date_document").EditMask:="00/00/00;1;_";
procedure TForm1.myValidate(ss: TField);
begin
showmessage("myValidate");
end;
При корректной дате - происходит вход в процедуру myValidate.
Но когда ввожу "13.13.09" сразу сообщение об ошибке и войти в процедуру myValidate не успеваю.
Не знаю, что я делаю не так?
← →
Anatoly Podgoretsky © (2009-11-26 14:49) [13]procedure TForm1.myValidate(ss: TField);
begin
// showmessage("myValidate");
if not проверка then Abort;
end;
← →
Анна (2009-11-26 15:22) [14]
> Anatoly Podgoretsky © (26.11.09 14:49) [13]
Вы не поняли меня. Я не могу ВОЙТИ в эту процедуру : procedure TForm1.myValidate(ss: TField);
При неправильном вводе даты сразу возникает исключение: EConvertError ..."13.13.09" is not valid date
До входа в процедуру myValidate дело не доходит :(
← →
Anatoly Podgoretsky © (2009-11-26 16:15) [15]Я не знаю почему, должно доходить.
← →
sniknik © (2009-11-26 16:33) [16]может проверка от маски происходит раньше?
← →
Anatoly Podgoretsky © (2009-11-26 16:42) [17]> sniknik (26.11.2009 16:33:16) [16]
Может быть, в справке сказано, что проверка EditMask делается на посимвольной основе, по мере ввода. Но это легко проверить если EditMask сделать пустой.
← →
Анна (2009-11-27 09:14) [18]
> sniknik © (26.11.09 16:33) [16]
Не смогла сразу ответить, у нас вчера полгорода осталось без света.
При закоментированной маске все равно не заходит в процедуру, исключение возникает раньше. А где ( в каком месте программы) перехватить это исключение я не знаю.
← →
sniknik © (2009-11-27 09:30) [19]используется чудосуперпутергрид?
сделай все в отдельном, новом, проекте с минимумом компонент, сделай одно поля статическими (в дизайн тайм), назначь обработчик одного поля там же, другому поставь динамически как сейчас, и сравни.
← →
Анна (2009-11-27 10:07) [20]
> sniknik © (27.11.09 09:30) [19]
Грид стандартный.
сделала маленький проект :
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, DB, Grids, DBGrids, ADODB;
type
TForm1 = class(TForm)
ADOConnection1: TADOConnection;
ADOQuery1: TADOQuery;
DBGrid1: TDBGrid;
DataSource1: TDataSource;
ADOQuery1Date_document: TDateTimeField;
ADOQuery1id_own: TIntegerField;
ADOQuery1datetime: TDateTimeField;
ADOQuery1FIO_person: TStringField;
procedure ADOQuery1Date_documentValidate(Sender: TField);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.ADOQuery1Date_documentValidate(Sender: TField);
begin
showmessage("ADOQuery1Date_documentValidate");
end;
end.
И все тоже самое, при вводе Date_document =13.13.2009 сразу вылетает исключение , а в процедуру ADOQuery1Date_documentValidate не заходит.
Если ввожу правильную дату - то в процедуру заходит.
Запрос к таблице на сервере (не к временной).
← →
sniknik © (2009-11-27 10:18) [21]ну тогда делай через onSetText, как в [1] советовали. он до всего.
← →
Anatoly Podgoretsky © (2009-11-27 10:42) [22]Все таки не понятно почему не работает. При условии что в свойствах поля назначен обработчик OnValidate
← →
Inovet © (2009-11-27 10:53) [23]> [22] Anatoly Podgoretsky © (27.11.09 10:42)
> Все таки не понятно почему не работает. При условии что
> в свойствах поля назначен обработчик OnValidate
Поле типа дата, насколько помню проверяется сначала корректность даты на дата ли вообще это.
← →
Anatoly Podgoretsky © (2009-11-27 11:08) [24]> Inovet (27.11.2009 10:53:23) [23]
> Validates a specified string against the current mask.
← →
Анна (2009-11-27 11:18) [25]
> sniknik © (27.11.09 10:18) [21]
В маленьком проекте заменила:
procedure TForm1.ADOQuery1Date_documentSetText(Sender: TField;
const Text: String);
var dt:tdatetime;
begin
showmessage("ADOQuery1Date_documentSetText");
try
dt:=strtodate(Text);
except
ADOQuery1.FieldByName("Date_document").AsString:="07.07.2007";
ADOQuery1.Refresh;
end;
end;
Работает, заходит в процедуру и заменяет на 07.07.2007.
Теперь в большом проекте при динамическом переопределении не компилируется: не корректные типы FieldSetTextEvent and proced....
ADOQ1.Fields[5].OnSetText:=MySetText(ADOQ1.Fields[5],ADOQ1.Fields[5].asstring);
procedure TForm1.mysettext(sender:TField;sss:string);
begin
showmessage("mysettext");
end;
Как правильно в Mysettext написать параметры?
← →
Анна (2009-11-27 11:30) [26]если
ADOQ1.Fields[5].OnSetText:=mysettext;
то при компиляции : Parameter lists differ
← →
Inovet © (2009-11-27 11:36) [27]> [24] Anatoly Podgoretsky © (27.11.09 11:08)
> > Inovet (27.11.2009 10:53:23) [23]
>
> > Validates a specified string against the current mask.
Я специально проверил. OnValidate после внутренней проверки вызывается для всех типов полей, в Integer, например, набрать 1000000000, то же самое.
Write an OnValidate event handler to validate changes made to the data in the field, just before the data is written to the current record buffer.
Или ты о другом?
> [25] Анна (27.11.09 11:18)
Так тебе заменять надо или просто повторить ввод, чтоб типа на английском не вылазила ошибка?
← →
Анна (2009-11-27 11:46) [28]
> Inovet © (27.11.09 11:36) [27]
Мне надо проверять, чтобы при неудачном вводе заменяла на NULL
Подходит On SetText, но не получается динамически из прогаммы обратиться в это событие.
написала:
ADOQ1.FieldValues["Date_document"].OnSetText := mysettext(ADOQ1.Fields[5],ADOQ1.Fields[5].asstring);
Компиляция проходит, но при выполнении на этой строке ошибка:
invalid variant operation...
← →
Плохиш © (2009-11-27 11:57) [29]
> написала:
> ADOQ1.FieldValues["Date_document"].OnSetText := mysettext(ADOQ1.
> Fields[5],ADOQ1.Fields[5].asstring);
> Компиляция проходит, но при выполнении на этой строке ошибка:
>
> invalid variant operation...
ADOQ1.FieldValues["Date_document"].OnSetText := mysettext;
При условии, что описание mysettext совпадает с описанием OnSetText.
PS. Стоит описание используемого языка программирования изучить в конце концов...
← →
Inovet © (2009-11-27 12:05) [30]> [26] Анна (27.11.09 11:30)
> если
> ADOQ1.Fields[5].OnSetText:=mysettext;
> то при компиляции : Parameter lists differ
Значит прототип твоего обработчика не совпадает с ожидаемым
procedure TForm1.ADOQuery1Date_documentSetText(Sender: TField; const Text: String);
← →
Анна (2009-11-27 12:06) [31]
> Плохиш © (27.11.09 11:57) [29]
ADOQ1.FieldValues["Date_document"].OnSetText := mysettext;
procedure TForm1.mysettext(sender:TField;sss:string);
begin
showmessage("mysettext");
end;
Не компилируется : Not enough actual parameters
← →
Inovet © (2009-11-27 12:08) [32]> [28] Анна (27.11.09 11:46)
> Мне надо проверять, чтобы при неудачном вводе заменяла на
> NULL
Вообще не очень хорошо очищать то что ввёл пользователь, надо дать возможность исправить. Как раз стандартная схема с OnValidate самое оно.
← →
Inovet © (2009-11-27 12:11) [33]> [31] Анна (27.11.09 12:06)
const где?
← →
Плохиш © (2009-11-27 12:17) [34]
> Inovet © (27.11.09 12:11) [33]
>
> > [31] Анна (27.11.09 12:06)
>
> const где?
>
+1
← →
Анна (2009-11-27 12:21) [35]
> Inovet © (27.11.09 12:11) [33]
тот же результат. Компиляция проходит:
ADOQ1.FieldValues["Date_document"].OnSetText := mysettext(ADOQ1.Fields[5],ADOQ1.Fields[5].asstring);
procedure TForm1.mysettext(sender:TField;const sss:string);
begin
showmessage("mysettext");
end;
но при выполнении на операторе
ADOQ1.FieldValues["Date_document"].OnSetText := mysettext.....
ошибка invalid variant operation...
← →
Inovet © (2009-11-27 12:28) [36]> [35] Анна (27.11.09 12:21)
> ADOQ1.FieldValues["Date_document"].OnSetText := mysettext(ADOQ1.Fields[5]
> ,ADOQ1.Fields[5].asstring);
Пару раз или больше уже подсказали, тебе же адрес процедуры надо присвоить, а не вызывать её, причём неизвестно с чем там
ADOQ1.FieldValues["Date_document"].OnSetText := mysettext;
← →
Анна (2009-11-27 12:40) [37]Вы думаете, что я не обращаю внимания на ваши подсказки???
Это не так.
Я уже отвечала в [31] что этот вариант не компилируется.
Если бы я смогла найти решение этой проблемы в интернете, я бы сюда не обратилась, т.к. очень хорошо понимаю, что никто мне ничего не должен, и если отвечают - то в ущерб своим делам.
← →
Anatoly Podgoretsky © (2009-11-27 12:46) [38]
> Теперь в большом проекте при динамическом переопределении
> не компилируется: не корректные типы FieldSetTextEvent
> and proced....
У тебя не закончено предложение. Возможно у тебя регулярная процедура.
← →
Плохиш © (2009-11-27 12:53) [39]Я не помню, нанять программиста еи уже предлагали? По-моему, самое время.
← →
Анна (2009-11-27 12:54) [40]
> Anatoly Podgoretsky © (27.11.09 12:46) [38]
ADOQ1.Fields[5].OnSetText:=MySetText(ADOQ1.Fields[5],ADOQ1.Fields[5].asstring);
Ошибка компиляции :
Incompatible types : "TFieldSerTextEvent" and "procedure, untyped pointer or untyped parameter
Страницы: 1 2 вся ветка
Форум: "Начинающим";
Текущий архив: 2010.01.17;
Скачать: [xml.tar.bz2];
Память: 0.55 MB
Время: 0.005 c