Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Foxpro/Clipper/Dbase > добавить поле в курсор


Автор: Artiom 16.6.2006, 09:39
такая ситуация: я считываю некоторые данные через ODBC в курсор, на основании этих данных надо сформировать еще одно поле в курсоре. 
Если я создаю курсор "на лету"
Код

sqlexec(handle, sql_str, 'mycursor')
ALTER TABLE MYCURSOR ADD COLUMN gr C(5)

FoxPro ругается на команду ALTER TABLE (я так понимаю недоступна для курсора).
А если я заранее создаю курсор командой CREATE CURSOR с "лишним" полем и загружаю туда результат запроса. то это поле просто исчезает из структуры.
Сейчас я пробую стянуть из исходных таблиц ненужное поле и приспособить под свои нужды, но если бы такой такой возможности не было - как лучше решать такую проблему? 

Автор: Artiom 16.6.2006, 10:38
а можно ли вообще писать в курсор заполняемый SQLEXEC()? что-то не отрабатывает такой од
Код

sql_kod = SQLEXEC(handle,sql_stat,"mycursor") 
*DISPLAY STRUCTURE

SCAN
    DO CASE
    CASE INLIST(field1, 11,12,15, 21,14)
        gr = 0    
    CASE INLIST(field2,2, 3)
        gr = 1
    OTHERWISE 
        gr = 2
    ENDCASE 
    * gr - поле в курсоре
ENDSCAN 

 

Автор: Cashey 16.6.2006, 11:25
Artiom, мой тебе совет не лезть в эти дебри  smile Работа с удаленными данными это довольно сложная тема. Если уж очень требуется, то юзай класс cursoradapter (доступен с 8-й версии Фокса), только сразу не вешайся. я сам в нем не разобрался до конца smile
По САБЖу, ALTER TABLE с курсорами нормально работает, но ф-ция sqlexec() создает курсор доступный только для чтения. Есть обходные варианты: скопировать курсор в таблицу командой COPY TO и спокойно с ней работать. Или вытащить данные запросом типа:
Код

select * from mycursor into cursor mycursor1 readwrite

Но лучше всего изменить запрос и в нем добавить пустое поле:
Код

sql_str = 'SELECT *, "     " as gr FROM test_table')


Добавлено @ 11:36 
Artiom, запись в таблицу или в курсор осуществляется по средствам команды replace 
Код

sql_kod = SQLEXEC(handle,sql_stat,"mycursor") 
*DISPLAY STRUCTURE
SCAN
    DO CASE
    CASE INLIST(field1, 11,12,15, 21,14)
        replace gr with 0    
    CASE INLIST(field2,2, 3)
       replace gr with 1
    OTHERWISE 
         replace gr with 2
    ENDCASE 
    * gr - поле в курсоре
ENDSCAN 

Но повторяю, этот курсор, созданный SQLEXEC, доступен только для чтения 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)