Создание идентификатора

MapInfo, MapBasic
Ответить
Shtr1h_KoT
Новоприбывший
Сообщения: 6
Зарегистрирован: 30 сен 2016, 19:00
Репутация: 0

Создание идентификатора

Сообщение Shtr1h_KoT » 10 янв 2018, 06:15

Есть векторка с атрибутами, нужно создать идентификатор в созданной символьной колонке, назовем ее "G". идентификатор записывается путем соединения значения других колонок a,b,c,d,e,f, т.е g=a+b+c+d+e+f. Причем a,...,f - десятичные. a(2.0), b(3.0), c(3.0),d(3.0),e(4.0),f(3.0). К тому же разделение должно производится путем разделения их пробелами или нулями. Пример : a-54, b-34, c-184, d-1, e-304, f-212. Результат : G = 54 34184 1 304212. В итоге получилось 18 символов. В бейзеке мало шарю, но что то уже пишу. Вечером постараюсь приложить код к теме, который некорректно работает. Заранее спасибо!

freeExec
Гуру
Сообщения: 629
Зарегистрирован: 23 апр 2011, 10:32
Проекты: 1
Репутация: 89
Откуда: Ульяновск

Re: Создание идентификатора

Сообщение freeExec » 10 янв 2018, 10:04

Код: Выделить всё

Dim G = Str(A) + " " + Str(B) + Str(C) + " " + Str(E) + Str(F)

Boris
Гуру
Сообщения: 4006
Зарегистрирован: 10 апр 2006, 22:34
Статьи: 3
Проекты: 1
Репутация: 379
Откуда: Париж

Re: Создание идентификатора

Сообщение Boris » 10 янв 2018, 15:24

freeExec писал(а):
10 янв 2018, 10:04
Dim G = Str(A) + " " + Str(B) + Str(C) + " " + Str(E) + Str(F)
Все же автор хотел ВСЕ колонки разделить нулями( :shock: ) или пробелами. Даже, если в примере сделал не совсем так.
Поскольку формально вы ему уже ответили, то рискну указать на странность исходных данных и желания автора:
1. команды Мапбасика тут конечно необходимы, но вот программировать на нем - это уже избыточно. Для получения результата хватит обычного запроса SQL или если "твердая" колонка все же необходима, то запроса Update.
2. Разделять нулем? Да еще данные разной разрядности - давно не видел. Хоть бы к единому формату "000" привели сперва, в ином случае - это что угодно, только не идентификатор в значении "уникальное поле, при условии уникальности всех колонок".
3. А почему поля в два или три разряда без десятичных знаков названы десятичными? Они даже Integer не являются - SmallInt вполне достаточно.
4. Для получения заявленной разрядности в 18 символов следует связать между собой результат функции Format$

Код: Выделить всё

Format$(54,"00\ ")+Format$(34,"000\ ")+ ... + Format$(212,"000")
или

Код: Выделить всё

Update [table] Set G=Format$(a,"00\ ")+Format$(b,"000\ ")+ ... + Format$(f,"000")

Shtr1h_KoT
Новоприбывший
Сообщения: 6
Зарегистрирован: 30 сен 2016, 19:00
Репутация: 0

Re: Создание идентификатора

Сообщение Shtr1h_KoT » 11 янв 2018, 15:43

Спасибо, сделал.
Boris писал(а):
10 янв 2018, 15:24
команды Мапбасика тут конечно необходимы, но вот программировать на нем - это уже избыточно
Так как работаю в команде объяснять каждому, как делать Sql запросы очень проблематично. А тут кнопку сделал и пусть все по ней тыкают :)
Boris писал(а):
10 янв 2018, 15:24
Разделять нулем?
Ну да, глупая была затея :D
Boris писал(а):
10 янв 2018, 15:24
А почему поля в два или три разряда без десятичных знаков названы десятичными?
Такую требуют, я бы все в короткие загнал

Вот вообщем, что хотел. Была идея с функцией, но их пока не умею правильно применять.
Завтра попробую результат на деле.

Код: Выделить всё

	Alter table tab (Modify G  char(18)) 
	Fetch First From tab

	ColName = ""
 	
	space1 = Space$(1)
	space2 = Space$(2)
	space3 = Space$(3)

	For i = 1 To TableInfo(tab, TAB_INFO_NROWS)
		
	Fetch Rec i From Tab
'________________________________________________________________________

		lcA =Str$(Tab.A)

'________________________________________________________________________

		If Len(Str$(Tab.B)) = 1 Then
			lcB =space2 + Str$(Tab.B)
		ElseIf Len(Str$(Tab.B)) = 2 Then
			lcB =space1 + Str$(Tab.B)
		Else			
			lcB =Str$(Tab.B)
		End If
'________________________________________________________________________
		
		If Len(Str$(Tab.C)) = 1 Then
			lcC=space2 + Str$(Tab.C)
		ElseIf Len(Str$(Tab.C)) = 2 Then
			lcC=space1 + Str$(Tab.C)
		Else			
			lcC=Str$(Tab.C)
		End If

'________________________________________________________________________
		
		If Len(Str$(Tab.D)) = 1 Then
			lcD=space2 + Str$(Tab.D)
		ElseIf Len(Str$(Tab.D)) = 2 Then
			lcD=space1 + Str$(Tab.D)
		Else			
			lcD=Str$(Tab.D)
		End If

'________________________________________________________________________
		
		If Len(Str$(Tab.E)) = 1 Then
			lcE=space3 + Str$(Tab.E)
		ElseIf Len(Str$(Tab.E)) = 2 Then
			lcE=space2 + Str$(Tab.E)
		ElseIf Len(Str$(Tab.E)) = 3 Then
			lcE=space1 + Str$(Tab.E)
		Else			
			lcE=Str$(Tab.E)
		End If

'________________________________________________________________________
		
		If Len(Str$(Tab.F)) = 1 Then
			lcF=space2 + Str$(Tab.F)
		ElseIf Len(Str$(Tab.F)) = 2 Then
			lcF=space1 + Str$(Tab.F)
		Else			
			lcF=Str$(Tab.F)
		End If

'________________________________________________________________________

		ColName = lcA + lcB+lcC+lcD+lcE+lcF
 		Update Tab
			Set G = ColName
			Where RowID = i
		Next
		Commit Table Tab
close all interactive

Аватара пользователя
jerry-maori
Гуру
Сообщения: 514
Зарегистрирован: 22 авг 2012, 17:02
Репутация: 104
Ваше звание: it-дворник
Откуда: Нижний Новгород

Re: Создание идентификатора

Сообщение jerry-maori » 11 янв 2018, 16:05

разделять нулями, пробелами, табуляциями -- это раскладывать грабли...
есть жи нижнее подчёркивание...

Ответить

Вернуться в «MapInfo»