Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2012.01.29;
Скачать: CL | DM;

Вниз

Передать в Format дату   Найти похожие ветки 

 
Laguna ©   (2011-10-18 15:25) [0]

При форматировании строки на ряду с числами и строками присутствует параметр как дата. Как его передать через Format? Из перечисленного в справке ничего не нашел

d = Десятичное (целое число)
e = Научный
f = Установленный
g = Генерал
m = Деньги
n = Число (плавающее)
p = Указатель
s = Строка
u = Десятичное число без знака
x = Шестнадцатеричный


А нужно вот так ... Format("%d - %s - %дата"), [10, "Строка", Now]


 
Amoeba_   (2011-10-18 15:30) [1]

Format("%d - %s - %s"), [10, "Строка", DateToStr(Now)]


 
Ega23 ©   (2011-10-18 15:31) [2]

Format("%d - %s - %s"), [10, "Строка", DateTimeToStr(Now)]

Ну или вместо DateTimeToStr можно FormatDateTime


 
Laguna ©   (2011-10-18 15:41) [3]

Дело в том, что передать дату нужно будет в таблицу с полем TDate через sql-запрос, поэтому перевод даты в строку не пойдет.


 
Amoeba_   (2011-10-18 15:48) [4]


> передать дату нужно будет в таблицу с полем TDate через
> sql-запрос

Запрос в студию!


 
OW ©   (2011-10-18 16:01) [5]


> передать дату нужно будет в таблицу с полем TDate через
> sql-запрос

use parameters


 
Ega23 ©   (2011-10-18 16:04) [6]


> нужно будет в таблицу с полем TDate через sql-запрос,


Параметры используй.


 
Laguna ©   (2011-10-18 16:06) [7]

Общая процедура для исполнения SQL-запроса

procedure SqlFromTab(St : String);
begin
 with TADOQuery.Create(nil) do
  try
    ADOConnection := DM1.AdoConnection1;
    ParamCheck := True;
    SQL.Clear;
    SQL.Add(St);
    ExecSQL;
  finally
    Free;
  end;
end;


Далее формируем нужную строку для запроса


SQlFromTab(Format("Insert InTo OperTab (Kod, , DataDoc, NameDoc, SumDoc) " +
                               "Values (%d, ???, %s, %.0f)",[RegInf.Kod, DataDocDateEdit.Date, NameDocEdit.Text, DBGridEh1.Columns[4].Footer.SumValue]));


Кстати вырисовалась дополнительно еще одна загвоздка. DBGridEh1.Columns[4].Footer.SumValue Имеет тип Variant и при применении параметра %.0f Тоже выдает ошибку несовместимости типа параметра, хотя в таблице поле имеет тип Double.


 
Ega23 ©   (2011-10-18 16:20) [8]

Ты не используешь параметры.
Используй их и будет тебе щщасте.


 
OW ©   (2011-10-18 16:21) [9]

uses the parameters
verwendet die Parameter
utilise les paramètres
パラメータを使用して います


 
OW ©   (2011-10-18 16:31) [10]

кажется, уловил мысль
вот, не претендуя на изящество и опуская проверки

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;
   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;
 except
   on E:Exception do
   begin
     Screen.Cursor := crDefault;
     E.Message := E.Message + #13#10 + "досада в uUtils. procedure OpenQ. при попытке сделать " + #13#10 + Q.SQL.Text + #13#10 + " а параметры таковы:" + s;
     Raise;
   end;
 end;
 Screen.Cursor := crDefault;
end;

 OpenQ(oqTmp, "select * from AGENTS where ID_AGENT = :ID_AGENT ", [IdAgent]);
 FAgentId := oqTmp.FieldbyName("ID_AGENT").Value;


 
Laguna ©   (2011-10-18 16:32) [11]

Я понял насчет параметров, как единичный случай сейчас попробую. Только как это будет выглядеть с применением их в общей процедуре? Параметры я указываю после строки запроса. А ведь их(параметров) каждый раз может быть различное количество. В данной ситуации Format ведь тоже использует параметры и все в одной строке.


 
Ega23 ©   (2011-10-18 16:34) [12]


> Только как это будет выглядеть с применением их в общей
> процедуре?


А не надо общую процедуру делать. Незачем.


 
OW ©   (2011-10-18 16:54) [13]


> не надо общую процедуру делать. Незачем.

да можно,
для упрощения, например

OpenQ(oqTmp, "select * from ТАБЛА1 where ID_COL = :ID_COL ", [AVal]);
FMyVar1 := oqTmp.FieldbyName("COL_NAME").Value;
OpenQ(oqTmp, "select * from ТАБЛА22 where ID_COL = :ID_COL and ID_COL2 = :ID_COL2 ", [AVal2, AVal3]);
FMyVar2 := oqTmp.FieldbyName("COL_SUBSCRIBE").Value;

вместо

oqTmp.sql.test := "select * from ТАБЛА1 where ID_COL = :ID_COL ";
oqTmp.pameters.parambyname(). value := AVal;
oqTmp.Open;
FMyVar1 := oqTmp.FieldbyName("COL_NAME").Value;
oqTmp.sql.test := "select * from ТАБЛА22 where ID_COL = :ID_COL and ID_COL2 = :ID_COL2 ";
oqTmp.pameters.parambyname(). value := AVal2;
oqTmp.pameters.parambyname(). value := AVal3;
oqTmp.Open;
FMyVar2 := oqTmp.FieldbyName("COL_SUBSCRIBE").Value;

представляется вот это все
oqTmp.pameters.parambyname(). value := AVal2;
oqTmp.pameters.parambyname(). value := AVal3;
да и Open|Exec потом - шелуха, детали, отвлекающие от сути

запрос и сразу параметры - имхо, лучше.


 
Ega23 ©   (2011-10-18 16:59) [14]


> да можно,
> для упрощения, например


Про упрощение - спорное утверждение.
Это запутывание + реинициализация CommandText и списка параметров при каждом вызове.
В принципе, иметь такую функцию, наверное полезно. Но пользоваться ей направо и налево я бы не стал.


 
Laguna ©   (2011-10-18 17:07) [15]

>Ega23

Почему же не нужна общая процедура? Это в данном случае так получилось, что дату никак не прикрутить, кроме как через параметры. А так она много где используется, как принимающая уже подготовленную строку запрса.


 
OW ©   (2011-10-18 17:07) [16]


> Это запутывание

нет, почему?
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:17) [17]

Я подумал что будет загвозда в передаче параметров. Ан нет, действительно можно в качестве массива из Variant


 
Ega23 ©   (2011-10-18 17:20) [18]


> А так она много где используется, как принимающая уже подготовленную
> строку запрса.


Так ты и давай строку запроса, а потом меняй значение параметра. Нафига при каждом изменении значения параметра реинициализировать всё?


> и нет никакой
> >> реинициализация CommandText и списка параметров при каждом
> вызове.


Я не знаю, как DOA себя ведёт. Но крайне рекомендую поиграться с ADO. Как с канонiчным, так и с дельфёвой реализацией.
Хотя чё там играться-то, см. TADODataSet.CommandText


 
OW ©   (2011-10-18 17:24) [19]

да говорю же

OpenQ(aqTmp, "", [Val]); или OpenQ(oqTmp, "", [Val]);
тут SQL = ""
а в этом случае Q.SQL.Text не меняется, ничего не происходит ни с командой, ни, соответственно, с параметрами, настроенными вдруг до этого, так или иначе.


 
Ega23 ©   (2011-10-18 17:29) [20]


> ни, соответственно, с параметрами, настроенными вдруг до
> этого, так или иначе.


Не знаю. ИМХО, всё равно фигня полная. BLOB не передать толком, для даты-время - отдельная строчка. Строка и число? Да и по имени параметра толком не обратишься.
ИМХО - ацтой, только путает.
Вот если через атрибуты RTTI как-то попробовать завязаться - это уже совсем другое дело.


 
OW ©   (2011-10-18 17:45) [21]


> для даты-время - отдельная строчка

да, это атавизм, это из-за того что в проекте юзал неподготовленную в параметрах DS. А если подготовленная, то и не надо этой строчки.


> BLOB не передать толком

не передать. Тут "честно" надо.
В остальном юзается нормально пока.


> Строка и число?

не понял


> Да и по имени параметра толком не обратишься

можно, если обычно опять же писать.

Это способ, повторюсь, для того что бы не загромождать код всякими
парам = значение
парам = значение
парам = значение
открыть
когда читаем что-то рабочее, малозначительное. Зачем место тратить..


 
Laguna ©   (2011-10-18 17:50) [22]

Сделал вот так

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. В чем дело? Что опять не так?


 
Медвежонок Пятачок ©   (2011-10-18 18:02) [23]

параметров запроса меньше чем длина массива


 
Ega23 ©   (2011-10-18 19:02) [24]


> В чем дело? Что опять не так?


Вот об этом, Влад, я и писал.

> Это способ, повторюсь, для того что бы не загромождать код всякими


Не захотел поциэнт "загромождать код всякими" - теперь любится до усёру.

З.Ы. А я ещё более параноидально с некоторых пор предпочитаю делать. Я и ParamCheck в False ставлю, а параметры с их типами добавляю исключительно вручную.


 
Плохиш ©   (2011-10-18 20:21) [25]


> параметров запроса меньше чем длина массива

На момент присваивания их вообще нет, да и запроса никакого нет.

> Laguna ©   (18.10.11 17:50) [22]

Ты б с бумажкой и карандашом перошёлся по своему "коду", да выполни его сам.


 
Игорь Шевченко ©   (2011-10-18 20:38) [26]


> f = Установленный
> g = Генерал


Это что и откуда ?


 
Laguna ©   (2011-10-18 21:02) [27]

> Игорь Шевченко

> f = Установленный
> g = Генерал

Это что и откуда ?


http://www.delphibasics.ru/Format.php

точка останова for i := 0 to High(P) do - массив содержит 4 элемента


 
Игорь Шевченко ©   (2011-10-18 21:25) [28]


> http://www.delphibasics.ru/Format.php


Внушает.

"&#212;&#243;&#237;&#234;&#246;&#232;&#255; Format &#238;&#225;&#229;&#241;&#239;&#229;&#247;&#232;&#226;&#224;&#229;&#803; "C" &#239;&#238;&#228;&#238;&#225;&#237;&#238;&#229; &#244;&#238;&#273;&#769;&#224;&#803;&#232;&#273;&#238;&#226;&#224;&#237;&#232;&# 229; &#769;&#237;&#238;&#230;&#229;&#241;&#803;&#226;&#224; &#239;&#273;&#238;&#241;&#803;&#251;&#417; &#803;&#232;&#239;&#238;&#226; &#228;&#224;&#237;&#237;&#251;&#417; &#226; &#241;&#803;&#273;&#238;&#234;&#229;. &#206;&#237;&#224; &#238;&#225;&#229;&#241;&#239;&#229;&#247;&#232;&#226;&#224;&#229;&#803; &#238;&#247;&#229;&#237;&#252; &#803;&#238;&#247;&#237;&#238;&#229; &#243;&#239;&#273;&#224;&#226;&#235;&#229;&#237;&#232;&#229; &#239;&#238; &#432;&#803;&#238;&#769;&#243; &#244;&#238;&#273;&#769;&#224;&#803;&#232;&#273;&#238;&#226;&#224;&#237;&#232;&# 8363;.

d = &#196;&#229;&#241;&#255;&#803;&#232;&#247;&#237;&#238;&#229; (&#246;&#229;&#235;&#238;&#229; &#247;&#232;&#241;&#235;&#238;)
e = &#205;&#224;&#243;&#247;&#237;&#251;&#233;
f = &#211;&#241;&#803;&#224;&#237;&#238;&#226;&#235;&#229;&#237;&#237;&#251;&#233;
g = &#258;&#229;&#237;&#229;&#273;&#224;&#235;
m = &#196;&#229;&#237;&#252;&#259;&#232;
n = &#215;&#232;&#241;&#235;&#238; (&#239;&#235;&#224;&#226;&#224;&#8363;&#249;&#229;&#229;)
p = &#211;&#234;&#224;&#231;&#224;&#803;&#229;&#235;&#252;
s = &#209;&#803;&#273;&#238;&#234;&#224;
u = &#196;&#229;&#241;&#255;&#803;&#232;&#247;&#237;&#238;&#229; &#247;&#232;&#241;&#235;&#238; &#225;&#229;&#231; &#231;&#237;&#224;&#234;&#224;
x = &#216;&#229;&#241;&#803;&#237;&#224;&#228;&#246;&#224;&#803;&#229;&#273;&#232;&# 247;&#237;&#251;&#233; "


 
Плохиш ©   (2011-10-18 21:29) [29]


> Laguna ©   (18.10.11 21:02) [27]

> точка останова for i := 0 to High(P) do - массив содержит
> 4 элемента

Какой из двух?


 
Ega23 ©   (2011-10-18 21:45) [30]


> Какой из двух?


Да не из двух. Товарищ SQL.Clear делает, а потом удивляется.


 
Laguna ©   (2011-10-18 23:56) [31]

Допустим 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;


по крайней мере  когда подставлю реальные параметрвы типа
парам = значение
парам = значение
парам = значение


 
Laguna ©   (2011-10-19 00:37) [32]

НУ, как я и предполагал, неверно было расположено место присвоения значений параметрам. После внесения изменений все заработало ка нужно. Вот конечный вариант многовариантной процедуры :

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 делает, а потом удивляется. Хоть не совсем то, но навело на мысль обратить внимание на место расположения строки запроса и параметров.


 
Германн ©   (2011-10-19 01:20) [33]


> Laguna ©   (18.10.11 23:56) [31]
>
> Допустим Clear я делаю всегда перед подстановкой новой строки
> запроса. Другое дело , что "настроку параметров" я выполняю
> не в том месте,

???
Очень похоже на "револьвер". И на "русскую рулетку". :)


 
Ega23 ©   (2011-10-19 01:26) [34]


> Преимущества использования этой процедуры:


Недостатки данной процедуры:
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.

Как-то так.


 
Ega23 ©   (2011-10-19 01:27) [35]

З.Ы. Перед SQL.Clear тут вообще лишнее. Если Add на Text заменить, конечно.


 
OW ©   (2011-10-19 08:46) [36]


> 6. Привязка к конкретному экземпляру TADOConnection. Коль
> делаешь универсальную процедуру - будь любезен делать её
> универсальной, не зависящей от всяких конкретных DataModule.

+

насчет:

> Каждый раз создаётся экземпляр TADOQuery. По-хорошему, надо
> одну такую держать для "разовых" работ. Как вариант - ввести
> её параметром, если <> nil, то работать с ней, если = nil,
>  то создавать и убивать.
>


тоже думал..  может, класс завести.. С учетом 6:
например,
RunnerQ.Connection := бла-бла1
RunnerQ.OpenQ()
RunnerQ.ExecQ()
RunnerQ.FConnection := бла-бла2
RunnerQ.OpenQ()
и т.п.

А насчет,

> Не захотел поциэнт "загромождать код всякими" - теперь любится
> до усёру.

так: пациент и не хочет слушать, походу. Или хочет выборочно.
ну и ССЗБ, чего сказать :)


 
Anatoly Podgoretsky ©   (2011-10-19 09:14) [37]


> 2. Не TADOQuery, а TADOCommand.

х. И не Params, а Parameters

И вообще переписать все нафиг


 
Laguna ©   (2011-10-19 09:15) [38]

> Недостатки данной процедуры:
>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.Как-то так.
Согласен, нужно думать.


> так: пациент и не хочет слушать, походу. Или хочет выборочно.
>  ну и ССЗБ, чего сказать :)

Не совсем разобрался на что конкретно нужно было усилить внимание.


 
Laguna ©   (2011-10-19 09:19) [39]

Забыл дописать, SQL.Clear; в данной процедуре действительно совершенно не нужен. Спасибо.


 
Ega23 ©   (2011-10-19 10:24) [40]


> Есть принципиальная разница, что строго 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 10:40) [41]

>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:47) [42]

Не знаю что такое ADS.

Но рекомендую внимательно посмотреть на TADSConnection. Вдруг у него уже есть аналог TADOConnection.Execute, но с параметрами?


 
OW ©   (2011-10-19 11:02) [43]


> Laguna ©   (19.10.11 10:40) [41]

ну вот, уже лучше, имхо


> Вопрос с Blob-полями остается открытым

да не совсем..
вечером посмотрю, надо понаписать и это дело, пригодится.

>> class helper для того же TADOCommand
Вот - вот :(

> для D7 не прокатит

это мне ИШ сказал еще, типа, хрень делаешь. Был бы хелпер - смысл был бы, а так - хрень. Но я не согласен :)
Удобно, если по мелочи более 2х раз подряд, например, идет.
От основной мысли не так отвлекает, не мозолит глаза реализация, сосредотачиваешься больше на логику. (хотя и 5-6 строк лишних - не такое уж отвлечение от мысли, но все равно)


 
Ega23 ©   (2011-10-19 11:06) [44]


> Удобно, если по мелочи более 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, то цикл просто ни разу не выполнится.


 
Laguna ©   (2011-10-19 11:17) [45]


> Не знаю что такое 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 равнозначны.


 
Медвежонок Пятачок ©   (2011-10-19 11:20) [46]

for i := 0 to min(High(P),Parameters.Count) do


 
Ega23 ©   (2011-10-19 11:23) [47]


> Я считаю что 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;


 
OW ©   (2011-10-19 11:29) [48]

>>Только вот это вот зачем? for i := 0 to Length(P) - 1
не смотрел на это. так, в общем смотрел.

да что мудрить
for i := 0 to Parameters.Count - 1 do

не надо high | low смотреть. Ошибся - ССЗБ.
или, на крайняк, if длины <> then raise Exception.create("ССЗБ");


 
Laguna ©   (2011-10-19 11:37) [49]

>Ega23

Ну, как говорится, мастерство не пропьешь. Снимаю шляпу :)

Действительно, запустил тестовую строку без параметров

 OperFromTab(DM1.AdsConnection2, "DELETE FROM PriTab ", []);

и вот что получил
http://s017.radikal.ru/i433/1110/d9/d20e56fcfa34.jpg

Теперь я однозначно знаю, что правильным будет применение Length(P) - 1


 
Ega23 ©   (2011-10-19 11:45) [50]


> Теперь я однозначно знаю, что правильным будет применение
> 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 Значит ни разу не выполнится.


 
Омлет ©   (2011-10-19 11:47) [51]

> Я считаю что High(P) и Length(P) - 1 равнозначны.

Для дин.массивов равнозначны.


 
Laguna ©   (2011-10-19 11:58) [52]

Хм, немного поспешил. Ведь при отсутствии параметров Length(P) - 1 тоже вернет -1. Значит тоже, что и High(P).


 
Ega23 ©   (2011-10-19 12:04) [53]


> Хм, немного поспешил. Ведь при отсутствии параметров Length(P)
> - 1 тоже вернет -1. Значит тоже, что и High(P).


Ты либо от Low до High используй, либо от N до M. А вот скрещивать их лучше не стоит, можно наколоться здорово.


 
Laguna ©   (2011-10-19 12:15) [54]

ОК, еще вариант использую как Params.Count? но почему мне компилятор не дает посмотреть его значение в режиме отладки?

http://s51.radikal.ru/i134/1110/44/5d1cff8cf816.jpg


 
Медвежонок Пятачок ©   (2011-10-19 12:19) [55]

Потому что нет такого свойства Params


 
Ega23 ©   (2011-10-19 12:20) [56]


> ОК, еще вариант использую как Params.Count?


Да что-ж тебя на извращения-то так тянет?????


 
Laguna ©   (2011-10-19 12:27) [57]


> Потому что нет такого свойства Params

http://s017.radikal.ru/i443/1110/85/bdbf66b42509.jpg


> Да что-ж тебя на извращения-то так тянет?????

как вариант хотелось рассмотреть.
Все, останавливаюсь на for i := Low(P) to High(P) do


 
Ega23 ©   (2011-10-19 12:32) [58]


> Все, останавливаюсь на for i := Low(P) to High(P) do


Я бы на твоём месте остановился на варианте for i:=0 to Params.Count - 1 do


 
Laguna ©   (2011-10-19 12:41) [59]


> Ega23 ©   (19.10.11 12:20) [56]
> ОК, еще вариант использую как Params.Count?
>Да что-ж тебя на извращения-то так тянет?????


???


> Ega23 ©   (19.10.11 12:32) [58]
> > Все, останавливаюсь на for i := Low(P) to High(P) do
>Я бы на твоём месте остановился на варианте for i:=0 to Params.Count - 1 do


 
Ega23 ©   (2011-10-19 12:43) [60]


> >Да что-ж тебя на извращения-то так тянет?????
>
>
> ???


Pred(Params.Count)


 
Laguna ©   (2011-10-19 12:49) [61]


> Pred(Params.Count)


:))) у каждого свой стиль. Главное чтобы конечный результат был правильным.


 
Ega23 ©   (2011-10-19 12:57) [62]


>  у каждого свой стиль.


Плохой стиль. Не делай так.


 
Anatoly Podgoretsky ©   (2011-10-19 13:06) [63]

> Ega23  (19.10.2011 11:45:50)  [50]

Притом, первое идеологически вернее.


 
Laguna ©   (2011-10-19 13:10) [64]


> Плохой стиль. Не делай так.


Для этого есть серьезный аргумент?

6 = 7 -1 (Pred(7))
7 = 6 + 1(Succ(6))


 
Anatoly Podgoretsky ©   (2011-10-19 13:10) [65]


> Я бы на твоём месте остановился на варианте for i:=0 to
> Params.Count - 1 do

Тоже идеологически не верно, что будет если Low=10, а High=11
А вот Low to High всегда будет работать.


 
Anatoly Podgoretsky ©   (2011-10-19 13:12) [66]


>  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];

Как тогда прикажешь понимать, когда тебе говорят, что у ADO нет свойства Params, а ты все равно настаиваешью


 
Ega23 ©   (2011-10-19 13:15) [67]


> Тоже идеологически не верно, что будет если Low=10, а High=11


Ошибка будет. Ибо нефиг.
Зато параметры - уж точно все будут охвачены.
И, кстати, ошибка в обоих случаях будет.


 
Laguna ©   (2011-10-19 13:17) [68]


> Как тогда прикажешь понимать, когда тебе говорят, что у
> ADO нет свойства Params, а ты все равно настаиваешью


[41]


 
Laguna ©   (2011-10-19 13:23) [69]

Я думаю не стоит уж так все усложнять. Массив то формируется динамически. А так как порядок элементов массива всегда начинаются с 0, то логично , что

Low(P) - всегда будет 0,
а High(P) - количество элементов - 1

Так ведь?


 
Ega23 ©   (2011-10-19 13:36) [70]


> Так ведь?


Так. Только в одном случае ты пройдёшь по всем элементам массива, а в другом - по всем параметрам запроса.
Чуешь разницу?


 
OW ©   (2011-10-19 13:39) [71]

по идее - да

Мне понравился Lotus в этом плане. По умолчанию с 0, но можно переопределить, с любого индекса.
Хотя, что со скриптового языка взять, кроме анализов :)


 
Ega23 ©   (2011-10-19 13:44) [72]

Давайте уже закончим данную ветку, это становится невыносимым...


 
Laguna ©   (2011-10-19 13:49) [73]

Ок. Всем спасибо за помощь.



Страницы: 1 2 вся ветка

Текущий архив: 2012.01.29;
Скачать: CL | DM;

Наверх




Память: 0.69 MB
Время: 0.009 c
2-1318496404
igorium
2011-10-13 13:00
2012.01.29
Как скопировать часть картинки ?


15-1318268712
Jeer
2011-10-10 21:45
2012.01.29
Вот я и стал тестем и приобрел второго сына.


2-1318784462
Тима12
2011-10-16 21:01
2012.01.29
Точки вершин в tchart


2-1319387815
Очень злой
2011-10-23 20:36
2012.01.29
Как узнать HANDLE окна, на форме которого находится компонент.


2-1318932404
rammic
2011-10-18 14:06
2012.01.29
Как применить FindComponent на дочерних окнах