Ну не все с TPanel умеют заморачиваться, чтобы изменять форму не меняя формы...

Изящно! Всего лишь поменяли дескриптор у объекта-структуры smile Так и продублировать меню на другие формы можно!

А, и малость я ввёл вас в заблуждение, на самом деле связь такая: 1<-2<-3<-4->5 - еще и поэтому и ставилась таблица 4 в качестве таблицы поиска при настройке кнопки с действием "Поиск" (которая и не работала как надо).
Так что насчет ценности "добытой" мною информации - еще надо подумать...

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


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


Главную таблицу рекомендуется указывать, если число таблиц, данные из которых связываются построителем, больше двух.

Вообще, вымученный мною sql-запрос в кнопке с действием "SQL-запрос" выглядел так:

SELECT
  strftime("%d.%m.%Y", 4.measurementDate) AS "measurementDate",
  2.GroupID,
  3.SerialNumber, 
  3.SubGroupID,
  1.SiteID,
  4.measurement_F,       
  4.measurement_t,
  4.currentPressure,
  5.SensorStatus,
  4.id
         
FROM 1                       
LEFT OUTER JOIN 2 ON 2.id_1 = 1.id  
LEFT OUTER JOIN 3 ON 3.id_2 = 2.id
LEFT OUTER JOIN 4 ON 4.id_3 = 3.id
LEFT OUTER JOIN 5 ON 4.id_5 = 5.id
                                      
WHERE 1.id = {cbSiteID}

ORDER BY 4.measurementDate, 2.GroupID, 3.SubGroupID;

и он выдавал то, что я и хотел в отличие от кнопки с действием "Поиск", где я ставил в качестве таблицы поиска таблицу 4, потом 1 (исходя из вымученного SQL-запроса). Причем выдавал ровно столько, сколько нужно - без избытка, дупликатов или недостатка.

Так написать запрос пришлось потому, что искомое значение из фильтрующего комбобокса находилось в таблице 1.

Вот как это называется?! Дня три долбался над нюансами проектирования кнопки с действием "Поиск", уже забил на неё, решил через пресловутую кнопку с действием "SQL-запрос" делать... И тут вот после думок о  роли "главной таблицы" после информации от Дмитрия перемкнуло меня таблицу поиска поменять при дизайне кнопки "Поиск" - и всё встало как надо...

У меня таблицы связаны так: 1<-2<-3->4->5, где стрелочки - это ключи-связи. Так вот, таблицей поиска при действии "Поиск" была таблица 4 (потому что в ней половина извлекаемых данных находилась), а стоило поставить 3 - как всё заработало как надо, и необходимость в кнопке с действием "SQL-запрос" отпала... Ну как так-то?!

Так вот для чего нужна "главная таблица"!.. А я думал-думал, так и не понял, ведь в http://myvisualdatabase.com/help_ru/ написано только

Обратите внимание на опцию: "Выберите главную таблицу базы данных в запросе" - в случае сложных SQL запросов с подзапросами, необходимо самостоятельно выбрать главную таблицу базы данных.

и ни слова о гарантии работоспособности форм добавления-просмотра/редактирования-удаления записи из таблицы в данном отображении содержимого грида.

Проставил нужную таблицу - всё работает как надо. Спасибо!

На форме есть грид, есть три комбобокса. По двум из трех комбобоксам фильтруется вывод в грид через инкрементальный поиск (к комбобоксам привязаны кнопки с действием "Поиск"). Также на форме присутствуют кнопки с действием "Новая запись", "Просмотреть/Отредактировать запись", "Удалить запись. На третьем комбобоксе висит кнопка с действием "SQL-запрос", так как стандартные механизмы не тянут - участвует 5 таблиц в выводе (программа просто виснет при настройке действия "Поиск").

Однако после применения этой кнопки на третьем комбоксе вдруг перестают работать кнопки на форме с просмотром и редактированием (а возможно, также с добавлением новой и удалением существующей) записей. То есть формы открываются для редактирования, но они - пустые. В грид выводится id записей из таблицы, аналогичной на первых двух комбобоксах (чтобы как раз и работали эти кнопки), однако этого не происходит. Вопрос - почему?

О, оптимизация кода подъехала!.. Спасибо!

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

DriveSoft, именно на OnDropDown вешать надо? Ведомого или таки ведущего комбобокса? smile

11

(54 replies, posted in Russian)

а frmEmployee.cbGroup.dbUpdate после INSERT'а где???

а я как-то больше привык работать с dbItemID, чем с sqlValue. да и проверки на наличие выбранного элемента у них разные: у первого <> -1, у второго <> "NULL".

А почему событие OnClick?

порыскал по форуму...

получается, надо определиться только с событием ведущего комбобокса, а связывать их статически при проектировании в самой IDE не обязательно, можно отрабатывать код типа:

if Form1.ComboBox_Master.dbItemID <> -1
  then
     begin
         Form1.ComboBox_Slave.dbSQLExecute('SELECT SensorName, id FROM Sensors WHERE id_Object='+IntToStr(Form1.ComboBox_Master.dbItemID));
         Form1.ComboBox_Slave.dbUpdate;
     end
  else
     begin
         Form1.ComboBox_Slave.dbSQLExecute('SELECT SensorName, id FROM Sensors');
         Form1.ComboBox_Slave.dbUpdate; 
     end;

или будут другие предложения?

Все знают, что два комбобокса можно связать друг с другом при помощи свойства ParentComboBox - один (ведомый) станет зависеть от другого (ведущего), который будет указан в этом свойстве у ведомого.

Так вот вопрос на засыпку. Я хочу иметь ведомый комбобокс как самостоятельный (не связанный с ведущим) в том случае, если в ведущем комбобоксе не выбрано ни одно значение (при этом у ведущего FirstEmptyItem = True).

Понимаю, что завязать надо будет программно, связывать ведомый с ведущим придется через событие OnChange или OnCloseUp ведущего.

Для понимания конкретики. Есть у меня список датчиков (ведомый комбобокс в моей хотелке) и есть список объектов (ведущий комбобокс в моей хотелке), на котором эти датчики установлены (само собой, на одном объекте от одного до нескольких датчиков). Пока ни одно значение в ведущем комбобоксе не выборано, ведомый комбобокс должен вести себя как самостоятельный комбобокс с пустым свойством ParentComboBox и позволять выбирать ЛЮБОЙ датчик из всех существующих в базе. Однако как только в ведущем комбобоксе будет выбрано какое-то значение, то ведомый комбобокс должен уже отреагировать как положено в модели поведения "ведомый - ведущий" и позволить выбрать только те датчики, которые присутствуют на выбранном объекте из ведущего комбобокса.

Компонент "Карта". Если API от Google стал платный, возможна ли поддержка открытых ГИС-платформ? Типа WiliWeb или OpenStreetMap?

А связать этот список с тем же ComboBox?

18

(73 replies, posted in Russian)

Что вы там запихали в БД?.. Формы со скриптами не больше 15 метров весят... Вылейте на файлообменник без базы.

19

(15 replies, posted in Russian)

Я чего-то не пойму... А нельзя ли вместо

     frmComServiceList.eNameCompany.Text := SQLExecute('SELECT NameCompany FROM company WHERE id='+ frmServiceCen.tgList.sqlValue);
     frmComServiceList.eStreetCompany.Text := SQLExecute('SELECT streetCompany FROM company WHERE id='+ frmServiceCen.tgList.sqlValue);
     frmComServiceList.eHouseCompany.Text := SQLExecute('SELECT houseCompany FROM company WHERE id='+ frmServiceCen.tgList.sqlValue);
     frmComServiceList.eFractionCompany.Text := SQLExecute('SELECT fractionCompany FROM company WHERE id='+ frmServiceCen.tgList.sqlValue);
     frmComServiceList.eOfficeCompany.Text := SQLExecute('SELECT officeCompany FROM company WHERE id='+ frmServiceCen.tgList.sqlValue);
     frmComServiceList.eTelCompany.Text := SQLExecute('SELECT telCompany FROM company WHERE id='+ frmServiceCen.tgList.sqlValue);
     frmComServiceList.eNameTypeOfEquipment.Text := SQLExecute('SELECT nameTypeOfEquipment FROM TypeOfEquipment WHERE id='+ frmServiceCen.tgList.sqlValue);
     frmComServiceList.eNameManufacturer.Text := SQLExecute('SELECT nameManufacturer FROM manufacturer WHERE id='+ frmServiceCen.tgList.sqlValue);
     frmComServiceList.eModel.Text := SQLExecute('SELECT Model FROM servise WHERE id='+ frmServiceCen.tgList.sqlValue);
     frmComServiceList.eSerialNamber.Text := SQLExecute('SELECT SerialNamber FROM servise WHERE id='+ frmServiceCen.tgList.sqlValue);
     frmComServiceList.eEquipment.Text := SQLExecute('SELECT Equipment FROM servise WHERE id='+ frmServiceCen.tgList.sqlValue);
     frmComServiceList.mDescriptionATCsWords.Text := SQLExecute('SELECT DescriptionATCsWords FROM servise WHERE id='+ frmServiceCen.tgList.sqlValue);
     frmComServiceList.mExternalStatus.Text := SQLExecute('SELECT ExternalStatus FROM servise WHERE id='+ frmServiceCen.tgList.sqlValue);
     frmComServiceList.mDiagnostics.Text := SQLExecute('SELECT Diagnostics FROM servise WHERE id='+ frmServiceCen.tgList.sqlValue);
     frmComServiceList.cbStatusName.DbItemID := SQLExecute('SELECT id_status FROM servise WHERE id='+ frmServiceCen.tgList.sqlValue);

просто настроить кнопку с действием "показать запись"?..

20

(24 replies, posted in Russian)

karim wrote:

2. В прикрепленном файле имеется проект. Нажимаем начать тест, вводим имя и при входе в Form1  выдает ошибку List index out of bounds (1). В чем проблема не могу понять. Помогите.

Эта ошибка связана с использованием массивов.  Если у вас где-то используется массив в цикле, посмотрите внимательно начальное и конечное значение индекса массива.

21

(24 replies, posted in Russian)

попробуйте

SQLExecute('INSERT INTO exam (id_students, id_questions, id_answers) VALUES (' + IntToStr(Form1.ComboBox6.dbitemid) + ', ' + IntToStr(Form1.ComboBox1.dbitemid) + ', '  + IntToStr(Form1.ComboBox1.dbitemid) + ')');

так как свойство dbItemID - это число, а выполнить вы хотите SQL-запрос в виде текста, поэтому надо привести числовую переменную в символьную (строковую)

22

(6 replies, posted in Russian)

Без чёткого ТЗ - результат хз. Вы скажите, что вам надо. Подробно.

Отформатировал - этот тип значения выставил с Text на Numerical?

24

(24 replies, posted in Russian)

Сколько заплатите?)))

25

(10 replies, posted in Russian)

на событие OnAfterSort в гриде повесить код типа

Sorted := 'ORDER BY <колонка таблицы - поле в БД>';

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

SQLQuery('SELECT * FROM ... WHERE ...' + Sorted, Result);

Если исходить из примера в хэлпе, то принимая во внимание

procedure Form1_TableGrid1_OnAfterSort (Sender: string; ACol: Integer);
begin
   ShowMessage('Пользователь сделал сортировку по колонке №' + IntToStr(ACol));
end;

надо еще четко знать какой номер колонки за какое поле в тбалице БД отвечает, а номер отсортированной колонки передается в ACol.