【问题标题】:Working with multiple tables in FoxPro在 FoxPro 中处理多个表
【发布时间】:2014-01-27 21:26:07
【问题描述】:

我的 IT 课有一件棘手的事情要做。

Two Tables: 
Classes |Class C-3, Day N-1, Lessons C-7|
Lessons |Lesson C-1, Lesson_Name C-10|

First table:
IX - 1 - MEP    
X - 2 - MBE
XI - 3 - FCM

Second table:
M - Maths
E - English
B - Biology
F - French
P - Physics
C - Chemistry

在第一个表中,课程列是课程名称的第一个字符(例如 M - 数学等)

第二个表格是从第一个表格输入的课程。 (课程 - 课程名称,例如 M - 数学)我需要从键盘输入一个课程(使用输入或获取/读取)并写出该课程的课程名称。

我希望你明白我在这里想说什么。

我尝试在一个工​​作区中从第一个表的班级和课程列中创建 2 个单独的数组,然后使用另一个工作区中的第二个表来写出课程名称,但我就是无法让它工作.我将不胜感激。

【问题讨论】:

  • 在早期学习的同时,从良好的表结构开始...所有表都应该有一个可以使用的主键 ID。不要使用一列的子字符串作为连接另一列的基础。为主题分类创建一个新列。此外,列出您的示例数据。最后,您是使用简单的 PRG 执行此操作,还是创建表单并将文本框和命令按钮放在表单上以使用。
  • 我正在尝试使用简单的 prg 和基本命令。

标签: sql visual-foxpro foxpro


【解决方案1】:

这里有一个快速的东西供你咀嚼。 我为您创建了表格并插入了您的示例数据,尽管您将及时了解表格结构。

至于为表创建列名,尽量不要使用保留字,甚至不要使用可能会导致混淆的函数……例如在本例中为“Class”、“Day”。编码时,您会看到保留字通常以蓝色语法颜色显示。如果您在创建表时使用了该名称,请再次考虑为该列取一个更好的名称。

至于 VFP 列名。如果表不是“数据库容器”的一部分,那么列名限制只有 10 个字符(所以我将您的“Lesson_Name”更改为“LessonName”)。

我正在使用简单的 SQL 查询来做这个示例。您在 VFP 与其他 sql 数据库中看到的查询差异相对较小。重要的是,在 VFP 中,分号表示命令在下一行继续。在 SQL 中,分号通常表示命令的结束。

*/ Sample... create the tables and insert the values
SET SAFETY OFF
CLOSE TABLES ALL 
CREATE TABLE Classes;
    (    Class C(3),;
        Day N(1),;
        Lessons C(7) )

INSERT INTO Classes ( Class, Day, Lessons );
    VALUES ( "IX", 1, "MEP" )

INSERT INTO Classes ( Class, Day, Lessons );
    VALUES ( "X", 2, "MBE" )

INSERT INTO Classes ( Class, Day, Lessons );
    VALUES ( "XI", 3, "FCM" )

*/ Create the next table and insert their records        
CREATE TABLE Lessons ;
    (   Lesson C(1),;
        LessonName C(10) )

INSERT INTO Lessons ( Lesson, LessonName );
    VALUES ( "M", "Math" )

INSERT INTO Lessons ( Lesson, LessonName );
    VALUES ( "E", "English" )

INSERT INTO Lessons ( Lesson, LessonName );
    VALUES ( "B", "Biology" )

INSERT INTO Lessons ( Lesson, LessonName );
    VALUES ( "F", "French" )

INSERT INTO Lessons ( Lesson, LessonName );
    VALUES ( "P", "Physics" )

INSERT INTO Lessons ( Lesson, LessonName );
    VALUES ( "C", "Chemistry" )


*/ Prepare a look and keep asking until a user hits the escape key (ASCII 27)
DO WHILE LASTKEY() <> 27
    */ prepare a value for data entry of the class
    SomeClass = "   "
    @ 1,1 say "Enter a value for a class (escape or leave blank to exit):" get SomeClass picture "!!!" 
    READ 
    IF EMPTY( SomeClass )
        EXIT 
    ENDIF 

    */ Query the classes table for the value entered
    USE IN SELECT( "FoundClass" )
    SELECT Class, Day, Lessons;
       FROM Classes;
       WHERE Class = SomeClass;
       INTO CURSOR FoundClass READWRITE 

    */ Did we find the class?   
    IF RECCOUNT( "FoundClass" ) = 0
       MESSAGEBOX( "Sorry, class was not found" )
    ELSE 
       */ Now, get all lessons associated with the class.
       USE IN SELECT( "FoundLessons" )
       SELECT Lesson, LessonName;
          FROM Lessons;
          WHERE Lesson $ FoundClass.Lessons;
          INTO CURSOR FoundLessons READWRITE 

        IF RECCOUNT( "FoundLessons" ) = 0
            MESSAGEBOX( "Sorry, no lessons found for the class" )
        ELSE 
            CLEAR
            ?
            ?
            ?
            ? "Class: " + FoundClass.Class, ;
              "  Day: ", FoundClass.Day, ;
              " Lessons: " + FoundClass.Lessons
            ? "Lessons:"  
            SELECT FoundLessons
            SCAN
               ? FoundLessons.LessonName
            ENDSCAN 
        ENDIF 
    ENDIF 

    USE IN SELECT( "FoundClass" )
    USE IN SELECT( "FoundLessons" )
ENDDO
CLEAR

【讨论】:

  • 唐,当我读到这篇文章时,这是作业。我们不应该为这些案例提供完整的答案。
  • @TamarE.Granor,所以请注意,我会尽量阻止此类“家庭作业”作业。但有时,我会回到编程的早期,从来没有看到一个完整的工作示例可以通过,并且永远需要“点击”一些东西。希望这个完整的示例可以帮助他们快速了解完整示例中的小部分。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-08
  • 2011-08-28
  • 1970-01-01
相关资源
最近更新 更多