Форум программистов, компьютерный форум, киберфорум
Наши страницы
krapotkin
Войти
Регистрация
Восстановить пароль
Блог. Двадцать пять лет Делфи-практики

В этом блоге я буду публиковать ответы на вопросы, которые постоянно приходится повторять на форуме.
Здесь можно это сделать более развернуто и спокойно.

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

Начав с Делфи-2 двадцать пять лет назад, я прошел все версии, испробовал массу технологий, включая работу с БД, с графикой DirectX, связью с серверами и интернетом, разработку на Андроид и IOS, и многое, многое другое.
____________________________________________________________________________________
P.S. все, о чем здесь написано, всего лишь измышления из головы.
совпадения с реальными людьми и фактами случайны.
Оценить эту запись

Что нужно знать о датасетах и DB-компонентах

Запись от krapotkin размещена 16.05.2018 в 09:10
Обновил(-а) krapotkin 02.08.2018 в 10:44

Ахтунг! Аттеншн! Внимание!
1. Все DB-компоненты ОТОБРАЖАЮТ текущую запись и поле датасета, к которому они подключены. НЕ ХРАНЯТ!!!
Они являются элементами ИНТЕРФЕЙСА - т.е. штуками для работы пользователя! Не программиста!!!
Нет смысла брать текст из DBEdit, его надо брать из поля датасета, к которому этот DBEdit подключен.
И наоборот, писать туда значение - такая же дичь.

Если узнаю, что вы так делаете, вычислю по IP и оборву что-нибудь важное! )

P.S. Для тех, кто обзывает компоненты DBEdit1, в аду стоит отдельный котел.

2 если ваши компоненты подключены к датасету через Datasource то при любом перемещении по компоненту, происходит перемещение и по датасету. И наоборот. Таким образом, датасет всегда стоит на той записи, которую видно в гриде
поэтому данные просто берете из датасета

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

4. каждый датасет никак не связан с БД откуда он вытащил данные
поэтому если два одинаковых датасета забрали одинаковые данные из БД, и в одном что-то поменять, или в БД что-то поменять, всем остальным пофиг. Для обновления данные нужно тащить заново.
Размещено в Без категории
Просмотров 980 Комментарии 18
Всего комментариев 18
Комментарии
  1. Старый комментарий
    Аватар для SatanaXIII
    Здорово.
    Очень важное предупреждение. Надо на подъезды такие расклеивать.
    Запись от SatanaXIII размещена 16.05.2018 в 12:38 SatanaXIII вне форума
  2. Старый комментарий
    Аватар для Avazart
    Цитата:
    в аду стоит отдельный котел.
    Delphi
    1
    
    Otdelnij1.Сotel1
    Запись от Avazart размещена 16.05.2018 в 12:39 Avazart вне форума
    Обновил(-а) Avazart 16.05.2018 в 15:48
  3. Старый комментарий
    Аватар для krapotkin
    не так!
    Delphi
    1
    2
    
    CommonBoilers: TObjectList<TBoiler>;
    SpecialBoiler: TBoiler;
    Запись от krapotkin размещена 16.05.2018 в 14:14 krapotkin вне форума
  4. Старый комментарий
    Аватар для Avazart

    Не по теме:

    Translit nawe vs:e


    Запись от Avazart размещена 16.05.2018 в 15:47 Avazart вне форума
    Обновил(-а) Avazart 16.05.2018 в 16:01
  5. Старый комментарий
    Цитата:
    вычислю по IP
    Вычислить IP - этого сегодня мало для того, чтобы получить дистанционный доступ к другому ПК при условии, что там не установлены специфичные программы.
    Запись от iner7 размещена 16.05.2018 в 17:16 iner7 вне форума
  6. Старый комментарий
    Аватар для kebot
    DBEdit125.text :='Моя строка данных'; => не давно кстати так делал ( если, что - я не дебил ))) )

    - в Query сидел сложный запрос (join из нескольких табличек)
    - на форме dbaware компоненты настроенные на поля из разных табличек этого запроса
    - при переходе в режим cashupdate и переводе датасета в режим редактирования
    пришлось те из контролов что привязаны к полям приджоиных таблиц временно отключить от источника
    данных и по сути использовать как обычные edit предварительно считав их содержимое в переменную
    ... ну при нажатии - "сохранить" соответственно в БД залить через другой запрос либо хранимкой - на выбор

    хочу совет - изначально юзал ehlib - (обожаю эти компоненты)
    так вот они без гемароя позволяют сделать из dbedit - обычный edit без усилий просто занилив datasource

    понадобилось вместо них воткнуть альфа скиновые acDBedit - вот эти красивые но ни черта не умеют
    что бы сделать аналогичное действо понадобилось
    - динамически создать на форме обычные acEdit разместить их в тех же местах и отображать только при редактировании
    ну соответственно куча костыльного кода типа findcomponent и тд. и тп.
    нет можно конечно было в базе еще создать фейковую временную (tempolary) табличку - живущую на время транзакции
    но ради такой задачи создавать объекты в БД это уж совсем изврат

    еще вариант полностью от dbaware уйти - но блин они удобные быстрые функциональные и т.д.

    подскажите есть ли способ альфа скиновый dbadit отвязать на время от бызы - но так чтобы в нем можно было текст
    редактировать - то что он его не за поммнит мне - пофиг - нужно просто как форма ввода - так ведь не дает же
    СОБАКА - заставляет огороды городить на пустом месте )))))))))))
    Запись от kebot размещена 30.05.2018 в 16:22 kebot вне форума
  7. Старый комментарий
    Аватар для krapotkin
    вообще без понятия что там в скинах
    в современных делфи отличные родные скины ) мне хватает
    а все свои программы c DB компонентов я перевел на обычные
    Запись от krapotkin размещена 30.05.2018 в 16:26 krapotkin вне форума
  8. Старый комментарий
    Аватар для kebot
    они отличные - до той поры пока проект в терминалку не засунеш, а в терминальной сесии всякие баги лезут - менюшки
    смазываются
    на альфа скинах - такого не наблюдается
    да и просто сравнивал по скорости отображения форм даже в обычном не терминальном режиме
    на альфах реально все быстрей
    Запись от kebot размещена 30.05.2018 в 23:04 kebot вне форума
  9. Старый комментарий
    Аватар для Avazart
    Я вообще не понимаю смысл использования TDBEdit, по моему беспонтовая штука.
    Как по мне обычно Все равно приходится делать ручками.

    Т.е у Вас есть форма для заполнения, и как правило в нужно валидировать некоторые значения а это можно сделать только ручками выполняя запросы.
    Запись от Avazart размещена 30.05.2018 в 23:47 Avazart вне форума
    Обновил(-а) Avazart 30.05.2018 в 23:49
  10. Старый комментарий
    Аватар для kebot
    не совсем понятно, что означает "валидировать" - т.е. пользователь вводит данные , а вы их перед записью в БД
    корректируете ?

    вообще конечно интересно кто как подходит к решению этой типичной для работы с БД задачей - как ввод и отображение
    данных на клиенте.

    вот допустим есть некая анкета и в ней полей 50 с данными
    а рядом с анкетой некий контрол - dblokupbox, dbgrid..... - не суть неважно
    просто то в чем можно записи скролить
    ну и анкета напрямую или через мастер-детейл связана с этим списком/контролом

    что эффективней в событии aftescroll - вручную обновлять - обычные TEdit
    или отдать эту работу на откуп dbaware компонентов ?

    ps/ из практики мной подмечено - что dbaware позволяют не загромождать код
    смотришь на код проекта а там - сплошная бизнес логика и изредка островки того что все таки пришлось допилить )))
    ну и по скорости хорошо проработанные компоненты от известных разработчиков как правило лучше - самописного
    чудо велосипеда,
    вообще считаю что любой "тра...дром" должен быть обоснованным
    нужно ваять с нуля только те вещи которых просто нет в доступности или они очень специфичны
    лучше посвятить время - обучению, получению прибыли и другим крайне полезным вещам )))
    Запись от kebot размещена 31.05.2018 в 13:44 kebot вне форума
  11. Старый комментарий
    Аватар для Avazart
    Цитата:
    не совсем понятно, что означает "валидировать" - т.е. пользователь вводит данные , а вы их перед записью в БД
    корректируете ?
    Проверять правильность, например есть условие что в поле должны числа быть от 1 и до 10.
    Т.е. тут нужен либо спинбокс либо комбобокс, а не эдит.
    Или же поле bool и нужно вводить True / False опять же тут ли комбо бокс или чекбокс нужен.
    Кроме того диапазон может быть вообще быть динамическим и меняться в зависимости от других полей или другой таблицы БД.

    Такие вещи приходится разруливать "руками" т.е. рассматривать каждый случай, реализовывать его через обычные компоненты результаты и подставлять в запрос.
    Запись от Avazart размещена 31.05.2018 в 21:33 Avazart вне форума
    Обновил(-а) Avazart 31.05.2018 в 21:37
  12. Старый комментарий
    Аватар для kebot
    Цитата:
    Проверять правильность, например есть условие что в поле должны числа быть от 1 и до 10.
    Т.е. тут нужен либо спинбокс либо комбобокс, а не эдит.
    Не вижу связи между проверкой валидности и отказом от DBedit (покрайней мере в данном конкретном случае)

    достаточно повесить на onChange дбэдита обработчик что то вроде такого
    Delphi
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    
      //Контроль ввода неккоретных данных
    procedure TCalculateCountBitForm.InputRules(Sender: TObject);
    var   i : Integer;
          s : string;
    begin
      with Sender as TDBEdit do
           begin
             s:= Text;
             if ( (s<>'') and not (StrToInt(s) in [0..255]) ) or
                ( (Length(Text)>1) and (Text[1]='0') )
             then  begin
                    SetLength(s,Length(s)-1);
                    Text:=s;
                    SelStart:= Length(Text);
                    SelLength:=0;
                   end
             else  if s<>'' then fINparam:=StrToInt(s);
           end;
    end;
    и все - пользователь просто физически не сможет ввести неверные данные
    но при этом все плюшки "автосинхрона" с БД остаются

    к тому же спинбокс либо комбобокс,..чекбокс.. радиогруп.. все это есть в db варианте, выбор большой
    Запись от kebot размещена 01.06.2018 в 08:47 kebot вне форума
  13. Старый комментарий
    Аватар для krapotkin
    DB контролы как раз подменяют нормальную модель данных своими прямыми связями с БД
    в нормальной модели вы можете делать все что угодно, а тут вам приходится работать только с полями датасета
    Никакой "бизнес-логики" в Dataset1Price.asCurrency * Dataset1Qty.AsFloat нет )))
    Связывать сложную модель в 20-MASTER-100-DETAIL - это получить ужасного монстра.
    А если еще добавить сложности работы с транзакциями, все становится вообще печально.
    Так что разделение - наше всё.
    Несмотря на это, для небольших программ DB компоненты вполне себе.
    Но этот запас быстро исчерпывается.
    Запись от krapotkin размещена 01.06.2018 в 09:14 krapotkin вне форума
    Обновил(-а) krapotkin 01.06.2018 в 09:19
  14. Старый комментарий
    Аватар для kebot
    ...ну не знаю, мне кажется это более сложившийся формат мышления - чем истинна
    db контролы они же - в помощь, а не вопреки....
    что кто то запретил писать запросы ? ))) или как то ограничивать себя в бизнес логике полями компонентов ?
    за то если на форме сотни элементов отображающих текущее состояние данных
    то нет необходимости вручную отслеживать и корректировать их состояние при каждом чихе
    Запись от kebot размещена 01.06.2018 в 09:58 kebot вне форума
  15. Старый комментарий
    Аватар для krapotkin
    да вовсе не в запросах дело
    DBконтролы так-то ими и работают
    дело в полном отсутствии МОДЕЛИ ДАННЫХ
    и концепция клиент-сервер в современном мире почти изжила себя
    сейчас запрос-ответ
    и это обосновано глобальным доступом к данным
    гетерогенными хранилищами и прочей фигней
    Запись от krapotkin размещена 01.06.2018 в 10:04 krapotkin вне форума
  16. Старый комментарий
    Аватар для kebot
    ок спасибо
    пошел читать про "гетерогенные хранилища"
    )))
    Запись от kebot размещена 01.06.2018 в 10:17 kebot вне форума
  17. Старый комментарий
    Аватар для Avazart
    Цитата:
    к тому же спинбокс либо комбобокс,..чекбокс.. радиогруп.. все это есть в db варианте, выбор большой
    Как я помню нет.
    Запись от Avazart размещена 01.06.2018 в 11:13 Avazart вне форума
  18. Старый комментарий
    Аватар для kebot
    EhLib,
    AlphaDBControls

    может еще в девках есть (DevExpress) но я их не юзал особо, хватило тех, что выше

    нет если конечно использовать только со вкладки Data Controls то да там скудновато
    .... впрочем глянул сейчас в Berline там то же много ))) или вы D7 предпочитаете
    Запись от kebot размещена 01.06.2018 в 12:00 kebot вне форума
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru