Форум: "Базы";
Текущий архив: 2013.08.18;
Скачать: [xml.tar.bz2];
Вниз[D2010] Магия мыши в TSQLQuery + DateTimePicker Найти похожие ветки
← →
megavoid (2010-12-14 20:13) [0]Здравствуйте, Мастера!
Столкнулся с такой проблемой:
Есть форма, на ней stringgrid, sqlquery, datetimepicker. Юзеры выбирают дату в datetimepicker, в onChange конструируется select с нужной датой, выполняется через query, в цикле (query.next) читаю ответ от query и заполняю stringgrid нужными значениями. Всё вроде бы шоколадно, но есть одно но - если выбирать значение в picker"e мышью (sic!), то query при попытке интерпретировать ответ (.asString, .asInteger) выдаёт ошибку: Query: Field "N1" not found. Не всегда выдаёт, произвольно, один раз из десяти-пятнадцати. Если же выбирать дату в пикере стрелочками, всё прекрасно, никакой ошибки. Более того, по событию FormCreate отрабатывает datetimepickerchange(self), и при запуске проги в гриде тоже всё прекрасно отображено.
Усугубляет разброд в моём мозге то, что поидее сообщения вообще выдаваться не должно бы (try..except), а оно выдаётся :)
Выглядит же этот безобразный цикл примерно так:
try
Query.Open;
for j := 0 to query.RecordCount-1 do begin
// здесь идут блоки s := fieldbyname .asstring; .asinteger; итд
try
S := query.FieldByName("N1").AsString;
except
end;
// здесь мы эти s пихаем в stringgrid
Query.Next;
Application.ProcessMessages;
end;
finally
Query.Close;
end;
При возникновении этого глюка отладчик вылетает в окно CPU, а не на строку между try..except. Стэк вызовов процедур получается такой:
KERNELBASE.RaiseException
DatabaseError
DatabaseErrorFmt
Dataset.FieldByName
стоп указывает на инструкцию leave
перед ней call dword ptr [$7555116c] - что там у меня по этому адресу - Готт его знает, перешёл туда - там jnbe, перед ней ещё пара инструкций и нули, много-много нулей :) Увы, мой ассемблер закончился в досе на уровне mov ah, 9 int 21h, так что мне это ровным счётом ничем не помогло :)
Вопрос: что же всё-таки её вызывает, ошибку эту, если мышкой выбирать дату? Пока вопрос решён чисто по-русски, то есть юзеры (~80 человек) не выбирают мышкой, но мучит меня совесть и интерес профессиональный, что ж за фигня такая :)
Плиз хелп, всем заранее спасибо!
← →
12 © (2010-12-14 21:07) [1]чего показывает
> try
showmessage(Query.sql.text);
> Query.Open;
> for j := 0 to query.ParamCount-1 do showmessage(query.params[i].Name + query.params[i].value);
if Query.IsEmpty then showmessage("Пусто");
> for j := 0 to query.RecordCount-1 do begin
showmessage(query.fields[i].FieldName + query.fields[i].asstring);
> // здесь идут блоки s := fieldbyname .asstring; .asinteger;
> итд
> try
> S := query.FieldByName("N1").AsString;
> except
> end;
> // здесь мы эти s пихаем в stringgrid
> Query.Next;
> Application.ProcessMessages;
> end;
> finally
> Query.Close;
> end;
← →
12 © (2010-12-14 21:08) [2]
> > try
> > S := query.FieldByName("N1").AsString;
> > except
> > end;
а за это тут расстреливают :)
← →
megavoid (2010-12-14 21:46) [3]
showmessage(Query.sql.text)
как и положено, показывает нужный SELECTfor j := 0 to query.ParamCount-1 do showmessage(query.params[i].Name + query.params[i].value);
только всё-таки так:for j := 0 to qry.Params.Count-1 do showmessage(qry.params[i].Name + qry.params[i].value);
гм, ничего не показываетсяshowmessage(query.fields[i].FieldName + query.fields[i].asstring);
тоже немножечко не то :) у меня получилось:for i := 0 to 9 do showmessage(qry.fields[i].FieldName + ":" + qry.fields[i].asstring);
выводит что и положено, имя поля бд со значением из ответа
try .. except end; я прикрутил специально из-за этой вот ситуации, уж не по уши деревянный же, понимаю, что расстреливают )) если есть ошибка, её надо обработать :)
повторюсь, алгоритм нормальный, работает нормально. даже когда вылазит эта ошибка, все данные отображены. если ответ empty, то тоже всё нормально!
беда в том, что если выбирать дату мышкой (или слишком быстро клавой), то вылазит вот этот вот мерзкий query: field not found, хотя все fields на самом деле есть и всё отображается нормально.
← →
Ega23 © (2010-12-14 21:59) [4]
> showmessage(Query.sql.text) как и положено, показывает нужный
> SELECT
1. А ты его в тот самый except поставь. Пустое гашение исключения надо ещё хорошенько обосновать. У меня на практике такое всего пару раз было.
2. Никогда не любил DateTimePicker, всегда Rx-овским пользовался.
3. На OnChange закладываться точно не стал бы. Представь, что ты хочешь на пару месяцев вперёд пролистать, а у тебя на каждом месяце выборка пойдёт. Нехорошо. Положи кнопочку "Обновить", пусть пользователь спокойно выберет дату, а потом уже получает данные.
← →
megavoid (2010-12-14 22:17) [5]@Extended Graphics Array
1. Хоспади, да что вы к этому исключению привязались, не глядите на него, нету его там, нету, я пытаюсь лишь подавить сообщение об ошибке, это удовлетворило бы меня на 101% в этом случае. Нету там такого, тамs1 = query.FieldByName("N1").AsString;
s2 = query.FieldByName("N2").AsString;
s3 = query.FieldByName("N3").AsString;
Всё и так внутри try..finally, без всяких try..except, это никоим образом не влияет ни на что там. Этот except я ввёл, разбираясь в этой ситуации, пытаясь подавить злосообщение.
2. Нельзя использовать сторонние компоненты, не входящие в стандартную поставку дельфи. Даже бесплатные. Даже JEDI. Это придумал не я.
3. Не поверите. Рядом с пикером лежит кнопка обновить. По ней (хе-хе) вызывается OnChange(Self) пикера. Я представлял - юзеры в 99.9% случаев листают на день-два вперёд назад, обычно даже не листают вообще (в грид выводится график на сегодня, им больше и не надо, изредка на завтра). Да, выборка идёт. Занимает 2-3 секунды. Юзеры не расстраиваются. Гораздо больше они расстраиваются из-за field not found :"(
← →
Ega23 © (2010-12-14 22:24) [6]
> Хоспади, да что вы к этому исключению привязались, не глядите
> на него, нету его там, нету,
Как это нету, когда "Field not found"?
А исключение - это для тебя. Между прочим - бесценная информация. Чтобы было понятно, где что происходит.
Ещё раз, возьми и сделай следующее:try
S := query.FieldByName("N1").AsString;
except on E: Exception do
ShowMessage(E.Message + #13#10 + query.SQL.Text);
end;
И после этого станет ясно, где там и чего not found.
← →
Ega23 © (2010-12-14 22:28) [7]
> По ней (хе-хе) вызывается OnChange(Self) пикера.
Это неправильно. Хотя бы потому, что Self (с вероятностью 99%) - это объект класса твоей формы. И с какого перепуга ты его в качестве Sender передаёшь пикеру - непонятно. Это не значит, что так делать запрещено, но ты делаешь неправильно (скорее всего потому, что не разобрался, для чего Sender используется).
Возьми заведи себе метод
TForm1 = class (TForm)
private
.....
procedure UpdateDBData;
И дёргай его, что по нажатию на кнопку, что в OnChange пикера.
← →
megavoid (2010-12-14 22:35) [8]да ё же моё!!!
try
S := TimeToStr(Qry.FieldByName("dtime").AsDateTime);
except
on E: Exception do
ShowMessage(E.Message + #13#10 + qry.SQL.Text);
end;
получаем:
Qry: Field "dtime" not found
и мой SELECT
[OK]
а потомQry: Cannot perform this operation on a closed dataset.
я же не просто так тут распинаюсь :)
Self - объект класса формы, верно. С таким же успехом можно передавать пикеру nil или что угодно, всё равно sender у меня внутри onchange пикера не используется.
Метод такой у меня уже есть. Гридов много, пикеров много. В метод я передаю нужный грид и нужный пикер. Дело не в этом.
← →
Ega23 © (2010-12-14 22:40) [9]
> Cannot perform this operation on a closed dataset.
И чего непонятного? У тебя набор данных закрыт.
Почему - это другой вопрос.
← →
Ega23 © (2010-12-14 22:46) [10]Да, и ещё один момент.
Вот это:try
Query.Open;
for j := 0 to query.RecordCount-1 do begin
перепиши и больше так не делай.
1. Открытие вынеси за try
2. Если не хочешь граблей получить, то обходи набор данных через while. Совершенно необязательно, что ты данные получил до конца, это зависит от драйвера доступа и настроек сервера.
Шаблон примерно такой:with Query do
begin
Open;
try
First;
while not Eof do
begin
try
..... Работаем с данными
finally
Next;
end;
end;
finally
Close;
end;
end;
← →
megavoid (2010-12-14 22:57) [11]@Ega23
>> И чего непонятного? У тебя набор данных закрыт.
>> Почему - это другой вопрос.
мне непонятно, почему грид правильно берёт все данные из якобы "закрытого набора". Повторяю, всё работает нормально!!! Если выбирать дату в пикере мышкой - то всё тоже работает нормально!!! Но изредка!!! вылазит сообщение об ошибке!
1. Оно так и есть. Набирал тут, поэтому и всобачил Open после try. Извиняюсь.
2. Софт уже три месяца в эксплуатации. Все данные всегда получаются нормально, до конца (см. пп. всё работает!!!). Поэтому я не вижу здесь принципиальной разницы между for и while - я ж не убиваю эти данные в qry, они никуда не денутся, что в for 0..count-1, что в while, а памяти на переменную i мне не жалко, да и небось компилятор соптимизирует сам до while, уберёт её.
← →
Ega23 © (2010-12-14 23:10) [12]
> Поэтому я не вижу здесь принципиальной разницы между for
> и while
Ещё раз: это тебе дружеский совет. Следовать ему или нет - это твоё дело.
Но RecordCount будет точно определён, когда данные полностью зафетчатся. До конца. А гарантии, что это произойдёт строго после DataSet.Open - нет. Это зависит от настроек конкретной реализации DataSet и от драйвера доступа.
← →
Ega23 © (2010-12-14 23:14) [13]
> мне непонятно, почему грид правильно берёт все данные из
> якобы "закрытого набора".
Во, кстати. если ты внимательно просмотришь код TDBGrid, то ты увидишь, что он берёт строго те данные, которые в данный момент отображаются на экране.
Это возвращаясь к моему предыдущему посту.
Представь, что выборка у тебя на 100 записей. На экране в данный момент ты видишь первые 20. Остальные могут уже находиться в DataSet, могут ещё продолжать "подсасываться". А могут подсосаться тогда, когда ты грид проскроллишь.
← →
megavoid (2010-12-14 23:24) [14]@Ega23
Хочется выть и биться об стол головой :)
Где вы у меня TDBGrid и DataSet увидели??? у меня TStringGrid и TSQLQuery!!!
Поэтому все данные будут у меня сразу после TSQLQuery.Open, а потом вручную данные из Query я вношу в StringGrid с нужным заказчику форматированием.
← →
Ega23 © (2010-12-14 23:59) [15]
> Поэтому все данные будут у меня сразу после TSQLQuery.Open
Не факт. Впрочем, это твоё дело.
← →
megavoid (2010-12-15 00:26) [16]> Не факт. Впрочем, это твоё дело.
ну тогда мне остаётся лишь признать, что создатели дельфи - полнейшие лохи, ведь они и сами об этом не знают!
http://docs.embarcadero.com/products/rad_studio/delphiAndcpp2009/HelpUpdate2/EN/html/delphivclwin32/SqlExpr_TSQLQuery.html
http://docs.embarcadero.com/products/rad_studio/delphiAndcpp2009/HelpUpdate2/EN/html/devwin32/5datasetusingunidirectionalresultsets_xml.html
впрочем, делу это не помогает нисколечко :(
ау, эксперты, откликнитесь пожалуйста!!!
← →
sniknik © (2010-12-15 02:09) [17]> впрочем, делу это не помогает нисколечко :(
а чем это должно помочь? могло бы, если бы прислушивался к советам, а так.. нет.
по второй ссылке про однонаправленные датасеты, косвенное подтверждение словам Ega23 про неопределенность RecordCount и все проблемы с этим связанные. т.к. однонаправленные могут быть только с серверным курсором, а для серверных это актуально... и то, что "через раз" тоже, т.к. успевает - работает, а чуть "повезло" быстрее сработать - глюк.
> ау, эксперты, откликнитесь пожалуйста!!!
тебе уже сказали, или следуй советам, и переделывай, даже не понимая причин, или... "это твоё дело", как бы переубеждать "насильно" это тебе нужны другие эксперты.
← →
megavoid (2010-12-15 04:37) [18]@sniknik
> > впрочем, делу это не помогает нисколечко :(а чем это должно
> помочь? могло бы, если бы прислушивался к советам, а так.
> . нет.
Единственный совет, к которому я не прислушался - это переделать цикл с предусловия for на постусловие while. Всё остальное из ответов я проделал с прилежностью ученика церковно-приходской школы, и привёл все полученные результаты в топике.
Query.Clear;
Query.Add("SELECT * from table WHERE date=" + format2sql(datetimepicker.date) + ";");
Query.Open;
try
/* приведите мне, пожалуйста, пример, когда TSqlQuery в этом случае вернёт мне НЕ ВСЕ нужные записи. Может быть, я с этим просто не столкнулся. Обычно возвращается в среднем порядка 100 записей. */
for i := 0 to Query.RecordCount-1 do begin
// here are we"re getting info from answer
Query.Next;
end;
finally
Query.Close;
end;
Во всех примерах использования dbExpress без отображения в dbgrid, для простого формирования запроса к БД указан именно этот путь - делаем запрос, open, читаем записи next, закрываем sqlquery. Если база не возвращает результат - используем execsql. Можно, конечно, и переделать цикл на while not eof, если recordcount врёт, но с чего ему врать? В той же документации указано, что RecordCount содержит количество записей в наборе данных однонаправленного датасета.
← →
megavoid (2010-12-15 04:50) [19]В этом проекте 20 форм и более 100 запросов. SQLQuery один. Все они (запросы) for i < recordcount всегда отрабатывают нормально (open/execsql). Кроме этого случая с выбором даты в пикере мышью.
← →
sniknik © (2010-12-15 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 © (2010-12-15 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 © (2010-12-15 09:10) [22]
> ну тогда мне остаётся лишь признать, что создатели дельфи
> - полнейшие лохи, ведь они и сами об этом не знают!
Не это ты лох.
И все то у тебя есть, вот только мы об этом узнаем потом.
← →
Плохиш © (2010-12-15 09:50) [23]
> megavoid (15.12.10 00:26) [16]
> > Не факт. Впрочем, это твоё дело.
> ну тогда мне остаётся лишь признать, что создатели дельфи
> - полнейшие лохи
Ламер-дерьмокодер детектед.
← →
sniknik © (2010-12-15 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 © (2010-12-15 10:03) [25]> sniknik (15.12.2010 09:53:24) [24]
Не, его просто развели как лоха на покупку Дельфи.
← →
Ega23 © (2010-12-15 10:06) [26]
> Не, его просто развели как лоха на покупку Дельфи.
Ха. Ха. Ха.
Купил.
← →
Anatoly Podgoretsky © (2010-12-15 10:09) [27]> Ega23 (15.12.2010 10:06:26) [26]
Купил, или ты думаешь, что это он возмущается по поводу ворованой,
взломаной?
Тогда это вообще двойной лох.
← →
12 © (2010-12-15 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 © (2010-12-15 11:26) [29]> 12 (15.12.2010 10:45:28) [28]
Это Trunc - тоже бывает глючит, там же нет места для глюка, это выполняет
процессор, он просто обрезает дробную часть. Если бы был глюк по этой части
уже стоял гигантский крик в Интернет.
← →
sniknik © (2010-12-15 12:12) [30]> но и Trunc - тоже бывает глючит. Я заводил тему, как-то.
Trunc вряд ли, а вот это -
> Q.Params[i].Value:=
возможно. из-за того, что при не заданности типа ADO к примеру берет его из присваиваемого "варианта", а присваиваемый "вариант" получается из приведенного значения, т.е. integer-а в случае с Trunc
> но, если
> TDateTime(Trunc( datetimepicker.date))
> то ошибку ODAC пишет, дескать я хочу время, а мне суют число
видимо с точки зрения оптимизатора подобное приведение типа не существенно (все одно числа туда сюда автоматом приводятся)
> но, на деле вот так вот работает, а иначе - нет.
иначе можно еще тип параметру явно указать, перед значением, и значит "автоопределением" из варианта.
← →
megavoid (2010-12-15 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 © (2010-12-15 12:23) [32]
> fd2sql (c) Белов Владимир
Укуси меня пчела...
О сколько раз твердили миру - используйте уже параметры.
З.Ы. Мне страшно ходить в кинотеатры.
← →
megavoid (2010-12-15 12:27) [33]Добавил Qry.ParamByName("ddate").asDateTime; чтобы совсем уж точно. То же самое.
← →
megavoid (2010-12-15 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 © (2010-12-15 12:34) [35]
> но, если
> TDateTime(Trunc( datetimepicker.date))
Ты зачем так делаешь, вроде бы достаточно грамотный программист.
← →
Anatoly Podgoretsky © (2010-12-15 12:35) [36]
> что же мне указывать, если мне все поля нужны? перечислять
> их все через запятую?
Ленивым не место в программирование.
← →
megavoid (2010-12-15 12:36) [37]Я имею некое представление про серверный курсор. При однонаправленном датасете мы можем лишь идти курсором вперёд по набору данных, используя .Next. Да, я понимаю, что раз он работает асинхронно, то я могу начать читать записи до того, как они все приедут по сети. Но как в таком случае мне отследить событие окончания приезда всех данных? Я положился на пример использования dbExpress, где так и было open - for .. recordcount - next - close - и всё работает.
← →
Anatoly Podgoretsky © (2010-12-15 12:36) [38]
> не, не то же самое. Qry: Parameter "ddate" not found - логично,
> ведь
А зачем ты обращаешься к несуществующему параметру?
← →
Ega23 © (2010-12-15 12:37) [39]
> Ты зачем так делаешь, вроде бы достаточно грамотный программист.
Ты его, похоже, с Мегавольтом путаешь.
> Добавил Qry.ParamByName("ddate").asDateTime; чтобы совсем
> уж точно. То же самое.
Всё, я так больше не могу. Это, походу, развод чей-то.
← →
megavoid (2010-12-15 12:39) [40]> А зачем ты обращаешься к несуществующему параметру?
я к нему не обращаюсь. это я пробовал [21], [24]
Страницы: 1 2 3 вся ветка
Форум: "Базы";
Текущий архив: 2013.08.18;
Скачать: [xml.tar.bz2];
Память: 0.6 MB
Время: 0.003 c