|
VFP 愛用者社區 本討論區為 Visual Foxpro 愛用者經驗交流的地方, 請多多利用"搜尋"的功能, 先查看看有無前例可循, 如果還有不懂的再發問. 部份主題有附加檔案, 須先註冊成為社區居民才可以下載.
|
上一篇主題 :: 下一篇主題 |
發表人 |
內容 |
ckp6250
註冊時間: 2004-07-30 文章: 1644
第 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
|
|
|
回頂端 |
|
|
|
|
您 無法 在這個版面發表文章 您 無法 在這個版面回覆文章 您 無法 在這個版面編輯文章 您 無法 在這個版面刪除文章 您 無法 在這個版面進行投票 您 無法 在這個版面附加檔案 您 無法 在這個版面下載檔案
|
|