Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 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.49 MB
Время: 0.03 c
2-1178258752
Marat
2007-05-04 10:05
2007.05.20
Округлить число в запросе


2-1178253625
Neket
2007-05-04 08:40
2007.05.20
Имя файла.


15-1177344906
vasIZmax
2007-04-23 20:15
2007.05.20
Паттерны проектирования


2-1177947590
Doom_2
2007-04-30 19:39
2007.05.20
TClientSocket и TServerSocket


2-1178118412
Антон Шестаков
2007-05-02 19:06
2007.05.20
Представление из базы