2012-03-19 2 views
2

Я ОЧЕНЬ новичок в FoxPro, поэтому, пожалуйста, извините, что, скорее всего, очень глупый вопрос. Я пытаюсь объединить мой мозг вокруг нескольких программ FoxPro 9, которые были написаны не-программистом и, никогда раньше не смотрел на код FoxPro, нахожу, что это довольно тяжелая работа, чтобы понять некоторые из ее особенностей.Строка 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 символов.

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

Замените 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

Dave. , , Спасибо за быстрый (и точный) ответ. Этот подход работал как шарм. Я реализовал его в функции, как отметил DRAP в своем ответе, но я считаю, что это одно и то же. Хотелось бы отметить как ответ – dscarr

5

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

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

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

+0

DRapp. , , Спасибо за быстрый ответ. Когда я прокомментировал ответ Дейва, я реализовал исправление в функции, как вы предлагали, и что я хочу, чтобы я мог проголосовать за ваш ответ как ответ. Это было очень ценно. – dscarr

+0

+1 - Хорошая информация о том, как VFP запускает запрос. – DaveB

-1

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

Смежные вопросы