VFP 愛用者社區 首頁 VFP 愛用者社區
本討論區為 Visual Foxpro 愛用者經驗交流的地方, 請多多利用"搜尋"的功能, 先查看看有無前例可循, 如果還有不懂的再發問. 部份主題有附加檔案, 須先註冊成為社區居民才可以下載.
 
 常見問題常見問題   搜尋搜尋   會員列表會員列表   會員群組會員群組   會員註冊會員註冊 
 個人資料個人資料   登入檢查您的私人訊息登入檢查您的私人訊息   登入登入

廣域網路上的造字同步管理

 
發表新主題   回覆主題    VFP 愛用者社區 首頁 -> VFP 討論區
上一篇主題 :: 下一篇主題  
發表人 內容
ckp6250



註冊時間: 2004-07-30
文章: 1642


第 1 樓

發表發表於: 星期六 五月 12, 2012 6:04 pm    文章主題: 廣域網路上的造字同步管理 引言回覆

感謝版友諸多協助,寫下簡單的廣域網路上造字同步管理,請指教!

代碼:

Local cPublicUsrFontsPath , N , i , vPage , vCode , vEuc , vUrl , vGetFontsCount , vShareFontsCount , MySqlHandle , vSqlCmd , vLastGetNo

=SQLDisconnect(0)

Set Library To vfpconnection.Fll Additive &&利用 vfpconnection 的下載功能,本 fll 請自行至該網站 http://www.sweetpotatosoftware.com/home.htm 下載
cPublicUsrFontsPath = SystemPath+"\系統工具箱\中文全字庫\CNSFonts\Default\" &&區域網路上共享造字檔之資料夾,請自行定義

*!*   資料庫主機定義
cSqlserver = 'xxx.xxx.xxx.xxx'
cSqlType = "MySql" &&資料庫型態,可自行更換
MySqlDriver = "MySql ODBC 5.1 Driver"
cSqlUser = 'xxx'
cSqlPwd = 'xxx'
cSqlDataBase = 'cnsfonts' &&造字記錄資料庫名稱
cSqlCnsTable = 'share' &&造字記錄檔名稱
cSqlOption = '2563' && MySql 專用

If File(Getenv("ProgramFiles")+"\CNSFontTools\ManageTools\cnspkgui.exe") &&有安裝中文全字庫
   vGetFontsCount = 0 &&取得共享之造字檔
   vShareFontsCount = 0 &&分享予他人之造字檔數量
   *!*   讀取本機已安裝之字型檔
   Create Cursor LocalCNSFonts (Unicode C(4),CNS11643 C(10) ,EUC C(8) ,倉頡碼 C(20) ,注音碼 C(20))
   If File("c:\CNSFonts\EUDC_LOG.CSV")
      Append From C:\CNSFonts\EUDC_LOG.Csv Type Csv &&讀取 Log 檔,以便得知本機已安裝了那幾個字
   Endif
   *!*   讀取遠端主機上已記錄之字型檔
   MySqlHandle = GetSqlConnect(cSqlType , cSqlserver , cSqlUser ,  cSqlPwd , cSqlDataBase ,cSqlOption)
   If MySqlHandle<0
      =SQLDisconnect(0)
      Release MySqlHandle
      Messagebox("登入失敗",16,"登入作業")
   Else
      vLastGetNo = '0' &&上回抓取的最後號碼
      If File('c:\CNSFonts\LastGetNo.txt')
         vLastGetNo = Filetostr('c:\CNSFonts\LastGetNo.txt')
      Endif
      nFlag = SQLExec(MySqlHandle , "select * from &cSqlCnsTable where autoinc_id > &vLastGetNo order by autoinc_id desc","RemoteCNSFonts")
      If nFlag <> -1
         *!* 遠端有但本機沒有的字予以下載及安裝
         Strtofile(Transform(RemoteCNSFonts.autoinc_id),'c:\CNSFonts\LastGetNo.txt') &&記錄本次抓取之筆次,以利下回再抓取時做為判斷之用
         Select * ;
            FROM RemoteCNSFonts ;
            WHERE ! EUC In (Select EUC From LocalCNSFonts) ;
            INTO Cursor Tmp

         If _Tally>0
            If ! Directory(cPublicUsrFontsPath) &&若無共享資料夾,則先建立之
               Try
                  Mkdir(cPublicUsrFontsPath)
               Catch To oErr

               Endtry
            Endif

            Scan
               vPage = Left(CNS11643,At('-',CNS11643)-1) &&頁面
               vCode = Trim(Substr(CNS11643,At('-',CNS11643)+1)) &&編碼
               vEuc = cPublicUsrFontsPath+Trim(EUC)+".cnspkg" &&檔名
               vUrl = "http://www.cns11643.gov.tw/AIDB/cnspkg.do?page="+vPage+"&"+"code="+vCode &&下載網�}
               If !File(vEuc)
                  HTTPGet(vUrl, vEuc) &&下載造字檔至共用資料夾
               Endif
               Opendoc(vEuc) &&安裝共享之造字
               Wait "載入:"+EUC Window Timeout 1 && 延遲秒數,依電腦執行速度而定,老舊電腦請�[大秒數
               oWS = Createobject( "WScript.Shell" ) &&自動按�[入及完成按鈕,以便自動化作業
               oWS.AppActivate( "造字轉入及列印" )
               oWS.SendKeys( "{ENTER}"+ "{ENTER}" )
               Release oWS
               vGetFontsCount = vGetFontsCount + 1
               Wait "完成:"+EUC Window Timeout 1   && 延遲秒數,依電腦執行速度而定,老舊電腦請�[大秒數
            Endscan
         Endif
         Wait Clear
         *!* 本機有但遠端沒有的字予以登載
         Select * ;
            FROM  LocalCNSFonts ;
            WHERE ! EUC In (Select EUC From RemoteCNSFonts) ;
            INTO Cursor Tmp
         If _Tally>0
            vSqlCmd = ""
            Scan
               TEXT TO vSqlCmd NOSHOW ADDITIVE TEXTMERGE PRETEXT 7
                  INSERT IGNORE INTO <<cSqlCnsTable>> (Unicode,CNS11643,EUC,倉頡碼,注音碼) VALUES
                  ("<<Tmp.Unicode>>","<<TRIM(Tmp.CNS11643)>>","<<Tmp.EUC>>","<<TRIM(Tmp.倉頡碼)>>","<<TRIM(Tmp.注音碼)>>") ;
               ENDTEXT
               vShareFontsCount = vShareFontsCount + 1
            Endscan
            SQLExec(MySqlHandle , vSqlCmd )
         Endif
         If vGetFontsCount + vShareFontsCount>0
            Messagebox("新增:"+Transform(vGetFontsCount)+" 字"+Chr(13)+"分享:"+Transform(vShareFontsCount)+" 字"+Iif(vGetFontsCount>0,Chr(13)+'重新�}機後,新增之造字才能使用。',''),64,"廣域網路造字同步作業報告")
         Endif
      Endif
      Return
   Endif
Endif
Close Databases All
Return



Function Opendoc(tcDocument,IsShowWindow)
   If Pcount()<2
      IsShowWindow = 1 && 0.表示隱藏 1正常方式 2最小化方式 3最大化方式。
   Endif

   Local lnResult

   Declare Integer ShellExecute ;
      IN SHELL32.Dll ;
      INTEGER nWinHandle, ;
      STRING cOperation, ;
      STRING cFileName, ;
      STRING cParameters, ;
      STRING cDirectory, ;
      INTEGER nShowWindow

   **retreive the main VFP window handle (this handle is used by ShellExecute)

   Declare Integer FindWindow ;
      IN WIN32API ;
      STRING cNull, ;
      STRING cWinName

   lnResult=ShellExecute(FindWindow( 0, _Screen.Caption), "Open", tcDocument, "", "", IsShowWindow)

   **Error messages if the return value is < 32
   If lnResult < 32
      Do Case
         Case lnResult=2
            Wait Wind "Invalid association or URL..."+tcDocument
         Case lnResult=31
            Wait Wind "找不到�}啟這個檔案的�{式..."+tcDocument
         Case lnResult=29
            Wait Wind "Can't start application."
         Case lnResult=30
            Wait Wind "Application already open."
      Endcase
   Endif

Endfunc

Function GetSqlConnect
   Parameters cSqlType , cSqlserver , cSqlUser , cSqlPwd , cSqlDataBase , cSqlOption
   Local cSqlDriver,cNetLib,nSqlHandle,cSqlstring
   nSqlHandle=0
   Do Case
      Case   cSqlType = "MySql"
         cSqlstring="DRIVER={"+cMySqlDriver+"};SERVER="+cSqlserver+";UID="+cSqlUser+";PWD="+cSqlPwd+";DATABASE="+cSqlDataBase+";STMT=set names big5;CLIENT_MULTI_STATEMENTS;CLIENT_MULTI_RESULTS;CLIENT_ODBC;OPTION=67108864;charset=big5"
      Case   cSqlType = "MsSql"
         cSqlstring = ("driver=SQL Server;Server=&cSqlserver;Uid=&cSqlUser;pwd=&cSqlPwd;database=&cSqlDataBase")
      Case  cSqlType = "PgSql"
         cSqlstring = ("driver=&cSqlDriver;Server=&cSqlserver;Uid=&cSqlUser;pwd=&cSqlPwd;database=&cSqlDataBase")
   Endcase
   =SQLSetprop(0,"DispLogin",Iif( Empty( cSqlUser) .Or. Empty(cSqlPwd),2,3))            &&  1.視情況提示登入框     2.顯示登入框     3.永不顯示登入框
   =SQLSetprop(0, "DispWarnings", .T.) &&.F.不顯示警告訊息       .T. 顯示警告訊
   =SQLSetprop(0, "PacketSize", 16384 )
   nSqlHandle = Sqlstringconnect(cSqlstring)
   Return nSqlHandle



1.採用資料庫來記錄全國各台電腦的造字而不採用簡單文字檔來記錄,主要是為了避免重覆.
2.資料表的格式如下:

代碼:

CREATE TABLE `share` (
   `unicode` CHAR(4) NOT NULL,
   `cns11643` VARCHAR(10) NOT NULL,
   `euc` VARCHAR(8) NOT NULL,
   `倉頡碼` VARCHAR(10) NOT NULL,
   `注音碼` VARCHAR(10) NOT NULL,
   `autoinc_id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
   PRIMARY KEY (`euc`),
   UNIQUE INDEX `autoinc_id` (`autoinc_id`)
)
COLLATE='utf8_general_ci'
ENGINE=MyISAM
回頂端
檢視會員個人資料 發送私人訊息 參觀發表人的個人網站
從之前的文章開始顯示:   
發表新主題   回覆主題    VFP 愛用者社區 首頁 -> VFP 討論區 所有的時間均為 台北時間 (GMT + 8 小時)
1頁(共1頁)

 
前往:  
無法 在這個版面發表文章
無法 在這個版面回覆文章
無法 在這個版面編輯文章
無法 在這個版面刪除文章
無法 在這個版面進行投票
無法 在這個版面附加檔案
無法 在這個版面下載檔案


Powered by phpBB © 2001, 2005 phpBB Group
正體中文語系由 phpbb-tw 維護製作