从过程返回的FoxPro字符串被截断

dsc*_*arr 2 foxpro visual-foxpro

我对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
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

DRa*_*app 5

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

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

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