Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / не получается изменить поле в конструкции SCAN / 23 сообщений из 23, страница 1 из 1
14.02.2005, 13:16
    #32914303
alex_dch
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
не получается изменить поле в конструкции SCAN
Здравствуйте!

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

я пробовал несколько вариантов, ничего не получается (они в коментах)


select e1.artikul, ;
e1.name_nom, ;
e1.tov_color, ;
e1.tov_size, ;
0000 as print_pos, ;
recno() as rec_no ;
from aden_end1 e1 ;
into dbf c:\aden_end2


select aden_end2
go top

pos = 0

scan

DO CASE
CASE rec_no = pos + 1
repl print_pos with 1 for rec_no = pos + 1
CASE rec_no = pos + 2
repl print_pos with 2 for rec_no = pos + 2
CASE rec_no = pos + 3
repl print_pos with 3 for rec_no = pos + 3
ENDCASE


*!* DO CASE
*!* CASE rec_no = pos + 1
*!* update aden_end2 set print_pos = 1 where rec_no = pos + 1
*!* CASE rec_no = pos + 2
*!* update aden_end2 set print_pos = 2 where rec_no = pos + 2
*!* CASE rec_no = pos + 3
*!* update aden_end2 set print_pos = 3 where rec_no = pos + 3
*!* ENDCASE


*!* if rec_no = pos + 3
*!* update aden_end2 set print_pos = 1 where rec_no = pos + 1
*!* endif

*!* if rec_no = pos + 2
*!* update aden_end2 set print_pos = 2 where rec_no = pos + 1
*!* endif

*!* if rec_no = pos + 3
*!* update aden_end2 set print_pos = 3 where rec_no = pos + 1
*!* endif

pos = pos + 3

endscan


табличку с образцами данных прилагаю
...
Рейтинг: 0 / 0
14.02.2005, 13:22
    #32914319
AleksMed
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
не получается изменить поле в конструкции SCAN
А где же у тебя rec_no меняется?
...
Рейтинг: 0 / 0
14.02.2005, 13:28
    #32914337
alex_dch
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
не получается изменить поле в конструкции SCAN
так rec_no это поле таблицы и оно меняется по-моему ( так раньше всегда работало ) просто движением по записям при сканировании
...
Рейтинг: 0 / 0
14.02.2005, 13:28
    #32914341
Hel!Riser
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
не получается изменить поле в конструкции SCAN
Код: plaintext
1.
2.
REPLACE print_pos WITH  3  FOR MOD(RECNO(), 3 )= 0 
REPLACE print_pos WITH  2  FOR MOD(RECNO(), 2 )= 0  AND print_pos= 0 
REPLACE print_pos WITH  1  FOR print_pos= 0 
кажеца пройдет
...
Рейтинг: 0 / 0
14.02.2005, 13:31
    #32914353
alex_dch
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
не получается изменить поле в конструкции SCAN
а у меня то что не так? вроде все нормально..
...
Рейтинг: 0 / 0
14.02.2005, 13:32
    #32914358
Станислав C.
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
не получается изменить поле в конструкции SCAN
alex_dchЗдравствуйте!

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

я пробовал несколько вариантов, ничего не получается (они в коментах)


select e1.artikul, ;
e1.name_nom, ;
e1.tov_color, ;
e1.tov_size, ;
0000 as print_pos, ;
recno() as rec_no ;
from aden_end1 e1 ;
into dbf c:\aden_end2


select aden_end2
go top

pos = 0

scan

DO CASE
CASE rec_no = pos + 1
repl print_pos with 1 for rec_no = pos + 1
CASE rec_no = pos + 2
repl print_pos with 2 for rec_no = pos + 2
CASE rec_no = pos + 3
repl print_pos with 3 for rec_no = pos + 3
ENDCASE


*!* DO CASE
*!* CASE rec_no = pos + 1
*!* update aden_end2 set print_pos = 1 where rec_no = pos + 1
*!* CASE rec_no = pos + 2
*!* update aden_end2 set print_pos = 2 where rec_no = pos + 2
*!* CASE rec_no = pos + 3
*!* update aden_end2 set print_pos = 3 where rec_no = pos + 3
*!* ENDCASE


*!* if rec_no = pos + 3
*!* update aden_end2 set print_pos = 1 where rec_no = pos + 1
*!* endif

*!* if rec_no = pos + 2
*!* update aden_end2 set print_pos = 2 where rec_no = pos + 1
*!* endif

*!* if rec_no = pos + 3
*!* update aden_end2 set print_pos = 3 where rec_no = pos + 1
*!* endif

pos = pos + 3

endscan


табличку с образцами данных прилагаю
Ну посмотри же внимательней на фрагмент! Ты делаешь SCAN, а внутри него делаешь replace... for... . Именно эта команда (первая из трех в Do Case) тебя и выбрасывает на конец файла. Соответственно и SCAN заканчивается...
В этом случае надо сделать примерно так:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
select e1.artikul, ;
        e1.name_nom, ;
        e1.tov_color, ;
        e1.tov_size, ;
         0000  as print_pos, ;
        recno() as rec_no ;
from aden_end1 e1 ;
order by rec_no;
into dbf c:\aden_end2

select aden_end2
go top

pos =  0 

do while !eof('aden_end2') 
  DO CASE
       CASE rec_no = pos +  1 
             repl print_pos with  1  
	CASE rec_no = pos +  2  
             repl print_pos with  2  
	CASE rec_no = pos +  3  
	     repl print_pos with  3  
        CASE rec_no > pos +  3  
             pos=pos+ 3 
             select aden_end2
             skip - 1 
    ENDCASE

select aden_end2
skip  1 
enddo
...
Рейтинг: 0 / 0
14.02.2005, 14:53
    #32914402
alex_dch
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
не получается изменить поле в конструкции SCAN
select aden_end2
go top

pos = 0

scan

repl print_pos with 1 for rec_no = pos + 1
repl print_pos with 2 for rec_no = pos + 2
repl print_pos with 3 for rec_no = pos + 3


pos = pos + 3

endscan

case можно не применять, условие for его фактически дублирует.

теперь делает первые 3 записи. видимо не понимает что pos + 3

в упор не пойму в чем наврал
...
Рейтинг: 0 / 0
14.02.2005, 14:59
    #32914416
AleksMed
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
не получается изменить поле в конструкции SCAN
Ты попутал ф-цию RECNO() с переменной rec_no.
...
Рейтинг: 0 / 0
14.02.2005, 14:59
    #32914418
ВладимирМ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
не получается изменить поле в конструкции SCAN
Напиши, что ты хочешь получить в результате. Т.е. какие значения должно принять поле print_pos.

Если даже убрать условие FOR в команде REPLACE (которое собственно и завершает твой цикл), то в твоем CASE всегда будет выполняться только первое условие.

Если тебе надо просто проставить 1,2,3 в цикле, то это можно решить проще через одну команду REPLACE

Код: plaintext
1.
select aden_end2
REPLACE ALL print_pos WITH MOD(Recno(), 3 )+ 1 

Использовать функцию Recno() непосредственно в команде Select-SQL надо с предельной осторожностью. Ясно понимая что именно будет возвращать такая функция в твоем запросе. В общем случае, лучше этого не делать.
...
Рейтинг: 0 / 0
14.02.2005, 15:13
    #32914461
leaf
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
не получается изменить поле в конструкции SCAN
теперь делает первые 3 записи. видимо не понимает что pos + 3
в упор не пойму в чем наврал


это не так уж и сложно как вы описываете просто не нужно удалять ганды через задний проход прочтите ответы приведеные выше

по поводу вашего вопроса последенего даю наводку куда переместиться указатель записи после :
repl print_pos with 1 for rec_no = pos + 1

и совет перестанте паниковать если моно
...
Рейтинг: 0 / 0
14.02.2005, 15:14
    #32914464
Станислав C.
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
не получается изменить поле в конструкции SCAN
alex_dch select aden_end2
go top

pos = 0

scan

repl print_pos with 1 for rec_no = pos + 1
repl print_pos with 2 for rec_no = pos + 2
repl print_pos with 3 for rec_no = pos + 3


pos = pos + 3

endscan


case можно не применять, условие for его фактически дублирует.

теперь делает первые 3 записи. видимо не понимает что pos + 3

в упор не пойму в чем наврал
Объясняю (если не поймете - перечитайте еще несколько раз):
Условие "for..." в различных командах аналогично сканированию базы данных от первой записи до последней и проверке условия .
Поэтому, после выполнения команды "repl print_pos with 3 for rec_no = pos + 3" указатель окажется на последней записи таблицы . Поэтому цикл SCAN прекратится .
Как результат: изменятся значения только у трех записей.
А чем Вас мое решение не устраивает? Или решение ВладимираМ? Или Hel!Riser'a? Или Вы их просто не понимаете?
...
Рейтинг: 0 / 0
14.02.2005, 15:15
    #32914467
alex_dch
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
не получается изменить поле в конструкции SCAN
вообще делает похоже, но не совсем.

мне надо чтоб записи нумеровались

Recno() print_pos
1 1
2 2
3 3
4 1
5 2
6 3
7 1
8 2

а Recno() я и не использую, для этого и завел столбец специальный
...
Рейтинг: 0 / 0
14.02.2005, 15:17
    #32914470
leaf
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
не получается изменить поле в конструкции SCAN
чем вам ответ hel!riser не понравился вчитывайтесь в ответы
...
Рейтинг: 0 / 0
14.02.2005, 15:20
    #32914478
leaf
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
не получается изменить поле в конструкции SCAN
мне надо чтоб записи нумеровались

select e1.artikul, ;
e1.name_nom, ;
e1.tov_color, ;
e1.tov_size, ;
0000 as print_pos, ;
recno()%3 as rec_no ;
from aden_end1 e1 ;
into dbf c:\aden_end2
...
Рейтинг: 0 / 0
14.02.2005, 15:22
    #32914484
leaf
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
не получается изменить поле в конструкции SCAN
select artikul,name_nom,e1.tov_color,e1.tov_size,0000 as print_pos, ;
;
recno() as rec_no ;
recno()%3 as nn ;

;
from aden_end1 e1 ;
into dbf c:\aden_end2
...
Рейтинг: 0 / 0
14.02.2005, 15:36
    #32914513
alex_dch
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
не получается изменить поле в конструкции SCAN
2 Станислав C.

да, ваш вариант работает, я просто скопировал как-то не все..

а то что предлагают другие, работает но немного не так

3
2
1
2
1

это от Владимира М

1
2
3
2
1

это от ХелРейзера

спасибо всем!!
главное я разобрался почему меня выкидывало из скана

а то что Leaf пишет с % я пока не смотрел, не знакомая штука
есть что почитать по поводу %??
...
Рейтинг: 0 / 0
14.02.2005, 15:39
    #32914521
leaf
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
не получается изменить поле в конструкции SCAN
mod(a,b) =a%b - остаток от деления а на b
попробуйте понравиться
в моем последнем варианте не нужно не цикла не команды репласе
найдите тока где запятую пропустил
...
Рейтинг: 0 / 0
14.02.2005, 15:45
    #32914544
leaf
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
не получается изменить поле в конструкции SCAN
ответы hel!riser и владимира не дают результата потому что порядок следования записей после выборки изменился
...
Рейтинг: 0 / 0
14.02.2005, 15:47
    #32914547
leaf
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
не получается изменить поле в конструкции SCAN
и работать надо уже не с функцией recno() а вашим полем таблицы rec_no
...
Рейтинг: 0 / 0
14.02.2005, 15:50
    #32914566
leaf
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
не получается изменить поле в конструкции SCAN
select artikul,name_nom,e1.tov_color,e1.tov_size,0000 as print_pos, ;
recno() as rec_no ;
,iif(recno()%3=0,3,recno()%3+1) as nn ;
from aden_end1 e1 ;
into dbf c:\aden_end2

это недостающая запятая
...
Рейтинг: 0 / 0
14.02.2005, 15:59
    #32914585
leaf
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
не получается изменить поле в конструкции SCAN
1.
select aden_end2
scan
repl print_pos with iif(rec_no%3=0,3,rec_no%3+1)
endscan

2.
select aden_end2
REPLACE ALL print_pos WITH iif(rec_no%3=0,3,rec_no%3+1)
...
Рейтинг: 0 / 0
14.02.2005, 16:09
    #32914630
alex_dch
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
не получается изменить поле в конструкции SCAN
наиболее короткое решение!



select artikul,name_nom,e1.tov_color,e1.tov_size,0000 as print_pos, ;
recno() as rec_no ;
,iif(recno()%3=0,3, recno()%3 ) as nn ;
from aden_end1 e1 ;
into dbf c:\aden_end2

только не надо recno()%3 + 1


ДА, действительно ГЛАНДЫ :))
...
Рейтинг: 0 / 0
14.02.2005, 16:11
    #32914641
leaf
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
не получается изменить поле в конструкции SCAN
ну вот ещё одна запятая заморочился слегка
...
Рейтинг: 0 / 0
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / не получается изменить поле в конструкции SCAN / 23 сообщений из 23, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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