-
> Единственный совет, к которому я не прислушался как бы тыкать носом в проигнорированное тут тоже никому не нужно, но один раз по такой настойчивой просьбе...
Ega23 © (14.12.10 22:24) [6] Ещё раз, возьми и сделай следующее: try S := query.FieldByName('N1').AsString; except on E: Exception do ShowMessage(E.Message + #13#10 + query.SQL.Text); end; И после этого станет ясно, где там и чего not found.
+ > Query.Add('SELECT * from table WHERE date=' + format2sql(datetimepicker.date) + ';'); 1 указывать * в запросе есть плохой тон. sql движок это напрягает. 2 параметры.
> приведите мне, пожалуйста, пример, когда TSqlQuery в этом случае вернёт мне НЕ ВСЕ нужные записи. а что ты знаешь о серверных курсорах? запрос тут совершенно ни при чем. достаточно самого факта его использования. оно просто так работает. асинхронно.
-
> for j := 0 to qry.Params.Count-1 do showmessage(qry.params[i]. > Name + qry.params[i].value); > гм, ничего не показывается
а для чего было написано? :)
> 'SELECT * from table WHERE date=' + format2sql(datetimepicker. > date) + ';');
Query.sql.text := 'SELECT * from table WHERE date= :DATE'; Query.parambyname('DATE').asDAtetime / или ).value / := datetimepicker.date; Query.open;
-
> ну тогда мне остаётся лишь признать, что создатели дельфи > - полнейшие лохи, ведь они и сами об этом не знают!
Не это ты лох.
И все то у тебя есть, вот только мы об этом узнаем потом.
-
> megavoid (15.12.10 00:26) [16] > > Не факт. Впрочем, это твоё дело. > ну тогда мне остаётся лишь признать, что создатели дельфи > - полнейшие лохи
Ламер-дерьмокодер детектед.
-
12 © (15.12.10 08:44) [21] > Query.parambyname('DATE').asDAtetime / или ).value / := datetimepicker.date; дата в датапикере тоже типа дататайм, т.что могут быть проблемы, если где оставить "огрызки времени", причем неожиданно, и непонятно (например в XP работает, в win 7 почему то нет. сталкивался с подобным). лучше, для гарантии, делать например так asDateTime:= Trunc(datetimepicker.date);
> Не это ты лох. в этом нет сомнений, как только начинаются "доказательства" типа "у меня все правильно", только почему то не работает... и "что вы придираетесь к показанному коду" (а к чему еще?) "проблема не в нем, а в том про что я для вас фантазирую" вместо твердых "вот что есть, вот как делается, при этом при вот таких условиях, вот такая ошибка".
-
> sniknik (15.12.2010 09:53:24) [24]
Не, его просто развели как лоха на покупку Дельфи.
-
> Не, его просто развели как лоха на покупку Дельфи.
Ха. Ха. Ха. Купил.
-
> Ega23 (15.12.2010 10:06:26) [26]
Купил, или ты думаешь, что это он возмущается по поводу ворованой, взломаной? Тогда это вообще двойной лох.
-
> sniknik © (15.12.10 09:53) [24] > > 12 © (15.12.10 08:44) [21] > > Query.parambyname('DATE').asDAtetime / или ).value / : > = datetimepicker.date; > дата в датапикере тоже типа дататайм, т.что могут быть проблемы, > если где оставить "огрызки времени", причем неожиданно, > и непонятно (например в XP работает, в win 7 почему то > нет. сталкивался с подобным). > лучше, для гарантии, делать например так > asDateTime:= Trunc(datetimepicker.date);
Согласен. эт я для простоты но и Trunc - тоже бывает глючит. Я заводил тему, как-то. try
Q.SQL.Text := SQL;
s := '';
for i := 0 to Q.ParamCount-1 do
begin
case Q.Params[i].DataType of
ftDateTime: Q.Params[i].AsDateTime := P[i];
else Q.Params[i].Value := P[i];
end;
s := s + Q.Params[i].Name + '=' + Q.Params[i].AsString + #13#10;
end;
Q.Open; теперь пишу так: TDateTime(StartOfTheDay( datetimepicker.date)) хотя не понятно, ведь function StartOfTheDay(const AValue: TDateTime): TDateTime; begin Result := Trunc(AValue); end; но, если TDateTime(Trunc( datetimepicker.date)) то ошибку ODAC пишет, дескать я хочу время, а мне суют число с другой стороны, число и есть время. но, на деле вот так вот работает, а иначе - нет.
-
> 12 (15.12.2010 10:45:28) [28]
Это Trunc - тоже бывает глючит, там же нет места для глюка, это выполняет процессор, он просто обрезает дробную часть. Если бы был глюк по этой части уже стоял гигантский крик в Интернет.
-
> но и Trunc - тоже бывает глючит. Я заводил тему, как-то. Trunc вряд ли, а вот это -
> Q.Params[i].Value:= возможно. из-за того, что при не заданности типа ADO к примеру берет его из присваиваемого "варианта", а присваиваемый "вариант" получается из приведенного значения, т.е. integer-а в случае с Trunc
> но, если > TDateTime(Trunc( datetimepicker.date)) > то ошибку ODAC пишет, дескать я хочу время, а мне суют число видимо с точки зрения оптимизатора подобное приведение типа не существенно (все одно числа туда сюда автоматом приводятся)
> но, на деле вот так вот работает, а иначе - нет. иначе можно еще тип параметру явно указать, перед значением, и значит "автоопределением" из варианта.
-
ну, хоть на расстрел набежали, и то радует повторюсь, проблема не в том, что что-то не работает, а в том, что всё работает. @sniknik [20]сделал сразу же, результат в [8]> указывать * в запросе есть плохой тон. sql движок это напрягает. что же мне указывать, если мне все поля нужны? перечислять их все через запятую? вот тот самый метод полностью
procedure TForm1.FillGrid(Grid: TZColorStringGrid; Req: String);
var
i, j, QCash, zal, rating: integer;
S, Trainer, Clients, Task, RatingStr: string;
begin
InitGridLines;
Qry.Close;
Qry.SQL.Clear;
Qry.SQL.Add(Req + ';');
try
Qry.Open;
for j := 0 to Qry.RecordCount-1 do begin
try
S := TimeToStr(Qry.FieldByName('dtime').AsDateTime);
except
on E: Exception do
ShowMessage(E.Message + #13#10 + qry.SQL.Text);
end;
try
i := StrToInt(Copy(S,0,Pos(':',S)-1)) - 6;
except
end;
QCash := Qry.FieldByName('cash').AsInteger;
Zal := Qry.FieldByName('zal').AsInteger;
Rating := Qry.FieldByName('rating').AsInteger;
Trainer := FIO2ShortFIO( Qry.FieldByName('trainer').AsString );
Clients := Qry.FieldByName('client').AsString;
Task := Qry.FieldByName('task').AsString;
if Rating = 0 then RatingStr := ''
else RatingStr := ' (' + IntToStr(Rating) + '*)';
if Grid.Cells[i, Zal] = '' then begin
if QCash = 3 then
Grid.Cells[i, Zal] := Trainer + '[' + Task + ']' + RatingStr
else
Grid.Cells[i, Zal] := Trainer + '[' + Task + ']' + #13#10 + Clients;
end else begin
if QCash = 3 then
Grid.Cells[i, Zal] :=
Grid.Cells[i, Zal] + #13#10#13#10 + Trainer + '[' + Task + ']' + RatingStr
else
Grid.Cells[i, Zal] :=
Grid.Cells[i, Zal] + #13#10#13#10 + Trainer + '[' + Task + ']' + #13#10 + Clients;
end;
if QCash = 3 then
Grid.CellStyle[i, Zal].BGColor := clSetka else
Grid.CellStyle[i, Zal].BGColor := clZal; Qry.Next;
Application.ProcessMessages;
end;
except
on E: Exception do
ShowMessage(E.Message + #13#10 + Qry.SQL.Text);
end;
Qry.Close;
AutoSizeGrid(Grid);
end;
вызывается он так:
procedure TForm1.DateTimePicker1Change(Sender: TObject);
begin
FillGrid(StringGrid1, 'SELECT * FROM z WHERE ddate = ' + fd2sql(datetimepicker1.DateTime));
end;
fd2sql (c) Белов Владимир
function TForm1.FD2SQL(ADateEdit : TDateTime) : string;
var Year, Month, Day : word;
s : string;
begin
if ADateEdit = 0 then Result:='NULL'
else begin
DecodeDate(ADateEdit, Year, Month, Day);
s:='';
s:=s+IntToStr(Year)+'-';
if Month < 10 then s:=s+'0';
s:=s+IntToStr(Month)+'-';
if Day < 10 then s:=s+'0';
s:=s+IntToStr(Day);
Result:=chr($27)+s+chr($27);
end;
end;
вот, так есть. всё работает. ошибка возникает, если выбрать дату в tdatetimepicker мышкой.
-
> fd2sql (c) Белов Владимир
Укуси меня пчела... О сколько раз твердили миру - используйте уже параметры.
З.Ы. Мне страшно ходить в кинотеатры.
-
Добавил Qry.ParamByName('ddate').asDateTime; чтобы совсем уж точно. То же самое.
-
не, не то же самое. Qry: Parameter 'ddate' not found - логично, ведь
for j := 0 to qry.Params.Count-1 do showmessage(qry.params[i].Name + qry.params[i].value); // !!
ничего не выдаёт но запрос-то работает!
-
> но, если > TDateTime(Trunc( datetimepicker.date))
Ты зачем так делаешь, вроде бы достаточно грамотный программист.
-
> что же мне указывать, если мне все поля нужны? перечислять > их все через запятую?
Ленивым не место в программирование.
-
Я имею некое представление про серверный курсор. При однонаправленном датасете мы можем лишь идти курсором вперёд по набору данных, используя .Next. Да, я понимаю, что раз он работает асинхронно, то я могу начать читать записи до того, как они все приедут по сети. Но как в таком случае мне отследить событие окончания приезда всех данных? Я положился на пример использования dbExpress, где так и было open - for .. recordcount - next - close - и всё работает.
-
> не, не то же самое. Qry: Parameter 'ddate' not found - логично, > ведь
А зачем ты обращаешься к несуществующему параметру?
-
> Ты зачем так делаешь, вроде бы достаточно грамотный программист.
Ты его, похоже, с Мегавольтом путаешь.
> Добавил Qry.ParamByName('ddate').asDateTime; чтобы совсем > уж точно. То же самое.
Всё, я так больше не могу. Это, походу, развод чей-то.
|