Тема: VLISP-DBF

Прошу консультацию у профи! Проблема в следующем:
Есть большая необходимость сделать приложение на VLisp, работающее со свободными таблицами VFP6.0 . Почитал я архив конфы и огорчился - получается, что вроде и нет хорошего механизма взаимодействия между ними. В одной теме говорилось, что с VBA не стоит связываться и лучше писать свои DLL. К сожалению, мне не по силам. Я не плохо знаю VFP, лет пять назад писал на AutoLisp для ACAD12 (rus). Подскажите, есть ли какое-нибудь решение этой проблемы (кроме передачи данных через текстовые файлы) и есть ли литература на эту тему?
Заранее благодарен всем ответившим.

Re: VLISP-DBF

На VBA - элементарно, через ADO. Ничего сложного.

Re: VLISP-DBF

Это конечно радует, что оказывается все так просто. А можно какую-нибудь ссылку на литературу, желательно русскоязычную.

Re: VLISP-DBF

В общем виде решается через COM-технологии. Это, собственно, и делает программа на VBA. Только VBA-программисты об этом не всегда знают.

То же может сделать любая программа, умеющая работать с ActiveX. Не знаю, можно ли это делать именно на VFP. Все-таки она делает "не настоящие" программы. Лучше писать прогграммы работы с БД на VC++ или Delphi. Delphi лучше, потому, что гораздо больше превосходных компонентов. VC++ лучше, потому что можно использовать ObjectARX.

Использовать можно любые движки баз данных и любые форматы. Здесь большой разброс вкусов и мнений. Лично я критически отношусь именно к DBF, да еще в версии VFP (хотя много лет работал с  фоксом, и накопил множество БД). Устарело это уже.

Можно использовать и другие БД, в том числе с прямым доступом. Без ADO, ODBC, BDE и прочего.

А вот насчет передачи данных без файлов - можно, но не очень надежно. Теоретически хорошо, практически - много проблем. Слишком все привязано к перспективным, но пока не надежным "решениям Microsoft". Да и Автокад пока, как COM-сервер, сыроват.   А обработка файла позволяет предусмотреть любые ситуации.

Re: VLISP-DBF

> To
ShaggyDoc
Если я правильно понял, то обмен данными между VFP и VLisp через текстовые файлы не есть атавизм и, так сказать, имеет право на существование не только в досях, но и в винде?
И возвращаясь к первому вопросу - всетаки какая есть толковая литература по этому вопросу?

Re: VLISP-DBF

привожу пример работы с mdb через ADO думаю точно также на фоксе

(setq PathADO (VL-REGISTRY-READ "HKEY_CLASSES_ROOT\\ADODB.Command\\CLSID"))
   (setq PathADO (VL-REGISTRY-READ (strcat "HKEY_CLASSES_ROOT\\CLSID\\" PathADO "\\InprocServer32")))
   (setq gADO-DLLpath PathADO)
   (if (/= gADO-DLLpath nil)(if (null (findfile gADO-DLLpath))(progn(alert (strcat "Cold not load ADO type library from: " gADO-DLLpath))(exit))))
   ;; Import the ADO type library
   ;; Note: We must provide prefixes for these methods and properties because some conflict
   ;; with protected LISP symbols such as APPEND().
   (if (null adok-adStateOpen)       ; Check that ADO type library has not yet been loaded.
       (vlax-import-type-library :tlb-filename gADO-DLLpath
            :methods-prefix "adom-"
        :properties-prefix "adop-"
        :constants-prefix "adok-"))
   (if rs (if (/= adok-adStateClosed (vlax-get-property rs "State"))(vlax-invoke-method rs "CLOSE")))
   (setq rs nil)    ; In VBA, setting recordSet to 'Nothing' disconnects. Not needed in LISP?
   (setq rs (vlax-create-object "ADODB.Recordset"))
   (setq FullNameMDB (vl-string-subst "mdb" "dwg" FullName))

(cmdConnectDataSource_Click FullNameMDB)
   (AddNewRecordInTable_TablSetIzdelie)
   (disconnectADOConnect)

;;;--------------------------------------------------------------------;
; Удаление записей                                                     
;;;--------------------------------------------------------------------;
(defun delRecordInBase (rs /
               )
   (while (not (equal :vlax-true (vlax-get-property rs "EOF")))
     (vlax-invoke-method rs "Delete" 1)
     (vlax-invoke-method rs "UpdateBatch" 1)
     (vlax-invoke-method rs "MoveNext")
   )
   (if rs (if (/= adok-adStateClosed (vlax-get-property rs "State"))(vlax-invoke-method rs "CLOSE")))
   (setq rs nil) 
)

;;;--------------------------------------------------------------------;
;;; Connect to the datasource and table for this linkTemplate.         ;
;;; Display the ADODB Connection object's Version and Provider info.   ;
;;;--------------------------------------------------------------------;
(defun cmdConnectDataSource_Click (FullNameMDB /
                   currConnectionString
                  )
   
   (if adoConnect
       (if (= adok-adStateOpen (vlax-get-property ADOConnect "State"))
      (vlax-invoke-method ADOConnect "Close")))
   (setq ADOConnect nil)
   (setq ADOConnect (vlax-create-object "ADODB.Connection")) ; ADOConnect is a global
   (setq currConnectionString (strcat "Data Source=" FullNameMDB ";User ID=;Password=;" ))
   (vlax-put-property ADOConnect "ConnectionString" currConnectionString)
   (vlax-put-property ADOConnect "Provider" "Microsoft.Jet.OLEDB.4.0")
   (vlax-put-property ADOConnect "Mode" 3)
   (vlax-invoke-method ADOConnect "Open" currConnectionString "" "" -1) ; LISP seems to require args which should be optional...
)
;;;--------------------------------------------------------------------;
;;; Closes the open ADODB.RecordRet, rs and ADODB.Connection, ADOConnect
;;;--------------------------------------------------------------------;
(defun disconnectADOConnect ()
   (if rs (if (/= adok-adStateClosed (vlax-get-property rs "State"))(vlax-invoke-method rs "CLOSE")))
   (setq rs nil)
   (if adoConnect (if (= adok-adStateOpen (vlax-get-property ADOConnect "State"))(vlax-invoke-method ADOConnect "Close")))
   (setq adoconnect nil)
)
;;;--------------------------------------------------------------------;
;; Query database and get linked rows through ADO                      ;
;;;--------------------------------------------------------------------;
(defun QweryADOConnect (Qwery /
            cmd
               )
   (setq cmd (vlax-create-object "ADODB.Command"))
   (vlax-put-property cmd "ActiveConnection" ADOConnect)
   (vlax-put-property cmd "CommandTimeout" 30)
   (vlax-put-property cmd "CommandText" Qwery)
   (if (/= adok-adStateClosed (vlax-get-property rs "State"))(vlax-invoke-method rs "CLOSE"))
   (setq rs nil)        ; In VBA, setting recordSet to 'Nothing' disconnects. Not needed in LISP?
   (setq rs (vlax-create-object "ADODB.Recordset"))
   (vlax-invoke-method rs "OPEN" cmd nil adok-adOpenDynamic adok-adLockBatchOptimistic adok-adCmdUnknown) ;adok-OpenForwardOnly adok-adLockReadOnly adok-adCmdUnknown) ;
)

;;;--------------------------------------------------------------------;
; Добавляю запись в таблицу TablSetIzdelie                             
;;;--------------------------------------------------------------------;
(defun AddNewRecordInTable_TablSetIzdelie (/
                       cmd
                       i
                       NameFields
                       ValueFields
                       List1
                       List2
                      )
   (setq cmd (vlax-create-object "ADODB.Command"))
   (vlax-put-property cmd "ActiveConnection" ADOConnect)
   (vlax-put-property cmd "CommandTimeout" 30)
   (vlax-put-property cmd "CommandType" 2)
   (vlax-put-property cmd "CommandText" "TablSetIzdelie")
   (if (/= adok-adStateClosed (vlax-get-property rs "State"))(vlax-invoke-method rs "CLOSE"))
   (setq rs nil)        ; In VBA, setting recordSet to 'Nothing' disconnects. Not needed in LISP?
   (setq rs (vlax-create-object "ADODB.Recordset"))
   (vlax-invoke-method rs "OPEN" cmd nil adok-adOpenDynamic adok-adLockBatchOptimistic adok-adCmdUnknown) ;adok-OpenForwardOnly adok-adLockReadOnly adok-adCmdUnknown) ;
   (setq NameFields (vlax-make-safearray vlax-vbVariant (cons 0 4))
    ValueFields (vlax-make-safearray vlax-vbVariant (cons 0 4))
    i 0
    List1 (list "1" "2" "3" "4" "5")
    List2 (list (cdr(assoc "1" ListData))
            (cdr(assoc "16" ListData))
            (cdr(assoc "19" ListData))
            (cdr(assoc "65" ListData))
            (cdr(assoc "4" ListData))))
   (repeat 5
     (vlax-safearray-put-element NameFields i (nth i List1))
     (vlax-safearray-put-element ValueFields i (nth i List2))
     (setq i (1+ i))
   )
   (vlax-invoke-method rs "AddNew" NameFields ValueFields)
   (vlax-invoke-method rs "UpdateBatch" 1)
   (setq thisCount (vlax-variant-value
            (vlax-get-property
              (vlax-get-property
            (vlax-get-property rs "Fields") "item" 0) "Value")))
)


если не все понятно пишите, а вообще открывайте хелп по ADO и все сразу станет ясно :о)

Re: VLISP-DBF

К сожалению я совершенно незнаком с ADO. И где взять хелп?

Re: VLISP-DBF

www.microsoft.com ... скачивай в разделе download MSADO, по моему последняя версия - 2.7 там все есть в том числе и хелп.