powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Размернось полей в запросе
22 сообщений из 22, страница 1 из 1
Размернось полей в запросе
    #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
Размернось полей в запросе
    #33268328
Фотография Aleksey-K
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
1. Ну если НИЧЕГО менять в запросе нельзя, какой совет вы хотите получить ?!
2. Какая версия VFP ?
С уважением, Алексей.
...
Рейтинг: 0 / 0
Размернось полей в запросе
    #33268332
Фотография Владимир СА
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
iif(empty(N.TYPE) ,'0' ,N.TYPE)
разная размерность при работе IIF
'0' - один символ, а N.TYPE - 3 символа
iif(empty(N.TYPE) ,'000' ,N.TYPE)
в этом выражении вывод размерности один и тот же.
...
Рейтинг: 0 / 0
Размернось полей в запросе
    #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
Размернось полей в запросе
    #33268461
Jovanny
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Aleksey-K1. Ну если НИЧЕГО менять в запросе нельзя, какой совет вы хотите получить ?!
2. Какая версия VFP ?

1.Всё дело в том, что в других подразделениях этого глюка нет. Значит дело в настройках. Где менять (или искать)?
2. Visual FoxPro 7.0.
...
Рейтинг: 0 / 0
Размернось полей в запросе
    #33268488
AleksMed
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дело не в настройках. Внимательно читай пост ВладимираМ.
...
Рейтинг: 0 / 0
Размернось полей в запросе
    #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
Размернось полей в запросе
    #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
Размернось полей в запросе
    #33268613
Jovanny
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Владимир СА
Происходит связь с другой таблицей через WHERE, а ничего из таблицы SPLAT неберем. Зачем соединяемся с таблицей SPLAT ???

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

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

Aleksey-K2. Какая версия VFP ?
Кстати, проверили и на FoxPro 2.6 for DOS - тот же глюк.
...
Рейтинг: 0 / 0
Размернось полей в запросе
    #33268694
Фотография Владимир СА
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Тогда в запрос поставьте как предлагал ВладимирМ :
iif(empty(N.TYPE) ,PADR('0',LEN(N.TYPE)),N.TYPE) as TYPE1
и сообщите результат.
...
Рейтинг: 0 / 0
Размернось полей в запросе
    #33268758
Фотография Aleksey-K
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я в таком случае поступаю сл. образом:
1. Создаю курсор с требуемой структурой (CREATE CURSOR ...)
2. Результат запроса сохраняю к этом курсоре
INSERT MyCursor (...)
SELECT N.KOD , ....
В этом случае тип поля TYPE_B можно задать корректно заранее.
С уважением, Алексей.
...
Рейтинг: 0 / 0
Размернось полей в запросе
    #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
Размернось полей в запросе
    #33268957
Jovanny
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Владимир САТогда в запрос поставьте как предлагал ВладимирМ :
iif(empty(N.TYPE) ,PADR('0',LEN(N.TYPE)),N.TYPE) as TYPE1
и сообщите результат.
Это сработало.
Но я повторяю, что ничего менять в ПО мы не можем. Можем дать только
предложения.
Обнаружили ещё одну интересную вещь - всё зависит от значений поля KOD - для некоторых значений работает нормально, а для некоторых нет. Т.е. если оставить в таблице OBJECT значения с одним конкретным значением KOD, то для одних значений возвращает нормально, а для других глючит. Причём другие строки должны быть не просто удалены, но и выполнен PACK.
Интересно...
Будем искать...
...
Рейтинг: 0 / 0
Размернось полей в запросе
    #33268982
Фотография Владимир СА
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да будет с Вами удача!!!
...
Рейтинг: 0 / 0
Размернось полей в запросе
    #33269412
Jovanny
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Наконец-то нашли что-то конкретное - работает нормально, если число записей в OBJECT не превышает 653.
Подскажите кто-нибудь - это решаемо?
...
Рейтинг: 0 / 0
Размернось полей в запросе
    #33269511
Фотография Владимир СА
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
JovannyНаконец-то нашли что-то конкретное - работает нормально, если число записей в OBJECT не превышает 653.
Подскажите кто-нибудь - это решаемо?
Обе таблицы сархивируй и направь на Email: vlad@tec14.permenergo.ru
Посмотрим.
...
Рейтинг: 0 / 0
Размернось полей в запросе
    #33270078
Komissar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Хм... Где-то я эти названия полей уже видел... Уж не налоговая ли инспекция? ;-)
Если ДА, то КОМУ Вы направляете предложения? Буду дико удивлен, если Вы назовете имя "Владимир Иванович"!!!
...
Рейтинг: 0 / 0
Размернось полей в запросе
    #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
Размернось полей в запросе
    #33270163
Igor Korolyov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Hi Jovanny!

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

Posted via ActualForum NNTP Server 1.3
...
Рейтинг: 0 / 0
Размернось полей в запросе
    #33270848
Jovanny
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
KomissarХм... Где-то я эти названия полей уже видел... Уж не налоговая ли инспекция? ;-)
Гениально, Холмс! Как Вы догадались?
Komissar
Если ДА, то КОМУ Вы направляете предложения? Буду дико удивлен, если Вы назовете имя "Владимир Иванович"!!!
Нет, не ему!
...
Рейтинг: 0 / 0
Размернось полей в запросе
    #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
Размернось полей в запросе
    #33272363
Igor Korolyov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Hi Jovanny!

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

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


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