Текущий архив: 2007.05.20;
Скачать: CL | DM;
Вниз
Прошу прокомментировать, и дать совет, как сделать лучше Найти похожие ветки
← →
Abcdef123 (2007-04-25 17:03) [0]Работаю с 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;
← →
Desdechado © (2007-04-25 17:38) [1]1. Забыть о Table
2. Использовать SQL
3. Для позиционирования в наборе данных использовать Locate
← →
Abcdef123 (2007-04-26 05:47) [2]To Desdechado
Насчет забыть о Table и использовать SQL - я просто подумала, что писать программу быстрее получается, если вызываешь одной строкой уже написанную функцию, а если SQL - то это надо прописывать несколько строк каждый раз (текст запроса, строки параментров и результат присвоения выполненного запроса надо обработать).
А по поводу Locate мне начальник мой запретил этой функцией пользоваться, сказал, что кушает рессурсы и выполняется медленнее при работе с большими таблицами.
← →
sniknik © (2007-04-26 08:12) [3]> А по поводу Locate мне начальник мой запретил этой функцией пользоваться
он идиот? либо ты врешь, что более вероятно.
----
начальник транспортного цеха запретил водителям пользоваться ручным тормозом... говорит ненадежный на крутых горках.
← →
Abcdef123 (2007-04-26 09:14) [4]to sniknik:
Совсем не понимаю подобных наездов насчет "врешь". Не вижу вообще никакой логики, зачем мне врать в принципе и в конференцию - в частности, где никто ни меня, не моего начальника не знает. Единственное сое предположение насчет этого вашего комментария - это то, что вы по себе судите, похоже, для вас вранье - как воздух, чтоб бышать - обычное дело. А что до меня, я вообще всегда по жизни стараюсь говорить только правду, либо молчу, но уж никак не вру. И ненавижу просто врунов. Они жутко услодняют всем жизнь, и сами пребывают всю жизнь в пелене лжи и неискренности. Я думаю, что просто такие люди боятся отвественности в жизни,препочитая не взрослеть. Взрослейте, молодой человек!
← →
StriderMan © (2007-04-26 09:55) [5]конечно Locate жрет ресурсы и работает мадленно, но то что Вы написали будет жрать еще больше и работать будет еще медленнее. а потом совсем непонятно зачем такие выкрутасы с преобразованием типов? если надо в строковом виде, чем не устраивает
FieldByName(...).AsString
?
> SQL - я просто подумала, что писать программу быстрее получается,
> если вызываешь одной строкой уже написанную функцию, а
> если SQL - то это надо прописывать несколько строк каждый
> раз
1. быстрее не значит лучше.
2. в чем проблема динамически построить запрос:SQL.Text := "SELECT " + FieldName + " FROM " + TableName + " WHERE " + "KeyField = " + KeyValue;
?
← →
StriderMan © (2007-04-26 09:57) [6]
> try
> IndexFieldNames := fldKey;
> except
> MessageDlg(Индекс "+fldKey+" не найден", mtError, [mbOk],
> 0);
> raise ;
> end;
а в этом коде сообщение об ошибке вообще ДВАЖДЫ появится
← →
Desdechado © (2007-04-26 11:14) [7]> Locate кушает рессурсы и выполняется медленнее при работе с большими таблицами
1. Не мешало бы почитать справку по этому методу, очень поучительно.
2. А с большими таблицами вдвойне полезно работать через SQL. Вырабатывается хороший стиль доставать в программу только те данные, которые реально нужны, а не всю таблицу целиком, как это делает Table.
Это Table кушает ресурсы и работает медленно. Так что, или начальник - ламер, или поняты его слова были с точностью до навыворот.
← →
Abcdef123 (2007-04-29 17:27) [8]Я прочла все ответы внимательно! Спасибо за комментарии, и критику насчет моего кода тоже спасибо, я учту и исправлюсь! :-)
← →
Ketmar © (2007-04-29 17:48) [9]> Abcdef123 (26.04.07 09:14) [4]
опять хамло припёрлось...
Страницы: 1 вся ветка
Текущий архив: 2007.05.20;
Скачать: CL | DM;
Память: 0.48 MB
Время: 0.035 c