:: Visual Foxpro, Foxpro for DOS
where в команде select sql
glaz58
Автор

Сообщений: 812
Откуда: Воронеж
Дата регистрации: 09.02.2008
Уважаемые знатоки! в нижеприведённой команде
Select smetarab->nrazd, Min(razdel->naimrazd) As naimrazd, Sum(Round(smetarab->osn_zarp*rccs->indzarp*kolvo,cop)) As sum_osn_zarp, Sum(Round(smetarab->expl_mech*rccs->indmech*kolvo,cop)) As sum_mech, Sum(Round(smetarab->zarp_mech*rccs->indzarp*kolvo,cop)) As sum_zarp_mech, Sum(Round(smetarab->mtrls*rccs->indmtrls*kolvo,cop)) As sum_mtrls,;
sum(Round(smetarab->trud_OSN*kolvo*(1+razdel->procnachis/100),2)+Round(smetarab->trud_MEH*kolvo*(1+razdel->procnachis/100),2)) As sum_trud,;
sum(Round(smetarab->trud_OSN*kolvo*(1+razdel->procnachis/100),2)) As sum_trud_osn,;
sum(Round(smetarab->trud_MEH*kolvo*(1+razdel->procnachis/100),2)) As sum_trud_meh,;
sum(Round(smetarab->osn_zarp*rccs->indzarp*kolvo,cop)+Round(smetarab->expl_mech*rccs->indmech*kolvo,cop)+Round(smetarab->mtrls*rccs->indmtrls*kolvo,cop)) As sum_prz,;
sum(Round(gesnnaim->procnakl/100*Round(smetarab->osn_zarp*rccs->indzarp*kolvo,cop)+Round(smetarab->zarp_mech*rccs->indzarp*kolvo,cop),cop)) As sum_nakl,;
MIN(smetarab->procnakl) As procnakl,;
sum(Round(razdel->procsmpr/100*Round(smetarab->osn_zarp*rccs->indzarp*kolvo,cop)+Round(smetarab->zarp_mech*rccs->indzarp*kolvo,cop),cop)) As sum_smpr,;
MIN(smetarab->procsmpr) As procsmpr,;
sum(Round(razdel->procwrem/100*(Round(smetarab->osn_zarp*rccs->indzarp*kolvo,cop)+Round(smetarab->expl_mech*rccs->indmech*kolvo,cop)+Round(smetarab->mtrls*rccs->indmtrls*kolvo,cop)+Round(nr*kolvo,cop)+Round(smpr*kolvo,cop)),cop)) As sum_wrem,;
sum(Round(razdel->proczim/100*(Round(smetarab->osn_zarp*rccs->indzarp*kolvo,cop)+Round(smetarab->expl_mech*rccs->indmech*kolvo,cop)+Round(smetarab->mtrls*rccs->indmtrls*kolvo,cop)+Round(nr*kolvo,cop)+Round(smpr*kolvo,cop)+Round(wrem*kolvo,cop)),cop)) As sum_zim,;
sum(Round(razdel->procproch/100*(Round(smetarab->osn_zarp*rccs->indzarp*kolvo,cop)+Round(smetarab->expl_mech*rccs->indmech*kolvo,cop)+Round(smetarab->mtrls*rccs->indmtrls*kolvo,cop)+Round(nr*kolvo,cop)+Round(smpr*kolvo,cop)+Round(wrem*kolvo,cop)+Round(zim*kolvo,cop)),cop)) As sum_proch,;
sum(Round(razdel->procnepr/100*(Round(smetarab->osn_zarp*rccs->indzarp*kolvo,cop)+Round(smetarab->expl_mech*rccs->indmech*kolvo,cop)+Round(smetarab->mtrls*rccs->indmtrls*kolvo,cop)+Round(nr*kolvo,cop)+Round(smpr*kolvo,cop)+Round(wrem*kolvo,cop)+Round(zim*kolvo,cop)+Round(proch*kolvo,cop)),cop)) As sum_nepr;
from smetarab, razdel, rccs, gesnnaim Into Cursor qurazd Where smetarab->nrazd=razdel->nrazd And smetarab->shifr=gesnnaim->shifr AND smetarab->index!=1 Group By smetarab->nrazd Order By smetarab->nrazd
добавляю условие в Where не включать в суммирование строки, где поле smetarab->index=1(выделено красным). Но оно не работает, строки всё равно включаются в суммирование. В чём моя ошибка?
Ratings: 0 negative/0 positive
Re: where в команде select sql
Simple777

Сообщений: 33855
Дата регистрации: 05.11.2006
Если речь идет об "обычном" логическом отрицании, то надо вроде так записывать условие:

AND !smetarab->index=1
Ratings: 0 negative/0 positive
Re: where в команде select sql
dimag

Сообщений: 464
Откуда: Одинцово
Дата регистрации: 17.12.2002
smetarab->index !=1
Мне думается пробела не хватает...


------------------
Глупость - это не отсутствие ума, это такой ум.
Ratings: 0 negative/0 positive
Re: where в команде select sql
Igor Korolyov

Сообщений: 34580
Дата регистрации: 28.05.2002
Для начала проверить без суммирования и без дополнительных таблиц (просто все поля из smetarab вывести). Может быть индекс по этому полю испорчен...

кроме того тут декартово произведение таблиц фигурирует (таблица rccs никак не "связана" с другими - соответственно перед суммированием данные будут "дублироваться" столько раз, сколько записей в этой таблице) - это тоже надо иметь в виду.

Simple777
AND !smetarab->index=1
Без разницы для числовых данных. Так же как и писать != <> или # в качестве оператора "не равно".

dimag
Мне думается пробела не хватает...
В VFP он не нужен, если речь про FPD или ещё что-то древнее - хз, но автор этого не указал.


------------------
WBR, Igor
Ratings: 0 negative/0 positive
Re: where в команде select sql
glaz58
Автор

Сообщений: 812
Откуда: Воронеж
Дата регистрации: 09.02.2008
Работаю на VFP9 SP2. Таблица rccs однострочная. Индекс smetarab не испорчен, строк в ней немного, заполняется ручным набором (составление смет на строительство или ремонт). До добавления поля Index всё работало нормально, теперь в связи с новой методикой нужно обработать таблицу smetarab таким образом, чтобы строки, где Index=1 не включались в суммирование. (Index=1 - это текущие цены, а там где Index!=1 - это цены 2000-го года, они переводятся в текущие умножением на соответствующие индексы)
Ratings: 0 negative/0 positive
Re: where в команде select sql
Simple777

Сообщений: 33855
Дата регистрации: 05.11.2006
Вроде как INDEX - зарезервированное слово. Не может ли это как-то влиять на работу SQL-запроса? Собственно, это легко можно проверить, переименовав поле INDEX.
Ratings: 0 negative/0 positive
Re: where в команде select sql
akvvohinc

Сообщений: 4224
Откуда: Москва
Дата регистрации: 11.11.2008
Цитата:
Вроде как INDEX - зарезервированное слово.

Думается, что у Фокса нет зарегистрированных слов.
Если INDEX будет написано там, где синтаксис ждет эту опцию, то воспримет её как опцию.
В других случаях будет искать переменную, алиас, имя файла и т.п. с таким именем.

Скажем,
USE INDEX
откроет таблицу с именем Index, если она существует.
Ratings: 0 negative/0 positive
Re: where в команде select sql
Simple777

Сообщений: 33855
Дата регистрации: 05.11.2006
Ну... Это как сказать.

Сейчас уже не помню, в какой версии FPD это было.

Сдали нам разработчики АРМ с исходниками. Сопровождать со стороны эксплуатации пришлось мне. Вдруг оказалось, что иногда АРМ буквально "вылетает" без каких-либо сообщений.
При просмотре модуля ничего этакого не видно. Всё "чисто и прозрачно". Тогда воспользовался отладчиком, который тоже ничего не показывал. Всё работает.
Случайно удалось в режиме отладчика попасть на ветку, где было такое присвоение (типа признак того, что "чего-то не хватает" в исходных данных)

proc=0

И вот на этой строке происходил мгновенный вылет из АРМа.

Видимо, такая вот строка приводила к "обнулению" всех программ из памяти. Что-то типа CLEAR PROGRAM.

Где-то в Help писали, что нельзя использовать зарезервированные слова, так как это может приводить к неожиданным результатам.



Исправлено 2 раз(а). Последнее : Simple777, 19.10.21 11:30
Ratings: 0 negative/0 positive
Re: where в команде select sql
glaz58
Автор

Сообщений: 812
Откуда: Воронеж
Дата регистрации: 09.02.2008
Спасибо за внимание к моему топику. У меня не вылетает, но почему-то включает в суммирование, несмотря на то, что указано:
where ... index!=1
. Пытаюсь сделать по-другому. В репорте detail band из двух частей: detail1 и detail2. Когда поле из detail2 выношу в footer раздела с указанием суммировать по разделу, суммируется с удвоением. Как бы убрать такое удвоение?


Исправлено 1 раз(а). Последнее : glaz58, 19.10.21 11:40
Ratings: 0 negative/0 positive
Re: where в команде select sql
Simple777

Сообщений: 33855
Дата регистрации: 05.11.2006
Можно "для отладочных целей" максимально упростить SQL-запрос с тем, чтобы "локализовать проблему" и выяснить, в каком именно месте происходит глюк. Иногда такой метод срабатывает. После выявления "места проблемы" можно попытаться возникшую проблему обойти тем или иным способом.

То есть перед вызовом реального SQL-запроса попробовать вызовы более простых запросов. Там, типа, просуммировать только одно поле по одному условию. Чтобы корректно отработал запрос. Потом постепенно усложнять запрос. Так можно будет выяснить, "где собака зарыта".
Ratings: 0 negative/0 positive
Re: where в команде select sql
pasha_usue

Сообщений: 3650
Откуда: Е-бург
Дата регистрации: 06.10.2006
glaz58
Спасибо за внимание к моему топику. У меня не вылетает, но почему-то включает в суммирование, несмотря на то, что указано:
where ... index!=1
. Пытаюсь сделать по-другому. В репорте detail band из двух частей: detail1 и detail2. Когда поле из detail2 выношу в footer раздела с указанием суммировать по разделу, суммируется с удвоением. Как бы убрать такое удвоение?
В rccs сколько записей?
Ratings: 0 negative/0 positive
Re: where в команде select sql
akvvohinc

Сообщений: 4224
Откуда: Москва
Дата регистрации: 11.11.2008
Simple777
Сейчас уже не помню, в какой версии FPD это было.

Ни в какой не было - я прошел почти все (если не все) версии Фокса, начиная с FoxBase+ 1988 года.
И команду USE INDEX можно было писать уже тогда.

Цитата:
Где-то в Help писали, что нельзя использовать зарезервированные слова, так как это может приводить к неожиданным результатам.

Да, список Reserved Words приводится (или приводился) в Help, но о запрете использования таких слов ничего не писали - предупреждали, что это может приводить к ошибкам синтаксиса.

Я не могу с ходу придумать команду, которая выдаст синтаксическую ошибку при использовании зарезервированных слов в другом качестве, но в любом случае, примеры показывают, что о запрете речь не идет, и если уж компилятор справился со своей задачей (как в случае ТС), то далее всё будет Ok.
Ratings: 0 negative/0 positive
Re: where в команде select sql
Simple777

Сообщений: 33855
Дата регистрации: 05.11.2006
Про USE INDEX я ничего и не говорил. А вот случай с proc=0 с последующим вылетом реальный. Это я хорошо запомнил. настолько это было удивительно.

Вообще говоря, есть некоторые "понятия" о том, "что такое хорошо", и "что такое плохо". Использование зарезервированных слов для имен таблиц и переменных вряд ли комильфо.

Во всяком случае после proc=0 я никогда не использую зарезервированные слова не по прямому их назначению. Впрочем, если кому-то это годно, то пусть использует, конечно. [sm128]
Ratings: 0 negative/0 positive
Re: where в команде select sql
akvvohinc

Сообщений: 4224
Откуда: Москва
Дата регистрации: 11.11.2008
Цитата:
А вот случай с proc=0 с последующим вылетом реальный. Это я хорошо запомнил. настолько это было удивительно.

Если такой случай и был, то очевидно, что не из-за использования слова proc.

Ещё раз уточню, что проблема, если она и есть (была), может касаться только компиляции (ошибка синтаксиса).
В рантайме никаких "зарезервированных слов" уже нет (о макро не говорю, так как это та же компиляция), и если компилятор оформил твой proc как переменную, то "вылет" никак не связан с тем, что proc - сокращение от PROCEDURE.

Впрочем, если ты ведёшь речь о чем-то из разряда НЛО, барабашек, создания вечного двигателя и т.п., то конечно - чем черт не шутит - тогда лучше такие слова не использовать.

Цитата:
Использование зарезервированных слов для имен таблиц и переменных вряд ли комильфо.

Ну, это уже немного другой вопрос.



Исправлено 1 раз(а). Последнее : akvvohinc, 19.10.21 16:49
Ratings: 0 negative/0 positive
Re: where в команде select sql
akvvohinc

Сообщений: 4224
Откуда: Москва
Дата регистрации: 11.11.2008
Кстати, вот что такое "глюк" Фокса (правда, у меня предпоследний релиз VFP):
CREATE CURSOR curs1 (field1 C(4))
INDEX ON STR(CTOBIN(field1)) TAG tag1
INSERT INTO curs1 VALUES (BINTOC(1))

У кого-нибудь этот код работает?

А такой?
CREATE CURSOR curs1 (field1 C(4))
INSERT INTO curs1 VALUES (BINTOC(1))
INDEX ON STR(CTOBIN(field1)) TAG tag1



Исправлено 1 раз(а). Последнее : akvvohinc, 19.10.21 17:05
Ratings: 0 negative/0 positive
Re: where в команде select sql
glaz58
Автор

Сообщений: 812
Откуда: Воронеж
Дата регистрации: 09.02.2008
Одна строка.
Ratings: 0 negative/0 positive
Re: where в команде select sql
Chemberzhy

Сообщений: 13142
Откуда: Измаил
Дата регистрации: 28.04.2009
where (smetarab->nrazd=razdel->nrazd And smetarab->shifr=gesnnaim->shifr) AND smetarab->index!=1


------------------
Что-то с памятью моей стало, всё что было не со мной- помню.
Ratings: 0 negative/0 positive
Re: where в команде select sql
Равиль

Сообщений: 6555
Откуда: Уфа
Дата регистрации: 01.08.2003
akvvohinc
Кстати, вот что такое "глюк" Фокса (правда, у меня предпоследний релиз VFP):
CREATE CURSOR curs1 (field1 C(4))
INDEX ON STR(CTOBIN(field1)) TAG tag1
INSERT INTO curs1 VALUES (BINTOC(1))

У кого-нибудь этот код работает?

А такой?
CREATE CURSOR curs1 (field1 C(4))
INSERT INTO curs1 VALUES (BINTOC(1))
INDEX ON STR(CTOBIN(field1)) TAG tag1

VFPA :
1) Первый - нет - ошибка :

[attachment 35876 1.png]

2) Второй - да, работает

Уи-Уи-Уи (сирена) - Первый госпитализируется в лечебницу Чена


------------------
Тяжело согнать курсором муху с монитора ...
Ratings: 0 negative/0 positive
Re: where в команде select sql
glaz58
Автор

Сообщений: 812
Откуда: Воронеж
Дата регистрации: 09.02.2008
Спасибо, что попытались помочь, но результат тот же, что со скобками, что без скобок. Упорно включает в суммирование строки, где Index=1. Придётся делать перенос поля из detail в Group footer calculate - Sum и делить на 2. Делить на 2 - потому что при переносе поля из Detail, которых 2 - Detail1 и Detail2 при суммировании в Group Footer результат удваивает.



Исправлено 2 раз(а). Последнее : glaz58, 19.10.21 20:01
Ratings: 0 negative/0 positive
Re: where в команде select sql
Igor Korolyov

Сообщений: 34580
Дата регистрации: 28.05.2002
akvvohinc
Кстати, вот что такое "глюк" Фокса (правда, у меня предпоследний релиз VFP)

Ничего удивительного - если делать индексные ключи "неопределённого" размера, то рано или поздно получим эту ошибку. В хелпе есть целый раздел посвящённый всяким нюансам создания индексных выражений - но и он не может покрыть всех возможных случаев. Впрочем, там явно сказано
Цитата:
When Visual FoxPro creates an index, it evaluates fields in the first record in the table. Therefore, if the index expression is a substring of an empty memo field, a zero-length index key is created.

To prevent creating a zero-length index key if a field is empty, it might be necessary to enter some temporary data in the field of the first record.

Тут речь будет не про ключ нулевого размера, но про ключ "неправильного" (недостаточного) размера.

CREATE CURSOR curs1 (field1 c(4))
? STR(CTOBIN(field1))
? STR(CTOBIN(field1),11)

ну или соответственно
CREATE CURSOR curs1 (field1 c(4))
INDEX ON STR(CTOBIN(field1)) TAG tag1
INSERT INTO curs1 VALUES (BINTOC(-1234567890))
APPEND BLANK && тоже "допустимо"


------------------
WBR, Igor
Ratings: 0 negative/0 positive


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

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

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