Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Размернось полей в запросе / 22 сообщений из 22, страница 1 из 1
14.09.2005, 11:32:00
    #33268300
Jovanny
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Размернось полей в запросе
Добрый день! Подскажите, плиз, как бороться с таким глюком.
Следующий запрос
Код: plaintext
1.
2.
SELECT N.KOD , N.TYPE, iif(empty(N.TYPE) ,'0' ,N.TYPE) TYPE;
     FROM OBJECT N
выдаёт
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
Record#  KOD        TYPE_A TYPE_B
       1    01072817     247      247    
       2    01072817     247      247    
       3    01072817     247      247    
       4    01072817     573      573    
       5    01412791     325      325    
       6    01412791     325      325    
       7    01412791     573      573    
Всё хорошо!
Но если просто добавить связь с другой таблицей (её поля для краткости не отображаем), то получаем
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
    
SELECT N.KOD , N.TYPE, iif(empty(N.TYPE) ,'0' ,N.TYPE) TYPE;
     FROM OBJECT N, SPLAT S;
     WHERE N.KOD=S.KOD

Record#  KOD        TYPE_A TYPE_B
       1    01072817     247      2      
       2    01072817     247      2      
       3    01072817     247      2      
       4    01072817     573      5      
       5    01412791     325      3      
       6    01412791     325      3      
       7    01412791     573      5      
       8    01412791     321      3      

Конечно, если поставить iif(empty(N.TYPE) ,'000' ,N.TYPE), то всё будет хорошо. Но прикол в том, что: 1) это готовое ПО и менять ничего нельзя;
2) в других подразделениях этого глюка нет.

Подскажите, можно ли устранить этот глюк изменением каких-нибудь настроек?
...
Рейтинг: 0 / 0
14.09.2005, 11:38:13
    #33268328
Aleksey-K
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Размернось полей в запросе
1. Ну если НИЧЕГО менять в запросе нельзя, какой совет вы хотите получить ?!
2. Какая версия VFP ?
С уважением, Алексей.
...
Рейтинг: 0 / 0
14.09.2005, 11:38:50
    #33268332
Владимир СА
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Размернось полей в запросе
iif(empty(N.TYPE) ,'0' ,N.TYPE)
разная размерность при работе IIF
'0' - один символ, а N.TYPE - 3 символа
iif(empty(N.TYPE) ,'000' ,N.TYPE)
в этом выражении вывод размерности один и тот же.
...
Рейтинг: 0 / 0
14.09.2005, 11:46:56
    #33268373
ВладимирМ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Размернось полей в запросе
Jovanny
Подскажите, можно ли устранить этот глюк изменением каких-нибудь настроек?
Нет. Нельзя.

Дело в том, что команда Select-SQL ДО того, как собственно начать выполнение запроса формирует структуру итоговой выборки. Ведь результат должен так или иначе попасть в таблицу, а таблица должна иметь структуру.

Вот сначала и происходит вычисление типа и размерностей полей по первым попавшимся записям таблиц-источников.

Если первой попалась запись у которой empty(N.TYPE)=.T., то значение поля будет '0', т.е. C(1). Если же первой попалась запись у которой empty(N.TYPE)=.F., то значение поля будет N.TYPE и размерность будет равна размерности поля N.TYPE.

Без изменения собственно самой команды Select-SQL эту ошибку не исправишь. Надо написать примерно так:

iif(empty(N.TYPE) ,PADR('0',LEN(N.TYPE)),N.TYPE)

Ну, или в том подразделении где есть глюк придется как-то физически перестроить таблицы, так, чтобы первой попадалась запись у которой empty(N.TYPE)=.F. Но это временная мера и без гарантий, что в будущем у другого подразделения опять проявиться тот же глюк.
...
Рейтинг: 0 / 0
14.09.2005, 12:03:27
    #33268461
Jovanny
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Размернось полей в запросе
Aleksey-K1. Ну если НИЧЕГО менять в запросе нельзя, какой совет вы хотите получить ?!
2. Какая версия VFP ?

1.Всё дело в том, что в других подразделениях этого глюка нет. Значит дело в настройках. Где менять (или искать)?
2. Visual FoxPro 7.0.
...
Рейтинг: 0 / 0
14.09.2005, 12:08:24
    #33268488
AleksMed
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Размернось полей в запросе
Дело не в настройках. Внимательно читай пост ВладимираМ.
...
Рейтинг: 0 / 0
14.09.2005, 12:11:07
    #33268508
Jovanny
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Размернось полей в запросе
ВладимирМ
Если первой попалась запись у которой empty(N.TYPE)=.T., то значение поля будет '0', т.е. C(1). Если же первой попалась запись у которой empty(N.TYPE)=.F., то значение поля будет N.TYPE и размерность будет равна размерности поля N.TYPE.
...
Ну, или в том подразделении где есть глюк придется как-то физически перестроить таблицы, так, чтобы первой попадалась запись у которой empty(N.TYPE)=.F. Но это временная мера и без гарантий, что в будущем у другого подразделения опять проявиться тот же глюк.

Оставил все записи с empty(N.TYPE)=.F. и все N.TYPE со значениями C(3). Результат тот же.
Обращаю внимание - глюк появляется, когда есть связь с другой таблицей.
...
Рейтинг: 0 / 0
14.09.2005, 12:21:11
    #33268549
Владимир СА
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Размернось полей в запросе
JovannyОбращаю внимание - глюк появляется, когда есть связь с другой таблицей.
1. Вообще-то для меня непонятно в запросе:
Код: plaintext
1.
2.
SELECT N.KOD , N.TYPE, iif(empty(N.TYPE) ,'0' ,N.TYPE) TYPE;
     FROM OBJECT N, SPLAT S;
     WHERE N.KOD=S.KOD
Происходит связь с другой таблицей через WHERE, а ничего из таблицы SPLAT неберем. Зачем соединяемся с таблицей SPLAT ???
2. Перечислите поля таблицы SPLAT и их размерности.
...
Рейтинг: 0 / 0
14.09.2005, 12:39:05
    #33268613
Jovanny
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Размернось полей в запросе
Владимир СА
Происходит связь с другой таблицей через WHERE, а ничего из таблицы SPLAT неберем. Зачем соединяемся с таблицей SPLAT ???

Я указывал, что поля SPLAT для краткости не отображаем. Если нравиться, можно добавить в запрос поле SPLAT.NAME C(60).
Владимир СА
2. Перечислите поля таблицы SPLAT и их размерности.

Их довольно много, но поля TYPE там нет, если Вы это имели ввиду.

Aleksey-K2. Какая версия VFP ?
Кстати, проверили и на FoxPro 2.6 for DOS - тот же глюк.
...
Рейтинг: 0 / 0
14.09.2005, 12:55:25
    #33268694
Владимир СА
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Размернось полей в запросе
Тогда в запрос поставьте как предлагал ВладимирМ :
iif(empty(N.TYPE) ,PADR('0',LEN(N.TYPE)),N.TYPE) as TYPE1
и сообщите результат.
...
Рейтинг: 0 / 0
14.09.2005, 13:08:42
    #33268758
Aleksey-K
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Размернось полей в запросе
Я в таком случае поступаю сл. образом:
1. Создаю курсор с требуемой структурой (CREATE CURSOR ...)
2. Результат запроса сохраняю к этом курсоре
INSERT MyCursor (...)
SELECT N.KOD , ....
В этом случае тип поля TYPE_B можно задать корректно заранее.
С уважением, Алексей.
...
Рейтинг: 0 / 0
14.09.2005, 14:02:24
    #33268953
Maltsev Max
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Размернось полей в запросе
Jovanny ВладимирМ
Если первой попалась запись у которой empty(N.TYPE)=.T., то значение поля будет '0', т.е. C(1). Если же первой попалась запись у которой empty(N.TYPE)=.F., то значение поля будет N.TYPE и размерность будет равна размерности поля N.TYPE.
...
Ну, или в том подразделении где есть глюк придется как-то физически перестроить таблицы, так, чтобы первой попадалась запись у которой empty(N.TYPE)=.F. Но это временная мера и без гарантий, что в будущем у другого подразделения опять проявиться тот же глюк.

Оставил все записи с empty(N.TYPE)=.F. и все N.TYPE со значениями C(3). Результат тот же.
Обращаю внимание - глюк появляется, когда есть связь с другой таблицей.

Основываясь на разъеснениях ВладимирМ, могу предположить, что первые строки OBJECT по коду не соответствуют первым строкам SPLAT, по этому при формировании структуры по первым строкам выборки empty(N.TYPE) возвращает .F.
...
Рейтинг: 0 / 0
14.09.2005, 14:03:08
    #33268957
Jovanny
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Размернось полей в запросе
Владимир САТогда в запрос поставьте как предлагал ВладимирМ :
iif(empty(N.TYPE) ,PADR('0',LEN(N.TYPE)),N.TYPE) as TYPE1
и сообщите результат.
Это сработало.
Но я повторяю, что ничего менять в ПО мы не можем. Можем дать только
предложения.
Обнаружили ещё одну интересную вещь - всё зависит от значений поля KOD - для некоторых значений работает нормально, а для некоторых нет. Т.е. если оставить в таблице OBJECT значения с одним конкретным значением KOD, то для одних значений возвращает нормально, а для других глючит. Причём другие строки должны быть не просто удалены, но и выполнен PACK.
Интересно...
Будем искать...
...
Рейтинг: 0 / 0
14.09.2005, 14:08:46
    #33268982
Владимир СА
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Размернось полей в запросе
Да будет с Вами удача!!!
...
Рейтинг: 0 / 0
14.09.2005, 15:53:34
    #33269412
Jovanny
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Размернось полей в запросе
Наконец-то нашли что-то конкретное - работает нормально, если число записей в OBJECT не превышает 653.
Подскажите кто-нибудь - это решаемо?
...
Рейтинг: 0 / 0
14.09.2005, 16:24:58
    #33269511
Владимир СА
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Размернось полей в запросе
JovannyНаконец-то нашли что-то конкретное - работает нормально, если число записей в OBJECT не превышает 653.
Подскажите кто-нибудь - это решаемо?
Обе таблицы сархивируй и направь на Email: vlad@tec14.permenergo.ru
Посмотрим.
...
Рейтинг: 0 / 0
14.09.2005, 22:52:43
    #33270078
Komissar
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Размернось полей в запросе
Хм... Где-то я эти названия полей уже видел... Уж не налоговая ли инспекция? ;-)
Если ДА, то КОМУ Вы направляете предложения? Буду дико удивлен, если Вы назовете имя "Владимир Иванович"!!!
...
Рейтинг: 0 / 0
14.09.2005, 23:07:50
    #33270090
ВладимирМ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Размернось полей в запросе
JovannyНаконец-то нашли что-то конкретное - работает нормально, если число записей в OBJECT не превышает 653.
Подскажите кто-нибудь - это решаемо?
Да при чем здесь количество полей. Вот примерчик

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
create cursor cur1 (kod I, cType C( 3 ))
insert into cur1 (kod, cType) values ( 1 , '123')
insert into cur1 (kod, cType) values ( 2 , '456')
insert into cur1 (kod, cType) values ( 2 , '789')

create cursor cur2 (kod I)
insert into cur2 values ( 1 )
insert into cur2 values ( 2 )

* Запрос по одной таблице
select cur1.kod, cur1.cType, iif(empty(cur1.cType),'0',cur1.cType) as cType ;
from cur1

* Запрос по  2  таблицам
select cur1.kod, cur1.cType, iif(empty(cur1.cType),'0',cur1.cType) as cType ;
from cur1,cur2 ;
where cur1.kod=cur2.kod

Получим описанный эффект. Как исправить не меняя сам запрос? Ну, в данном конкретном случае, надо уйти от связи вида один-ко-многим. Т.е. не должно быть ситуации, когда одной записи из таблицы cur1 соответсвует несколько записей из таблицы cur2. Но это частное решение и без каких-либо гарантий.

Т.е. весь вопрос в том, какие именно записи будут использованы командой Select-SQL для формировании структуры таблицы.

Да, я это все делал в VFP6SP5
...
Рейтинг: 0 / 0
15.09.2005, 03:43:06
    #33270163
Igor Korolyov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Размернось полей в запросе
Hi Jovanny!

Простой совет - прими это как ДАННОСТЬ - так писать НЕЛЬЗЯ. В более свежих
версиях фокса вместо "000" можно использовать функцию CAST().
Рассказывать тебе про особенности работы оптимизатора при выполнении
многотабличных запросов, про особенности определения размерностей таких
"плавающих" полей думаю не стоит - ты всё равно объяснения не читаешь...

Posted via ActualForum NNTP Server 1.3
...
Рейтинг: 0 / 0
15.09.2005, 12:14:25
    #33270848
Jovanny
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Размернось полей в запросе
KomissarХм... Где-то я эти названия полей уже видел... Уж не налоговая ли инспекция? ;-)
Гениально, Холмс! Как Вы догадались?
Komissar
Если ДА, то КОМУ Вы направляете предложения? Буду дико удивлен, если Вы назовете имя "Владимир Иванович"!!!
Нет, не ему!
...
Рейтинг: 0 / 0
15.09.2005, 12:42:53
    #33270994
Jovanny
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Размернось полей в запросе
ВладимирМДа при чем здесь количество полей.
Не полей - записей .
Этот вопрос снимается - попробовали на таблицах с меньшим числом полей - этот эффект стал проявляться на количестве записей около 350. Проанализировать не было времени, но скорей всего зависит от количества уникальных значений поля OBJECT.KOD.
ВладимирМ
Получим описанный эффект. Как исправить не меняя сам запрос? Ну, в данном конкретном случае, надо уйти от связи вида один-ко-многим. Т.е. не должно быть ситуации, когда одной записи из таблицы cur1 соответсвует несколько записей из таблицы cur2. Но это частное решение и без каких-либо гарантий.
Т.е. весь вопрос в том, какие именно записи будут использованы командой Select-SQL для формировании структуры таблицы.

От связи один-ко-многим тут не уйти...
Вообще-то интересно, когда результат запроса зависит от порядка записей в таблице.
Ладно, давайте закончим этот топик.

И самое интересное в конце - оцените глубину мысли разработчика:
в полном тексте запроса в предикате WHERE стоит and !empty(n.type).
Т.е. примерно так
SELECT N.KOD , N.TYPE, iif(empty(N.TYPE) ,'0' ,N.TYPE) TYPE;
FROM OBJECT N, SPLAT S;
WHERE N.KOD=S.KOD and !empty(n.type)
.
Ну, в общем, спасибо всем за обсуждение!
...
Рейтинг: 0 / 0
16.09.2005, 03:39:44
    #33272363
Igor Korolyov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Размернось полей в запросе
Hi Jovanny!

Я вообще не понимаю - если программа не ваша, то чего беспокоится то?
Банально сообщаете автору что "не работает" и всё! Это его проблемы - надо
учится нормально писать :)

Posted via ActualForum NNTP Server 1.3
...
Рейтинг: 0 / 0
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Размернось полей в запросе / 22 сообщений из 22, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]