首页 > 解决方案 > 将 Foxpro 转换为 T-SQL

问题描述

我不知道这篇文章的标题是什么,如果你能想到更好的标题,请随时编辑我的文章。

我有一些看起来像这样的视觉 foxpro:

* Get the vendor code for case management hours
Select op_value ;
    FROM dbfs\am_opts ;
    WHERE op_code = "CMGT_VENDOR" ;
    INTO CURSOR cmgt_vndr
lcCMGTVendor = padr(cmgt_vndr.op_value, 4)



* Determine if we need to include CMGT hours
llIncludeCMGT = .f.

Select sub_code ;
    FROM tempsrv ;
    WHERE Is_It_Case_Service(sub_code) ;
    AND selected ;
    INTO CURSOR c_dummy1
*
If _tally
 > 0 or pcService = "ALL"
    llIncludeCMGT = .t.
Endif
*
If m.llIncludeCMGT
    *   Pick only certain Vendors?
    If m.pcVendor=="ALL"
        *   No, then leave the CMGT flag as DO Include.
    Else
        *   Yes, only get CMGT if the "Default CMGT Vendor"
        *   is one of the selected vendors.
        Select 'TempVnd'
        Locate FOR provkey=m.lcCMGTVendor .AND. Selected
        m.llIncludeCMGT = FOUND()
        *
        *
    Endif
    *
Endif
*
*
* Merge in CMGT hours if necessary
If llIncludeCMGT
    Wait WINDOW NOWAIT ;
        'Gathering Case-Management entries'
    *
    * 10/25/2001 JDB Take into account f_rpt.sub_code
    *
    Select 0

    Use 'dbfs\f_Rpt' AGAIN ALIAS 'SQL_F_Rpt' NOUPDATE
    *
    *   Build basic WHERE-clause, and name basic tables.
    m.SQL_FROM = "SQL_F_Rpt"
    m.SQL_WHERE = "SQL_F_Rpt.End_Dt BETWEEN m.pdBegin_Date AND m.pdEnd_Date" ;
        + " AND !(IS_IT_WAIVER(SQL_F_Rpt.Payor, .F.))"
    *
    *   Do they only want certain Fund-Sources?
    If m.pcPayor=="ALL"
        *   No, ignore the Payor-field
    Else
        *   Yes, only get matching/selected payors.
        m.SQL_FROM = m.SQL_FROM + ", TempPay"
        m.SQL_WHERE = m.SQL_WHERE ;
            + " AND SQL_F_Rpt.Payor=TempPay.Payor_CD" ;
            + " AND TempPay.Selected"
        *
    Endif
    *

    *   Pick only certain Service-Codes?
    If m.pcService=="ALL"
        *   No, ignore the SubCode-field
    Else
        *   Yes, only get matching/selected Services.
        m.SQL_FROM = m.SQL_FROM + ", TempSrv"
        m.SQL_WHERE = m.SQL_WHERE ;
            + " AND IIF(EMPTY(SQL_F_Rpt.Sub_Code), 'CMGT', SQL_F_Rpt.Sub_Code)=TempSrv.Sub_Code" ;
            + " AND TempSrv.Selected"
        *
    Endif
    *
    *







    Select * from pass2 union all ;
        select lcCMGTVendor as provkey, ;
        iif(empty(SQL_F_Rpt.sub_code), "CMGT", SQL_F_Rpt.sub_code) as sub_code, ;
        SQL_F_Rpt.keyfld, ;
        00000.00 as tot_auth, ;
        (SQL_F_Rpt.unit * SQL_F_Rpt.cost) as tot_deliv, ;
        SQL_F_Rpt.start_dt as plandt ;
        from &SQL_FROM ;
        where &SQL_WHERE ;
        into cursor pass3

我不知道它lcCMGTVendor是如何被纳入最终的 foxpro 查询的。它不在SQL_WHERE任何地方的子句中。代码中的其他任何地方都没有引用它,只是这一部分。

有人可以帮我弄清楚我缺少什么,以便弄清楚它在底部的 Foxpro 查询中的情况吗?

在我目前的理解中,我们采用任何 provkey 值并将其应用于每一行,这似乎是错误的。

标签: sql-servertsqlvisual-foxpro

解决方案


好的,你想转换它的一部分,那么你要求的“部分”实际上对应于:

Foxpro 代码:

* Get the vendor code for case management hours
Select op_value ;
    FROM dbfs\am_opts ;
    WHERE op_code = "CMGT_VENDOR" ;
    INTO CURSOR cmgt_vndr
lcCMGTVendor = padr(cmgt_vndr.op_value, 4)

T-SQL:

declare @lcCMGTVendor char(20+4); -- if op_value size is char(20)
Select top(1) @lcCMGTVendor = op_value 
        FROM am_opts
        WHERE op_code = 'CMGT_VENDOR';

恕我直言,即使在 foxpro 代码中,padr() 也不是必需的。上面的代码无论如何都使用 char(20+4) 而不是 varchar() - foxpro 字段有尾随空格。


推荐阅读