VFP下客戶機訪問任意映射服務(wù)器的方法

字號:

在開發(fā)網(wǎng)絡(luò)多用戶應(yīng)用系統(tǒng)時,VFP的程序員常采用如下方法:將1個或多個數(shù)據(jù)庫(.DBC及.DBF)作為共享資源放在1臺或多臺NOVELL,WIN-NT(或在WIN9X對等網(wǎng)上所設(shè)定)的服務(wù)器上,應(yīng)用程序及臨時文件放在本地客戶的機WIN9X環(huán)境下,在客戶機上開發(fā)時將本機對這些服務(wù)器訪問盤符預先映射成指定的F:(H:..)等。最后編譯成.EXE文件生成安裝系統(tǒng)安裝到每臺客戶機上。
    ---- 實際應(yīng)用中局域網(wǎng)內(nèi)各客戶機因本身盤符數(shù)量的原因,對這指定的1臺或多臺服務(wù)的映射盤符可能并不是開發(fā)機上的F:(H:)。這時麻煩來了,程序一運行,屏幕提示“‘定位數(shù)據(jù)庫’—‘初始化臨時表對象時發(fā)生錯誤。找不到F:…???.DBC’” 。如果整個應(yīng)用軟件有.DBC庫表和各種自由表,又有許多表單組成,此時讓用戶去定位數(shù)據(jù)庫或自由表在什么位置,簡直是不可能的。
    ---- 筆者是這樣解決這個問題的(大致方法如下):
    ---- 1. 建立一個包含文件:如info.h
    #include DBCname1_loc drv1_loc+’\citicmis1.dbc’
    ;服務(wù)器1上的庫1
    #include DBCname2_loc drv2_loc+’\citicmis2.dbc’;
    服務(wù)器2上的庫2
    #include DBCusrinf_loc drv1_loc+’\citicmis1!usrinf.dbf’
    ;庫1中表
    #include DBCEMP_loc drv2_loc+’\citicmis2!emp.dbf ‘ ;
    庫2中的表
    #include dbcjgbh_loc drv1_loc+’\rsc\jgbh.dbf’;
    庫中表或自由表
    ---- 2. 在應(yīng)用系統(tǒng)的某目錄中建文本文件:如.\bmp\serdrv.txt, 內(nèi)有二行文本
    F:\acc ;某客戶機對第1臺服務(wù)器的映射盤符
    H:\acc ;某客戶機對第2臺服務(wù)器的映射盤符
    ---- 3. 在軟件的主程序main.prg中 建全局變量 drv1_loc,drv2_loc,一開始就用低級文件操作命令fopen,fget等將serdev.txt中的二行 f:\acc,h:\acc分別讀入并賦值給drv1_loc,drv2_loc。
    ---- 4. 應(yīng)用軟件中的表單或其他過程都包含info.h 文件。
    ---- 4.1 對于自由表:
    ---- 可在表單的LOAD 事件中 用如 use (dbcjgbh_loc) in 0 alia jgbh shar打開表,在UNLOAD事件中用 USE in jgbh 關(guān)閉表。
    ---- 4.2 對于數(shù)據(jù)庫的表:
    ---- 可在表單設(shè)計時的數(shù)據(jù)環(huán)境中打開表(如打開了 usrinf.dbf,emp.dbf),此事 數(shù)據(jù)環(huán)境中的 Dataenvironmnet.cursor?.database屬性 自動設(shè)定為所在的服務(wù)器的數(shù)據(jù)庫,如本例為 f:\acc\citicmis1.dbc,h:\acc\citicmis2.dbc 。
    ---- 這時可以在Dataenvironmnet對象的 BeforeOpenTables 方法中寫入如下代碼:
    ---- This.Cursor1.database=DBCNAME1_LOC
    ---- This.Cursor2.database=DBCNAME2_LOC 就可解決問題。
    ---- 以上方法生成的.EXE系統(tǒng),安裝到各客戶機上后,只要修改各客戶機的.\bmp\serdrv.txt中為實際對服務(wù)器盤符指向就能使用應(yīng)用系統(tǒng)運行自如了!用此方法開發(fā)的系統(tǒng)已在筆者所在系統(tǒng)各單位的WIN9X對WIN9X,WIN9X對NOVELL服務(wù)器,VFP6.0環(huán)境中運行著!