Topic: Ошибка в СУБД MySQL

Добрый день.
У проекта возникает ошибка если пользуюсь MySQL. На SQLite похоже работает , во всяком случае  ошибку не показывает.
Сперва подумал может я как то неправильно собрал проект и возник конфликт ,  но после того как пересоздал увидел что все так и остался.
Прикрепляю проект, если не затруднит посмотрите пожалуйста.
Ошибка выходит при нажатии кнопки поиска.
Спасибо.

Post's attachments

Attachment icon crmalfa.zip 330.6 kb, 399 downloads since 2017-01-21 

Re: Ошибка в СУБД MySQL

Не знаю насколько правильно но нашел несколько ошибок.
1) Вот код стандартной кнопки поиск

SELECT DISTINCT 

`Doctor`.`dName` as "Doctor.dName",
`Rating`.`rating` as "Rating.rating",
`Specialty`.`specialty` as "Specialty.specialty",
`Agent`.`login` as "Agent.login",
`Object`.`object` as "Object.object",
`ObjectCategory`.`objectcategory` as "ObjectCategory.objectcategory",
`Region`.`region` as "Region.region",
`City`.`city` as "City.city",
`Doctor`.id,
`Doctor`.`id_Specialty` as "Doctor.id_Specialty",
`Doctor`.`id_Agent` as "Doctor.id_Agent",
`Region`.`id_City` as "Region.id_City",
`Doctor`.`id_Object` as "Doctor.id_Object",
`Object`.`id_ObjectCategory` as "Object.id_ObjectCategory",
`Doctor`.`id_Rating` as "Doctor.id_Rating",
`Region`.`id_City` as "Region.id_City" 

FROM `Doctor` 
LEFT OUTER JOIN `Specialty` ON `Doctor`.`id_Specialty`=`Specialty`.id 
LEFT OUTER JOIN `Agent` ON `Doctor`.`id_Agent`=` Agent`.id 
LEFT OUTER JOIN `City` ON `Region`.`id_City`=`City`.id 
LEFT OUTER JOIN `Object` ON `Doctor`.`id_Object`=`Object`.id 
LEFT OUTER JOIN `Objectcategory` ON `Object`.`id_ObjectCategory`=`Objectcategory`.id 
LEFT OUTER JOIN `Rating` ON `Doctor`.`id_Rating`=`Rating`.id 
LEFT OUTER JOIN `Region` ON `City`.id=`Region`.`id_City`

Как я понял JOIN-и тут  неправильно упорядочены
Я сделал так

FROM Doctor
LEFT OUTER JOIN `Rating` ON `Doctor`.`id_Rating`=`Rating`.id
LEFT OUTER JOIN `Specialty` ON `Doctor`.`id_Specialty`=`Specialty`.id
LEFT OUTER JOIN `Agent` ON `Doctor`.`id_Agent`=`Agent`.id
LEFT OUTER JOIN `Object` ON `Doctor`.`id_Object`=`Object`.id
LEFT OUTER JOIN `Objectcategory` ON `Object`.`id_ObjectCategory`=`ObjectCategory`.id
LEFT OUTER JOIN `Region` ON `Object`.`id_Region`=`Region`.id
LEFT OUTER JOIN `City` ON `Region`.`id_City`=`City`.id

2) Посмотрите на последнюю строку SELECT-a

`Region`.`id_City` as "Region.id_City"

Оно повторяется
3)Нет выбора Region-a в SELEC-е 

`Object`.`id_Region` as "Object.id_Region"

как я понял вместо него и дублировалась 

`Region`.`id_City` as "Region.id_City"

В прикрепленном архиве два скриншота, из первого видно что выбор Region-a должно было произойти.
4)Во втором скриншоте баг какой то,  встречаю не первый раз но не обращал внимание. Таблица повторяется.
По скольку проект начал собирать заново, уверен что не я перекосячил.

Я вас прошу по возможности посмотреть проект, поскольку сам в программировании  не разбираюсь подозреваю что не все правильно понял и не все правильно нашел.

В прикрепленном файле из первого поста пока не добавлял кнопку с sql запросом, поэтому тут напишу полностью код  по которому будет работать поиск (во всяком случае ошибки не выдаст ).  я прицепил его к отдельной кнопке и выводил результат в отдельном TG

Post's attachments

Attachment icon ScreenShots.zip 64.93 kb, 377 downloads since 2017-01-22 

Re: Ошибка в СУБД MySQL

Вот код sql кнопки

SELECT DISTINCT
`Doctor`.id,
`Doctor`.`dName` as "Doctor.dName",
`Rating`.`rating` as "Rating.rating",
`Specialty`.`specialty` as "Specialty.specialty",
`Agent`.`login` as "Agent.login",
`ObjectCategory`.`objectcategory` as "ObjectCategory.objectcategory",
`City`.`city` as "City.city",
`Region`.`region` as "Region.region",
`Object`.`object` as "Object.object",
`Doctor`.`id_Rating` as "Doctor.id_Rating",
`Doctor`.`id_Specialty` as "Doctor.id_Specialty",
`Doctor`.`id_Agent` as "Doctor.id_Agent",
`Region`.`id_City` as "Region.id_City",
`Object`.`id_ObjectCategory` as "Object.id_ObjectCategory",
`Doctor`.`id_Object` as "Doctor.id_Object",
`Object`.`id_Region` as "Object.id_Region"

FROM `Doctor`
LEFT OUTER JOIN `Rating` ON `Doctor`.`id_Rating`=`Rating`.id
LEFT OUTER JOIN `Specialty` ON `Doctor`.`id_Specialty`=`Specialty`.id
LEFT OUTER JOIN `Agent` ON `Doctor`.`id_Agent`=`Agent`.id
LEFT OUTER JOIN `Object` ON `Doctor`.`id_Object`=`Object`.id
LEFT OUTER JOIN `Objectcategory` ON `Object`.`id_ObjectCategory`=`ObjectCategory`.id
LEFT OUTER JOIN `Region` ON `Object`.`id_Region`=`Region`.id
LEFT OUTER JOIN `City` ON `Region`.`id_City`=`City`.id

WHERE
(Doctor.dName LIKE '%{sdName}%') OR
(Doctor.id_Rating LIKE {sdRating})  OR
(Doctor.id_Specialty LIKE {sdSpecialty}) OR
(Doctor.id_Object LIKE {sdObject}) OR
(Object.id_ObjectCategory LIKE {soObjectCategory}) OR
(Object.id_Region LIKE {soRegion}) OR
(Region.id_City LIKE {srCity}) ;

4 (edited by beniamin91 2017-01-22 00:24:38)

Re: Ошибка в СУБД MySQL

Возникло еще одна проблема
По тому sql коду что ведется поиск, в таблице выводятся не только значения параметров но и их id.
Смотрю на код и понимаю что так и должно бить. Там же есть эти выборки. Но не понимаю почему стандартная кнопка поиска сгенерировала такой код.

5 (edited by beniamin91 2017-01-22 23:37:01)

Re: Ошибка в СУБД MySQL

Немножко доработал проект. Сейчас поиск работает, да еще и  с параметрами Incremental Search. Но на второй вкладке я не смог нормально подключить к поиску checkbox и datetimepicker (что бы и инкремент работал и фильтры и т.д)
Прошу вас помочь.

Post's attachments

Attachment icon crm_alfa_3.zip 333.73 kb, 363 downloads since 2017-01-23 

Re: Ошибка в СУБД MySQL

Сделал импорт базы из phpmyadmin, может понадобится.

Post's attachments

Attachment icon localhost.sql 10.13 kb, 507 downloads since 2017-01-23 

Re: Ошибка в СУБД MySQL

Пожалуйста обобщите ваш вопрос в одном сообщении, иначе не ясно какую проблему вы уже решили, а какая осталась.

Dmitry.

8 (edited by beniamin91 2017-01-23 19:35:38)

Re: Ошибка в СУБД MySQL

Все проблемы второго поста актуальны, я посмел предположить что это ошибки самой программы MVD. Если есть способ их исправить то других вопросов не остается, по скольку необходимость SQL запроса для поиска отпадет.
Если же исправить не удастся, значит поиск должен будет осуществляться по SQL запросу , и тогда остается проблема с CheckBox и DateTimePicker.
Нужно сделать так.
Если галочка datetimepicker не установлена, то выводятся записи с любой датой, но в то же время учитываются значения остальных компонентов участвующие в поиске (edit, combobox,checkbox)
Если datetimepicker активна и выбрана дата, выводятся записи с выбранной датой и с фильтром (то есть <,>,=  фильтры должны работать). Значения остальных компонентов опять учитываются.
С чекбоксом аналогична то же самое. Будет состояние grayed, увидим все записи несмотря на Visit.vState ровно 0 или 1. Состояние 1 то все записи у которых Visit.vState ровно 1. Состояние 0 то все записи у которых Visit.vState ровно 0. И опять таки остальные компоненты тоже будут учитываться, то есть всегда будет связь AND.
В прикрепленном проекте из последнего поста я осуществил поиск с помощью SQL запроса, но вышеупомянутые проблемы с CheckBox  и DateTimePicker не смог решить.

Re: Ошибка в СУБД MySQL

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


Просто приложите актуальный проект, и опишите действия, которые приводят к ошибке (пошаговые действия с указанием имен компонентов)


Также учитывайте, что у меня будет пустая база (делать импорт у меня нет времени), поэтому опишите какие данные я должен внести, чтобы воспроизвести ошибку.

Dmitry.

10 (edited by beniamin91 2017-01-24 10:39:55)

Re: Ошибка в СУБД MySQL

Form1.Button10
Form1.Button12

Post's attachments

Attachment icon project.zip 345.85 kb, 372 downloads since 2017-01-24 

Re: Ошибка в СУБД MySQL

beniamin91 wrote:

Form1.Button10
Form1.Button12

Кнопка Поиск не может автоматически связать более 3 последовательных таблиц. Так например если из настройки кнопки Button10 вы удалите поле City.city, то ошибка пропадет.


Чтобы обойти эту проблему, можно воспользоваться вычисляемым полем, создать его в таблице Region, для вывода названия города,пример:

(SELECT City.city FROM City WHERE City.id=Region.id_City)

Также присутствует другая проблема между таблицами Region и City, внешний ключ Region.id_City создан неверно, необходимо в таблице City создать внешний ключ id_Region, т.е. не регион принадлежит к городу, а наоборот, город принадлежит региону.

Dmitry.

Re: Ошибка в СУБД MySQL

О если пойти другим путем?
В этом же проекте кнопки SQL Search делают поиск точно так как задумано но к ним не смог подключить checkbox и datetimepicker. Вы можете дать пример как реализовать поиск с MySQL и checkbox , datetimepicker.
Я несколькими постами выше описал проблему

beniamin91 wrote:

Немножко доработал проект. Сейчас поиск работает, да еще и  с параметрами Incremental Search. Но на второй вкладке я не смог нормально подключить к поиску checkbox и datetimepicker (что бы и инкремент работал и фильтры и т.д)
Прошу вас помочь.

Re: Ошибка в СУБД MySQL

Здесь можете скачать проект с примером, как реализовать SQL поиск со всеми возможными компонентами
http://myvisualdatabase.com/forum/misc. … download=1

Dmitry.

14 (edited by beniamin91 2017-01-24 22:00:23)

Re: Ошибка в СУБД MySQL

Спасибо за пример. Только один вопрос. В примере поиск по дате осуществляется строго по фильтру  " = ". Как сделать что бы можно было работать с фильтрами " < , > " ?
И еще как сделать datetimepickcer.Date := ( datetimepickcer.Date - 1 месяц )?
Можно конечно datetimepickcer.Date := datetimepickcer.Date - 30  но ведь не каждый месяц имеет 30 дней.

15 (edited by beniamin91 2017-01-24 22:20:38)

Re: Ошибка в СУБД MySQL

beniamin91 wrote:

И еще как сделать datetimepickcer.Date := ( datetimepickcer.Date - 1 месяц )?
Можно конечно datetimepickcer.Date := datetimepickcer.Date - 30  но ведь не каждый месяц имеет 30 дней.

С этим разобрался

Form1.DateTimePicker1.Date:=IncMonth(Form1.dtDateOfBirth.Date,-1);

Но фильтры не хочу делать на костылях.

Re: Ошибка в СУБД MySQL

Если в скрипте объявить переменную, можно ли как то использовать его в sql запросе?

Re: Ошибка в СУБД MySQL

beniamin91 wrote:

Спасибо за пример. Только один вопрос. В примере поиск по дате осуществляется строго по фильтру  " = ". Как сделать что бы можно было работать с фильтрами " < , > " ?

Пример, с фильтрами < >

SELECT
employees.lastname,
employees.firstname,
strftime('%d.%m.%Y', employees.dateofbirth),
strftime('%H:%M:%S', employees.timefield),
groups.groupname,
(CASE WHEN employees.smoke = 1 THEN 'Yes' WHEN employees.smoke = 0 THEN 'No' END),
employees.id

FROM
employees

LEFT OUTER JOIN groups ON groups.id=employees.id_groups

WHERE

(CASE WHEN '{edLastName}' = '' THEN 1=1 ELSE employees.lastname LIKE '{edLastName}' END) AND
(CASE WHEN '{edFirstName}' <> '' THEN employees.firstname LIKE '%{edFirstName}%'  ELSE 1=1 END) AND
(CASE WHEN {dtDateOfBirth} IS NOT NULL THEN date(employees.dateofbirth) = date({dtDateOfBirth}) ELSE 1=1 END) AND

(CASE WHEN {DateTimePickerFrom} IS NOT NULL THEN date(employees.dateofbirth) >= date({DateTimePickerFrom}) ELSE 1=1 END) AND
(CASE WHEN {DateTimePickerTo} IS NOT NULL THEN date(employees.dateofbirth) <= date({DateTimePickerTo}) ELSE 1=1 END) AND

(CASE WHEN {dtTime} IS NOT NULL THEN time(employees.timefield) = time({dtTime}) ELSE 1=1 END) AND
(CASE WHEN {chbSmoke} IS NOT NULL THEN employees.smoke = {chbSmoke} ELSE 1=1 END) AND
(CASE WHEN {cbGroups} <> -1 THEN employees.id_groups = {cbGroups} ELSE 1=1 END)
Dmitry.

Re: Ошибка в СУБД MySQL

beniamin91 wrote:

Если в скрипте объявить переменную, можно ли как то использовать его в sql запросе?

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

Dmitry.