powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / не получается изменить поле в конструкции SCAN
23 сообщений из 23, страница 1 из 1
не получается изменить поле в конструкции SCAN
    #32914303
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


табличку с образцами данных прилагаю
...
Рейтинг: 0 / 0
не получается изменить поле в конструкции SCAN
    #32914319
AleksMed
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А где же у тебя rec_no меняется?
...
Рейтинг: 0 / 0
не получается изменить поле в конструкции SCAN
    #32914337
alex_dch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
так rec_no это поле таблицы и оно меняется по-моему ( так раньше всегда работало ) просто движением по записям при сканировании
...
Рейтинг: 0 / 0
не получается изменить поле в конструкции SCAN
    #32914341
Фотография Hel!Riser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: 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
не получается изменить поле в конструкции SCAN
    #32914353
alex_dch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
а у меня то что не так? вроде все нормально..
...
Рейтинг: 0 / 0
не получается изменить поле в конструкции SCAN
    #32914358
Станислав C.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
не получается изменить поле в конструкции SCAN
    #32914402
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

в упор не пойму в чем наврал
...
Рейтинг: 0 / 0
не получается изменить поле в конструкции SCAN
    #32914416
AleksMed
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ты попутал ф-цию RECNO() с переменной rec_no.
...
Рейтинг: 0 / 0
не получается изменить поле в конструкции SCAN
    #32914418
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Напиши, что ты хочешь получить в результате. Т.е. какие значения должно принять поле 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
не получается изменить поле в конструкции SCAN
    #32914461
leaf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
теперь делает первые 3 записи. видимо не понимает что pos + 3
в упор не пойму в чем наврал


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

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

и совет перестанте паниковать если моно
...
Рейтинг: 0 / 0
не получается изменить поле в конструкции SCAN
    #32914464
Станислав C.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
не получается изменить поле в конструкции SCAN
    #32914467
alex_dch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
вообще делает похоже, но не совсем.

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

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

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

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
не получается изменить поле в конструкции SCAN
    #32914484
leaf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
не получается изменить поле в конструкции SCAN
    #32914513
alex_dch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
2 Станислав C.

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

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

3
2
1
2
1

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

1
2
3
2
1

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

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

а то что Leaf пишет с % я пока не смотрел, не знакомая штука
есть что почитать по поводу %??
...
Рейтинг: 0 / 0
не получается изменить поле в конструкции SCAN
    #32914521
leaf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mod(a,b) =a%b - остаток от деления а на b
попробуйте понравиться
в моем последнем варианте не нужно не цикла не команды репласе
найдите тока где запятую пропустил
...
Рейтинг: 0 / 0
не получается изменить поле в конструкции SCAN
    #32914544
leaf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ответы hel!riser и владимира не дают результата потому что порядок следования записей после выборки изменился
...
Рейтинг: 0 / 0
не получается изменить поле в конструкции SCAN
    #32914547
leaf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
и работать надо уже не с функцией recno() а вашим полем таблицы rec_no
...
Рейтинг: 0 / 0
не получается изменить поле в конструкции SCAN
    #32914566
leaf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
не получается изменить поле в конструкции SCAN
    #32914585
leaf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
не получается изменить поле в конструкции SCAN
    #32914630
alex_dch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
наиболее короткое решение!



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
не получается изменить поле в конструкции SCAN
    #32914641
leaf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ну вот ещё одна запятая заморочился слегка
...
Рейтинг: 0 / 0
23 сообщений из 23, страница 1 из 1
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / не получается изменить поле в конструкции SCAN
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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