Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Передать в Format дату [D7, XP]


Страницы:   1 2 3 4

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.

Как-то так.


Страницы:   1 2 3 4

Наверх

Титульная страница Поиск, карта сайта Написать письмо