powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Помогите переместить данные по полям
8 сообщений из 8, страница 1 из 1
Помогите переместить данные по полям
    #38836563
AlexGood123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Доброй ночи! Есть база, в ней одно из полей содержит данные, которые необходимо поместить в другие поля. Задача состоит в том, что нужны только уникальные трехзначные цифровые значения. Алгоритм действий я примерно понимаю - делаем вхождение в первую строчку, ищем уникальное число, состоящее только из трех знаков, проверяем свободно ли определенное поле(dom1) и реплейсим туда это число. Далее берем второе число из этой строчки, проверяем уникально ли оно для этой строчки и если да, проверяем свободно ли поле(dom1), если в этом поле есть запись, пишем в следующее(dom2). Затем следующее число в поле(dom3) и так далее.
Во вложении файл с данной таблицей.
К сожалению, на данный момент времени, моих знаний не достаточно, что бы единолично разобраться и решить данную задачу. Очень надеюсь на Вашу помощь. Спасибо.
...
Рейтинг: 0 / 0
Помогите переместить данные по полям
    #38836568
AlexGood
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
...
Рейтинг: 0 / 0
Помогите переместить данные по полям
    #38836591
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Трехзначные числа так искать
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
lcMask = chrtran(alltrim(table3.all), '1234567890', '')
lcAll = chrtran(alltrim(table3.all), lcMask, space(len(lcMask)))
for i = 1 to GetWordCount(lcAll)
	lcNom = GetWordNum(lcAll, i)
	if len(lcNom) = 3
		? lcNom
	endif
endfor
...
Рейтинг: 0 / 0
Помогите переместить данные по полям
    #38837183
sg12
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AlexGood

Зачем вам вторая таблица, все эти накрутки. Работайте со строкой, нюансы подправьте. В таблицу, если надо, потом переведете.

LOCAL lcReturn,lcString,lcStr,lnVal
lcReturn = REPLICATE('#',1000)
SCAN
lcString = ALLTRIM(table1.field1)
FOR i = 1 TO LEN(lcString) - 3
lcStr = SUBSTR(lcString,i,3)
lnVal = VAL(lcStr)
IF lnVal > 99 AND OCCURS(lcStr,lcReturn) = 0
lcReturn = STUFF(lcReturn,AT('#',lcReturn,lnVal)+1,0,',' + lcStr)
ENDIF
ENDFOR
ENDSCAN
RETURN SUBSTR(CHRTRAN(lcReturn,'#',''),2)
...
Рейтинг: 0 / 0
Помогите переместить данные по полям
    #38837664
AlexGood
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Доброй ночи! Спасибо огромное. Куда двигаться ясно, дальше, как говориться, по азимуту .....
...
Рейтинг: 0 / 0
Помогите переместить данные по полям
    #38837666
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вообще-то, не факт, что номер дома будет именно трехзначным. Скорее, правило поиска номера дома звучит так:

Номер дома - это первое число после запятой, вне зависимости от количества знаков. Номер заканчивается любым символом отличным от цифры

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

Код: sql
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.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
* Пример символьной строки для разбора
lcString = 'д.. 10, д. 110,д. 12к.2,д. 124/2,д. 116 стр.1,д. 116 стр.2,д. 24,д. 120'

* Добавляю ведущий и концевой разделитель
lcString = ','+lcString+','

* Формирую маску для исключения символов
lcMask = Chrtran(lcString, '1234567890,', '')

* Заменяю все, что не входит в маску на пробелы
lcAll = Chrtran(lcString, lcMask, Replicate(' ',Len(lcMask)))

* Формирую массив, каждый элемент которого - это строка между разделителями
lnElements = Alines(laHome, lcAll, 1+4+8, ',')

* Массив, в который будут записаны уникальные номера домов
Local laUniqueHome(m.lnElements)

* Анализ полученного списка элементов
Local lnNext
lnNext = 0

For lnI = 1 To lnElements
	lnHome = Val(laHome[lnI])
	If Ascan(laUniqueHome, lnHome) = 0
		lnNext = lnNext + 1
		laUniqueHome[lnNext] = lnHome
	Endif
Endfor

* Отбрасываю лишние элементы массива
If lnNext > 0
	Dimension laUniqueHome(lnNext)
Endif

* Упорядочиваю элементы массива по возрастанию
*=ASort(laUniqueHome)

* Смотрим, что получилось
Clear
?lcString
For lnI = 1 To lnNext
	?laUniqueHome(lnI)
Endfor
...
Рейтинг: 0 / 0
Помогите переместить данные по полям
    #38838036
sg12
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ВладимирМ
Осталось совсем малость, например:
'д21,д21/1,д22,д22а'
Сколько в этой строке номеров домов?
...
Рейтинг: 0 / 0
Помогите переместить данные по полям
    #38841179
sg12
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AlexGood123

С этой проблемой, хоть и сумбурно, вы разобрались.
Но при таком бессистемном хранении данных при любом обращении к ним будут подобные проблемы.
Такие таблицы не должны существовать, номера домов и квартир должны иметь соответствующее поля.
Строки как и цифры тоже сортируются, достаточно будет индексов.
Адрес может быть также записан как одно строковое выражение через программно устанавливаемые разделители.

Упорядочить ваши данные можно так:
FOR i = 1 TO GETWORDCOUNT(lcString,',')
lcStr = GETWORDNUM(lcString,i,',')
REPLACE table1.field1 WITH GETWORDNUM(lcStr,1,' '), table1.field2 WITH GETWORDNUM(lcStr,2,' ')
ENDFOR
И приводить в порядок данные по необходимости:
REPLACE ALL field1 WITH SUBSTR(field1,2) FOR LEFT(field1,1)=='д'
И т.д.

Кстати, некоторые угловые дома могут иметь двойную адресацию:
Улица1, д. 37/43 или Улица2, д. 43/37.
Заметим, что у вас в таблице есть и такие номера домов: д.120к.1, д.271 кор.2, д.116 стр.2
...
Рейтинг: 0 / 0
8 сообщений из 8, страница 1 из 1
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Помогите переместить данные по полям
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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