![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Прошу прокомментировать, и дать совет, как сделать лучше [D6, XP]
Abcdef123 © (2007-04-25 17:03:00)Работаю с Advantage базой данных, и написала функцию для определения значения поля в таблице. Недостаток вроде в том, что если указать поле, ко которому не существует индекса, то эта функция бесполезна. Но, может не стоит заморачиваться и создавать универсальную функцию с созданием индекса? Что скажут опытные программеры? И еще - принимаются советы и замечания к коду, поскольку вполне допускаю, что выглядит примитивно.
function GetFieldValue(var tblTable : TAdsTable; fldKey, keyValue, fldName : String) : String; {~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}
{ примечание fldKey параметр - поле, по которому уже существует }{индекс }
var
oldIdx, strKeyValue : String;
begin
result :='';
with tblTable do
begin
if not Active then
OpenTable(tblTable); // это просто уже существующая процедура
case tblTable.FieldByName(fldKey).DataType
of
ftString :
strKeyValue := keyValue;
ftInteger :
strKeyValue := 'StrToInt('+ keyValue+')';
ftBoolean :
strKeyValue := 'StrToBool('+ keyValue+')';
ftCurrency :
strKeyValue := 'StrToCurr('+ keyValue+')';
ftDate :
strKeyValue := 'StrToDate('+ keyValue+')';
ftDateTime :
strKeyValue := 'StrToDateTime('+ keyValue+')';
ftFloat :
strKeyValue := 'StrToFloat('+ keyValue+')';
else
strKeyValue := keyValue;
end; //case
oldIdx := IndexFieldNames;
try
IndexFieldNames := fldKey;
except
MessageDlg(Индекс '+fldKey+' не найден', mtError, [mbOk], 0);
raise ;
end;
if not FindKey([strKeyValue]) then exit;
case tblTable.FieldByName(fldName).DataType
of
ftString :
result := FieldByName(fldName).AsString;
ftInteger :
result := IntToStr(FieldByName(fldName).AsInteger);
ftBoolean :
result := BoolToStr(FieldByName(fldName).AsBoolean);
ftCurrency :
result := CurrToStr(FieldByName(fldName).AsCurrency);
ftDate :
result := DateToStr(FieldByName(fldName).AsDateTime);
ftDateTime :
result := DateTimeToStr(FieldByName(fldName).AsDateTime);
ftFloat :
result := FloatToStr(FieldByName(fldName).AsFloat);
else result :='';
end; //case
IndexFieldNames := oldIdx;
end; //with
end;
Ketmar (2007-04-29 17:48:00) [1]> Abcdef123 (26.04.07 09:14) [4]
опять хамло припёрлось...
Abcdef123 (2007-04-29 17:27:00) [2]Я прочла все ответы внимательно! Спасибо за комментарии, и критику насчет моего кода тоже спасибо, я учту и исправлюсь! :-)
Desdechado (2007-04-26 11:14:00) [3]> Locate кушает рессурсы и выполняется медленнее при работе с большими таблицами
1. Не мешало бы почитать справку по этому методу, очень поучительно.
2. А с большими таблицами вдвойне полезно работать через SQL. Вырабатывается хороший стиль доставать в программу только те данные, которые реально нужны, а не всю таблицу целиком, как это делает Table.
Это Table кушает ресурсы и работает медленно. Так что, или начальник - ламер, или поняты его слова были с точностью до навыворот.
StriderMan (2007-04-26 09:57:00) [4]
> try
> IndexFieldNames := fldKey;
> except
> MessageDlg(Индекс '+fldKey+' не найден', mtError, [mbOk],
> 0);
> raise ;
> end;
а в этом коде сообщение об ошибке вообще ДВАЖДЫ появится
StriderMan (2007-04-26 09:55:00) [5]конечно Locate жрет ресурсы и работает мадленно, но то что Вы написали будет жрать еще больше и работать будет еще медленнее. а потом совсем непонятно зачем такие выкрутасы с преобразованием типов? если надо в строковом виде, чем не устраивает
FieldByName(...). AsString?
> SQL - я просто подумала, что писать программу быстрее получается,
> если вызываешь одной строкой уже написанную функцию, а
> если SQL - то это надо прописывать несколько строк каждый
> раз
1. быстрее не значит лучше.
2. в чем проблема динамически построить запрос:
SQL.Text := 'SELECT ' + FieldName + ' FROM ' + TableName + ' WHERE ' + 'KeyField = ' + KeyValue;?
Abcdef123 (2007-04-26 09:14:00) [6]to sniknik:
Совсем не понимаю подобных наездов насчет "врешь". Не вижу вообще никакой логики, зачем мне врать в принципе и в конференцию - в частности, где никто ни меня, не моего начальника не знает. Единственное сое предположение насчет этого вашего комментария - это то, что вы по себе судите, похоже, для вас вранье - как воздух, чтоб бышать - обычное дело. А что до меня, я вообще всегда по жизни стараюсь говорить только правду, либо молчу, но уж никак не вру. И ненавижу просто врунов. Они жутко услодняют всем жизнь, и сами пребывают всю жизнь в пелене лжи и неискренности. Я думаю, что просто такие люди боятся отвественности в жизни,препочитая не взрослеть. Взрослейте, молодой человек!
sniknik (2007-04-26 08:12:00) [7]> А по поводу Locate мне начальник мой запретил этой функцией пользоваться
он идиот? либо ты врешь, что более вероятно.
----
начальник транспортного цеха запретил водителям пользоваться ручным тормозом... говорит ненадежный на крутых горках.
Abcdef123 (2007-04-26 05:47:00) [8]To Desdechado
Насчет забыть о Table и использовать SQL - я просто подумала, что писать программу быстрее получается, если вызываешь одной строкой уже написанную функцию, а если SQL - то это надо прописывать несколько строк каждый раз (текст запроса, строки параментров и результат присвоения выполненного запроса надо обработать).
А по поводу Locate мне начальник мой запретил этой функцией пользоваться, сказал, что кушает рессурсы и выполняется медленнее при работе с большими таблицами.
Desdechado (2007-04-25 17:38:00) [9]1. Забыть о Table
2. Использовать SQL
3. Для позиционирования в наборе данных использовать Locate