我对FoxPro非常陌生,所以请原谅最有可能是一个非常愚蠢的问题。我试图将我的大脑包裹在由非程序员编写的几个FoxPro 9程序中,并且在我的生活中从未查看过FoxPro代码,我发现了解它的一些特性是相当繁琐的。
我有一个非常简单的SQL语句,它从Project文件返回信息(用作表)。我有三个简单的函数来处理给我一些关于项目中包含的对象(文件)的有用信息。
以下是运行的整个主程序。它只是一个使用三个简单函数的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
答案 0 :(得分:5)
实际上,更短,有你的函数GetType(),总是返回“PADR(retVal,15)”(或任何长度)。
理由是。当VFP运行查询时,它实际上运行TWICE。首次检查以确保其有效,并查看函数调用以确保结果的给定类型。如果您对第一条记录的查询返回的字符串长度值较短,那么最终光标的列宽也是如此。
通过强制执行函数的完全常量长度,您将保证不会在其他任何SQL调用中截断,也不会错过它。
答案 1 :(得分:3)
将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根据返回的第一条记录确定列宽。
答案 2 :(得分:-1)
您将获得截断的返回,因为SELECT中找到的第一个项目决定了长度。用“00000000000000”或其他东西来回答你的问题。你听说过ProMatrix吗?超级强大的VFP覆盖构建器。我用了好几年了,真的帮助了我学习曲线。 HTH