CA類增強

來源:互聯網
上載者:User
能簡就簡, CA加的功能作些增強

(1) 自動產生cursorSchema。 這樣的話,後端欄位長度/小數點長度,有改變時,前端能自動適應,不必
     再去改CA,輸入介面也適應了,方便很多。

     另外,FOX9的CA/SPT在n型欄位的映射長度方面也有BUG,通過下段代碼一併修正。
 

NUMERIC定義比較

(1)無小數的情況

SQL: N 5   ->   數字全長為5. 可表達最大數字為 99999

VFPL: N 5   ->   數字全長為5. 可表達最大數字為 99999

以spt或ca,從vfp取回sql的資料時,sql端 n 5的欄位, VFP端竟然是 n 7。如果使用者按這個長度輸入,那UPDATE時就出錯了。

處理:對整數,整數部分的長度減2。


(2)有小數

SQL: N 5.2  -> 數字全長為5,其中整數部分3位, 小數點後2位。 小數點不計在長度之內。  可表達最大數字為 999.99

VFP: N 5.2  -> 數字連小數點全長為5,其中小數點後2位。 小數點計在長度之內。 可表達最大數字為 99.99 (比上面小了1位)

取回 SQL 端 n (5.2) (999.99) 欄位, VFP端竟為 N 7.2 (9999.99)。即:VFP端 小數點前多了 1 位.。應是  N6.2 才對.

處理:對有小數的,整數部分長度減1。

Local cSql,cKeyWord,nArea,cSchema,i,cType,cTmp,nTmp,cLenght,cDecimal
nArea =  Select()

*-- 如curorSchema為空白 且 沒有改過相關屬性 --> 自動產生 curorSchema
If Not( (Pemstatus(This, '__VFPSetup', 5) And This.__VFPSetup!=0 ) Or  Empty(This.SelectCmd) )
    If NOT This.UseCursorSchema
        cSchema=''
        cKeyWord = 'select,from,where,order by,having'
        TEXT to cSql
        Select <<gcGetSubClause(this.SelectCmd,cKeyWord,'select')>>
            from <<gcGetSubClause(this.SelectCmd,cKeyWord,'from')>>
            where 1=2
        ENDTEXT
        If Not glSql(0,cSql)
            Select (nArea)
            Return .F.
        Endif

        *- 欄位類別轉換 t -> d, G -> W(blob)
        For i=1 To Fcount()
            cType = gcFieldType(i,'',2)
            cType = Icase(  Left(cType,1)='G', 'W',;
                Left(cType,1)='T' And ( Not '時間' $ Field(i) And Not 'TIME' $ Field(i)) , 'D'+Substr(cType,2),;
                .T., cType)
            
            If GetWordNum(cType,1,'(,)')=='N'
                *- 修正VFP sp2 beta 的bug    
                *- N(5) -> N(3)
                *- N(5,2) -> N(4,2)
                cDecimal = GetWordNum(cType,3,'(,)')
                cLenght = Alltrim( Str(Val(GetWordNum(cType,2,'(,)')) - Iif(cDecimal='0',2,1)  ) )  &&
                cType = 'N(' + cLenght + ', ' +cDecimal + ')'
            EndIf 
               
                
            cSchema = cSchema + ',' + Field(i) + ' ' + cType
        Next
        cSchema=Substr(cSchema,2)

        This.CursorSchema=cSchema
        This.UseCursorSchema=.T.
    Endif
Endif
*--EOS-----------------------------------------
Select (nArea)

(2) 加一個方法 _c取欄位對照表,返回 alias.field 與 select 語句中 a.XX 的對照表,多用於 多條件產生器中。

*---取出 a.xx <-> XX 對照表
*- 遇到 select *的情況, 暫不管了 

Local cTmp,i,oCA,c對照表,cCA欄位名
Local  cCA欄位名,c欄位標題,c欄位類型,c欄位標題,cTmp,c前端欄位名,nPosi,cSelect

cSelect=gcGetSubClause(this.SelectCmd, 'select,from,where,order by','select')
cSelect=Strtran(cSelect,'distinct','')

c對照表=''
For i=1 to GetWordCount(cSelect,',')
    cTmp = Alltrim( GetWordNum(cSelect,i,','),1,Chr(9),Chr(10),Chr(13),Chr(32))
    nPos = Atc('as',cTmp)
    If nPos = 0
        cField = cTmp
        cCaption = Iif(At('.',cTmp)>0,GetWordNum(cTmp,2,'.'),cTmp)
    Else
        cField = Alltrim(Substr(cTmp,1,nPos-1))
        cCaption = Alltrim(Substr(cTmp,nPos+2))
    EndIf     
    c對照表 = c對照表 +','+ Textmerge("<<cCaption>>,<<cField>>,<<Type(cCaption)>>")
Next 
c對照表=Substr(c對照表,2)
*-- 

Return c對照表

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.