Конференция "Базы" » [D2010] Магия мыши в TSQLQuery + DateTimePicker [MySQL]
 
  • sniknik © (15.12.10 08:02) [20]
    > Единственный совет, к которому я не прислушался
    как бы тыкать носом в проигнорированное тут тоже никому не нужно, но один раз по такой настойчивой просьбе...

    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 в этом случае вернёт мне НЕ ВСЕ нужные записи.
    а что ты знаешь о серверных курсорах? запрос тут совершенно ни при чем. достаточно самого факта его использования. оно просто так работает. асинхронно.
  • 12 © (15.12.10 08:44) [21]

    > 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;
  • Anatoly Podgoretsky © (15.12.10 09:10) [22]

    > ну тогда мне остаётся лишь признать, что создатели дельфи
    > - полнейшие лохи, ведь они и сами об этом не знают!

    Не это ты лох.

    И все то у тебя есть, вот только мы об этом узнаем потом.
  • Плохиш © (15.12.10 09:50) [23]

    > megavoid   (15.12.10 00:26) [16]
    > > Не факт. Впрочем, это твоё дело.
    > ну тогда мне остаётся лишь признать, что создатели дельфи
    > - полнейшие лохи

    Ламер-дерьмокодер детектед.
  • 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);

    > Не это ты лох.
    в этом нет сомнений, как только начинаются "доказательства" типа "у меня все правильно", только почему то не работает... и "что вы придираетесь к показанному коду" (а к чему еще?) "проблема не в нем, а в том про что я для вас фантазирую" вместо твердых "вот что есть, вот как делается, при этом при вот таких условиях, вот такая ошибка".
  • Anatoly Podgoretsky © (15.12.10 10:03) [25]
    > sniknik  (15.12.2010 09:53:24)  [24]

    Не, его просто развели как лоха на покупку Дельфи.
  • Ega23 © (15.12.10 10:06) [26]

    > Не, его просто развели как лоха на покупку Дельфи.


    Ха. Ха. Ха.
    Купил.
  • Anatoly Podgoretsky © (15.12.10 10:09) [27]
    > Ega23  (15.12.2010 10:06:26)  [26]

    Купил, или ты думаешь, что это он возмущается по поводу ворованой,
    взломаной?
    Тогда это вообще двойной лох.
  • 12 © (15.12.10 10:45) [28]

    > 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 пишет, дескать я хочу время, а мне суют число

    с другой стороны, число и есть время.

    но, на деле вот так вот работает, а иначе - нет.
  • Anatoly Podgoretsky © (15.12.10 11:26) [29]
    > 12  (15.12.2010 10:45:28)  [28]

    Это Trunc - тоже бывает глючит, там же нет места для глюка, это выполняет
    процессор, он просто обрезает дробную часть. Если бы был глюк по этой части
    уже стоял гигантский крик в Интернет.
  • sniknik © (15.12.10 12:12) [30]
    > но и Trunc - тоже бывает глючит. Я заводил тему, как-то.
    Trunc вряд ли, а вот это -

    > Q.Params[i].Value:=
    возможно. из-за того, что при не заданности типа ADO к примеру берет его из присваиваемого "варианта", а присваиваемый "вариант" получается из приведенного значения, т.е. integer-а в случае с Trunc

    > но, если
    > TDateTime(Trunc( datetimepicker.date))
    > то ошибку ODAC пишет, дескать я хочу время, а мне суют число
    видимо с точки зрения оптимизатора подобное приведение типа не существенно (все одно числа туда сюда автоматом приводятся)

    > но, на деле вот так вот работает, а иначе - нет.
    иначе можно еще тип параметру явно указать, перед значением, и значит "автоопределением" из варианта.
  • megavoid (15.12.10 12:13) [31]
    ну, хоть на расстрел набежали, и то радует
    повторюсь, проблема не в том, что что-то не работает, а в том, что всё работает.

    @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 + ';');
     // showmessage(Qry.sql.text);  // !!
     // for j := 0 to qry.Params.Count-1 do showmessage(qry.params[i].Name + qry.params[i].value);  // !!
     try
       Qry.Open;
       // if Qry.IsEmpty then showmessage('Пусто'); // !!
       for j := 0 to Qry.RecordCount-1 do begin
         // for i := 0 to 9 do showmessage(qry.fields[i].FieldName + qry.fields[i].asstring);    // !!
         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) + '*)';
         // one or more tasks at one time
         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;
             //Grid.CellStyle[i, Zal].WordWrap := True;
         end;
         if QCash = 3 then
           Grid.CellStyle[i, Zal].BGColor := clSetka   // сетка
         else {if Zal = 1 then}
           Grid.CellStyle[i, Zal].BGColor := clZal;    // 1 зал
         Qry.Next;
         Application.ProcessMessages;
       end;
     except
       on E: Exception do
         ShowMessage(E.Message + #13#10 + Qry.SQL.Text);
       // Qry.Close;   // finally
     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);
     // s:=s+' 00:00:00';
     Result:=chr($27)+s+chr($27);
    end;
    end;



    вот, так есть. всё работает.
    ошибка возникает, если выбрать дату в tdatetimepicker мышкой.
  • Ega23 © (15.12.10 12:23) [32]

    > fd2sql (c) Белов Владимир


    Укуси меня пчела...
    О сколько раз твердили миру - используйте уже параметры.

    З.Ы. Мне страшно ходить в кинотеатры.
  • megavoid (15.12.10 12:27) [33]
    Добавил Qry.ParamByName('ddate').asDateTime; чтобы совсем уж точно. То же самое.
  • megavoid (15.12.10 12:29) [34]
    не, не то же самое. Qry: Parameter 'ddate' not found - логично, ведь

    for j := 0 to qry.Params.Count-1 do showmessage(qry.params[i].Name + qry.params[i].value);  // !!

    ничего не выдаёт
    но запрос-то работает!
  • Anatoly Podgoretsky © (15.12.10 12:34) [35]

    > но, если
    > TDateTime(Trunc( datetimepicker.date))

    Ты зачем так делаешь, вроде бы достаточно грамотный программист.
  • Anatoly Podgoretsky © (15.12.10 12:35) [36]

    > что же мне указывать, если мне все поля нужны? перечислять
    > их все через запятую?

    Ленивым не место в программирование.
  • megavoid (15.12.10 12:36) [37]
    Я имею некое представление про серверный курсор. При однонаправленном датасете мы можем лишь идти курсором вперёд по набору данных, используя .Next. Да, я понимаю, что раз он работает асинхронно, то я могу начать читать записи до того, как они все приедут по сети. Но как в таком случае мне отследить событие окончания приезда всех данных? Я положился на пример использования dbExpress, где так и было open - for .. recordcount - next - close - и всё работает.
  • Anatoly Podgoretsky © (15.12.10 12:36) [38]

    > не, не то же самое. Qry: Parameter 'ddate' not found - логично,
    >  ведь

    А зачем ты обращаешься к несуществующему параметру?
  • Ega23 © (15.12.10 12:37) [39]

    > Ты зачем так делаешь, вроде бы достаточно грамотный программист.


    Ты его, похоже, с Мегавольтом путаешь.


    > Добавил Qry.ParamByName('ddate').asDateTime; чтобы совсем
    > уж точно. То же самое.

    Всё, я так больше не могу. Это, походу, развод чей-то.
 
Конференция "Базы" » [D2010] Магия мыши в TSQLQuery + DateTimePicker [MySQL]
Есть новые Нет новых   [134431   +15][b:0][p:0.005]