Вау.. Я думаю, вы делаете это неправильно... Просто выполните простой SQLCONNECT() для базы данных SQL, запустите запрос к источнику данных, хранимой процедуре или чему-то еще, и он будет в курсоре в VFP.. Затем вы можете просто «скопировать» в DBF, и все готово... Что-то вроде
lnH = SQLCONNECT()
(появляется диалоговое окно соединений ODBC).
если бы не это, вы могли бы сделать
lnH = SQLStringConnect("Provider=... for sql server, server name, etc")
потом
if lnH > 0
sqlexec( lnH, "select * from someTableOnServer where whateverConditon", "C_LocalCursor" )
select C_LocalCursor
copy to PermanentTable
sqldisconnect( lnH )
endif
Теперь, если есть столбцы, имена столбцов которых длиннее 10 символов, и вы НЕ используете контейнер базы данных, вам, возможно, придется настроить, либо изменив запрос на GET имена столбцов, либо повторно выбрав данные после того, как они будут локальными, чтобы соответствовать в 10-символьный контекст таблицы, отличный от dbc.
Другим примером построения запроса может быть -- для простоты чтения при наборе текста я использую текст/конечный текст, такой как
text to lcSQLCmd noshow pretext 1+2
select
t1.Column1,
t1.AVeryLongColumnName as AVLColName,
t1.AnotherLongColumn2 as ALC2,
t1.SomeFlag,
t2.ColumnFromAnotherTable as CFATbl,
t2.AnotherCol
from
SQLDatabase.dbo.SQLTable1 t1
join SQLDatabase.dbo.SQLTable2 t2
on t1.SomeKey = t2.SomeKey
where
t1.SomeCriteria = 'whatever'
order by
t1.SomeFlag
endtext
*/ Then, to "clean up" the string for VFP to pass properly,
*/ strip out the cr/lf from the text such as
lcSQLCmd = chrtran( lcSQLCmd, chr(13)+chr(10), "" )
*/ THEN, pass this command through sqlexec()
sqlexec( lnH, lcSQLCmd, "C_LocalCursor" )
Во-вторых, очевидно, НАМНОГО легче читать то, что вы пытаетесь получить, и обратите внимание, что я также предварительно сократил длинные имена столбцов до 10-символьного предела имени столбца VFP, отличного от DBC. Затем просто скопируйте, как в первом примере.
person
DRapp
schedule
19.09.2012