Переключение на Главную Страницу Страницы: [1] 2  ОтправитьПечать
Горячая тема (более 10 ответов) SUBSTR(1SBLOB.BLOCK,10,VAL(1SBLOB.BLOCK)) НЕ работ (число прочтений - 8246 )
DionX
Senior Member
****
Отсутствует



Сообщений: 373
Местоположение: Кемерово
Зарегистрирован: 22. Августа 2006
Пол: Мужской
SUBSTR(1SBLOB.BLOCK,10,VAL(1SBLOB.BLOCK)) НЕ работ
05. Октября 2006 :: 04:29
Печать  
Пытаюсь получит комментарий документа (строка неограниченной длн).

SUBSTR(1SBLOB.BLOCK,10,VAL(1SBLOB.BLOCK)) - всегда возвращает только один символ!
проверяю VAL(1SBLOB.BLOCK) - возвращает нужное кол-во символов
пробую  SUBSTR(1SBLOB.BLOCK,10,VAL('5    пап')) - возвращает нужное, т.е. 5, символов. Что это такое? Как быть?
  
Наверх
ICQ  
IP записан
 
Alex_Bob
Full Member
***
Отсутствует



Сообщений: 136
Местоположение: Липецк
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: SUBSTR(1SBLOB.BLOCK,10,VAL(1SBLOB.BLOCK)) НЕ р
Ответ #1 - 05. Октября 2006 :: 05:15
Печать  
Заглянул в поле BLOCK 1SBLOB и вижу, что в первых 9 символах первого блока указан размер блока в ШЕСТНАДЦАТИРИЧНОМ формате. Что-то я не помню в FoxPro готовой функции по переводу из шестнадцатиричного формата в десятичный. Возможно придется писать UDF. В нутри хранимой процедуры это возможно.
Кроме того, если длина комментария превышает 71 символ, то продолжение его записывается в BLOCK с BLOCKNO 1,2 и т.д.
  

Необходимо время, чтобы восстановить хаос. (с) Дж. Буш (младший)
Наверх
 
IP записан
 
DionX
Senior Member
****
Отсутствует



Сообщений: 373
Местоположение: Кемерово
Зарегистрирован: 22. Августа 2006
Пол: Мужской
Re: SUBSTR(1SBLOB.BLOCK,10,VAL(1SBLOB.BLOCK)) НЕ р
Ответ #2 - 05. Октября 2006 :: 05:40
Печать  
Это всё понятно, НО!
1. VAL(1SBLOB.BLOCK) - возвращает правильный результат
2. Сосмневаюсь, что кто-то в коментарии к документу будет писать сочинение на 71 символ, хотя... но это уже другая история.
Ещё варианты есть?
  
Наверх
ICQ  
IP записан
 
tav13
1c++ donor
Отсутствует



Сообщений: 108
Местоположение: Donetsk
Зарегистрирован: 22. Мая 2006
Пол: Мужской
Re: SUBSTR(1SBLOB.BLOCK,10,VAL(1SBLOB.BLOCK)) НЕ р
Ответ #3 - 24. Ноября 2006 :: 12:54
Печать  
Alex_Bob писал(а) 05. Октября 2006 :: 05:15:
Заглянул в поле BLOCK 1SBLOB и вижу, что в первых 9 символах первого блока указан размер блока в ШЕСТНАДЦАТИРИЧНОМ формате. Что-то я не помню в FoxPro готовой функции по переводу из шестнадцатиричного формата в десятичный. Возможно придется писать UDF. В нутри хранимой процедуры это возможно.
Кроме того, если длина комментария превышает 71 символ, то продолжение его записывается в BLOCK с BLOCKNO 1,2 и т.д.  

Господа, подскажите возможно ли сделать хранимые процедуры для DBF формата 1С?
  
Наверх
ICQ  
IP записан
 
steban
1c++ developer
Отсутствует


#define sizeof(x) rand()

Сообщений: 787
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: SUBSTR(1SBLOB.BLOCK,10,VAL(1SBLOB.BLOCK)) НЕ р
Ответ #4 - 24. Ноября 2006 :: 13:11
Печать  
Возможно.
В каталоге базы создать файл ИмяПроцедурыИлиФункции.prg с текстом процедуры/функции.
Можно также создать в каталоге бызы фоксовую базу (.dbc) и описать процедуры и функции там.
в строке подключения вместо
Код
Выбрать все
SourceDB=C:\ПутьКБазе\;SourceType=DBF 


написать
Код
Выбрать все
SourceDB=C:\ПутьКБазе\db.dbc;SourceType=DBC 


При выполнении запросов к фоксовой базе к таблицам DBF, лежащим в одном каталоге с базой можно обращаться по имени, как к таблицам в самой базе.
  

int getRandomNumber()&&{&&  return 4; //chosen by fair dice roll&&         //guaranteed to be random&&}
Наверх
 
IP записан
 
tav13
1c++ donor
Отсутствует



Сообщений: 108
Местоположение: Donetsk
Зарегистрирован: 22. Мая 2006
Пол: Мужской
Re: SUBSTR(1SBLOB.BLOCK,10,VAL(1SBLOB.BLOCK)) НЕ р
Ответ #5 - 24. Ноября 2006 :: 13:44
Печать  
Создал файл: ConvSyst10.prg
Код
Выбрать все
CREATE FUNCTION ConvSyst10(@num varchar(99), @syst int)
RETURNS bigint
AS
BEGIN
  declare @i bigint,@c int
  SELECT @i=0,@num = UPPER(@num)
  while @num<>''
    select @c=ascii(LEFT(@num,1)),
		 @i=case when @c>57
			 then @c-55
			 else @c-48 end *power(@syst,len(@num)-1) +@i,  
		 @num=right(@num,len(@num)-1)
  return @i
END
 


Как в запросе обратится к такой функции?
Нужно преобразование 36->10
p.s. Code from sql.ru
  
Наверх
ICQ  
IP записан
 
steban
1c++ developer
Отсутствует


#define sizeof(x) rand()

Сообщений: 787
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: SUBSTR(1SBLOB.BLOCK,10,VAL(1SBLOB.BLOCK)) НЕ р
Ответ #6 - 24. Ноября 2006 :: 13:56
Печать  
Код
Выбрать все
SELECT ConvSyst10(TRIM(LEFT(BLOCK,9)),16) FROM 1SBLOB 

  

int getRandomNumber()&&{&&  return 4; //chosen by fair dice roll&&         //guaranteed to be random&&}
Наверх
 
IP записан
 
steban
1c++ developer
Отсутствует


#define sizeof(x) rand()

Сообщений: 787
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: SUBSTR(1SBLOB.BLOCK,10,VAL(1SBLOB.BLOCK)) НЕ р
Ответ #7 - 24. Ноября 2006 :: 14:00
Печать  
Только в .prg-файле писать не CREATE FUNCTION а просто FUNCTION
И функция у тебя не совсем фокспрошная Улыбка
  

int getRandomNumber()&&{&&  return 4; //chosen by fair dice roll&&         //guaranteed to be random&&}
Наверх
 
IP записан
 
tav13
1c++ donor
Отсутствует



Сообщений: 108
Местоположение: Donetsk
Зарегистрирован: 22. Мая 2006
Пол: Мужской
Re: SUBSTR(1SBLOB.BLOCK,10,VAL(1SBLOB.BLOCK)) НЕ р
Ответ #8 - 24. Ноября 2006 :: 14:02
Печать  
Ошибка:
FAILED! ICommandText::Execute(): No PARAMETER statement is found.
  
Наверх
ICQ  
IP записан
 
tav13
1c++ donor
Отсутствует



Сообщений: 108
Местоположение: Donetsk
Зарегистрирован: 22. Мая 2006
Пол: Мужской
Re: SUBSTR(1SBLOB.BLOCK,10,VAL(1SBLOB.BLOCK)) НЕ р
Ответ #9 - 24. Ноября 2006 :: 14:13
Печать  
steban писал(а) 24. Ноября 2006 :: 14:00:
И функция у тебя не совсем фокспрошная Улыбка

Понял, буду переделывать.
Спасибо
  
Наверх
ICQ  
IP записан
 
steban
1c++ developer
Отсутствует


#define sizeof(x) rand()

Сообщений: 787
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: SUBSTR(1SBLOB.BLOCK,10,VAL(1SBLOB.BLOCK)) НЕ р
Ответ #10 - 24. Ноября 2006 :: 14:54
Печать  
Код
Выбрать все
FUNCTION ConvSyst10( num AS String, s AS Integer)
	i=0
	num = UPPER(num)
	DO WHILE !EMPTY(num)
		l=len(num)-1
		c=asc(num)
		i=IIF(c>57,c-55,c-48) * s ** l+i
		num=right(num,l)
	ENDDO
	return i
ENDFUNC 


и вызов:
Код
Выбрать все
SELECT *,ConvSyst10(TRIM(LEFT(BLOCK,9)),16) FROM 1SBLOB 

  

int getRandomNumber()&&{&&  return 4; //chosen by fair dice roll&&         //guaranteed to be random&&}
Наверх
 
IP записан
 
steban
1c++ developer
Отсутствует


#define sizeof(x) rand()

Сообщений: 787
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: SUBSTR(1SBLOB.BLOCK,10,VAL(1SBLOB.BLOCK)) НЕ р
Ответ #11 - 24. Ноября 2006 :: 15:08
Печать  
А вообще для скорости надо бы эту ф-ю написать на С++ и скомпильнуть в dll
а из ф-и на фоксе только вызывать экспортную ф-ю dll
  

int getRandomNumber()&&{&&  return 4; //chosen by fair dice roll&&         //guaranteed to be random&&}
Наверх
 
IP записан
 
Uzhast
1c++ power user
Отсутствует



Сообщений: 1341
Зарегистрирован: 30. Августа 2006
Пол: Мужской
Re: SUBSTR(1SBLOB.BLOCK,10,VAL(1SBLOB.BLOCK)) НЕ р
Ответ #12 - 24. Ноября 2006 :: 15:23
Печать  
steban писал(а) 24. Ноября 2006 :: 15:08:
А вообще для скорости надо бы эту ф-ю написать на С++ и скомпильнуть в dll
а из ф-и на фоксе только вызывать экспортную ф-ю dll


Ну, не факт, что это даст сильный прирост скорости. В конце концов, это фокс все-таки (а не 1С какой-то там...) Улыбка
  
Наверх
 
IP записан
 
tav13
1c++ donor
Отсутствует



Сообщений: 108
Местоположение: Donetsk
Зарегистрирован: 22. Мая 2006
Пол: Мужской
Re: SUBSTR(1SBLOB.BLOCK,10,VAL(1SBLOB.BLOCK)) НЕ р
Ответ #13 - 27. Ноября 2006 :: 06:42
Печать  
Функция:
Код
Выбрать все
FUNCTION ConvSyst10(num AS String, syst AS Integer)
	i=0
	c=0
	num=UPPER(num)
DO WHILE !EMPTY(num)
	c=ASC(LEFT(num,1))
	i=IIF(c>57,c-55,c-48) * syst ** (len(num)-1)+i
	num=RIGHT(num,LEN(num)-1)
ENDDO
RETURN i
ENDFUNC 


Вызов:
Код
Выбрать все
SELECT ConvSyst10(TRIM(LEFT(BLOCK,9)),16) FROM 1SBLOB 


Ошибка:
FAILED! IAccessor::GetData(): Произошли ошибки во время выполнения многошаговой операции OLE DB. По возможности, проверьте значения всех состояний OLE DB. Работа не выполнена.
« Последняя редакция: 27. Ноября 2006 :: 07:56 - tav13 »  
Наверх
ICQ  
IP записан
 
tav13
1c++ donor
Отсутствует



Сообщений: 108
Местоположение: Donetsk
Зарегистрирован: 22. Мая 2006
Пол: Мужской
Re: SUBSTR(1SBLOB.BLOCK,10,VAL(1SBLOB.BLOCK)) НЕ р
Ответ #14 - 27. Ноября 2006 :: 08:33
Печать  
Вопрос снят, вот так работает:
Код
Выбрать все
SELECT
 Спр.Descr as Descr,
 ДС.BLOCKNO,
 ДС.Block,
 ConvSyst10(TRIM(LEFT(ДС.BLOCK,9)),16) as N,
 SUBSTR(ДС.BLOCK,10, ConvSyst10(TRIM(LEFT(ДС.BLOCK,9)),16)) as Full
FROM
 $Справочник.Номенклатура as Спр
RIGHT JOIN 1SBLOB as ДС ON ДС.ObjID=Спр.ID
 

  
Наверх
ICQ  
IP записан
 
Переключение на Главную Страницу Страницы: [1] 2 
ОтправитьПечать