powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Конвертация General в Memo...
2 сообщений из 2, страница 1 из 1
Конвертация General в Memo...
    #35009211
CTAC-KO
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Привет!

Дело в том, что если я хранил в бд непосредственно файлы, в полях типа Memo, то когда конвертил их на mySQL, то обнаружилось, что там соотв. тип поля может быть TEXT либо BLOB. Попробовал юзать MEDIUMTEXT (mySQL схавал все нормально), но при выборке VFP расчехляет такие данные как CHAR и отрубает от них на показ мне тока первые 255 символов... Тогда я перешел на mySQL на тип поля BLOB. Но при выборке в VFP все оказалось еще интереснее, их он трактует как General. Но зато не режет и приходит там то что надо. Теперь стал вопрос о изъятии данных из General-a этого. Поиски по форуму на эту тему натолкнули на функцию CAST. В итоге наваял в myExecSQL() такую байду:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
lnFCount = AFIELDS(arrFields)
      IF ASCAN(arrFields,"G", 1 ,m.lnFCount, 2 )# 0 
         *MESSAGEBOX("Achtung! General Fields!")
         lsSQLConvStr="SELECT" && в сию переменную соберем конвертационную команду SELECT
         FOR lnF =  1  TO m.lnFCount
             field_name = arrFields(m.lnF, 1 )
             field_type = arrFields(m.lnF, 2 )
             IF field_type = "G"
                lsSQLConvStr = lsSQLConvStr +" "+"CAST(CAST(field_name AS W) AS M) AS "+field_name
             ELSE
                lsSQLConvStr = lsSQLConvStr +" "+field_name
             ENDIF
             IF lnF # lnFCount
                lsSQLConvStr = lsSQLConvStr +","
             ENDIF
         ENDFOR
         lcTempName = "tmp"+SYS( 3 )
         lcTempDBF = SYS( 2023 ) + "\" + m.lcTempName +".dbf"
         lcTempFPT = SYS( 2023 ) + "\" + m.lcTempName +".fpt"
         lsSQLConvStr = lsSQLConvStr + " FROM " + m.lcTempName + " INTO CURSOR " + m.lcCursor + " READWRITE"
         * полученный от SQL-сервера курсор радостно сливаем в загашнег
         COPY TO (lcTempDBF)
         * и теперь его копию оттедова подымаем
         USE (lcTempDBF)
         * исполняем конвертационный SELECT
         &lsSQLConvStr 
         * закрываем конвертированный курсор
         USE IN (m.lcTempName)
         * убиваем его DBF
         ERASE (lcTempDBF)
         * ну и FPT
         ERASE (lcTempFPT)
      ENDIF
lcCursor - имя курсoра в который делается SQL-выборка и передаваемый параметр в функцию myExecSQL(), к примеру myExecSQL('test'). Т.е. по ходу любая выборка пройдет этот ытап и я сменю таки General на необходимый Memo. Вот тока еси бд подвалит большая, а молотить ее будет клиентский "цилик-300", чувствую это может зятянуццо...

Собственно не похвастаццо, а спросить, мож это как-то можно элегантнее замутить, без таких наворотов?
А, да, еще попробовал тупо в хедере таблицы подменить G на M, с помощью HIEW - прошло на ура! Но такой вариант кабы не по-сложнее будет... И так или иначе не обойдеццо без предварительного копирования... с другой стороны обойдеццо без CAST()
...
Рейтинг: 0 / 0
Конвертация General в Memo...
    #35010137
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А не пробовали использовать CursorAdapter и его свойство MapBinary = .T. ?
...
Рейтинг: 0 / 0
2 сообщений из 2, страница 1 из 1
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Конвертация General в Memo...
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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