|
слияние полей таблицы dbf
|
|||
---|---|---|---|
#18+
Есть таблица в 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 ... |
|||
:
Нравится:
Не нравится:
|
|||
07.01.2010, 00:10 |
|
слияние полей таблицы dbf
|
|||
---|---|---|---|
#18+
В FoxPro размерность полей результирующего курсора определяется еще ДО выполнения собственно запроса путем вычисления выражений по первой попавшейся записи. Если в первой записи результат был длиной 57 символов, то соответствующее поле получит размерность C(57) вне зависимости от того, сколько символов будет в других записях. Поэтому, необходимо ЯВНО указать размерность итогового поля. Либо через функцию CAST(... as C(230) ) - введена только в VFP9, либо, для младших версий FoxPro, через функцию PADR(...,230) Кстати, в данном случае, вместо evaluate() можно использовать val(), поскольку здесь надо просто преобразовать символьную строку в число. Что, собственно, и делает val() Кроме того, в среде FoxPro символьные строки можно не только складывать, но и вычитать. Операция вычитания символьных строк работает также, как и сложение, но все концевые пробелы КАЖДОГО слагаемого переносятся в конец итоговой строки. Сравни Код: plaintext 1. 2.
Т.е. вместо RTRIM() можно просто использовать вычитание. Ну, и вместо подзапросов, проще использовать LEFT JOIN В результате имеем Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10.
... |
|||
:
Нравится:
Не нравится:
|
|||
07.01.2010, 17:15 |
|
|
start [/forum/search_topic.php?author=MikeCr.&author_mode=last_posts&do_search=1]: |
0ms |
get settings: |
9ms |
get forum list: |
13ms |
get settings: |
11ms |
get forum list: |
14ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
52ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
49ms |
get tp. blocked users: |
2ms |
others: | 758ms |
total: | 931ms |
0 / 0 |