【问题标题】:FoxPro string returned from procedure is truncated从过程返回的 FoxPro 字符串被截断
【发布时间】:2012-03-19 14:50:40
【问题描述】:

我对 FoxPro 非常陌生,所以请原谅最有可能是一个非常愚蠢的问题。我正试图围绕几个由非程序员编写的 FoxPro 9 程序进行思考,并且在我以前从未看过 FoxPro 代码的情况下,我发现理解其中的一些特性是一件很麻烦的事。

我有一个非常简单的 SQL 语句,它从项目文件(用作表)返回信息。我有三个简单的函数来处理给我一些关于项目中包含的对象(文件)的有用信息。

这是运行的整个主程序。它只是一个使用三个简单函数的 SQL 语句:

SELECT ShortName(Name) AS SName, LongName(Name) AS LName, Type, GetType(Type) AS TypeName ;
FROM <my project file here> ;
ORDER BY Type, SName

SQL 语句运行良好,我的三个函数被调用,三个函数都返回我期望的数据,但 GetType 函数除外。 ShortName 函数只返回文件名,LongName 函数返回整个路径和文件名,GetType 函数应该返回一个更易读的字符串,告诉我文件类型是什么。如“表”、“程序”等。 . .

问题来了:

GetType 函数正在运行并且正在设置返回值,但是正在返回的值被截断为 6 个字符。

我已经验证函数的返回值是函数退出之前我期望的完整文本字符串。然而;当数据显示在查看器中时,该值被截断。

为什么这些数据会被截断?其他两个函数的工作方式几乎相同(至少从我完全“不知情”的角度来看)并且它们没有被截断。

这是来自 GetType 函数的代码

PARAMETERS pType

retVal = ""

DO CASE
    CASE LEFT(ALLTRIM(pType),1) = 'B'
        retVal  = "Lable"
    CASE LEFT(ALLTRIM(pType),1) = 'D'
        retVal  = "Table"
    CASE LEFT(ALLTRIM(pType),1) = 'd'
        retVal  = "XBase Table"
    CASE LEFT(ALLTRIM(pType),1) = 'F'
        retVal  = "Format"
    CASE LEFT(ALLTRIM(pType),1) = 'H'
        retVal  = "Header"
    CASE LEFT(ALLTRIM(pType),1) = 'I'
        retVal  = "Index"
    CASE LEFT(ALLTRIM(pType),1) = 'L'
        retVal  = "Library"
    CASE LEFT(ALLTRIM(pType),1) = 'M'
        retVal  = "Menu"
    CASE LEFT(ALLTRIM(pType),1) = 'P'
        retVal  = "Program"
    CASE LEFT(ALLTRIM(pType),1) = 'Q'
        retVal  = "Query"
    CASE LEFT(ALLTRIM(pType),1) = 'R'
        retVal  = "Report Form"
    CASE LEFT(ALLTRIM(pType),1) = 's'
        retVal  = "Screen Table"
    CASE LEFT(ALLTRIM(pType),1) = 'S'
        retVal  = "Screen Program"
    CASE LEFT(ALLTRIM(pType),1) = 'T'
        retVal  = "Configuration File"
    CASE LEFT(ALLTRIM(pType),1) = 'x'
        retVal  = "File"
    CASE LEFT(ALLTRIM(pType),1) = 'X'
        retVal  = "File"
    CASE LEFT(ALLTRIM(pType),1) = 'Z'
        retVal  = "Application"
ENDCASE 

RETURN retVal

【问题讨论】:

    标签: visual-foxpro foxpro


    【解决方案1】:

    实际上,更短的,有你的函数 GetType(),总是返回“PADR(retVal, 15)”(或任何长度)。

    理性。当 VFP 运行查询时,它实际上运行了两次。第一次检查以确保其有效,并查看函数调用以确保结果的给定类型。如果您对第一条记录的查询返回较短的字符串长度值,那么最终游标的列宽也是如此。

    通过从您的函数中强制执行完全恒定的长度,您将保证它不会被截断,也不会在其他任何其他 SQL 调用中丢失。

    【讨论】:

    • DRapp 。 . .也感谢您的快速回复。正如我评论戴夫的回复时,我确实按照你的建议在函数中实施了修复,我希望我也可以投票给你的回复作为答案。非常感谢。
    【解决方案2】:

    将您的 SQL SELECT 替换为:

    SELECT ShortName(Name) AS SName, LongName(Name) AS LName, Type, PADR(GetType(Type), 10) AS TypeName ;
    FROM <my project file here> ;
    ORDER BY Type, SName
    

    这将用适当的数字填充结果文本,以便空格直到结果为 10 个字符。根据需要调整值。

    这是因为 SQL SELECT 根据返回的第一条记录确定列宽。

    【讨论】:

    • 戴夫。 . .感谢您的快速(准确)回复。这种方法就像一种魅力。正如 DRapp 在他的回答中指出的那样,我确实在函数中实现了它,但我认为两者相同。我希望我可以将两者都标记为答案
    【解决方案3】:

    您得到一个截断的返回值,因为在 SELECT 中找到的第一项决定了长度。用'00000000000000'或其他东西来纠正这个问题。你听说过 ProMatrix 吗?超级强大的 VFP 覆盖生成器。我已经使用它好几年了,真的帮助我完成了学习曲线。高温

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-06-05
      • 2016-11-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-02-19
      相关资源
      最近更新 更多