Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > БД в Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 12.07.2019, 07:58   #1
KBO
Форумчанин
 
Регистрация: 11.06.2010
Сообщений: 525
По умолчанию DBComboBox при вставке нового значения, не отображает данные

Доброе время суток форумчане,
Какой-то глюк произошел, в одной программе работает, в другой – нет.

В IBDataSet.AfterInsert заполняю 3 DBComboBox (dbcbCountryCL, dbcbNameTest, dbcbYearBegin)

Код:
ExecQuery(C_sel_full_ComboBoxEquipment, 0, Select_rec, nil);//заполнение IBQuery (DM.ibqEmpty)
FMain.dbcbCountryCL.Clear;
FMain.dbcbNameTest.Clear;
FMain.dbcbYearBegin.Clear;
DM.ibqEmpty.First;
while not DM.ibqEmpty.Eof do
begin
  if DM.ibqEmpty.FieldByName('FILED_NAME').AsString = 'PRODUCER' then 
    FMain.dbcbCountryCreate.Items.Add(DM.ibqEmpty.FieldByName('PRODUCER').AsString);
  if DM.ibqEmpty.FieldByName('FILED_NAME').AsString = 'NAME_TEST' then
    FMain.dbcbNameTest.Items.Add(DM.ibqEmpty.FieldByName('PRODUCER').AsString);
  if DM.ibqEmpty.FieldByName('FILED_NAME').AsString = 'YEAR_BEGIN' then
    FMain.dbcbYearBegin.Items.Add(DM.ibqEmpty.FieldByName('PRODUCER').AsString);
  DM.ibqEmpty.Next;
  end;
end
все нормально.
Но при вставке нового (т.е. значения, которого нету в их списках) значения в эти DBComboBox'ы, оно в нем перестает отображаться, хотя в БД это значение есть и DBGrid их отображает.
При нажатии Refresh на навигаторе, также это значение появляется в DBComboBox, но при переходе с записи на запись, оно опять пропадает только из DBComboBox.
Конечно если закоментировать, заполнение элементов DBComboBox, все нормально отрабатывается.

Где может быть ошибка?
Заранее спасибо за ответ.

Последний раз редактировалось KBO; 12.07.2019 в 08:03.
KBO вне форума Ответить с цитированием
Старый 12.07.2019, 09:27   #2
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,238
По умолчанию

а мне вот этот код не нравится.
Тут точно нет логической ошибки?
Цитата:
Сообщение от KBO Посмотреть сообщение
Код:
if DM.ibqEmpty.FieldByName('FILED_NAME').AsString = 'PRODUCER' then 
    FMain.dbcbCountryCreate.Items.Add(DM.ibqEmpty.FieldByName('PRODUCER').AsString);
  if DM.ibqEmpty.FieldByName('FILED_NAME').AsString = 'NAME_TEST' then
    FMain.dbcbNameTest.Items.Add(DM.ibqEmpty.FieldByName('PRODUCER').AsString);
  if DM.ibqEmpty.FieldByName('FILED_NAME').AsString = 'YEAR_BEGIN' then
    FMain.dbcbYearBegin.Items.Add(DM.ibqEmpty.FieldByName('PRODUCER').AsString);
я бы предложил такой вариант:
Код:
if DM.ibqEmpty.FieldByName('FILED_NAME').AsString = 'PRODUCER' then 
    FMain.dbcbCountryCreate.Items.Add(DM.ibqEmpty.FieldByName('PRODUCER').AsString);
  if DM.ibqEmpty.FieldByName('FILED_NAME').AsString = 'NAME_TEST' then
    FMain.dbcbNameTest.Items.Add(DM.ibqEmpty.FieldByName('NAME_TEST').AsString);
  if DM.ibqEmpty.FieldByName('FILED_NAME').AsString = 'YEAR_BEGIN' then
    FMain.dbcbYearBegin.Items.Add(DM.ibqEmpty.FieldByName('YEAR_BEGIN').AsString);
но, возможно, что это специально сделано так и в ibqEmpty есть только два поля FILED_NAME и PRODUCER,
просто значение PRODUCER означает разное, в зависимости от значения FILED_NAME.
Тогда я ошибся со своим советом и просто игнорируйте вышепредложенный код.


теперь по сути.
Цитата:
Код:
ExecQuery(C_sel_full_ComboBoxEquipment, 0, Select_rec, nil);//заполнение IBQuery (DM.ibqEmpty)
покажите процедуру ExecQuery.
выполнение запросов происходит через один и тот же Connection ?
вот, конкретно, DM.ibqEmpty к какому Connection привязан? к тому же самому, что и DBGrid ?
попробуйте cделать ему Close, потом Open.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 12.07.2019, 09:54   #3
KBO
Форумчанин
 
Регистрация: 11.06.2010
Сообщений: 525
По умолчанию

вот процедура ExecQuery

Код:
procedure ExecQuery(ARequire: string;
                    ASuiteData: integer;
                    A_ActQuery: ActRecord;
                    ADataSet: TIBDataSet);
//execute different request
var
  LID, LPos: integer;
  s: string;
  L_EventAfterScroll: TDataSetNotifyEvent;
begin
  case ASuiteData of
    0:
      begin
        DM.ibqEmpty.Close;
        DM.ibqEmpty.SQL.Clear;
        DM.ibqEmpty.SQL.Add(ARequire);
//showmessage(DM.ibqEmpty.SQL.CommaText);
        if A_ActQuery = Select_rec then
        begin
          DM.ibqEmpty.Open;
          DM.ibqEmpty.FetchAll;
          DM.ibqEmpty.First;
        end
        else
        begin
          DM.ibqEmpty.ExecSQL;
          DM.ibTrans.CommitRetaining;
        end;
      end;
    1:
      begin
        if ADataSet.FindField('ID') <> nil then
          if A_ActQuery = Exec_rec then
          begin
            ADataSet.DisableControls;
            ADataSet.Next;
            LID := ADataSet.FieldByName('ID').AsInteger;
            ADataSet.Prior;
            ADataSet.EnableControls;
          end
          else LID := ADataSet.FieldByName('ID').AsInteger;

        ADataSet.Close;
        ADataSet.SelectSQL.Clear;
        ADataSet.SelectSQL.Add(ARequire);
//showmessage(ADataSet.SelectSQL.CommaText);
        ADataSet.DisableControls;
          L_EventAfterScroll := ADataSet.AfterScroll;
          ADataSet.AfterScroll := nil;
        ADataSet.Open;
        ADataSet.FetchAll;
        case A_ActQuery of //position on record
          Select_rec: ADataSet.First;
          Exec_rec:
                   begin
                     if LID = 0 then //insert new word
                       ADataSet.Last
                     else ADataSet.Locate('ID', LID, []);
                   end;
        end;
        ADataSet.EnableControls;
        ADataSet.AfterScroll := L_EventAfterScroll;
      end;
  end;
end;
но сразу хочу заметить, что она давно используется и пока нареканий не было.

Вот запрос:
Код:
C_sel_full_ComboBoxEquipment = 'select distinct PRODUCER, trim(''PRODUCER'') FILED_NAME from EQUIPMENT where PRODUCER <> ''null'' '
                                 +' union all select distinct NAME_TEST, ''NAME_TEST'' from EQUIPMENT where NAME_TEST<>''null'' '
                                 +' union all select distinct YEAR_BEGIN, ''YEAR_BEGIN'' from EQUIPMENT where YEAR_BEGIN is not null ';

Последний раз редактировалось KBO; 12.07.2019 в 09:58.
KBO вне форума Ответить с цитированием
Старый 12.07.2019, 10:00   #4
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,238
По умолчанию

Connection проверьте

и ещё, чисто гипотетически. Проверьте, не ищите ли Вы запись, которая схлопнулась через distinct ...
выполните запрос отдельно, убедитесь, что он возвращает именно то, что Вы ожидаете увидеть в комбобоксах
Serge_Bliznykov вне форума Ответить с цитированием
Старый 12.07.2019, 10:12   #5
KBO
Форумчанин
 
Регистрация: 11.06.2010
Сообщений: 525
По умолчанию

проверил

Код:
  DM.ibdsEquipment.Close;
  DM.ibdsEquipment.Open;
не помогает...
P.S.
сторонний TDBCombobox все отображает без переоткрытий...

А что вы имели ввиду под
Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
Connection проверьте
???

Последний раз редактировалось KBO; 12.07.2019 в 10:29.
KBO вне форума Ответить с цитированием
Старый 12.07.2019, 10:15   #6
KBO
Форумчанин
 
Регистрация: 11.06.2010
Сообщений: 525
По умолчанию

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
Проверьте, не ищите ли Вы запись, которая схлопнулась через distinct ...
выполните запрос отдельно, убедитесь, что он возвращает именно то, что Вы ожидаете увидеть в комбобоксах
и пожалуйста по подробней "запись которая схлопнулась"??
KBO вне форума Ответить с цитированием
Старый 12.07.2019, 10:43   #7
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,238
По умолчанию

Цитата:
Сообщение от KBO Посмотреть сообщение
А что вы имели ввиду под
я имел в виду
Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
выполнение запросов происходит через один и тот же Connection ?
вот, конкретно, DM.ibqEmpty к какому Connection привязан? к тому же самому, что и DBGrid ?

Цитата:
Сообщение от KBO Посмотреть сообщение
и пожалуйста по подробней "запись которая схлопнулась"??
одинаковые значения уйдут при использовании DISTINCT

Цитата:
Код:
 where PRODUCER <> ''null'' '
                                 +' union all select distinct NAME_TEST, ''NAME_TEST'' from EQUIPMENT where NAME_TEST<>''null'' '
                                 +' union all select distinct YEAR_BEGIN, ''YEAR_BEGIN'' from EQUIPMENT where YEAR_BEGIN is not null ';
кстати, не null не надо проверять знаком <>
лучше это делать так, как Вы делаете с year_begin:

Код:
...where PRODUCER is not null  '
                                 +' union all select distinct NAME_TEST, ''NAME_TEST'' from EQUIPMENT where NAME_TEST is not null '
....
Serge_Bliznykov вне форума Ответить с цитированием
Старый 12.07.2019, 11:10   #8
KBO
Форумчанин
 
Регистрация: 11.06.2010
Сообщений: 525
По умолчанию

и еще такая вот штука
Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
вот, конкретно, DM.ibqEmpty к какому Connection привязан? к тому же самому, что и DBGrid ?
последовательно
DM.ibqEmpty - это TIBQuery, привязан к TIBDataBase
DBGrid привязан к TDataSource привязан к TIBDataset привязан к TIBDataBase
ивсе они используют один IBTransaction

если вы о этом.
KBO вне форума Ответить с цитированием
Старый 12.07.2019, 11:13   #9
KBO
Форумчанин
 
Регистрация: 11.06.2010
Сообщений: 525
По умолчанию

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
одинаковые значения уйдут при использовании DISTINCT
такая вот фигня происходит только при использовании нового значения, которого НЕТ в списке (я его ввел с клавиатуры)

Есть еще одна фишка, если я ввожу новое значение в DBCombobox, то оно не отображается, но если я его добавлю в список DBCombobox, отдельной процедурой, и пройду по строка и обратно все нормально

Вот тут http://help.prognoz.com/ru/mergedPro...dbcombobox.htm вообще написано, что он фокусируется только на соответствующий элемент списка. Но при повторном открытии приложения все и так отображается, хотя список DBCombobox - пуст

Последний раз редактировалось KBO; 12.07.2019 в 11:24.
KBO вне форума Ответить с цитированием
Старый 12.07.2019, 11:20   #10
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,238
По умолчанию

попробуйте
Цитата:
Я добавил Commit в читающей транзакции и все работает. Насколько это правильно/не правильно?
https://www.sql.ru/forum/1056618/pos...yautsya-dannye

а ещё здесь http://www.ibase.ru/ibx
посмотрите раздел Обновление данных
Цитата:
Обновление данных
У тех, кто уже знаком с механизмами работы технологии клиент-сервер, вопрос по обновлению данных, измененных другими приложениями, возникает только при неверно выбранном уровне изолированности (параметрах) транзакций (см. описание IBTransaction).....

Последний раз редактировалось Serge_Bliznykov; 12.07.2019 в 11:23.
Serge_Bliznykov вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
как отобразить в одном DBComboBox соответствующие данные другого DBComboBox sergeykom БД в Delphi 14 06.07.2016 14:50
Получение значения идентификатора SQL при вставке, и вывод в переменную в C# SeregaVili Помощь студентам 5 11.11.2015 19:02
Dataset не отображает данные - C# Игорь Обухов Базы данных (ADO.NET, LinqToSql, ORM Entity Framework, NHibernate) 4 06.11.2015 23:34
Не отображает данные в ДБ Гриде EHLIB Помощь студентам 1 24.12.2012 20:45
Отчет не отображает данные lionforever C# (си шарп) 7 13.04.2012 14:37