【问题标题】:FoxPro form not updating tablesFoxPro 表单不更新表
【发布时间】:2011-06-23 17:47:03
【问题描述】:

我创建了一个非常简单的表单,其中包含两个文本框和一个“更新位置”按钮,其输入值应更新为数据库中的两个链接表。我最终试图把它放在一个独立的应用程序中,但现在我只想让表单本身工作。我对 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

感谢您的任何意见!

【问题讨论】:

    标签: database forms visual-foxpro


    【解决方案1】:

    您在单击事件中做多余的工作...关闭数据库,然后重新打开,然后以独占方式打开。您尝试更新的表应该已经在您计划加入或搜索的关键列上有一个索引。一旦完成,您就不需要一遍又一遍地显式创建索引标签...一旦创建了索引“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
    

    【讨论】:

    • 感谢您的回复!我特别感谢对 init 事件的澄清。尝试自学 FoxPro 是一项挑战!我正在努力应用您的更改。
    • 您的建议非常有效,并且帮助我弄清楚如何在 FoxPro 中工作!感谢您提供如此出色的帮助:)
    • @Katie,如果您不仅对此​​处的故障排除感兴趣,还对更具体的 VFP 指导感兴趣,请告诉我... - 开始你的任何需求...
    • 除了 DRapp 为您提供的帮助之外,请查看 www.hentzenwerke.com 上的书籍;那里有大量的 VFP 书籍。
    • @DRapp- 非常感谢您的好意!我很乐意接受你的提议。 @Tamar,感谢您的参考!我一定会看看的。
    【解决方案2】:

    您可能还想看看表单的数据环境。 您可以选择表单加载时要打开哪些表,这样可以节省在表单加载事件或表单初始化事件中显式打开它们

    我对“更新位置”按钮的点击事件的谦虚提议是:-

    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,我将为您提供现场演示。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-12-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-12-30
      • 1970-01-01
      • 1970-01-01
      • 2012-02-02
      相关资源
      最近更新 更多