Переключение на Главную Страницу Страницы: 1 ОтправитьПечать
Горячая тема (более 10 ответов) Киньте примером как правильно пользовать INSERT (число прочтений - 3863 )
Arta
1c++ power user
Отсутствует



Сообщений: 2537
Местоположение: Нижний Новгород
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Киньте примером как правильно пользовать INSERT
06. Февраля 2007 :: 22:29
Печать  
Надо пользовать INSERT извне для базы 1С. Есть перловый скрипт, который должен вносить данные в справочник 1С (неподчиненный, без групп).

Как я понимаю, основная проблема это генерация id. Это решаемо на сервере?
  
Наверх
 
IP записан
 
Phoenix
Senior Member
****
Отсутствует


itpath.ru

Сообщений: 398
Местоположение: Москва
Зарегистрирован: 15. Июня 2006
Пол: Мужской
Re: Киньте примером как правильно пользовать INSER
Ответ #1 - 07. Февраля 2007 :: 14:10
Печать  
решаемо, стукнись ко мне в асю после 8 вечера - скину пример.
  

Лень двигатель прогресса.&&http://www.itpath.ru&&;
Наверх
IP записан
 
mche
YaBB Newbies
*
Отсутствует


I Love YaBB 2!

Сообщений: 7
Зарегистрирован: 22. Января 2007
Re: Киньте примером как правильно пользовать INSER
Ответ #2 - 08. Февраля 2007 :: 07:16
Печать  
А почему бы не сюда?
Было бы интересно посмотреть
  
Наверх
 
IP записан
 
artbear
1c++ developer
1c++ moderator
Отсутствует


Эх, дайте что-нибудь новенькое
да полезное потести

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Киньте примером как правильно пользовать INSER
Ответ #3 - 08. Февраля 2007 :: 07:22
Печать  
еще можно посмотреть исходники 1С++, там также решена подобная проблема.
SQLLock
  

OpenConf developer :: http://openconf.1cpp.ru&&FormEx developer :: http://formex.dorex.ru&&1C++ active developer && tester :: www.1cpp.ru
Наверх
GTalkSkype/VoIPICQ  
IP записан
 
Phoenix
Senior Member
****
Отсутствует


itpath.ru

Сообщений: 398
Местоположение: Москва
Зарегистрирован: 15. Июня 2006
Пол: Мужской
Re: Киньте примером как правильно пользовать INSER
Ответ #4 - 08. Февраля 2007 :: 09:08
Печать  
стыдно будет за не оптимальный запрос, полученный тупым копанием и мелкой переработкой вызовов запросов 1С.
но для начала этой информации должно хватить. выложу вечером, т.к. код дома лежит.
  

Лень двигатель прогресса.&&http://www.itpath.ru&&;
Наверх
IP записан
 
Arta
1c++ power user
Отсутствует



Сообщений: 2537
Местоположение: Нижний Новгород
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Киньте примером как правильно пользовать INSER
Ответ #5 - 08. Февраля 2007 :: 13:05
Печать  
Почти победил Улыбка
Лочу таблицу на запись, получаю 36-чный ID, инкрементирую его. Остается его теперь записать. Но вот никогда не задумывался как лежит ID, пробелы там справа и слева :-D. Инкрементированный естесенно без пробелов Улыбка


Phoenix, uin какой?
  
Наверх
 
IP записан
 
DmitrO
1c++ power user
Отсутствует


ex developer

Сообщений: 579
Местоположение: г. Киров
Зарегистрирован: 22. Мая 2006
Пол: Мужской
Re: Киньте примером как правильно пользовать INSER
Ответ #6 - 08. Февраля 2007 :: 13:50
Печать  
Ну что вы мучаетесь.. "все уже украдено до нас"

Код
Выбрать все
create function id36toint(@idc as char(6)) returns int as
begin
  declare @i int, @id int, @weight int
  set @i = 6
  set @id = 0
  set @weight = 1
  while @i > 0
  begin
    declare @code int
    set @code = ascii(substring(@idc, @i, 1));
    if @code = 0x20
	break
    if @code > 0x39
	set @code = @code - 0x37
    else
	set @code = @code - 0x30
    set @id = @id + @code * @weight
    if @i > 1
	set @weight = @weight * 36
    set @i = @i - 1
  end
  return @id
end
 


Код
Выбрать все
create function inttoid36(@id as int) returns char(6) as
begin
  declare @i int, @idc varchar(6), @weight int, @Leading int
  set @idc = ''
  set @weight = 60466176
  set @Leading = 1

  if @id = 0
    set @idc = '     0'
  else
  begin
    set @i = 0
    while @i < 6
    begin
	declare @code int
	set @code = @id / @weight;
	if @code > 9
	begin
	  set @idc = @idc + char(@code + 0x37)
	  set @Leading = 0
	end
	else
	  if @code = 0 and @Leading = 1
	   set @idc = @idc + ' '
	  else
	  begin
	    set @idc = @idc + char(@code + 0x30)
	    set @Leading = 0
	  end
	set @id = @id % @weight
	set @i = @i + 1
	if @i < 6
	  set @weight = @weight / 36
    end
  end
  return @idc
end
 



Соответственно пример кода получения нового идентификатора документа:
Код
Выбрать все
...
    select
	@ИДДокумента = case when max(iddoc) is null
	  then '     1   '
	  else dbo.inttoid36(dbo.id36toint(left(max(iddoc), 6)) + 1) + '   '
	end
    from _1sjourn
...
 


Примечание1: код ИБ в данном примере три пробела, т.е. нет УРИБа
Примечание2: блокировку поставить не забудьте
  
Наверх
ICQ  
IP записан
 
Arta
1c++ power user
Отсутствует



Сообщений: 2537
Местоположение: Нижний Новгород
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Киньте примером как правильно пользовать INSER
Ответ #7 - 08. Февраля 2007 :: 15:39
Печать  
Весь итланд перелазил, помню что кто-то постил Улыбка

Пасиб!
  
Наверх
 
IP записан
 
Александр Тихонов
Junior Member
**
Отсутствует


I Love YaBB 2!

Сообщений: 17
Зарегистрирован: 26. Октября 2008
Re: Киньте примером как правильно пользовать INSERT
Ответ #8 - 30. Октября 2008 :: 01:01
Печать  
Господа, я в паскале не силен. Не подскажите правильно ли я поняд:
Код
Выбрать все
Функция ф36to10(ID36)
	i=6; id=0; weight=1;

	Пока i>0 Цикл
		СимвКод = КодСимв(Сред(ID36,i,1));
		Если СимвКод=20 Тогда Продолжить; КонецЕсли;
		Если СимвКод>39 Тогда
			СимвКод=СимвКод-37;
		Иначе
			СимвКод=СимвКод-30;
		КонецЕсли;
		id=id+СимвКод*weight;
		Если i>0 Тогда
			weight=weight * 36;
		КонецЕсли;
		i=i-1;
	КонецЦикла;

	Возврат id;
КонецФункции 



И

Код
Выбрать все
Функция ф10to36(ID10)
	idc=""; weight=60466176; learding=1;

	Если ID10=0 Тогда
		id = "     0";
	Иначе
		i=0;
		Пока i<6 Цикл
			СимвКод = цел(ID10 / weight);
			Если СимвКод>9 Тогда
				id=id+Симв(СимвКод+37);
				learding=0;
			Иначе
				Если (СимвКод=0) И (learding=1) Тогда
					id=id+" ";
				Иначе
					id=id+Симв(СимвКод+30);
					learding=0;
				КонецЕсли;
			КонецЕсли;
			ID10 = ID10 % weight;
			i=i+1;
			Если i<6 Тогда
				weight=цел(weight/36);
			КонецЕсли;
		КонецЦикла;
	КонецЕсли;

	Возврат id;
КонецФункции 



Что-то вроде блок-схемы (т.е. на понятном всем языке).
Просто почему-то эти функции дают разные результаты по сравнению с _idtostr и _strtoid. Где-то я ошибся в интерпретации?
  
Наверх
 
IP записан
 
novichek
Экс-Участник


Re: Киньте примером как правильно пользовать INSERT
Ответ #9 - 30. Октября 2008 :: 03:51
Печать  
Это не паскаль, это функции для SQL  Улыбка
  
Наверх
 
IP записан
 
Александр Тихонов
Junior Member
**
Отсутствует


I Love YaBB 2!

Сообщений: 17
Зарегистрирован: 26. Октября 2008
Re: Киньте примером как правильно пользовать INSERT
Ответ #10 - 30. Октября 2008 :: 04:18
Печать  
Цитата:
Это не паскаль, это функции для SQL  Улыбка

А в фоксе это как-нибудь применимо (для DBF)?
И вопрос таки о понимании мною алгоритма...
  
Наверх
 
IP записан
 
Quan
1c++ donor
1c++ power user
Отсутствует


I'm old, bald and ugly.

Сообщений: 273
Местоположение: Новосибирск -- Москва
Зарегистрирован: 20. Мая 2006
Пол: Мужской
Re: Киньте примером как правильно пользовать INSERT
Ответ #11 - 06. Ноября 2008 :: 12:36
Печать  
SET OFFTOPIC ON

С ностальгией вспоминаю, как лихо на ассемблере звучало преобразование в Base36 (точнее, изначально предназначалось для DEC->char(HEC), что в данном случае пофигу)

Код
Выбрать все
ADD A, #90
DAA
ADC A, #40
DAA 


И всё!!! На в ходе в A лежал integer, на выходе лежит требуемый Ascii символ
Кстати, это - рекорд: самый короткий запатентованый машинный код. Круглые глаза
  

А для тех, кто не хотел учить SQL, господь сотворил курсоры
Наверх
 
IP записан
 
Переключение на Главную Страницу Страницы: 1
ОтправитьПечать