Строка FoxPro, возвращаемая из процедуры, усекается - PullRequest
2 голосов
/ 19 марта 2012

Я ОЧЕНЬ новичок в 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 символов.

enter image description here

Я проверил, что возвращаемое значение функции - это полная строка текста, которую я ожидаю непосредственно перед выходом из функции.Тем не мение;когда данные отображаются в средстве просмотра, значение усекается.

Почему эти данные усекаются?Две другие функции работают почти одинаково (по крайней мере, с моей совершенно «неведомой» точки зрения), и они не усекаются.

Вот код из функции 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

Ответы [ 3 ]

5 голосов
/ 19 марта 2012

На самом деле, короче, ваша функция GetType () всегда возвращает «PADR (retVal, 15)» (или любую другую длину).

Причина существования. Когда VFP запускает запрос, он фактически запускает его ДВАЖДЫ. Первый раз проверяет, является ли он действительным, и просматривает вызовы функций, чтобы обеспечить заданный тип результата. Если ваш запрос по первой записи возвращает более короткое значение длины строки, то и конечный курсор также имеет ширину столбца.

Применяя полную-постоянную длину из вашей функции, вы гарантируете, что она не будет обрезана или пропущена в любом другом вызове SQL в другом месте.

3 голосов
/ 19 марта 2012

Замените ваш 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 определяет ширину столбцов на основе первой возвращенной записи.

0 голосов
/ 02 июля 2013

Вы получаете усеченный возврат, потому что первый элемент, найденный в SELECT, определяет длину.Подпишите ответ «00000000000000» или что-то еще, чтобы исправить это.Вы когда-нибудь слышали о ProMatrix?Сверхмощный VFP-оверлей.Я использовал это в течение нескольких лет и действительно помог мне с кривой обучения.НТН

...