Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / пронумеровать / 16 сообщений из 16, страница 1 из 1
23.07.2008, 10:17
    #35446281
gromozeka2007
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
пронумеровать
Люди добрые прошу вас помогите ламаку!!! Есть поле invent_n в ньом значения типа 000125 они могут повторяться помогите какимто макаром пронумеровать их 001251 001252 и т.д. поле типа Character
функция recno() не прокатит...
...
Рейтинг: 0 / 0
23.07.2008, 10:32
    #35446325
Galyamov Rinat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
пронумеровать
Народ, решите за меня алгоритмическую задачку!!! :)


По сути.

scan all

lnRecNo=RecNo()

lcCurInvent_n=Invent_n

count for lcCurInvent_n=Invent_n to CountInvent_n

lnI=1
if CountInvent_n>1
repl Invent_n with substr(CountInvent_n,2)+trans(lnI)

locate for lcCurInvent_n=Invent_n to CountInvent_n

do while found()
lnI=lnI+1
repl Invent_n with substr(CountInvent_n,2)+trans(lnI)
continue
enddo
goto record lnRecNo
endscan


Только несколько НО:
1 - данный алгоритм отработает корректно для кол-ва <=9 (сдвигает на один
разряд, если нужно - доработать)

2 - было в базе 000001 000001 и 000011.
После отработки алгоритма станет 000011 000012 и 000112

было в базе 000011 000001 000001 .
После отработки алгоритма станет 000011 000011 и 000012

Т.е. ты запросто можешь при присваивании нового значения напороться на
"занятый" диапозон. Возможно имеет смысл добавить некий разделитель,
например "-"

Т.о. в случае: было в базе 000011 000001 000001 .
После отработки алгоритма станет 000011 0001-1 и 0001-2


Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
23.07.2008, 10:34
    #35446336
Galyamov Rinat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
пронумеровать
Вот здесь напутал:

2 - было в базе 000001 000001 и 000011.
После отработки алгоритма станет 000111 000012 и 000112


Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
23.07.2008, 11:14
    #35446463
Hel!Riser
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
пронумеровать
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
** в табличку добавили поле, в кот будет новый генер номеров..
ALTER TABLE MyTable ADD COLUMN inv_new C( 6 )

SELECT invent_n, COUNT(*) AS cnt, LEN(LTRIM(STR(COUNT(*)))) AS lenght ;
	FROM MyTable;
	HAVING COUNT(*)> 1 ;
	GROUP BY  1 ;
	INTO CURSOR qNum READWRITE
INDEX ON invent_n TAG invent_id

SELECT MyTable
SET RELATION TO invent_n INTO qNum
** заполнили номерками...
SCAN FOR !EOF('qNum')
	REPLACE inv_new WITH SUBSTR(MyTable.invent_n,qNum.Lenght+ 1 )+PADL(qNum.cnt,qNum.Lenght,'0')
	REPLACE cnt WITH cnt- 1 ;
		IN qNum
ENDSCAN

** и тута выставляем вновь прощщитаный ИД
REPLACE invent_n WITH inv_new;
	FOR !EMPTY(inv_new)
...
Рейтинг: 0 / 0
23.07.2008, 11:24
    #35446484
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
пронумеровать
gromozeka2007Люди добрые прошу вас помогите ламаку!!! Есть поле invent_n в ньом значения типа 000125 они могут повторяться помогите какимто макаром пронумеровать их 001251 001252 и т.д. поле типа Character
функция recno() не прокатит...

Не совсем понял что надо. Вобщем примерно так:
Код: plaintext
1.
2.
3.
4.
i =  1251 
scan
   repl invent_n with chrtran(str(i,  6 ), ' ', '0')
   i = i +  1 
endscan
...
Рейтинг: 0 / 0
23.07.2008, 14:21
    #35447184
gromozeka2007
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
пронумеровать
Последний вариант прикольный только мне необходимо чтобы старое значение не затиралось а к нему добавлялось если у меня например несколько записей с номером 000123,000123,000123, то мне необходимо в конце этим номерам добавить 0001231 0001232 0001233 и т.д. но только к тем что одинаковые
...
Рейтинг: 0 / 0
23.07.2008, 14:29
    #35447221
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
пронумеровать
gromozeka2007Последний вариант прикольный только мне необходимо чтобы старое значение не затиралось а к нему добавлялось если у меня например несколько записей с номером 000123,000123,000123, то мне необходимо в конце этим номерам добавить 0001231 0001232 0001233 и т.д. но только к тем что одинаковые
Ты как-то определись уже что хочешь. Заново пронумеровать или одинаковые попавить или еще чего. Может на примере опишешь что тебе надо. Типа такого:
Старое значениеновое значение00012200012200012300012310001230001232......
Размерность поля укажи
...
Рейтинг: 0 / 0
23.07.2008, 14:32
    #35447233
gromozeka2007
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
пронумеровать
вот именно ... оно как заделать?
...
Рейтинг: 0 / 0
23.07.2008, 14:38
    #35447254
q123qw
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
пронумеровать
gromozeka2007Люди добрые прошу вас помогите ламаку!!! Есть поле invent_n в ньом значения типа 000 125 они могут повторяться помогите какимто макаром пронумеровать их 00 1251 001252 и т.д. поле типа Character
функция recno() не прокатит...
Ты ж корректно расписывай! А то поди пойми чё ты хошь!
Отойди от компа и опиши алгоритм на бамажке! Потом сам всё сможешь сделать!
...
Рейтинг: 0 / 0
23.07.2008, 14:43
    #35447274
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
пронумеровать
gromozeka2007вот именно ... оно как заделать?

сделай индекс invent_n по invent_n если нет такого
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
set order to invent_n
lcPrev = 'xxx'
scan
     if lcPrev = invent_n
        i = i +  1 
        if i =  1 
           skip - 1 
           repl invent_n with alltrim(invent_n) + '1'
           skip
           i =  2 
        endif
        repl invent_n with alltrim(invent_n) + alltrim(str(i))
     else
         lcPrev = invent_n
         i =  0 
     endif
endscan

PS А ты уверен что нормально иметь номер '001231' и '0001231' ? Нолики наверно не просто так в начале дописаны?
...
Рейтинг: 0 / 0
23.07.2008, 14:56
    #35447308
gromozeka2007
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
пронумеровать
Благодарю всем большое спасибо. Последний вариант именно то что нужно. Премного благодарен :)
...
Рейтинг: 0 / 0
23.07.2008, 15:10
    #35447354
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
пронумеровать
gromozeka2007Последний вариант именно то что нужно.
Странно. Только сейчас дошло что я глупость написал :)
По идее должно неправильно работать, т.к. при изменении invent_n и при активном индексе по этому полю запись должна сместится сразу в конец среди одинаковых.

Вобщем надо еще одно поле делать, заполнять, и потом из него переносить. Так правильно
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
set order to invent_n
alter table ... add column invent_2 c( 10 )
lcPrev = 'xxx'
scan
     if lcPrev = invent_n
        i = i +  1 
        if i =  1 
           skip - 1 
           repl invent_2 with alltrim(invent_n) + '1'
           skip
           i =  2 
        endif
        repl invent_2 with alltrim(invent_n) + alltrim(str(i))
     else
         lcPrev = invent_n
         i =  0 
     endif
endscan
set order to
repl for !empty(invent_2) invent_n with invent_2
alter table ... drop column invent_2
...
Рейтинг: 0 / 0
25.07.2008, 15:46
    #35452526
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
пронумеровать
Давай все-таки тут продолжать.

gromozeka2007От что плучилось после того как я запустил скрипт. А необходимо чтобы все одинаковые значения пронумеровались чтобы небыло совпадений. Оно допустим значение 001102 001102 пронумеровало 0011021 0011022 а почему для 001012 которое повторяется 4 раза не пронумеровало. Я выложил dbf в архиве там поле nomer его необходимо пронумеровать
У меня нормально все получилось, все 4 исправились. Табличку твою отсюда взял, индекс сделал
Код: plaintext
index on nomer tag nomer
и самый последний вариант запустил.

Только у тебя уже бардак в таблице и этот способ приводит к другим задвоениям. Есть повторение "002014" для правки оно будет преобразовано в "0020141","0020142" ... но есть уже "0020141","0020142"
поэтому в результате исправления одного получаем задвоение другого. Что с этим делать?
...
Рейтинг: 0 / 0
25.07.2008, 16:02
    #35452591
gromozeka2007
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
пронумеровать
я понял но как с этим бороться если какойто счетчик создать который если номер совпадает будет добавлять
например 044150, встретившийся дважды, стал 0441500 и 0441501
...
Рейтинг: 0 / 0
25.07.2008, 16:04
    #35452603
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
пронумеровать
Так попробуй. С проверкой что новый номер уже есть.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
use vost_fobos

select nomer;
	from vost_fobos;
	group by nomer;
	having count(*) >  1 ;
	into cursor tdv

sele tdv
scan
	i =  0 
	sele vost_fobos
	scan for vost_fobos.nomer = tdv.nomer
		do while .T.
			i = i +  1 
			lcNewNomer = padr(alltrim(tdv.nomer) + alltrim(str(i)),  10 )
			if !indexseek(lcNewNomer, .F., 'vost_fobos', 'nomer')
				repl in vost_fobos nomer with lcNewNomer
				exit
			endif
		enddo
	endscan
endscan

В таблице vost_fobos должен быть индекс NOMER по полю NOMER и этот индекс должен быть не активен
...
Рейтинг: 0 / 0
25.07.2008, 16:40
    #35452741
gromozeka2007
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
пронумеровать
Вот это вроди то что нужно !!! Огромное человеческое СПАСИБО !!! Если бы жил рядом Укатал бы тебя пвом :)
...
Рейтинг: 0 / 0
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / пронумеровать / 16 сообщений из 16, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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