На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! ПРАВИЛА РАЗДЕЛА · FAQ раздела Delphi · Книги по Delphi
Пожалуйста, выделяйте текст программы тегом [сode=pas] ... [/сode]. Для этого используйте кнопку [code=pas] в форме ответа или комбобокс, если нужно вставить код на языке, отличном от Дельфи/Паскаля.
Следующие вопросы задаются очень часто, подробно разобраны в FAQ и, поэтому, будут безжалостно удаляться:
1. Преобразовать переменную типа String в тип PChar (PAnsiChar)
2. Как "свернуть" программу в трей.
3. Как "скрыться" от Ctrl + Alt + Del (заблокировать их и т.п.)
4. Как прочитать список файлов, поддиректорий в директории?
5. Как запустить программу/файл?
... (продолжение следует) ...

Вопросы, подробно описанные во встроенной справочной системе Delphi, не несут полезной тематической нагрузки, поэтому будут удаляться.
Запрещается создавать темы с просьбой выполнить какую-то работу за автора темы. Форум является средством общения и общего поиска решения. Вашу работу за Вас никто выполнять не будет.


Внимание
Попытки открытия обсуждений реализации вредоносного ПО, включая различные интерпретации спам-ботов, наказывается предупреждением на 30 дней.
Повторная попытка - 60 дней. Последующие попытки бан.
Мат в разделе - бан на три месяца...
Модераторы: jack128, D[u]fa, Shaggy, Rouse_
  
> Как в Dataset сделать внутренний Delete без запуска SQL ?
    Здравствуйте,
    есть некий Dataset FIBplus, в нём указан код DeleteSQL который нормально работает. Но в ряде случаев нужно удалить строки только внутри Dataset НЕ запуская DeleteSQL код (не обращаясь к БД)! Можно ли как-то это сделать?
      По идее, должен быть тип курсора, который не отправляет изменения сразу на сервер, а кеширует их на клиенте. Если указать этот тип курсора, то с датасетом можно выполнять операции обычными средствами. А потом, либо подтвердить изменения, либо отменить их. Наличие этого типа курсора зависит от провайдера.
      ИМХО
        Теория отличная. Можно пример на практике в коде?
          свойство CachedUpdates
            Цитата DeveloPerchik @
            Теория отличная. Можно пример на практике в коде?

            К сожалению, сейчас не вспомню что и как. Такой проект писал очень давно. Запамятовал...
              ViktorXP
              Привет, давно не виделись, как поживаешь? :)


              Раз Вы заинтересовались вопросом, опишу задачу подробнее... Интерфейс: окно с огромной таблицей, внизу кнопка "Удалить". Код: Таблица cxGrid получает данные из FIBplus Dataset который получает данные из сложной ХП из БД связывающей порядка 10таблиц в результате чего KeyField=xID. Когда юзер нажимает кнопку "Удалить" ему задаётся вопрос: вы хотите удалить по методу "а" или методу "б"? Удаление возможно двух типов: а) удаление строки по xID из основной для отображаемой таблицы xTable - это удаление делает Dataset.DeleteSQL; б) возможно удаление по другому yID (есть в полученных данных) которое требует сложного кросс-удаления из множества всех 10таблиц для чего используется отдельная ХП в БД.

              То есть в случае удаления типа "б" удаление происходит скрыто от Dataset из-за чего строка(и) которые уже удалены из БД всё ещё присутствуют в Dataset и отображаются в связанной таблице cxGrid. Так вот вопрос в том - как удалить из Dataset уже неактуальные-несуществующие строки данных? Можно сделать тупо FullRefresh, но хотелось бы обойтись без дополнительных запросов к БД (без повторных сложных выборок)!
                Как вариант, можно воспользоваться локальным фильтром. Т.е.
                ExpandedWrap disabled
                  query1.filtered := false;
                  query1.filter := 'xID <> 1'
                  query1.filtered := true;
                  Можно, но поработав с cxGrid опасаюсь их туманного поведения, ведь у них есть свой DataController выкачивающий все данные из Dataset в связи с чем бывают всякие баги... поэтому хотелось бы уж наверняка удалить строки из Dataset...
                    cxGrid очень богатая на возможности. скрыть строку можно прямо в ней (я не помню как точно там все эти свойства называются так как последние полтора года, вообще не работал с визуализацией. все как то более системной разработкой занят)

                    Также можно сделать копию TDataSet. Для копии можно взять стандартный TClientDataSet (midas). Так и TMemDataSet (если я не ошибся в имени) из тойже библиотеки DevExpres. И если я не ошибаюсь что то наподобие этого есть среди компонентов джейди.

                    Ну или как вариант загрузить все данные прямо в сетку cxGrid (он умеет работать и как обычный TStringGrid)

                    + еще можно почитать доки FIBplus. Я не знаю как в этом компоненте (почти не пользовался им), но например pgDac умеет рефрешить отдельные строки (ну по крайне мере умел полтора года тому назад)

                    Цитата DeveloPerchik @
                    ViktorXP
                    Привет, давно не виделись, как поживаешь?

                    Привет. Да все как то в делах погруз.
                      Точно встречал в описаниях FB фишку, которая обновляет только выбранную запись. Правда, не знаю, как это сработает в случае удаления этой записи. Вообще проблема интересная.
                        Цитата artsb @
                        Как вариант, можно воспользоваться локальным фильтром. Т.е.


                        Решил вопрос темы всё же через Dataset.Filter, тк тупо "Dataset.InternalDelete" нет, а все остальные обходные варианты оказались хуже.

                        Всем спасибо за участие!
                        0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                        0 пользователей:


                        Рейтинг@Mail.ru
                        [ Script execution time: 0,0338 ]   [ 16 queries used ]   [ Generated: 3.05.24, 01:51 GMT ]