:: Архив конференции по VFP до 2005 года
Написал поиск по БД. Работает он плохо. Прошу помощи
Andrey74
Автор

Сообщений: 33
Дата регистрации: 10.02.2005
Добрый день!

Написал поиск по таблицам БД. Поиск организован так: пользователь вводит в textbox или выбирает из combobox значения (доступно порядка 16 критериев запроса, дальше - будет больше). Первый запрос делаю по таблице Customers - выбираю в курсор перечень всех iid_cust. Далее каждым следующим запросом между курсором и следующем таблицей (по которой пользователь ввел критерий поиска) я получаю общие iid_cust. Последним запросом, если в курсоре есть хотя бы одна запись, формирую более читабельный курсор и показываю его в grid.

При поиске появляются проблемы: чаще всего при поиске по "Страна", выьирается 5 клиентов, а должно - 200. Нет проблем при поиске по фрагментам фамилии, имени, отчеству, названии компании. Прогнал в отладке - ничего "ненормального" не нашел. Среда - VFP8, откомпилировано в exe, применено шифорование exe средствами самого VFP.

Прошу профессионалов посмотреть мой код и наставить на путь истинный.

Код поиска:

LOCAL lnid, ; && текущий id клиента
lnOldArea, ; && текущая рабочая область
lcCompanyName, lcCompanyEmail, ;
lcContactName1, lcContactName2, lcContactName3, lnPosition, ;
lnProduct, lnMachineType, lnPacking, lnVolume, lnCapacity, ;
lnCountry, lnRegion, lnTown, ;
lnActivity, lnTrademark, ;
lnid, liUser, lcWorkStation, lcWhatSearch as String && переменные для записи в журнал поиска
lnOldArea = SELECT() &&Сохранить номер текущей рабочей области
* Перед каждым новым поиском обнуляю свойства ControlSource для Column.
* Если этого не сделать, отображение grid "поламается"
thisform.pageframe1.page3.grdSearchResult.RecordSource = ""
thisform.pageframe1.page3.grdSearchResult.column1.ControlSource = ""
thisform.pageframe1.page3.grdSearchResult.column2.ControlSource = ""
thisform.pageframe1.page3.grdSearchResult.column3.ControlSource = ""
thisform.pageframe1.page3.grdSearchResult.column4.ControlSource = ""
* присваиваю переменным значения соответсвующих элементов управления
* все текстовые значения перевожу в верхний регистр, т.к.
* нельзя полагаться на правильный ввод пользователем критериев ("иван", "Иван", "ИВАН", ...)
lcCompanyName = UPPER(ALLTRIM(thisform.pageframe1.page3.txtCcompanyName.Value))
lcCompanyEmail = UPPER(ALLTRIM(thisform.pageframe1.page3.txtCcompanyEmail.Value))
lcContactName1 = UPPER(ALLTRIM(thisform.pageframe1.page3.txtcname1.Value))
lcContactName2 = UPPER(ALLTRIM(thisform.pageframe1.page3.txtcname2.Value))
lcContactName3 = UPPER(ALLTRIM(thisform.pageframe1.page3.txtcname3.Value))
* Нюанс: т.к. элементы combobox не имеют установленного свойства ControlSource, то выбранное
* пользователем значение автоматически принимает тип String, поэтому всю дальнейшую работу
* со значениями combobox продолжаю как со строковыми значениями.
lnPosition = VAL(ALLTRIM(thisform.pageframe1.page3.cboPosition.Value))
lnProduct = VAL(ALLTRIM(thisform.pageframe1.page3.cboProduct.Value))
lnMachineType = VAL(ALLTRIM(thisform.pageframe1.page3.cboMachineType.Value))
lnPacking = VAL(ALLTRIM(thisform.pageframe1.page3.cboPacking.Value))
lnVolume = VAL(ALLTRIM(thisform.pageframe1.page3.cboVolume.Value))
lnCapacity = VAL(ALLTRIM(thisform.pageframe1.page3.cboCapacity.Value))
lnCountry = VAL(ALLTRIM(thisform.pageframe1.page3.cboCountry.Value))
lnRegion = VAL(ALLTRIM(thisform.pageframe1.page3.cboRegion.Value))
lnTown = VAL(ALLTRIM(thisform.pageframe1.page3.cboTown.Value))
lnActivity = VAL(ALLTRIM(thisform.pageframe1.page3.cboActivity.Value))
lnTrademark = VAL(ALLTRIM(thisform.pageframe1.page3.cboTrademark.Value))
* создаю курсор с полным списком iid_cust для группы "Покупатели"
SELECT Customers.iid_customer as iid_cust ;
FROM customers WHERE Customers.iid_group = 4 INTO CURSOR cust_result NOFILTER
* далее, для каждого критерия выполняю проверку - если ему присвоено значение, то он принимает
* участие в цепочке запросов.
* ========== ГРУППА 1: Компания, Контактные лица ==============
IF !EMPTY(lcCompanyName) && Любой фрагмент НАЗВАНИЯ КОМПАНИИ
SELECT DISTINCT cust_result.iid_cust;
FROM cust_result ;
INNER JOIN customers ;
ON cust_result.iid_cust = Customers.iid_customer;
WHERE UPPER(Customers.cname) LIKE ('%'+m.lcCompanyName+'%') INTO CURSOR cust_result NOFILTER
ENDIF
IF !EMPTY(lcCompanyEmail) && Любой фрагмент E-MAIL КОМПАНИИ (общего адреса - office, info)
SELECT DISTINCT cust_result.iid_cust;
FROM cust_result ;
INNER JOIN customers ;
ON cust_result.iid_cust = Customers.iid_customer;
WHERE UPPER(Customers.cemail_adress) LIKE ('%'+m.lcCompanyEmail+'%') INTO CURSOR cust_result NOFILTER
ENDIF
IF !EMPTY(lcContactName1) && Любой фрагмент ФАМИЛИИ контактного лица
SELECT DISTINCT cust_result.iid_cust;
FROM cust_result ;
INNER JOIN cust_contact ;
ON cust_result.iid_cust = cust_contact.iid_customer;
WHERE UPPER(cust_contact.cname1) LIKE ('%'+m.lcContactName1+'%') INTO CURSOR cust_result NOFILTER
ENDIF
IF !EMPTY(lcContactName2) && Любой фрагмент ИМЕНИ контактного лица
SELECT DISTINCT cust_result.iid_cust;
FROM cust_result ;
INNER JOIN cust_contact ;
ON cust_result.iid_cust = cust_contact.iid_customer;
WHERE UPPER(cust_contact.cname2) LIKE ('%'+m.lcContactName2+'%') INTO CURSOR cust_result NOFILTER
ENDIF
IF !EMPTY(lcContactName3) && Любой фрагмент ОТЧЕСТВА контактного лица
SELECT DISTINCT cust_result.iid_cust;
FROM cust_result ;
INNER JOIN cust_contact ;
ON cust_result.iid_cust = cust_contact.iid_customer;
WHERE UPPER(cust_contact.cname3) LIKE ('%'+m.lcContactName3+'%') INTO CURSOR cust_result NOFILTER
ENDIF
IF !EMPTY(lnPosition) && ДОЛЖНОСТЬ
SELECT DISTINCT cust_result.iid_cust;
FROM cust_result ;
INNER JOIN cust_contact ;
ON cust_result.iid_cust = cust_contact.iid_customer;
WHERE Cust_contact.iid_position = (lnPosition) INTO CURSOR cust_result NOFILTER
ENDIF
* ========== ГРУППА 2: Оборудование. Установленное. ==============
IF !EMPTY(lnProduct) && Оборудование установленное. ПРОДУКТ
SELECT DISTINCT cust_result.iid_cust;
FROM cust_result ;
INNER JOIN cust_machines ;
ON cust_result.iid_cust = cust_machines.iid_customer;
WHERE Cust_machines.iid_product = (lnProduct) INTO CURSOR cust_result NOFILTER
ENDIF
IF !EMPTY(lnMachineType) && Оборудование установленное. ТИП ОБОРУДОВАНИЯ
SELECT DISTINCT cust_result.iid_cust;
FROM cust_result ;
INNER JOIN cust_machines ;
ON cust_result.iid_cust = cust_machines.iid_customer;
WHERE Cust_machines.iid_type = (lnMachineType) INTO CURSOR cust_result NOFILTER
ENDIF
IF !EMPTY(lnPacking) && Оборудование установленное. УПАКОВКА (ТАРА)
SELECT DISTINCT cust_result.iid_cust;
FROM cust_result ;
INNER JOIN cust_machines ;
ON cust_result.iid_cust = cust_machines.iid_customer;
WHERE Cust_machines.iid_packing = (lnPacking) INTO CURSOR cust_result NOFILTER
ENDIF
IF !EMPTY(lnVolume) && Оборудование установленное. ОБЪЕМ УПАКОВКИ (БУТЫЛКИ)
SELECT DISTINCT cust_result.iid_cust;
FROM cust_result ;
INNER JOIN cust_machines ;
ON cust_result.iid_cust = cust_machines.iid_customer;
WHERE Cust_machines.iid_volume = (lnVolume) INTO CURSOR cust_result NOFILTER
ENDIF
IF !EMPTY(lnCapacity) && Оборудование установленное. ПРОИЗВОДИТЕЛЬНОСТЬ
SELECT DISTINCT cust_result.iid_cust;
FROM cust_result ;
INNER JOIN cust_machines ;
ON cust_result.iid_cust = cust_machines.iid_customer;
WHERE Cust_machines.iid_capacity = (lnCapacity) INTO CURSOR cust_result NOFILTER
ENDIF
* ========== ГРУППА 3: МЕСТО РАСПОЛОЖЕНИЯ ==============
IF !EMPTY(lnCountry) && Местоположение. СТРАНА
SELECT DISTINCT cust_result.iid_cust;
FROM cust_result ;
INNER JOIN cust_adress;
ON cust_result.iid_cust = cust_adress.iid_customer;
WHERE cust_adress.iid_country = (lnCountry) INTO CURSOR cust_result NOFILTER
ENDIF
IF !EMPTY(lnRegion) && Местоположение. ОБЛАСТЬ
SELECT DISTINCT cust_result.iid_cust;
FROM cust_result ;
INNER JOIN cust_adress;
ON cust_result.iid_cust = cust_adress.iid_customer;
WHERE cust_adress.iid_region = (lnRegion) INTO CURSOR cust_result NOFILTER
ENDIF
IF !EMPTY(lnTown) && Местоположение. НАСЕЛЕННЫЙ ПУНКТ
SELECT DISTINCT cust_result.iid_cust;
FROM cust_result ;
INNER JOIN cust_adress;
ON cust_result.iid_cust = cust_adress.iid_customer;
WHERE cust_adress.iid_town = (lnTown) INTO CURSOR cust_result NOFILTER
ENDIF
* ========== ГРУППА 4: РАЗНОЕ =====================
IF !EMPTY(lnActivity) && Разное. ОТРАСЛЬ
SELECT DISTINCT cust_result.iid_cust;
FROM cust_result ;
INNER JOIN cust_adress;
ON cust_result.iid_cust = cust_activity.iid_customer;
WHERE cust_activity.iid_activity = (lnActivity) INTO CURSOR cust_result NOFILTER
ENDIF
IF !EMPTY(lnTrademark ) && Разное. ТОРГОВАЯ МАРКА
SELECT DISTINCT cust_result.iid_cust;
FROM cust_result ;
INNER JOIN cust_adress;
ON cust_result.iid_cust = cust_trademark.iid_customer;
WHERE cust_trademark.iid_trademark = (lnTrademark) INTO CURSOR cust_result NOFILTER
ENDIF
* ======= ОКОНЧЕНЫ ЗАПРОСЫ ПО КРИТЕРИЯМ, ВВЕДЕННЫМ ПОЛЬЗОВАТЕЛЯМ =========================
* Формирую более информативный курсор для отображения в Grid (результаты поиска)
SELECT Cust_result.iid_cust, Customers.cname;
FROM Cust_result ;
INNER JOIN customers ;
ON Cust_result.iid_cust = Customers.iid_customer INTO CURSOR cust_result NOFILTER
SELECT DISTINCT Cust_result.*, Ref_country.ccountry,;
Ref_region.cregion, Ref_town.ctown;
FROM Cust_result ;
LEFT OUTER JOIN cust_adress ;
ON Cust_result.iid_cust = Cust_adress.iid_customer ;
LEFT OUTER JOIN ref_town ;
ON Cust_adress.iid_town = Ref_town.iid_town ;
LEFT OUTER JOIN ref_region ;
ON Cust_adress.iid_region = Ref_region.iid_region ;
LEFT OUTER JOIN ref_country ;
ON Cust_adress.iid_country = Ref_country.iid_country;
ORDER BY Cust_result.cname INTO CURSOR cust_result NOFILTER
IF RECCOUNT("Cust_result") = 0
thisform.FindSuccess = .F. && свойство указыват, что поиск был неуспешным
= MESSAGEBOX("По Вашему запросу не найдено ни одной карточки")
ELSE
thisform.FindSuccess = .T. && свойство указыват, что поиск был успешным (создан курсор Cust_result)
* для отображения результатов поиска подготовить Grid
thisform.pageframe1.page3.grdSearchResult.RecordSource = "Cust_result"
thisform.pageframe1.page3.grdSearchResult.column1.ControlSource = "Cust_result.cname"
thisform.pageframe1.page3.grdSearchResult.column2.ControlSource = "Cust_result.ccountry"
thisform.pageframe1.page3.grdSearchResult.column3.ControlSource = "Cust_result.cregion"
thisform.pageframe1.page3.grdSearchResult.column4.ControlSource = "Cust_result.ctown"
thisform.pageframe1.page3.grdSearchResult.Refresh()
ENDIF
* ЗАПИСЫВАЮ В ЖУРНАЛ ПОИСКА КТО И ПО КАКИМ КРИТЕРИЯМ ВЫПОЛНЯЛ ПОИСК (неважно успешным был поиск или нет)
lcWhatSearch = ""
lnid = newid("LOG_SEARCH") && получаю уникальный код записи
liUser = oApp.getEmployeeID() && id пользователя
lcWorkStation = Sys(0) && имя ПК
* ========== ГРУППА 1: Компания, Контактные лица ==============
IF !EMPTY(lcCompanyName) && Любой фрагмент НАЗВАНИЯ КОМПАНИИ
lcWhatSearch = lcWhatSearch + "Название компании: " + lcCompanyName + Chr(13)
ENDIF
IF !EMPTY(lcCompanyEmail) && Любой фрагмент E-MAIL КОМПАНИИ (общего адреса - office, info)
lcWhatSearch = lcWhatSearch + "E-mail компании: " + lcCompanyEmail + Chr(13)
ENDIF
IF !EMPTY(lcContactName1) && Любой фрагмент ФАМИЛИИ контактного лица
lcWhatSearch = lcWhatSearch + "Фамилия: " + lcContactName1 + Chr(13)
ENDIF
IF !EMPTY(lcContactName2) && Любой фрагмент ИМЕНИ контактного лица
lcWhatSearch = lcWhatSearch + "Имя: " + lcContactName2 + Chr(13)
ENDIF
IF !EMPTY(lcContactName3) && Любой фрагмент ОТЧЕСТВА контактного лица
lcWhatSearch = lcWhatSearch + "Отчество: " + lcContactName3 + Chr(13)
ENDIF
IF !EMPTY(lnPosition) && ДОЛЖНОСТЬ
lcWhatSearch = lcWhatSearch + "Должность: " + ALLTRIM(cRef_position20.cposition) + Chr(13)
ENDIF
* ========== ГРУППА 2: Оборудование. Установленное. ==============
IF !EMPTY(lnProduct) && Оборудование установленное. ПРОДУКТ
lcWhatSearch = lcWhatSearch + "Обор_установл. Продукт: " + ALLTRIM(cRef_Product20.cproduct) + Chr(13)
ENDIF
IF !EMPTY(lnMachineType) && Оборудование установленное. ТИП ОБОРУДОВАНИЯ
lcWhatSearch = lcWhatSearch + "Обор_установл. Тип: " + ALLTRIM(cRef_machines_type20.ctype) + Chr(13)
ENDIF
IF !EMPTY(lnPacking) && Оборудование установленное. УПАКОВКА (ТАРА)
lcWhatSearch = lcWhatSearch + "Обор_установл. Упаковка: " + ALLTRIM(cRef_packing20.cpacking) + Chr(13)
ENDIF
IF !EMPTY(lnVolume) && Оборудование установленное. ОБЪЕМ УПАКОВКИ (БУТЫЛКИ)
lcWhatSearch = lcWhatSearch + "Обор_установл. Продукт: " + ALLTRIM(cRef_Product20.cproduct) + Chr(13)
ENDIF
IF !EMPTY(lnCapacity) && Оборудование установленное. ПРОИЗВОДИТЕЛЬНОСТЬ
lcWhatSearch = lcWhatSearch + "Обор_установл. Произ-ть: " + ALLTRIM(TRANSFORM(cRef_volume20.nvolume)) + Chr(13)
ENDIF
* ========== ГРУППА 3: МЕСТО РАСПОЛОЖЕНИЯ ==============
IF !EMPTY(lnCountry) && Местоположение. СТРАНА
lcWhatSearch = lcWhatSearch + "Страна: " + ALLTRIM(cRef_country20.ccountry) + Chr(13)
ENDIF
IF !EMPTY(lnRegion) && Местоположение. ОБЛАСТЬ
* lcWhatSearch = lcWhatSearch + "Область: " + ALLTRIM(cRef_country20.ccountry) + Chr(13)
ENDIF
IF !EMPTY(lnCountry) && Местоположение. НАСЕЛЕННЫЙ ПУНКТ
* lcWhatSearch = lcWhatSearch + "Нас. пункт: " + ALLTRIM(cRef_country20.ccountry) + Chr(13)
ENDIF
* ========== ГРУППА 4: РАЗНОЕ =====================
IF !EMPTY(lnActivity) && Разное. ОТРАСЛЬ
lcWhatSearch = lcWhatSearch + "Отрасль: " + ALLTRIM(cRef_Activity20.cactivity) + Chr(13)
ENDIF
IF !EMPTY(lnTrademark ) && Разное. ТОРГОВАЯ МАРКА
lcWhatSearch = lcWhatSearch + "ТМ: " + ALLTRIM(cRef_trademark20.ctrademark) + Chr(13)
ENDIF
* Заглушка, если во время формирования строки произошла ошибка и строка равна .NULL., то:
lcWhatSearch = NVL(lcWhatSearch, "Во время формирования строки критериев поиска произошла ошибка. Обратитесь к программисту. (форма Customers-01, вкладка Поиск, код кнопки Поиск)")
*** Собранную информацию записываем в журнал "Поиска"
Insert Into Log_search (iid, iid_employee, mdescription, cWrkStat, dDateTime ) ;
Values (lnid, liUser, lcWhatSearch, lcWorkStation, DateTime())
*вернуть установки, которые были до начала работы функции.
SELECT (lnOldArea)


Есть еще проблемка: написал код, который поместил в событие DblClick grid - по двойному щелчку пользователь должен перейти на 1-ую вкладку pageframe с выбранным клиентом. Когда прогоняю код в отладке - все норомально, без отладки - нет перехода на 1-ую вкладку. Поместил тот же код в событие Click кнопки "Детально" - есть переход на 1-ую вкладку.
В чем может біть проблема?
Код кнопки:
LOCAL lnid_cust, lnOldArea
IF thisform.FindSuccess && свойство FindSuccess определяет, был ли успешным поиск (имеется хотя бы одна запись в Cust_result)
thisform.LockScreen = .T.
lnOldArea = SELECT()
lnid_cust = cust_result.iid_cust
SEEK lnid_cust ORDER ID_CUST IN Customers
IF FOUND()
thisform.pageframe1.page1.SetFocus()
thisform.pageframe1.Refresh()
ELSE MESSAGEBOX("Не удалось найти карточку клиента." + CHR(13) + "Попробуйте искать самостоятельно.")
ENDIF
SELECT (lnOldArea)
thisform.LockScreen = .F.
ENDIF
Ratings: 0 negative/0 positive
Re: Написал поиск по БД. Работает он плохо. Прошу помощи
Владимир Максимов

Сообщений: 14093
Откуда: Москва
Дата регистрации: 02.09.2000
"Это просто праздник, какой-то" (с)

Вообще-то, первым желанием после того, как я увидел такую "простыню" было немедленно перейти к другой теме. Ты всерьез думаешь, что у кого-то хватит сил и желания разбираться в таком огромном коде? Ну, ладно:

-) Если необходимо, чтобы ComboBox принимал числовые значения при отсутствующем ControlSource, надо на этапе дезайна (или в Init) сделать присвоение:

ComboBox.Value = 0
ComboBox.BoundTo = .T.

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

-) В FoxPro существует такая вещь, как макроподстановка. Т.е. можно заранее сформировать условие отбора, а потом выполнить одну команду Select-SQL. Примерно так:

LOCAL lcFilter
lcFilter = "Customers.iid_group = 4"
IF !EMPTY(m.lcCompanyName) && Любой фрагмент НАЗВАНИЯ КОМПАНИИ
lcFilter = m.lcFilter + [ AND UPPER(Customers.cname) LIKE ('%'+m.lcCompanyName+'%')]
ENDIF
IF !EMPTY(lcCompanyEmail) && Любой фрагмент E-MAIL КОМПАНИИ (общего адреса - office, info)
lcFilter = m.lcFilter + [ AND UPPER(Customers.cemail_adress) LIKE ('%'+m.lcCompanyEmail+'%')]
ENDIF
...
SELECT Customers.iid_customer as iid_cust ;
FROM customers WHERE &lcFilter INTO CURSOR cust_result NOFILTER

Надеюсь, общая идея понятна? Все то же самое можно сделать с условиями по другим таблицам и сделать один итоговый запрос сразу по всем таблицам-источникам.




------------------
Ratings: 0 negative/0 positive
Re: Написал поиск по БД. Работает он плохо. Прошу помощи
Igor Korolyov

Сообщений: 34580
Дата регистрации: 28.05.2002
Hi, Andrey74!

Для переключения на другую страницу PageFrame нужно использовать
ThisForm.pgf1.ActivePage = Номер_страницы.
При использовании LIKE формата SQL скобки не нужны, при подстановке
"переменных" в SQL скобки тоже не нужны - можно лишь буковкой m. уточнить
где именно находится переменная. Можно ещё и ? поставить - как маркер
"параметра", но для локальных данных это лишнее...
В остальном согласен с Владимиром.




------------------
WBR, Igor
Ratings: 0 negative/0 positive
Re: Написал поиск по БД. Работает он плохо. Прошу помощи
Andrey74
Автор

Сообщений: 33
Дата регистрации: 10.02.2005
Владимир Максимов

Владимир Максимов
Вообще-то, первым желанием после того, как я увидел такую "простыню" было немедленно перейти к другой теме. Ты всерьез думаешь, что у кого-то хватит сил и желания разбираться в таком огромном коде?
Да кусок большой, но сам не могу разобраться

Владимир Максимов
ComboBox.BoundTo = .T.
установлено

Igor Korolyov

Igor Korolyov
Для переключения на другую страницу PageFrame нужно использовать
ThisForm.pgf1.ActivePage = Номер_страницы.
Пробовал - не получилось. В справке написано: ActivePage Property
Returns the number of the active Page in a PageFrame object. Available at design time; read-write at run time.

Кажется, что я не достаточно ясно описал проблему, сорри, попробую еще раз: когда я выполняю этот же код отдельно по каждому запросу из среды VFP - все запросы работают "правильно", когда пробую выполнить код из программы (exe) при тех же установленных критериях - в итоговом курсоре получается записей меньше. Проверяю в отладке значения всех переменных - все правильно. В частности - проблема в этом запросе. Почему он по разному работает (отбирает разное кол-во записей) в из среды VFP и в откомпилированной версии я не пойму

* ========== ГРУППА 3: МЕСТО РАСПОЛОЖЕНИЯ ==============
&& Местоположение. СТРАНА
SELECT DISTINCT cust_result.iid_cust;
FROM cust_result ;
INNER JOIN cust_adress;
ON cust_result.iid_cust = cust_adress.iid_customer;
WHERE cust_adress.iid_country = (lnCountry) INTO CURSOR cust_result NOFILTER
Ratings: 0 negative/0 positive
Re: Написал поиск по БД. Работает он плохо. Прошу помощи
Владимир Максимов

Сообщений: 14093
Откуда: Москва
Дата регистрации: 02.09.2000
Так ведь у тебя результат последующего запроса напрямую зависит от результата предыдущего. Посмотри что осталось в курсоре cust_result на момент выполнения этого запроса. Возможно, предыдущие выборки так все сократили. И еще, на этапе отладки и в готовом EXE ты работаешь с одними и теми же данными? Может, просто данные разные?

Кстати, зачем ты делаешь DISTINCT? У тебя разве код клиента не уникален?




------------------
Ratings: 0 negative/0 positive
Re: Написал поиск по БД. Работает он плохо. Прошу помощи
Andrey74
Автор

Сообщений: 33
Дата регистрации: 10.02.2005
Сегодня вечером погоняю в отладке несколько раз.


Владимир Максимов
Кстати, зачем ты делаешь DISTINCT? У тебя разве код клиента не уникален?
Все таблицы, по которым идет запросы, связаны отношением один ко многим с customers. Если, например, пользователь ищет клиента, у которого одного из контактных лиц зовут "иван", и их 2 лица у одного юр. лица, то в куросре будут присутсвовать два раза один и тот же id_cust, дальше получается лавинообразное нарастание, потому и пишу DISTINCT
Ratings: 0 negative/0 positive
Re: Написал поиск по БД. Работает он плохо. Прошу помощи
Andrey74
Автор

Сообщений: 33
Дата регистрации: 10.02.2005
Владимир, Игорь - спасибо за ответы!

В редакторе форм установил ComboBox.Value = 0, отказался от преобразований ComboBox.Value из текстового значения в числовое, убрал скобки вокруг критерия запроса, уточнил критерий запроса с помощью "m. " - все заработало!

Большое спасибо.
Ratings: 0 negative/0 positive


Извините, но у вас нет прав для того, чтобы оставлять сообщения в этом форуме.

On-line: 4 (Гостей: 4)

© 2000-2024 Fox Club 
Яндекс.Метрика