![]() |
| ||
|
|
Новости |
Поиск |
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]
Ega23 (2011-10-19 12:04:00) [21]
> Хм, немного поспешил. Ведь при отсутствии параметров Length(P)
> - 1 тоже вернет -1. Значит тоже, что и High(P).
Ты либо от Low до High используй, либо от N до M. А вот скрещивать их лучше не стоит, можно наколоться здорово.
Laguna (2011-10-19 11:58:00) [22]Хм, немного поспешил. Ведь при отсутствии параметров Length(P) - 1тоже вернет -1. Значит тоже, что и High(P).
Омлет (2011-10-19 11:47:00) [23]> Я считаю что High(P) и Length(P) - 1 равнозначны.
Для дин.массивов равнозначны.
Ega23 (2011-10-19 11:45:00) [24]
> Теперь я однозначно знаю, что правильным будет применение
> Length(P) - 1
Нет не так. ЛибоLow to High, либо0 to Length - 1
var
arr: array of Integer;
begin
SetLength(arr, 0);
ShowMessage(IntToStr(Low(arr)));
ShowMessage(IntToStr(High(arr)));
Т.е. 0 to -1 Значит ни разу не выполнится.
Laguna (2011-10-19 11:37:00) [25]>Ega23
Ну, как говорится, мастерство не пропьешь. Снимаю шляпу :)
Действительно, запустил тестовую строку без параметров
OperFromTab(DM1.AdsConnection2, 'DELETE FROM PriTab ', []);
и вот что получил
http://s017.radikal.ru/i433/1110/d9/d20e56fcfa34.jpg
Теперь я однозначно знаю, что правильным будет применение Length(P) - 1
OW (2011-10-19 11:29:00) [26]>>Только вот это вот зачем? for i := 0 to Length(P) - 1
не смотрел на это. так, в общем смотрел.
да что мудрить
for i := 0 to Parameters.Count - 1 do
не надо high | low смотреть. Ошибся - ССЗБ.
или, на крайняк, if длины <> then raise Exception.create('ССЗБ');
Ega23 (2011-10-19 11:23:00) [27]
> Я считаю что High(P) и Length(P) - 1 равнозначны.
Нет.
procedure TForm19.Button2Click(Sender: TObject);
var
arr: array[3..4] of Integer;
begin
ShowMessage(IntToStr(Length(arr)));
ShowMessage(IntToStr(High(arr)));
end;
Медвежонок Пятачок (2011-10-19 11:20:00) [28]for i := 0 to min(High(P),Parameters.Count) do
Laguna (2011-10-19 11:17:00) [29]
> Не знаю что такое ADS.
http://www.sybase.com/products/databasemanagement/advantagedatabaseserver
> Только вот это вот зачем? for i := 0 to Length(P) - 1Если
> длина 0, то цикл просто ни разу не выполнится.
А если будет так for i := 0 to High(P)при Length(P)=0тоже ведь не будет цикл ни разу срабатывать.
Я считаю что High(P)и Length(P) - 1равнозначны.
Ega23 (2011-10-19 11:06:00) [30]
> Удобно, если по мелочи более 2х раз подряд, например, идет.
Я всё равно предпочитаю на каждую команду свой TADOCommand держать. По крайней мере там, где параметры нужны.
> ну вот, уже лучше, имхо
Это да, гораздо лучше.
if Length(P) <> 0 then
for i := Low(P) to High(P) do
Params[i].Value := P[i];
Только вот это вот зачем?for i := 0 to Length(P) - 1
Если длина 0, то цикл просто ни разу не выполнится.
OW (2011-10-19 11:02:00) [31]
> Laguna © (19.10.11 10:40) [41]
ну вот, уже лучше, имхо
> Вопрос с Blob-полями остается открытым
да не совсем..
вечером посмотрю, надо понаписать и это дело, пригодится.
>> class helper для того же TADOCommand
Вот - вот :(
> для D7 не прокатит
это мне ИШ сказал еще, типа, хрень делаешь. Был бы хелпер - смысл был бы, а так - хрень. Но я не согласен :)
Удобно, если по мелочи более 2х раз подряд, например, идет.
От основной мысли не так отвлекает, не мозолит глаза реализация, сосредотачиваешься больше на логику. (хотя и 5-6 строк лишних - не такое уж отвлечение от мысли, но все равно)
Ega23 (2011-10-19 10:47:00) [32]Не знаю что такое ADS.
Но рекомендую внимательно посмотреть на TADSConnection. Вдруг у него уже есть аналог TADOConnection.Execute, но с параметрами?
Laguna (2011-10-19 10:40:00) [33]>Ega23
C ADO раньше практиковал применение. Сейчас хочу перейти на ADS. Вот что получилось в новом виде:
procedure OperFromTab(AC : TAdsConnection; St : String; const P : array of variant);
Var
i : Integer;
begin
with TADSQuery.Create(nil) do
try
ADSConnection := AC;
ParamCheck := True;
SQL.Text := St;
if Length(P) <> 0 then
for i := Low(P) to High(P) do
Params[i].Value := P[i];
ExecSQL;
finally
Free;
end;
end;
Вопрос с Blob-полями остается открытым
Ega23 (2011-10-19 10:24:00) [34]
> Есть принципиальная разница, что строго Text нужно применять?
В твоём конкретном примере - нет. Вообще - есть, и довольно серьёзная.
constructor TADOQuery.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
FSQL := TStringList.Create;
TStringList(FSQL).OnChange := QueryChanged;
Command.CommandTextAlias := 'SQL'; { Do not localize }
end;
> а Length(P) - 1 и High(P) не даст одно и то же для конечного параметра цикла?
В твоём конкретном случае - даст. В общем - нет.
> Согласен, нужно думать.
На самом деле тут всё просто.
Либо делаешь полностью универсальную процедуру, подаёшь в неё Connection, текст запроса и параметры.
Либо делаешь паблик-метод своего датамодуля и в нём уже используешь один и тот же TADOCommand. Т.е. просто текст запроса и параметры.
Либо (но этот вариант для D7 не прокатит) делаешь class helper для того же TADOCommand
Laguna (2011-10-19 09:19:00) [35]Забыл дописать, SQL.Clear;в данной процедуре действительно совершенно не нужен. Спасибо.
Laguna (2011-10-19 09:15:00) [36]> Недостатки данной процедуры:
>1. Не SQl.Add(St), а SQL.Text
Есть принципиальная разница, что строго Text нужно применять?
> := St;2. Не TADOQuery, а TADOCommand.3. Либо for i := 0
> to Length(P) - 1 do, либо for i:= Low(P) to High(P) do4.
а Length(P) - 1 и High(P) не даст одно и то же для конечного параметра цикла?
> ИМХО, самое главное: работа с BLOB-ом не учтена.
Согласен. В данный момент небыло необходимости, но...
> Каждый раз создаётся экземпляр TADOQuery.
Да, есть такое дело. Ноэта процедура не используется в цикле. Для разовых операций(удалить записи, добавить запист и т.д)
> По-хорошему, надо одну такую держать для "разовых" работ. Как вариант >- ввести её параметром, если <> nil, то работать с ней, если = nil,
> то создавать и убивать.
Раньше так и делал. Решил разнообразить.
> Привязка к конкретному экземпляру TADOConnection. Коль делаешь
> универсальную процедуру - будь любезен делать её универсальной, не >зависящей от всяких конкретных DataModule.Как-то так.
Согласен, нужно думать.
> так: пациент и не хочет слушать, походу. Или хочет выборочно.
> ну и ССЗБ, чего сказать :)
Не совсем разобрался на что конкретно нужно было усилить внимание.
Anatoly Podgoretsky (2011-10-19 09:14:00) [37]
> 2. Не TADOQuery, а TADOCommand.
х. И не Params, а Parameters
И вообще переписать все нафиг
OW (2011-10-19 08:46:00) [38]
> 6. Привязка к конкретному экземпляру TADOConnection. Коль
> делаешь универсальную процедуру - будь любезен делать её
> универсальной, не зависящей от всяких конкретных DataModule.
+
насчет:
> Каждый раз создаётся экземпляр TADOQuery. По-хорошему, надо
> одну такую держать для "разовых" работ. Как вариант - ввести
> её параметром, если <> nil, то работать с ней, если = nil,
> то создавать и убивать.
>
тоже думал.. может, класс завести.. С учетом 6:
например,
RunnerQ.Connection := бла-бла1
RunnerQ.OpenQ()
RunnerQ.ExecQ()
RunnerQ.FConnection := бла-бла2
RunnerQ.OpenQ()
и т.п.
А насчет,
> Не захотел поциэнт "загромождать код всякими" - теперь любится
> до усёру.
так: пациент и не хочет слушать, походу. Или хочет выборочно.
ну и ССЗБ, чего сказать :)
Ega23 (2011-10-19 01:27:00) [39]З.Ы. Перед SQL.Clear тут вообще лишнее. Если Add на Text заменить, конечно.
Ega23 (2011-10-19 01:26:00) [40]
> Преимущества использования этой процедуры:
Недостатки данной процедуры:
1. НеSQl.Add(St), аSQL.Text := St;
2. НеTADOQuery, аTADOCommand.
3. Либоfor i := 0 to Length(P) - 1 do, либоfor i:= Low(P) to High(P) do
4. ИМХО, самое главное: работа с BLOB-ом не учтена.
5. Каждый раз создаётся экземпляр TADOQuery. По-хорошему, надо одну такую держать для "разовых" работ. Как вариант - ввести её параметром, если <> nil, то работать с ней, если = nil, то создавать и убивать.
6. Привязка к конкретному экземпляру TADOConnection. Коль делаешь универсальную процедуру - будь любезен делать её универсальной, не зависящей от всяких конкретных DataModule.
Как-то так.