【问题标题】:Converting Foxpro to T-SQL将 Foxpro 转换为 T-SQL
【发布时间】:2019-01-18 21:42:19
【问题描述】:

我不确定这篇文章的标题,如果你能想到更好的标题,请随时编辑我的文章。

我有一些看起来像这样的视觉 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 值并将其应用于每一行,这似乎是错误的。

【问题讨论】:

  • 关于第6行是lcCMGTVendor = padr(cmgt_vndr.op_value, 4)
  • 以便将值应用于底部的每条记录?
  • 是的。您是 FoxPro 的初学者吗?你应该从更简单的开始。
  • 我是foxpro的初学者。我正在将 foxpro 翻译成 T-SQL,以完成分配给我的任务。谢谢
  • 恕我直言,即使对于经验丰富的 foxpro 和 MS SQL Server 开发人员来说,将 Foxpro 代码转换为 T-SQL 也不是一件容易的事。如果您想将其转换为另一种语言,例如 C#、Go、Python ……但尝试转换为 T-SQL、pgSQL ……没有意义。

标签: sql-server tsql visual-foxpro


【解决方案1】:

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

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 字段有尾随空格。

【讨论】:

  • 最底层的查询是我试图在 SQL 中生成的。除了我之前提到的那一列之外,我能够复制所有内容。我认为有某种加入或我缺少的东西可以增加这个价值,但在阅读了你的 cmets 之后,我想我明白了。
猜你喜欢
  • 2013-11-08
  • 1970-01-01
  • 2011-02-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-27
  • 2010-12-02
相关资源
最近更新 更多