這是一個園長學習VFP(Visual Foxpro)的Blog歡迎同好一起來參與

星期三, 4月 21, 2010

如何顯示正確的總筆數

為何不用reccount()?
因為這個函式會將做刪除標記的記錄計算進來,
為了解決這個問題,所以寫了一個函式

Function WRECCOUNT
    Lparameters p_alias
    Local wret
    wret=0
    *20080617 修改 !! 修正計算後指標會跑到最後一筆的情況
    If Empty(p_alias)
        p_alias=Alias()
    Endif
    Select Count(*) From (p_alias) Where !Deleted() Into Array nodelrec
    If !Empty(nodelrec)
        wret=nodelrec[1]
    Endif
    Return wret
Endfunc

使用Select 的語法,計算沒有標記刪除記號的記錄,結果放到矩陣中

星期二, 4月 20, 2010

如何檢查是否為正確的DBF檔

一般我們use非DBF時會跳出系統的錯誤訊息,但我們並非都需要這個訊息,
要檢視特定檔案是否為DBF檔,我使用Try …Catch To 語法來攔截系統錯誤
很多類似的檢測手法都可以當它做範本
範例如下:

*傳入要測試的dbf檔,測試是否可開啟,可傳回>0之筆數,否傳回-1
Function chk_dbf
    Lparameters p_bf,p_no_show_msg
    Local ret,walias,OERR
    ret=-1
    If !Empty(p_bf)
        If !File(p_bf)
            If At(p_bf,'\')>0    &&有路徑
                If Empty(p_no_show_msg)
                    =chk_err(p_bf+" 不存在!")
                Endif
                Return ret
            Endif
        Endif
        Try
            Select 0
            Use (p_bf) Shar Again
            walias=Alias()
        Catch To OERR
            If Empty(p_no_show_msg)
                =chk_err(p_bf+" 不是資料庫,或已損壞")
            Endif
        Endtry
        If Type("oErr")<>'O'
            If Used(walias)
                Select &walias
                ret=Reccount()
                Use
            Endif
        Endif
    Endif
    Return ret
Endfunc

星期六, 4月 10, 2010

使用odbc匯入excel檔案

 

匯入EXCEL到VFP中有很多方法,但若使用VFP的APPEND FROM …TYPE XLS8,或IMPORT FROM … TYPE XL8

皆只能支援到 EXCEL5.0 ,但現在版本都已經到EXCEL12.0了

所以只能將EXCEL另存成EXCEL5.0的格式再轉入,現在介紹的這個方法,可以直接匯入新版本的EXCEL檔

imp_file="要匯入的EXCEL檔名(包含路徑)"
*
lcMDBName=Substr(imp_file,Rat('\',imp_file)+1,Len(imp_file)-Rat('\',imp_file))   

lcMDBDir=Substr(imp_file,1,Rat('\',imp_file))

* for vista    
*Microsoft Excel Driver (*.xls);DriverId=790;DefaultDir=C:\;DBQ=testbook.xls
lcCnStr =;
'DRIVER=Microsoft Excel Driver (*.xls);'+;
'DriverId=790;'+;
'DefaultDir='+Substr(imp_file,1,Rat('\',imp_file))+';'+;
'DBQ='+Substr(imp_file,Rat('\',imp_file)+1,Len(imp_file)-Rat('\',imp_file))
*   
nCon = Sqlstringconnect( lcCnStr )
If nCon<0    &&連線失敗
    =chk_err("不是正確的來源檔(*.xls)")
    Return .F.
ELSE
   lcSQL = "SELECT * FROM [sheet1$]"
   lnError = SQLExec( nCon, lcSQL ,'tmp_xls')
   IF lnError = 1  &&取檔成功
         SELECT tmp_xls
         BROWSE
   ENDIF
ENDIF
= SQLDISCONNECT(nCon)

匯入ACCESS資料表到VFP

VFP內建可以匯入如CSV,TXT,XLS等格式,但並無提供匯入ACCESS資料表的功能
這裏提供匯入的方式給各位參考:

*檢查是否為 合法之 mdb 檔案
lcMDBName=Substr(imp_mdb,Rat('\',imp_mdb)+1,Len(imp_mdb)-Rat('\',imp_mdb))    && a:\abcde\xxx.mdb
lcMDBDir=Substr(imp_mdb,1,Rat('\',imp_mdb))
*
wpt='50'
wbuf='2048'

*vista相容
lcCnStr =;
    'DRIVER=Microsoft Access Driver (*.mdb);'+;
    'UID=admin;'+;
    'UserCommitSync=Yes;'+;
    'Threads=3;'+;
    'SafeTransactions=0;'+;
    'PageTimeout=5;'+;
    'MaxScanRows=8;'+;
    'MaxBufferSize=2048;'+;
    'FIL=MS Access;'+;
    'DriverId=281;'+;
    'DefaultDir='+Substr(imp_mdb,1,Rat('\',imp_mdb))+';'+;
    'DBQ='+Substr(imp_mdb,Rat('\',imp_mdb)+1,Len(imp_mdb)-Rat('\',imp_mdb))
*
*WAIT lcCnStr windows

nCon = Sqlstringconnect( lcCnStr )
If nCon<0    &&連線失敗
    =chk_err("不是正確的來源檔(*.mdb)")
    Return .F.
Endif
*
SQLTables( nCon, ['TABLE'], 'MDB_Tables' )    &&取出資料表到 MDB_Tables

經過以上的動作,即可把MDB裏的資料表抓到VFP使用