Форма FoxPro не обновляет таблицы

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

Вот код моей кнопки «Обновить местоположения» (OldLoc - первое текстовое поле, NewLoc - второе):

SET DATABASE TO LOCATIONS
CLOSE ALL DATABASES
OPEN DATABASE locations\locations EXCLUSIVE

IF  this.parent.OldLoc.Value == "" then  
     MESSAGEBOX('Please fill in the old location.', 48, 'Missing Location Information')
this.parent.OldLoc.SetFocus

ELSE
INDEX ON table1.loc TAG loc
SET ORDER TO loc
SEEK this.parent.OldLoc.Value IN table1

IF FOUND()
    IF this.parent.NewLoc.Value == "" then
        MESSAGEBOX('Please fill in the new location.', 48, 
                                 'Missing  Location Information')       this.parent.NewLoc.SetFocus  

    UPDATE table1 SET loc = this.parent.NewLoc.Value ; 
                   WHERE loc = this.parent.OldLoc.value
    UPDATE table2 SET loc = this.parent.NewLoc.Value ;
                   WHERE loc = this.parent.OldLoc.value

    ENDIF
ENDIF
ENDIF

Любой ваш вклад приветствуется!

моя очень простая форма


person Katie    schedule 23.06.2011    source источник


Ответы (2)


вы выполняете избыточную работу в своем событии щелчка ... Закрытие базы данных, затем повторное открытие, затем открытие эксклюзивного. Таблицы, которые вы пытаетесь обновить, уже должны иметь индекс по ключевым столбцам, которые вы когда-либо планируете объединить или использовать для поиска. Как только это будет сделано, вам не нужно явно создавать тег индекса снова и снова ... После того, как индекс "TAG" создан, вам не нужно делать это снова ..

Итак, как говорится ...

Откройте форму и откройте событие «INIT». Там вы можете явно открывать таблицы для использования, пока форма используется ...

IF NOT DBUSED( "Locations" )
   */ You only need exclusive if you will be modifying the database.
   */ The indexes should already exist before the form ever starts
   Open Database Locations\Locations SHARED
ENDIF

Теперь событие «ЩЕЛЧОК» вашей кнопки обновления ... Предварительно проверьте, что есть значения, не беспокойтесь о попытках поиска или обновления, если ОБА не заполнены ...

IF    ALLTRIM( This.Parent.OldLoc.Value ) == "";
   OR ALLTRIM( This.Parent.NewLoc.Value ) == ""
   */ Simple one message about BOTH being required
   messagebox( "Please fill in both Old and New Locations.", 48, ;
      "Missing Location Information" )
ENDIF

*/ Then, update... if no entries match, no records will be updated.
*/ VFP sometimes chokes with multiple "." values such as form values 
*/ as SQL commands are expecting "alias.field" format... 
lcOldValue = This.Parent.OldLoc.Value
lcNewValue = This.Parent.NewLoc.Value


Update Locations!Table1;
   set Loc = lcNewLoc;
   where Loc = lcOldLoc

*/ Were there any updates?
llAnyUpdates = _Tally > 0

*/ Now, the OTHER table too...
Update Locations!Table1;
   set Loc = lcNewLoc;
   where Loc = lcOldLoc

*/ Were there any updates on THIS cycle...
llAnyUpdates = llAnyUpdates OR _Tally > 0

if llAnyUpdates
   messagebox( "Locations have been updated.", 0, "Update complete" )
else
   messagebox( "No such location found to be updated.", 0, "No Records Updated" )
endif
person DRapp    schedule 23.06.2011
comment
Спасибо за ваш ответ! Я особенно ценю разъяснения по событию инициализации. Пытаться научиться FoxPro - это вызов! Сейчас я работаю над применением ваших изменений. - person Katie; 23.06.2011
comment
Ваши предложения работали отлично и помогли мне понять, как работать в FoxPro! Спасибо за такую ​​отличную помощь :) - person Katie; 23.06.2011
comment
@Katie, если вас интересует больше, чем просто устранение неполадок, но более конкретное руководство по VFP, дайте мне знать ... Я могу предложить свое электронное письмо для такой помощи и нюансов работы с VFP, чтобы лучше начать работу с любыми вашими потребностями. быть... - person DRapp; 24.06.2011
comment
В дополнение к любезному предложению DRapp помочь вам, посмотрите книги на сайте www.hentzenwerke.com; там доступно множество книг по VFP. - person Tamar E. Granor; 28.06.2011
comment
@ DRapp- большое спасибо за ваше любезное предложение! Я с радостью приму ваше предложение. @Tamar, спасибо за ссылку! Я обязательно посмотрю. - person Katie; 28.06.2011

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

Мое скромное предложение для Click Event кнопки «Обновить локации»: -

LOCAL lcOldLoc,lcNewLoc
WITH THISFORM
    lcOldLoc=.oldloc.VALUE
    lcNewLoc=newloc.VALUE
    DO CASE
        CASE EMPTY(lcOldLoc)
            MESSAGEBOX("PLEASE ENTER OLD LOCATION",16,"ERROR")
        CASE EMPTY(lcNewLoc)
            MESSAGEBOX("NEW LOCATION CAN'T BE EMPTY",16,"ERROR")
        OTHERWISE
            UPDATE table1 SET loc=lcNewLoc WHERE loc=lcOldLoc
            DO CASE
                CASE _TALLY=0
                    MESSAGEBOX("OLD LOCATION NOT FOUND",16,"ERROR")
                OTHERWISE
                    UPDATE tabel2 SET loc=lcNewLoc WHERE loc=lcOldLoc
            ENDCASE
    ENDCASE
ENDWITH

Это должен быть единственный требуемый код. Очевидно, что есть много улучшений, которые можно внести в вышеизложенное, но, по сути, это сработает.

Если вы хотите, чтобы вышеуказанная форма была создана с нуля, напишите электронное письмо по адресу [email protected], и я проведу вам живую демонстрацию.

person Hugh CB    schedule 11.08.2011