Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / FoxPro, Visual FoxPro Новый топик    Ответить
 Помогите с запросом  [new]
curys
Member

Откуда:
Сообщений: 80
У меня такой вопрос.
Имеется основные таблицы: gruz, region, goroda, transport, loding и одна временная(создается при выполнении запроса и заполняется всеми полями основных таблиц) cBuilding. Проблема в том что при выполнении запроса она создается, но остается пустой. Подскажите как сделать чтобы она заполнялась?
27 апр 10, 19:42    [8698447]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом  [new]
Dag
Member

Откуда:
Сообщений: 842
Вероятно не выполнены условия, удовлетворяющие запросу.
27 апр 10, 20:23    [8698563]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом  [new]
curys
Member

Откуда:
Сообщений: 80
как так, я точно знаю, что у меня есть в таблице регион: Новосибирская область и город: Новосибирск, делаю поиск именно по этому региону и городу и у меня результат нулевой и во временной таблице пусто.
27 апр 10, 20:56    [8698671]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом  [new]
tanglir
Member

Откуда:
Сообщений: 28966
curys,

структуру таблиц и код процедуры в студию
27 апр 10, 21:13    [8698725]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом  [new]
curys
Member

Откуда:
Сообщений: 80
Может в коде у меня какие-нибудь косяки, посмотрите пожалуйста!
Вот код запроса:

*- Кнопка Поиск
Wait 'Ждите! Ваш запрос обрабатывает сервер.' WINDOW NOWAIT

IF Selectidotkydare=0
* Значение символьной переменной - пустая строка
* К оператору SELECT ничего добавлено не будет
Sidotkydare=[]
ELSE
* Строка в квадратных скобках будет добавлена
* к оператору SELECT как значение &Sidotkydare
* Обратите внимание на знак & (амперсанд)
Sidotkydare=[and gruz.idotkydare=Selectidotkydare]
ENDIF

IF Selectidotkydago=0
* Значение символьной переменной - пустая строка
* К оператору SELECT ничего добавлено не будет
Sidotkydago=[]
ELSE
* Строка в квадратных скобках будет добавлена
* к оператору SELECT как значение &Sidotkydago
* Обратите внимание на знак & (амперсанд)
Sidotkydago=[and gruz.idotkydago=Selectidotkydago]
ENDIF

IF Selectidkydare=0
* Значение символьной переменной - пустая строка
* К оператору SELECT ничего добавлено не будет
Sidkydare=[]
ELSE
* Строка в квадратных скобках будет добавлена
* к оператору SELECT как значение &Sidkydare
* Обратите внимание на знак & (амперсанд)
Sidkydare=[and gruz.idkydare=Selectidkydare]
ENDIF

IF Selectidkydago=0
* Значение символьной переменной - пустая строка
* К оператору SELECT ничего добавлено не будет
Sidkydago=[]
ELSE
* Строка в квадратных скобках будет добавлена
* к оператору SELECT как значение &Sidkydago
* Обратите внимание на знак & (амперсанд)
Sidkydago=[and gruz.idkydago=Selectidkydago]
ENDIF

IF Selectidtran=0
Sidtran=[]
ELSE
* Строка в квадратных скобках будет добавлена
* к оператору SELECT как значение &Sidtran
Sidtran=[and gruz.idtran=Selectidtran]
ENDIF

IF Selectidload=0
Sidload=[]
ELSE
* Строка в квадратных скобках будет добавлена
* к оператору SELECT как значение &Sidload
Sidload=[and gruz.idload=Selectidload]
ENDIF

* Дата погрузки
* Уберем концевые пробелы
Selectgotovs=ALLTRIM(Selectgotovs)
IF LEN(Selectgotovs)=0
Sgotovs=[]
ELSE
* Строка в квадратных скобках будет добавлена
* к оператору SELECT как значение &Sgotovs
Sgotovs=[and gruz.gotovs==Selectgotovs]
* Знак == означает: в точности равно.
* Если поставить просто знак равенства
* Будут найдены все груз, дата погрузки которых
* начинаются с введенных символов.
ENDIF

* Дата погрузки
* Уберем концевые пробелы
Selectgotovdo=ALLTRIM(Selectgotovdo)
IF LEN(Selectgotovdo)=0
Sgotovdo=[]
ELSE
* Строка в квадратных скобках будет добавлена
* к оператору SELECT как значение &Sgotovdo
Sgotovdo=[and gruz.gotovdo==Selectgotovdo]
* Знак == означает: в точности равно.
* Если поставить просто знак равенства
* Будут найдены все груз, дата погрузки которых
* начинаются с введенных символов.
ENDIF

* Масса груза
* Уберем концевые пробелы
Selectmassa=ALLTRIM(Selectmassa)
IF LEN(Selectmassa)=0
Smassa=[]
ELSE
* Строка в квадратных скобках будет добавлена
* к оператору SELECT как значение &Smassa
Smassa=[and gruz.massa==Selectmassa]
* Знак == означает: в точности равно.
* Если поставить просто знак равенства
* Будут найдены все груз, масса которых
* начинаются с введенных символов.
ENDIF

* Объем груза
* Уберем концевые пробелы
Selectobiem=ALLTRIM(Selectobiem)
IF LEN(Selectobiem)=0
Sobiem=[]
ELSE
* Строка в квадратных скобках будет добавлена
* к оператору SELECT как значение &Sobiem
Sobiem=[and gruz.obiem==Selectobiem]
* Знак == означает: в точности равно.
* Если поставить просто знак равенства
* Будут найдены все груз, дата погрузки которых
* начинаются с введенных символов.
ENDIF


* Выполнение запроса
SELECT gruz.idotkydare,region.region,;
gruz.idotkydago,goroda.gorod,;
gruz.idkydare,region.region,;
gruz.idkydago,goroda.gorod,;
gruz.gruznaumen,;
gruz.massa,;
gruz.obiem,;
gruz.idtran,transport.transport,;
gruz.idload,loading.load,;
gruz.ctavka,;
gruz.gotovs,;
gruz.gotovdo,;
gruz.compani,;
gruz.kontakt,;
gruz.telefon,;
gruz.icq,;
gruz.mail;
FROM gruz,region,goroda,transport,loading;
INTO TABLE C:\WINNT\TEMP\cBuilding;
WHERE gruz.idotkydare=region.idreg;
AND gruz.idotkydago=goroda.idgorod;
AND gruz.idkydare=region.idreg;
AND gruz.idkydago=goroda.idgorod;
AND gruz.gruznaumen=gruz.gruznaumen;
AND gruz.massa=gruz.massa;
AND gruz.obiem=gruz.obiem;
AND gruz.idtran=transport.idtran;
AND gruz.idload=loading.idload;
AND gruz.ctavka=gruz.ctavka;
AND gruz.gotovs=gruz.gotovs;
AND gruz.gotovdo=gruz.gotovdo;
&Sidotkydare &Sidotkydago &Sidkydare &Sidkydago &Smassa &Sobiem &Sidtran &Sidload &Sgotovs &Sgotovdo
SELECT cBuilding
* Во временной выборке находится информация по грузам,
* отвечающим условиям составленного запроса.
* Запись содержит полный набор полей из всех таблиц:
*
* Полученную выборку можно конвертировать в Excel, Access и др.
* Без дополнительной обработки
Wait 'Готово!' WINDOW NOWAIT
IF RECCOUNT()=0
=MESSAGEBOX('Груза, отвечающих условиям вашего запроса, '+;
'в базе нет. Повторите запрос, изменив требования.';
,48,'Внимание')
RETURN
ENDIF
* Временная таблица-выборка хранится в файлах
* cBuilding.dbf и cBuilding.fpt в папке C:\WINNT\TEMP
* Запуск формы для работы с грузами
DO FORM rezultgruz
27 апр 10, 21:15    [8698735]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом  [new]
ВладимирМ
Member

Откуда: г. Москва
Сообщений: 7864
gruz.idotkydare=region.idreg AND gruz.idkydare=region.idreg

Вы уверены, что два РАЗНЫХ поля таблицы gruz содержат одно и то же значение?

А зачем вот эти условия совсем не понимаю

AND gruz.gruznaumen=gruz.gruznaumen;
AND gruz.massa=gruz.massa;
AND gruz.obiem=gruz.obiem;
AND gruz.ctavka=gruz.ctavka;
AND gruz.gotovs=gruz.gotovs;
AND gruz.gotovdo=gruz.gotovdo;

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

AND gruz.gruznaumen IS NOT NULL

или

AND IsNull(gruz.gruznaumen) = .F.
27 апр 10, 23:29    [8699271]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом  [new]
tanglir
Member

Откуда:
Сообщений: 28966
Мне кажется, или точно такая же тема была тут совсем недавно?
28 апр 10, 04:57    [8699585]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом  [new]
curys
Member

Откуда:
Сообщений: 80
Посмотрите проект, может вы разберетесь почему во временную таблицу не добовляются результаты поиска?

К сообщению приложен файл (Автодиспетчер.rar - 14Kb) cкачать
29 апр 10, 14:12    [8708532]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом  [new]
curys
Member

Откуда:
Сообщений: 80
помогите пожалалуйста, я уже не знаю что делать, даже мой преподаватель не знает в чем моя ошибка.
30 апр 10, 12:04    [8713907]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом  [new]
прошелмимо
Member [заблокирован]

Откуда: Из Курска понаехал
Сообщений: 10363
curys
помогите пожалалуйста, я уже не знаю что делать, даже мой преподаватель не знает в чем моя ошибка.


преподавателю жирный минус

я от своего просто под стол падал и катался в конвульсиях:
ПК - это сист.блок, монитор и клавиатура.
30 апр 10, 12:18    [8714061]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом  [new]
Ffffffffffffffffffffff
Guest
curys, разбираться в нагромождении вашего кода в запросе нет никакого желания. Хотя бы сделали все с использованием Join
30 апр 10, 12:29    [8714170]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом  [new]
tanglir
Member

Откуда:
Сообщений: 28966
прошелмимо
curys
помогите пожалалуйста, я уже не знаю что делать, даже мой преподаватель не знает в чем моя ошибка.


преподавателю жирный минус

я от своего просто под стол падал и катался в конвульсиях:
ПК - это сист.блок, монитор и клавиатура.
Он был труЪ-линуксойд? Мышку не признавал категорически?
30 апр 10, 12:35    [8714221]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом  [new]
curys
Member

Откуда:
Сообщений: 80
tanglir
прошелмимо
curys
помогите пожалалуйста, я уже не знаю что делать, даже мой преподаватель не знает в чем моя ошибка.


преподавателю жирный минус

я от своего просто под стол падал и катался в конвульсиях:
ПК - это сист.блок, монитор и клавиатура.
Он был труЪ-линуксойд? Мышку не признавал категорически?


А я своего вчера чуть не пребил на месте, стоит и смотрит на меня как баран на новые ворота.
30 апр 10, 12:57    [8714406]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом  [new]
Fffffffffffffff
Guest
Значит, придется самому делать. Возьмите хотя бы конструктор запросов, в нем соедините линиями таблицы и введите условия отбора. Получившийся код перенесите в программу, изменив под свои условия отбора.
30 апр 10, 13:16    [8714566]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом  [new]
прошелмимо
Member [заблокирован]

Откуда: Из Курска понаехал
Сообщений: 10363
curys
tanglir
прошелмимо
curys
помогите пожалалуйста, я уже не знаю что делать, даже мой преподаватель не знает в чем моя ошибка.


преподавателю жирный минус

я от своего просто под стол падал и катался в конвульсиях:
ПК - это сист.блок, монитор и клавиатура.
Он был труЪ-линуксойд? Мышку не признавал категорически?


А я своего вчера чуть не пребил на месте, стоит и смотрит на меня как баран на новые ворота.


ты ихде?

я - в Мск

завтра буду в Курске,
потом - в Белгороде.

поймаешь - попьем пива,
я на пальцах покажу все.
30 апр 10, 13:30    [8714656]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом  [new]
ВладимирМ
Member

Откуда: г. Москва
Сообщений: 7864
curys
помогите пожалалуйста, я уже не знаю что делать, даже мой преподаватель не знает в чем моя ошибка.

Если на рассматривать стиль написания, то у тебя несколько ошибок.

(1.)

Коды "откуда" и "куда" не могут одновременно ссылаться на разные записи одной и той же таблицы. Их надо "развести" по разным таблицам. Для этой цели одну и ту же таблицу открывают дважды. В двух рабочих областях. Получая как бы копию таблицы.

В результате, запрос получится таким

SELECT ;
       gruz.idotkydare, region.region, ;
       gruz.idotkydago, goroda.gorod, ; 
       gruz.idkydare, regKyda.region, ;
       gruz.idkydago, gorKyda.gorod, ; 
       gruz.gruznaumen, ; 
       gruz.massa, ;
       gruz.obiem, ;
       gruz.idtran,transport.transport, ;
       gruz.idload,loading.load, ;
       gruz.ctavka, ;
       gruz.gotovs, ;
       gruz.gotovdo, ;
       gruz.compani, ;
       gruz.kontakt, ;
       gruz.telefon, ;
       gruz.icq, ;
       gruz.mail ;
FROM ;
       gruz, ;
       region, ;
       region regKyda, ;
       goroda, ;
       goroda gorKyda, ;
       transport, ;
       loading ;
INTO TABLE cBuilding;
WHERE gruz.idotkydare=region.idreg;
      AND gruz.idotkydago=goroda.idgorod;
      AND gruz.idkydare=regKyda.idreg;
      AND gruz.idkydago=gorKyda.idgorod;
      AND gruz.idtran=transport.idtran;
      AND gruz.idload=loading.idload;
      &Sidotkydare &Sidotkydago &Sidkydare &Sidkydago &Smassa &Sobiem &Sidtran &Sidload &Sgotovs &Sgotovdo

Т.е. две таблицы region и goroda теперь участвуют в запросе в двух ипостасях: как регион и город "откуда", и еще одна копия - как регион и город "куда"

Ну, тут я еще выбросил бессмысленные условия когда поле ссылается само на себя.

(2.)

Условие объединения таблиц описанным способом предполагает, что для каждой записи таблицы grus существует соответствующая запись таблиц-справочников. Если хотя бы в одном справочнике нет соответствующего кода записи, то запись таблицы grus в выборку не попадет.

В данном случае, проблема с кодами записей таблицы goroda. В ней нет записей с кодом 1 и 2. Как следствие, результат выборки по присланным тестовым данным всегда пустой.

Добавьте в таблицу goroda записи с кодом 1 и 2 или измените в таблице grus значения полей idotkydago и idkydago таким образом, чтобы в них не было кодов 1 и 2
30 апр 10, 17:00    [8716292]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом  [new]
curys
Member

Откуда:
Сообщений: 80
ВладимирМ
curys
помогите пожалалуйста, я уже не знаю что делать, даже мой преподаватель не знает в чем моя ошибка.

Если на рассматривать стиль написания, то у тебя несколько ошибок.

(1.)

Коды "откуда" и "куда" не могут одновременно ссылаться на разные записи одной и той же таблицы. Их надо "развести" по разным таблицам. Для этой цели одну и ту же таблицу открывают дважды. В двух рабочих областях. Получая как бы копию таблицы.

В результате, запрос получится таким

SELECT ;
       gruz.idotkydare, region.region, ;
       gruz.idotkydago, goroda.gorod, ; 
       gruz.idkydare, regKyda.region, ;
       gruz.idkydago, gorKyda.gorod, ; 
       gruz.gruznaumen, ; 
       gruz.massa, ;
       gruz.obiem, ;
       gruz.idtran,transport.transport, ;
       gruz.idload,loading.load, ;
       gruz.ctavka, ;
       gruz.gotovs, ;
       gruz.gotovdo, ;
       gruz.compani, ;
       gruz.kontakt, ;
       gruz.telefon, ;
       gruz.icq, ;
       gruz.mail ;
FROM ;
       gruz, ;
       region, ;
       region regKyda, ;
       goroda, ;
       goroda gorKyda, ;
       transport, ;
       loading ;
INTO TABLE cBuilding;
WHERE gruz.idotkydare=region.idreg;
      AND gruz.idotkydago=goroda.idgorod;
      AND gruz.idkydare=regKyda.idreg;
      AND gruz.idkydago=gorKyda.idgorod;
      AND gruz.idtran=transport.idtran;
      AND gruz.idload=loading.idload;
      &Sidotkydare &Sidotkydago &Sidkydare &Sidkydago &Smassa &Sobiem &Sidtran &Sidload &Sgotovs &Sgotovdo

Т.е. две таблицы region и goroda теперь участвуют в запросе в двух ипостасях: как регион и город "откуда", и еще одна копия - как регион и город "куда"

Ну, тут я еще выбросил бессмысленные условия когда поле ссылается само на себя.

(2.)

Условие объединения таблиц описанным способом предполагает, что для каждой записи таблицы grus существует соответствующая запись таблиц-справочников. Если хотя бы в одном справочнике нет соответствующего кода записи, то запись таблицы grus в выборку не попадет.

В данном случае, проблема с кодами записей таблицы goroda. В ней нет записей с кодом 1 и 2. Как следствие, результат выборки по присланным тестовым данным всегда пустой.

Добавьте в таблицу goroda записи с кодом 1 и 2 или измените в таблице grus значения полей idotkydago и idkydago таким образом, чтобы в них не было кодов 1 и 2


Спасибо большое!:)
30 апр 10, 19:36    [8716842]     Ответить | Цитировать Сообщить модератору
Все форумы / FoxPro, Visual FoxPro Ответить