![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Передать в Format дату [D7, XP]
Laguna © (2011-10-18 15:25:00)При форматировании строки на ряду с числами и строками присутствует параметр как дата. Как его передать через Format? Из перечисленного в справке ничего не нашел
d = Десятичное (целое число)
e = Научный
f = Установленный
g = Генерал
m = Деньги
n = Число (плавающее)
p = Указатель
s = Строка
u = Десятичное число без знака
x = Шестнадцатеричный
А нужно вот так ... Format('%d - %s - %дата'), [10, 'Строка', Now]
Германн (2011-10-19 01:20:00) [41]
> Laguna © (18.10.11 23:56) [31]
>
> Допустим Clear я делаю всегда перед подстановкой новой строки
> запроса. Другое дело , что "настроку параметров" я выполняю
> не в том месте,
???
Очень похоже на "револьвер". И на "русскую рулетку". :)
Laguna (2011-10-19 00:37:00) [42]НУ, как я и предполагал, неверно было расположено место присвоения значений параметрам. После внесения изменений все заработало ка нужно. Вот конечный вариант многовариантной процедуры :
procedure OperFromBuhTab(St : String; const P : array of variant);
Var
i : Integer;
begin
with TADOQuery.Create(nil) do
try
ADOConnection := DM1.AdoConnection1;
ParamCheck := True;
SQL.Clear;
SQL.Add(St);
for i := 0 to High(P) do
Params[i].Value := P[i];
ExecSQL;
finally
Free;
end;
end;
Преимущества использования этой процедуры:
1) Query коспонент формируется в рантайм по мере необходимости
2) Произвольное количество входящих параметров
OW- спасибо за const P : array of variant
Ega23- спасибо за Товарищ SQL.Clear делает, а потом удивляется.Хоть не совсем то, но навело на мысль обратить внимание на место расположения строки запроса и параметров.
Laguna (2011-10-18 23:56:00) [43]Допустим Clear я делаю всегда перед подстановкой новой строки запроса. Другое дело , что "настроку параметров" я выполняю не в том месте,
SQL.Clear;
for i := 0 to High(P) do
Params[i].Value := P[i];
SQL.Add(St);
ExecSQL;
А нужно правильно так, ИМХО
SQL.Clear;
SQL.Add(St);
for i := 0 to High(P) do
Params[i].Value := P[i];
ExecSQL;
по крайней мере когда подставлю реальные параметрвы типа
парам = значение
парам = значение
парам = значение
Ega23 (2011-10-18 21:45:00) [44]
> Какой из двух?
Да не из двух. Товарищ SQL.Clear делает, а потом удивляется.
Плохиш (2011-10-18 21:29:00) [45]
> Laguna © (18.10.11 21:02) [27]
> точка останова for i := 0 to High(P) do - массив содержит
> 4 элемента
Какой из двух?
Игорь Шевченко (2011-10-18 21:25:00) [46]
> http://www.delphibasics.ru/Format.php
Внушает.
"Ôóíêöèÿ Format îáåñïå÷èâàạ̊ 'C' ïîäîáíîå ôîđ́ạ̀èđîâàíè 229; ́íîæåṇ̃âà ïđîṇ̃ûơ ̣èïîâ äàííûơ â ṇ̃đîêå. Îíà îáåñïå÷èâàạ̊ î÷åíü ̣î÷íîå óïđàâëåíèå ïî ựî́ó ôîđ́ạ̀èđîâàíè 8363;.
d = Äåñỵ̈è÷íîå (öåëîå ÷èñëî)
e = Íàó÷íûé
f = Óṇ̃àíîâëåííûé
g = Ăåíåđàë
m = Äåíüăè
n = ×èñëî (ïëàâà₫ùåå)
p = Óêàçạ̀åëü
s = Ṇ̃đîêà
u = Äåñỵ̈è÷íîå ÷èñëî áåç çíàêà
x = Øåṇ̃íàäöạ̀åđè 247;íûé "
Laguna (2011-10-18 21:02:00) [47]> Игорь Шевченко
> f = Установленный
> g = Генерал
Это что и откуда ?
http://www.delphibasics.ru/Format.php
точка останова for i := 0 to High(P) do- массив содержит 4 элемента
Игорь Шевченко (2011-10-18 20:38:00) [48]
> f = Установленный
> g = Генерал
Это что и откуда ?
Плохиш (2011-10-18 20:21:00) [49]
> параметров запроса меньше чем длина массива
На момент присваивания их вообще нет, да и запроса никакого нет.
> Laguna © (18.10.11 17:50) [22]
Ты б с бумажкой и карандашом перошёлся по своему "коду", да выполни его сам.
Ega23 (2011-10-18 19:02:00) [50]
> В чем дело? Что опять не так?
Вот об этом, Влад, я и писал.
> Это способ, повторюсь, для того что бы не загромождать код всякими
Не захотел поциэнт "загромождать код всякими" - теперь любится до усёру.
З.Ы. А я ещё более параноидально с некоторых пор предпочитаю делать. Я и ParamCheck в False ставлю, а параметры с их типами добавляю исключительно вручную.
Медвежонок Пятачок (2011-10-18 18:02:00) [51]параметров запроса меньше чем длина массива
Laguna (2011-10-18 17:50:00) [52]Сделал вот так
procedure SqlFromTab(St : String; const P : array of variant);
Var
i : Integer;
begin
with TADOQuery.Create(nil) do
try
ADOConnection := DM1.AdoConnection1;
ParamCheck := True;
SQL.Clear;
for i := 0 to High(P) do
Params[i].Value := P[i];
SQL.Add(St);
ExecSQL;
finally
Free;
end;
end;
В программе запускаю процедуру
SqlFromTab('Insert InTo OperTab (RegKod, DataDoc, NameDoc, SumDoc) Values (:p1, :p2, :p3, :p4)',
[RegInf.Kod, DataDocDateEdit.Date, NameDocEdit.Text,
DBGridEh1.Columns[4].Footer.SumValue]);
В отладку смотрю - массив заполнен, но Params[i].Value := P[i];вылетает ошибка List Index Out of Bonds. В момент трассировки P[i]AV. В чем дело? Что опять не так?
OW (2011-10-18 17:45:00) [53]
> для даты-время - отдельная строчка
да, это атавизм, это из-за того что в проекте юзал неподготовленную в параметрах DS. А если подготовленная, то и не надо этой строчки.
> BLOB не передать толком
не передать. Тут "честно" надо.
В остальном юзается нормально пока.
> Строка и число?
не понял
> Да и по имени параметра толком не обратишься
можно, если обычно опять же писать.
Это способ, повторюсь, для того что бы не загромождать код всякими
парам = значение
парам = значение
парам = значение
открыть
когда читаем что-то рабочее, малозначительное. Зачем место тратить..
Ega23 (2011-10-18 17:29:00) [54]
> ни, соответственно, с параметрами, настроенными вдруг до
> этого, так или иначе.
Не знаю. ИМХО, всё равно фигня полная. BLOB не передать толком, для даты-время - отдельная строчка. Строка и число? Да и по имени параметра толком не обратишься.
ИМХО - ацтой, только путает.
Вот если через атрибуты RTTI как-то попробовать завязаться - это уже совсем другое дело.
OW (2011-10-18 17:24:00) [55]да говорю же
OpenQ(aqTmp, '', [Val]); или OpenQ(oqTmp, '', [Val]);
тут SQL = ''
а в этом случае Q.SQL.Text не меняется, ничего не происходит ни с командой, ни, соответственно, с параметрами, настроенными вдруг до этого, так или иначе.
Ega23 (2011-10-18 17:20:00) [56]
> А так она много где используется, как принимающая уже подготовленную
> строку запрса.
Так ты и давай строку запроса, а потом меняй значение параметра. Нафига при каждом изменении значенияпараметра реинициализировать всё?
> и нет никакой
> >> реинициализация CommandText и списка параметров при каждом
> вызове.
Я не знаю, как DOA себя ведёт. Но крайне рекомендую поиграться с ADO. Как с канонiчным, так и с дельфёвой реализацией.
Хотя чё там играться-то, см. TADODataSet.CommandText
Laguna (2011-10-18 17:17:00) [57]Я подумал что будет загвозда в передаче параметров. Ан нет, действительно можно в качестве массива из Variant
OW (2011-10-18 17:07:00) [58]
> Это запутывание
нет, почему?
Tmp - временная ерунда, для считать по мелочи данные из БД,
что-то серьёзное - достойно самостоятельного компонента на форме/модуле
но, и к нему тоже можно применить!
procedure OpenQ(const Q:TORA(или ADO)Query; const SQL:string; const P:array of variant);
var
i:integer;
s:string;
begin
try
try
Screen.Cursor := crHourGlass;
if SQL <> '' then
Q.SQL.Text := SQL;
т.е.
OpenQ(oqTmp, '', [Val]);
и нет никакой
>> реинициализация CommandText и списка параметров при каждом вызове.
Laguna (2011-10-18 17:07:00) [59]>Ega23
Почему же не нужна общая процедура? Это в данном случае так получилось, что дату никак не прикрутить, кроме как через параметры. А так она много где используется, как принимающая уже подготовленную строку запрса.
Ega23 (2011-10-18 16:59:00) [60]
> да можно,
> для упрощения, например
Про упрощение - спорное утверждение.
Это запутывание + реинициализация CommandText и списка параметров при каждом вызове.
В принципе, иметь такую функцию, наверное полезно. Но пользоваться ей направо и налево я бы не стал.