Форма FoxPro не обновляет таблицы - PullRequest
0 голосов
/ 23 июня 2011

Я создал очень простую форму с двумя текстовыми полями и кнопкой «обновить местоположения», введенные значения которых должны обновляться до двух связанных таблиц в базе данных.В конце концов я пытаюсь поместить это в отдельное приложение, но сейчас я просто хочу, чтобы сама форма работала.Я очень новичок в 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

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

my very basic form

Ответы [ 2 ]

2 голосов
/ 23 июня 2011

вы выполняете избыточную работу в вашем событии клика ... Закрытие базы данных, затем повторное открытие, затем открытие эксклюзива. Таблицы, которые вы пытаетесь обновить, уже должны иметь индекс по ключевым столбцам, к которым вы когда-либо планируете присоединиться или выполнить поиск по ним. Как только это будет сделано, вам не нужно явно создавать тег индекса снова и снова ... После создания индекса "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

Теперь событие CLICK вашей кнопки обновления ... Предварительно проверьте наличие значений, не беспокойтесь о попытках поиска или обновления, если ОБА не заполнены ...

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
0 голосов
/ 11 августа 2011

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

Мое скромное предложение для события Click из «Места обновления»кнопка ': -

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

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

Если вы хотите, чтобы вышеуказанная форма была построена с нуля, отправьте электронное письмо по адресу support@foxsoft.co.uk и я дам вам живую демонстрацию.

...