Visual Foxpro изменить общее поле - PullRequest
0 голосов
/ 26 июня 2009

Во-первых, я не программист VFP, поэтому то, что я делаю неправильно, возможно, является чем-то простым.

Я пытаюсь извлечь некоторые документы из общих полей в базе данных VFP 9. У меня есть способ сделать это путем эффективного копирования и вставки поля в Word, а затем сохранения документа Word на диск.

У меня все это работает в среде разработки foxpro в файле .prg.

Вот секреты моего кода (большая часть которого была скопирована из вопроса поддержки Microsoft):

DO WHILE NOT EOF()
    IF EMPTY(tnoteole) then
        SKIP
        LOOP
    ENDIF

    KEYBOARD "{ctrl+c} {ctrl+w}" 
    MODIFY GENERAL tnoteole 

    TRY
        .EditPaste
    CATCH
    ENDTRY

    .InsertPara

    filename = Path + ALLTRIM(STR(recnum)) + ".doc"
    .FileSaveAs(filename)
    .EditSelectAll
    .EditClear
    SKIP                     

    recnum = recnum + 1
ENDDO

Моя проблема в том, что когда я запускаю это из среды разработки, оно работает нормально, и на экране вспыхивает окно общего поля, и оно вставляется в Word и т. Д. Но когда я пытаюсь запустить это из исполняемого файла exe ( этот процесс запускается тем, что пользователь нажимает кнопку в форме - у меня так много работы - хотя я бы на самом деле хотел, чтобы это было пакетное задание, не требующее взаимодействия с пользователем) Word открывается, но это далеко не так. Общее поле не вспыхивает на экране, и в основном оно просто ждет вечно.

(Да, и в случае, если вы задаетесь вопросом о неприятной попытке / улове, я обнаружил исключение в Word при вставке некоторых полей, но попытка / отлов отлично работает в среде dev., Поэтому я не думаю, что это причина моих проблем.)

Итак, как я могу заставить это работать? Я как бы чувствую себя в темноте фокспро.

Пожалуйста, помогите! :)

Спасибо

Craig

Ответы [ 3 ]

2 голосов
/ 27 июня 2009

Несколько вещей:

  • Это скомпилированный VFP EXE? У вас есть команда READ EVENTS ? В противном случае исполняемый код будет запущен и сразу же завершится, что немного похоже на вашу проблему.

  • Откуда вы берете переменную Path? Может ли это варьироваться между разработкой и временем выполнения?

  • Любые настройки, которые необходимо установить, должны быть явно заданы в среде выполнения - на ум приходят SET EXCLUSIVE и SET SAFE.

В противном случае небольшая часть отладки или регистрации MessageBox должна сказать вам, как далеко вы проходите через программу и какие переменные установлены, что должно быть достаточно, чтобы она заработала.

Обновлено: я только что посмотрел документацию Modify General , и вам может понадобиться использовать предложение NOWAIT с вашей командой Modify General: NOMODIFY также не повредит, и вам, возможно, придется предоставить ОПРЕДЕЛЕННОЕ окно для открытия окна редактирования и включения предложения IN WINDOW.

NOWAIT Продолжает выполнение программы после окно редактирования общего поля открыт. Программа не ждет окно редактирования должно быть закрыто, но продолжает выполнение по программе линия сразу после строки который содержит MODIFY GENERAL NOWAIT. Если вы пропустите NOWAIT, когда MODIFY GENERAL выдается в программе, редактирование окно открывается и выполнение программы паузы, пока окно редактирования закрыт.

1 голос
/ 27 июня 2009

Я являюсь разработчиком foxpro с 1987 года, а VFP - с 1993 года. Если ваши данные не являются конфиденциальными, и вы можете дать мне копию, скажем, 20 записей или около того ... Я посмотрю, смогу ли я может скомпоновать что-то для вас, что будет работать без присмотра, как EXE вне режима разработки. Даже если вы дадите мне фиктивный необязательный столбец И общий столбец данных.

0 голосов
/ 30 июня 2009

Поле General в значительной степени зависит от информации автоматизации, хранящейся в поле General, а в вашем случае - на документе Word. Поэтому, если на компьютере, на котором вы работаете, нет Microsoft Word, вы столкнетесь с проблемой. Как вы, наверное, знаете, общие поля являются привередливыми.

Мое предложение состоит в том, чтобы включить ОБЩИЙ КОД MODIFY в TRY ... CATCH и добавить код исключения в CATCH, чтобы вы могли видеть, что здесь происходит.

LOCAL loException AS Exception

TRY
    KEYBOARD "{ctrl+c} {ctrl+w}" 
    MODIFY GENERAL tnoteole 

    .EditPaste

    .InsertPara

    filename = Path + ALLTRIM(STR(recnum)) + ".doc"
    .FileSaveAs(filename)
    .EditSelectAll
    .EditClear
    SKIP                     

CATCH TO loException
    * Output problem to a text file for review after the process
    STRTOFILE(loException.Message + CHR(13) + CHR(10) ;
              " on " + TRANSFORM(loException.LineNo), ;
              "ExceptionLog.txt", 1)

ENDTRY

Я также согласен с NOWAIT. Без некоторого примера кода я бы только предположил, что открытое окно также должно быть закрыто или может поглотить некоторые ресурсы, которые вам нужны на машине.

...