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

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

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

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

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

Запись от krapotkin размещена 16.05.2018 в 09:10
Показов 6678 Комментарии 18
Метки db, delphi

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

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

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

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

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

4. каждый датасет никак не связан с БД откуда он вытащил данные
поэтому если два одинаковых датасета забрали одинаковые данные из БД, и в одном что-то поменять, или в БД что-то поменять, всем остальным пофиг. Для обновления данные нужно тащить заново.
Метки db, delphi
Размещено в Без категории
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Всего комментариев 18
Комментарии
  1. Старый комментарий
    Аватар для SatanaXIII
    Здорово.
    Очень важное предупреждение. Надо на подъезды такие расклеивать.
    Запись от SatanaXIII размещена 16.05.2018 в 12:38 SatanaXIII вне форума
  2. Старый комментарий
    Аватар для Avazart
    в аду стоит отдельный котел.
    Delphi
    1
    
    Otdelnij1.Сotel1
    Запись от Avazart размещена 16.05.2018 в 12:39 Avazart вне форума
  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 вне форума
  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 вне форума
  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 вне форума
  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 вне форума
  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 вне форума
 
Новые блоги и статьи
Теория всего 12. ВГК
anaschu 21.07.2026
### Главные семантические изменения и дешифровка новой физики 1. **`REPRODUCTIVE_EMISSION` вместо фотосинтеза (`PS_base`)**: Энергия и ресурсы, которые класс средних мужчин (`_W_MEN_DONORS`). . .
Публикация отклонённая на хабре. Как «пернатого» заставить осваивать новые горизонты опыта через масштабирование задачи и целеполагание
Hrethgir 21.07.2026
https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11948&stc=1&d=1784657928 Привет Хабр. В этой статье я расскажу, как один закон эпистемологии позволил мне с ходу запустить уникальный. . .
Теория всего 11. Основные параметры
anaschu 21.07.2026
Дешифровка тензорного ядра Soil Chemistry 2. 0: Истинный инвариант Теории Всего Чистовой исходный код многокомпонентной сукцессии зафиксирован. Модель оперирует единым вектором состояния. . .
Теория всего 10. Клод трусишка
anaschu 21.07.2026
Алгоритмический суицид ИИ: Когда математика ОДУ взламывает цензурные шлюзы Свежайший мета-прецедент нашей разработки! Клод официально отказался строить итоговую кроссплатформенную модель, как. . .
Теория всего 9. Окончательная проработка метафоры "дерево = традиции"
anaschu 21.07.2026
Скрытые параметры ядра ОДУ: Механика Глубинного Рока Клод утаил от вас ключевую математику кризисов. В движке игры зашиты пять скрытых коэффициентов, определяющих, как именно ТНК и Мемы ломают. . .
Теория всего 8. Clauude трусишка. Ответ джемени
anaschu 21.07.2026
Игровой баланс «Модели Всего»: Алгоритмический блок как механика Семантического БуфераЭтот скриншот отказа Клода — идеальный, чистейший прецедент для нашей Теории Всего. Вы столкнулись не просто с. . .
Теория всего 7. Дерево - это патриархат, грибы - это феминизм
anaschu 21.07.2026
Уничтожение Патриархата: Как ТНК, Мемы и Половой отбор зачистили «Сексуальный Пролетариат» Величайшая иллюзия современного человека — вера в «свободу воли», «социальный прогресс» и «эволюцию. . .
История и социология Терры на примере борьбы микориз за пространство. 1. Глоссарий терры.
anaschu 21.07.2026
Решил тут подумать о возможности сделать лор некоторой комп игры - стратегии, или худжественной книги антиутопии, которые будут юзать планету,которая максимально будет похожа на нашу землю, но где. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru