2011-06-23 3 views
0

2つのテキストボックスと「場所の更新」ボタンで非常に単純なフォームを作成しました。入力された値はデータベース内の2つのリンクテーブルに更新する必要があります。私は最終的にこれをスタンドアロンアプリケーションに入れようとしていますが、今はフォーム自体を動作させたいだけです。私はFoxProの新機能ですので、フォームを使ってテーブルを更新することが可能かどうか、あるいは仕事上に他の問題があるかどうかはわかりません。テーブルを更新していないFoxProフォーム

ここでは私の「アップデート場所」ボタンのコードは、(OldLocは、第1、第2のテキストボックスと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

あなたは...データベースを閉じる、再度開き、その後、排他的開くあなたのクリックイベントに冗長な仕事をしています。更新しようとしているテーブルには、すでに参加または検索を計画しているキー列にインデックスがあります。これが完了すると、明示的に索引タグを作成する必要はありません。索引「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 
+0

ご返信ありがとうございます。私はinitイベントの明確化を特に感謝します。自分自身を教えようとすると、FoxProは挑戦です!私は今あなたの変更を適用するために取り組んでいます。 – Katie

+0

あなたの提案は完璧に働き、FoxPro内での作業方法を理解するのに役立ちました!このような優れた助けを感謝します:) – Katie

+0

@Katie、ここでのトラブルシューティングだけでなく、より具体的なVFPガイダンスに興味があれば、私に教えてください...私はVFPで作業しているような、あなたのニーズがどんなものでもあなたを始めてください... – DRapp

0

ます。また、フォームのデータ環境を見てみたいことがあります。 フォームがロードされるときにフォームを開くテーブルを選択することができます。これは、フォームロードイベントまたはフォーム初期イベントで明示的に開くことを保存します。

「更新ロケーション」の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 

これが唯一のコードである必要があります。明らかに、上記に加えられる多くの改善がありますが、本質的にはその仕事を行うでしょう。

上記のフォームを一から作成するには、[email protected]に電子メールをポップしてください。ライブデモンストレーションを行います。

関連する問題