Как мне вернуть массив из общедоступного класса Visual FoxPro 9 OLEPUBLIC?
-
20-08-2019 - |
Вопрос
Как новичок в FoxPro (но опытный специалист Clipper), я немного затрудняюсь понять, как вернуть массив из следующего OLEPUBLIC класса. Редактировать:Я изменил код belw, чтобы учесть замечания, сделанные @Stuart ниже.
DEFINE CLASS db AS CUSTOM OLEPUBLIC
DIMENSION ada(1) && public scope for later return
FUNCTION opendb( cpName )
SET MULTILOCKS ON
USE (cpName) EXCLUSIVE NOUPDATE
= CURSORSETPROP("Buffering",5)
RETURN ALIAS()
ENDFUNC
&& etc
FUNCTION getrecord( sAlias, nRecno )
SELECT (sAlias)
GOTO (nRecno)
fc = FCOUNT()
DIMENSION this.ada(fc)
FOR i = 1 TO fc
STORE CURVAL(FIELD(i)) to THIS.ada(i)
ENDFOR
RETURN @THIS.ada
ENDFUNC
ENDDEFINE
Учитывая следующий фрагмент VBScript, я могу нормально открыть файл.Чего я, похоже, не могу сделать, так это вернуть что-нибудь более полезное, чем сообщение об ошибке.
set sp = createobject("sloop.db")
al = sp.opendb("p:\testing\sloop\patient.dbf")
wscript.echo sp.getrecord(al,1)
Это сообщение об ошибке:
c: emp\foo.vbs (3, 1) шлюп.db шлюп.db:.getrecord p: esting\sloop\sloop.prg Ошибка в строке 41 Синтаксическая ошибка.200
Строка 41, как выясняется, является
RETURN @THIS.ada
что действительно странно, поскольку именно такой синтаксис предлагает Microsoft.Есть какие-нибудь зацепки?
Решение
Попробуйте 'return @ada', но массивы VFP никогда не работали должным образом с другими языками, несмотря попытки заставить их сделать это.
Другие советы
(с опозданием на 5 лет, но, возможно, все еще полезный кому-то там ...)
Лучшим вариантом было бы, чтобы ваш код VFP вместо этого создал объект Collection, затем проанализировал массив и добавил все элементы в коллекцию (используя метод .Add()).Затем вы можете передать объект коллекции обратно в VB, который затем с удовольствием поиграет с ним.
Ваш пересмотренный код работает для меня в VFP9SP2 - мне пришлось создавать как EXE, но мне удалось получить доступ к данным из VBScript.
Это был мой код VBScript:
set sp = createobject("stack1.db") ' Different project name
al = sp.opendb("C:\WORK\VFP\DATABASES\DATA\DATA.DBF")
arrData = sp.getrecord(al,1)
msgbox(arrData(1))