Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / слияние полей таблицы dbf / 3 сообщений из 3, страница 1 из 1
07.01.2010, 00:10
    #36399537
GamalPaperot
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
слияние полей таблицы dbf
Есть таблица в 1С для записи длинных строк - 1SBLOB.DBF
Данные хранятся блоками по 80 символов, блоки нумеруются с 0
В нулевом блоке первые 9 символов - длина строки в 16-ричном коде
Я пытаюсь слить строки в одном запросе, но почему то получается длина максимум 57 символов, а может реально быть (максимум 3 блока) 230 символов.
По отдельности каждый элемент запроса выполняется правильно, а результат ...

*-- кусочек кода
CLOSE ALL
USE cPathSource + "1SBLOB.DBF" IN 0 SHARED AGAIN ALIAS FULLNAME && полное имя контрагента
*-- fieldid=" 3E" - мои данные
SELECT a.objid, LEFT(a.block,9) as "bLen", ;
SUBSTR(((RTRIM(SUBSTR(a.BLOCK,10))+RTRIM(NVL((SELECT block FROM FULLNAME WHERE fieldid=" 3E" AND objid=a.objid AND blockno=1)," "))+ ;
RTRIM(NVL((SELECT block FROM FULLNAME WHERE fieldid=" 3E" AND objid=a.objid AND blockno=2)," ")))),1,eval("0x"+LEFT(a.block,3))) as "full_str" ;
FROM FULLNAME a WHERE a.fieldid=" 3E" AND a.blockno=0 INTO CURSOR x0 READWRITE

*-- отдельно взятая строка <eval("0x"+LEFT(a.block,3))> даёт правильный результат, а в выборке не работает

разделять на пару запросов нежелательно, надо в одном всё сделать, важно получить лишь два поля
objid и full_str
...
Рейтинг: 0 / 0
07.01.2010, 17:15
    #36400041
ВладимирМ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
слияние полей таблицы dbf
В FoxPro размерность полей результирующего курсора определяется еще ДО выполнения собственно запроса путем вычисления выражений по первой попавшейся записи. Если в первой записи результат был длиной 57 символов, то соответствующее поле получит размерность C(57) вне зависимости от того, сколько символов будет в других записях.

Поэтому, необходимо ЯВНО указать размерность итогового поля. Либо через функцию CAST(... as C(230) ) - введена только в VFP9, либо, для младших версий FoxPro, через функцию PADR(...,230)

Кстати, в данном случае, вместо evaluate() можно использовать val(), поскольку здесь надо просто преобразовать символьную строку в число. Что, собственно, и делает val()

Кроме того, в среде FoxPro символьные строки можно не только складывать, но и вычитать. Операция вычитания символьных строк работает также, как и сложение, но все концевые пробелы КАЖДОГО слагаемого переносятся в конец итоговой строки. Сравни

Код: plaintext
1.
2.
?("a  " - "b  ") +"1"
?("a  " + "b  ") +"1"

Т.е. вместо RTRIM() можно просто использовать вычитание.

Ну, и вместо подзапросов, проще использовать LEFT JOIN

В результате имеем

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
Select ;
	a.objid, ;
	LEFT(a.block, 9 ) as "bLen", ;
	Padr(Left(Left(a.block, 10 ) - Nvl(b.block,"") - Nvl(c.block,""), ;
			Val("0x"+Left(a.block, 3 ))), 230 ) as full_str ;
FROM FULLNAME a ;
LEFT JOIN FULLNAME b ON b.objid=a.objid and b.fieldid=" 3E" AND b.blockno= 1  ;
LEFT JOIN FULLNAME c ON c.objid=a.objid and c.fieldid=" 3E" AND c.blockno= 2  ;
INTO CURSOR x0 READWRITE ;
WHERE a.fieldid=" 3E" AND a.blockno= 0  
...
Рейтинг: 0 / 0
12.01.2010, 11:41
    #36404858
GamalPaperot
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
слияние полей таблицы dbf
Спасибо, ВладимирМ.
Всё получилось, вообще то я делал подобную конструкцию, но пытался её тримить в этом же селекте и, естественно, получался облом.
...
Рейтинг: 0 / 0
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / слияние полей таблицы dbf / 3 сообщений из 3, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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