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

Вниз

ODAC/ запомнить и восстановить текущее положение в dataset   Найти похожие ветки 

 
Правильный$Вася   (2010-03-25 18:17) [40]


> Игорь Шевченко ©   (25.03.10 14:01) [38]

потому что кроме гипотетической экономии памяти никаких плюсов больше нет
да и в сторону мы уходим, это уже десятки раз перетирали и каждый остался при своем
я предпочитаю суррогатные первичные ключи, а то, что может претендовать на натуральный первичный ключ, просто делаю уником
гораздо гибче во многих случаях - можно и на то опереться, и на это, зависит от логики конкртной задачи
и даже если вдруг окажется, что натуральный ключ уже не совсем ключ, ничего не развалится, в отличие от противников суррогата


 
Anatoly Podgoretsky ©   (2010-03-25 19:59) [41]

> Медвежонок Пятачок  (25.03.2010 10:06:34)  [34]

Да никакие изменения первичного ключа не являются проблемой. Надо чтобы форма редактирования/вставки возвращала правильный номер. Это еще один плюс в пользу редактирования в отдельной форме.


 
Anatoly Podgoretsky ©   (2010-03-25 20:00) [42]

> MsGuns  (25.03.2010 14:34:39)  [39]

Не приводит, если использовать cascade updates, а я не вижу причины не использовать их


 
Anatoly Podgoretsky ©   (2010-03-25 20:01) [43]

> Правильный$Вася  (25.03.2010 18:17:40)  [40]

И у тебя получается дублирование


 
Игорь Шевченко ©   (2010-03-25 20:11) [44]

Правильный$Вася   (25.03.10 18:17) [40]


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


Джо Целко зовет таких IDиотами :)

Я не совсем понимаю - если нет referential ссылки на таблицу с естественным ключом из N полей, зачем вводить дополнительную сущность ?

Телега хорошо едет с четырьмя колесами.


 
Правильный$Вася   (2010-03-25 20:29) [45]


> Я не совсем понимаю - если нет referential ссылки на таблицу
> с естественным ключом из N полей, зачем вводить дополнительную
> сущность ?

у меня практически всегда есть (98%), так что не вижу смысла ради 2% делать исключение из своего правила

> Anatoly Podgoretsky ©   (25.03.10 20:01) [43]
> > Правильный$Вася  (25.03.2010 18:17:40)  [40]И у тебя получается
> дублирование

лучше продублировать 1 поле GUID, чем  ссылаться на 10 полей из многих разных таблиц
экономия памяти, нервов и времени огромная


 
Anatoly Podgoretsky ©   (2010-03-26 07:36) [46]

> Правильный$Вася  (25.03.2010 20:29:45)  [45]

Откуда взялось 10 полей? В связи как правило участвует одно поле.


 
MsGuns ©   (2010-03-26 09:07) [47]

>Anatoly Podgoretsky ©   (26.03.10 07:36) [46]
>Откуда взялось 10 полей? В связи как правило участвует одно поле.

Каждый "этаж" - одно поле. 10-этажный "небоскреб" - 10 полей в "пентхаузе" :)


 
Правильный$Вася   (2010-03-26 11:13) [48]


> Откуда взялось 10 полей? В связи как правило участвует одно поле.

если PK составной, то в связи не может быть его часть, верно ведь?


 
evvcom ©   (2010-03-26 14:34) [49]

1. Как уже было сказано в [2] "Вноси данные через датасет - ничего рефрешить не надо."
2. Я копал внутренности букмарка одаковского датасета, это не что иное как номер строки датасета, поэтому добавляя новую запись (через грид или отдельную форму), вызывая метод Add, мы добавляем запись в конец набора, а после рефреша и order by в запросе эта запись становится уже далеко не последней (чаще всего).
3. Я немного модифицировал одаковский датасет, написав наследника, добавив туда KeyFieldName, и написал одну регулярную процедуру. После этого просто вызаваю DSRefresh(ADataSet):
procedure DSRefresh(DS: TDataSet; KeepPos: Boolean);
var
 l_Values    : array of Variant;
 l_FieldCount: Integer;
 l_FieldNames: string;
 l_FieldName : string;
 l_RecNo     : Integer;
 l_RecCount  : Integer;
begin
 if (DS is TOraStoredProc) and (TOraStoredProc(DS).StoredProcName <> "")
 then begin
   if DS.Active and (DS is TMyOraStoredProc) and
     (TMyOraStoredProc(DS).KeyFieldName <> "")
   then begin
     l_FieldNames := TMyOraStoredProc(DS).KeyFieldName;
     l_FieldCount := 0;
     l_RecNo := 1;
     while True do begin
       l_FieldName := ExtractFieldName(l_FieldNames, l_RecNo);
       if l_FieldName <> "" then begin
         Inc(l_FieldCount);
         SetLength(l_Values, l_FieldCount);
         l_Values[l_FieldCount - 1] := DS.FieldValues[l_FieldName];
       end
       else
         Break;
     end;
     DS.Close;
     DS.Open;
     if DS.Active then
       DS.Locate(l_FieldNames, l_Values, []);
   end
   else begin
     l_RecNo := DS.RecNo;
     DS.Close;
     DS.Open;
     l_RecCount := DS.RecordCount;
     if KeepPos and (l_RecCount > 0) then begin
       if l_RecNo > l_RecCount then
         l_RecNo := l_RecCount;
       if DS.Active then
         DS.MoveBy(l_RecNo - 1);
     end;
   end;
 end;
end;

Противники RecNo могут поменять их на букмарки, но в хелпе явно написано, что букмарк после переоткрытия датасета становится невалидным! Это в общем случае. Таким образом, данная процедура отлично у меня работает уже несколько лет и с одним ключом, и с составным, и даже пытается работать, если я где-то забыл указать ключ.
Но следует понимать, что этот рефреш написан не для рефреша после изменений, т.к. см. пункт 1-й, а для работы после изменений значений входных параметров!



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

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

Наверх




Память: 0.56 MB
Время: 0.189 c
1-1278875240
dyonysos
2010-07-11 23:07
2012.01.01
MessageBox из TService


2-1317136441
Antoxa
2011-09-27 19:14
2012.01.01
DragNDrop в приложении


2-1316618998
Мемоза
2011-09-21 19:29
2012.01.01
Как написать на Дельфи эмулятор игровой приставки NES?


2-1316962248
Krema
2011-09-25 18:50
2012.01.01
Как вывести сеткой одномерный массив кнопок в Delphi?


2-1316988773
Krema
2011-09-26 02:12
2012.01.01
Иероглифы в справке