Connecting to an Excel spreadsheet

Discussion in 'Rebol' started by Noteleks, May 28, 2010.

  1. notchent

    notchent Member

    Here's a quick hack (each student ID should be unique):
    Code:
    write %StudentList.csv {STUDENTID,LASTNAME,FIRSTNAME,DOB,GRADE
    111111,Doe,Steven D,6/16/1992,12
    111112,Doe,Jonathan Daniel,12/16/1991,12
    111113,Smith,Karen J,12/3/1991,12
    111114,Jones,Michael J,6/4/1992,12
    111115,Taylor,Ryan C,1/10/1992,12
    111116,Adam,Kaitlan C,4/30/1992,12
    111117,Washington,Gabryela,3/31/1992,12
    111118,Travolta,Juan D,1/24/1992,12
    111119,Cruise,Amber E,5/8/1992,12}
    
    Code:
    REBOL [title: "Student Photos"]
    either exists? %data.txt [
        database: load %data.txt
    ][
        filename: %StudentList.csv
        database: copy []
        lines: read/lines filename
        foreach line lines [
            append database parse/all line ","
        ]
        remove/part database 5  ; get rid of headers
        for counter 6 ((length? database) + 12) 6 [
            insert (at database counter) %none
        ]
        save %data.txt database
    ]
    
    view center-face gui: layout [
        text "Load an existing record:"
        name-list: text-list blue 300x80 data sort (extract database 6) [
            if value = none [return]
            marker: index? find database value
            n/text: pick database marker
            a/text: pick database (marker + 1)
            p/text: pick database (marker + 2)
            o/text: pick database (marker + 3)
            g/text: pick database (marker + 4)
            i/text: pick database (marker + 5)
            if error? try [photo/image: load to-file i/text] [
                ; alert "No image selected"
                photo/image: none
            ]
            photo/text: ""
            show gui
        ]
        text "ID:"       n: field 300
        text "Last:"     a: field 300
        text "First:"    p: field 300
        text "BD:"       o: field 300
        text "Grade:"    g: field 300
        text "Image:"    i: btn 300 [
            i/text: request-file 
            photo/image: load to-file i/text
            show gui
        ]
        at 340x20 photo: image white 300x300
        across
        btn "Save" [
            if n/text = "" [alert "You must enter a name." return]
            if find (extract database 6) n/text [
                either true = request "Overwrite existing record?" [
                   remove/part (find database n/text) 6
                ] [
                   return
                ]
            ]
            save %data.txt repend database [
                n/text a/text p/text o/text g/text i/text
            ]
            name-list/data: sort (extract copy database 6)
            show name-list
        ]
        btn "Delete" [
            if true = request rejoin ["Delete " n/text "?"] [
                remove/part (find database n/text) 6
                save %data.txt database
                do-face clear-button 1
                name-list/data: sort (extract copy database 6)
                show name-list
            ]
        ]
        clear-button: btn "New" [
            n/text: copy  ""
            a/text: copy  ""
            p/text: copy  ""
            o/text: copy  ""
            g/text: copy  ""
            i/text: copy  ""
            photo/image: none
            show gui
        ]
        at 340x340 f: field 300 "Search For First Names Here" [
            results: copy []
            foreach item (extract/index database 6 3)  [
                if find item f/text [
                    append results item
                    t/data: results
                    show t
                ]
            ]
        ]
        at 340x380 t: text-list 300x100
    ]
    
  2. notchent

    notchent Member

    Noteleks, the image file names were not included in your exported data. I added an error checking routine to make the script work, but didn't you want to include that info?
  3. notchent

    notchent Member

    Here's some more search functionality:

    Code:
    REBOL [title: "Student Photos"]
    
    ; Here's an example CSV data file, exported from Excel
    ; (not really part of this program, but included here
    ; to demonstrate a fully working example):
    
    write %StudentList.csv {STUDENTID,LASTNAME,FIRSTNAME,DOB,GRADE
    111111,Doe,Steven D,6/16/1992,12
    111112,Doe,Jonathan Daniel,12/16/1991,12
    111113,Smith,Karen J,12/3/1991,12
    111114,Jones,Michael J,6/4/1992,12
    111115,Taylor,Ryan C,1/10/1992,12
    111116,Adam,Kaitlan C,4/30/1992,12
    111117,Washington,Gabryela,3/31/1992,12
    111118,Travolta,Juan D,1/24/1992,12
    111119,Cruise,Amber E,5/8/1992,12}
    
    ; Program starts here:
    
    either exists? %data.txt [
        database: load %data.txt
    ][
        filename: %StudentList.csv
        database: copy []
        lines: read/lines filename
        foreach line lines [
            append database parse/all line ","
        ]
        remove/part database 5  ; get rid of headers
        for counter 6 ((length? database) + 12) 6 [
            insert (at database counter) %none
        ]
        save %data.txt database
    ]
    
    view center-face gui: layout [
        text "Load an existing record:"
        name-list: text-list blue 300x80 data sort (extract database 6) [
            if value = none [return]
            marker: index? find database value
            n/text: pick database marker
            a/text: pick database (marker + 1)
            p/text: pick database (marker + 2)
            o/text: pick database (marker + 3)
            g/text: pick database (marker + 4)
            i/text: pick database (marker + 5)
            if error? try [photo/image: load to-file i/text] [
                ; alert "No image selected"
                photo/image: none
            ]
            photo/text: ""
            show gui
        ]
        text "ID:"       n: field 300
        text "Last:"     a: field 300
        text "First:"    p: field 300
        text "BD:"       o: field 300
        text "Grade:"    g: field 300
        text "Image:"    i: btn 300 [
            i/text: request-file 
            photo/image: load to-file i/text
            show gui
        ]
        at 340x20 photo: image white 300x300
        across
        btn "Save" [
            if n/text = "" [alert "You must enter a name." return]
            if find (extract database 6) n/text [
                either true = request "Overwrite existing record?" [
                   remove/part (find database n/text) 6
                ] [
                   return
                ]
            ]
            save %data.txt repend database [
                n/text a/text p/text o/text g/text i/text
            ]
            name-list/data: sort (extract copy database 6)
            show name-list
        ]
        btn "Delete" [
            if true = request rejoin ["Delete " n/text "?"] [
                remove/part (find database n/text) 6
                save %data.txt database
                do-face clear-button 1
                name-list/data: sort (extract copy database 6)
                show name-list
            ]
        ]
        clear-button: btn "New" [
            n/text: copy  ""
            a/text: copy  ""
            p/text: copy  ""
            o/text: copy  ""
            g/text: copy  ""
            i/text: copy  ""
            photo/image: none
            show gui
        ]
        at 340x340 f1: field 300 "Search For First Names Here" [
            results: copy []
            foreach item (extract/index database 6 3)  [
                if find item f1/text [
                    append results first at database ((index? find database item) - 2)
                    t/data: copy results
                    show t
                ]
            ]
        ]
        at 340x380 f2: field 300 "Search For Last Names Here" [
            results: copy []
            foreach item (extract/index database 6 2)  [
                if find item f2/text [
                    append results first at database ((index? find database item) - 1)
                    t/data: copy results
                    show t
                ]
            ]
        ]
        at 340x420 t: text-list 300x60 [
            name-list/picked: copy value
            show name-list
            if value = none [return]
            marker: index? find database value
            n/text: pick database marker
            a/text: pick database (marker + 1)
            p/text: pick database (marker + 2)
            o/text: pick database (marker + 3)
            g/text: pick database (marker + 4)
            i/text: pick database (marker + 5)
            if error? try [photo/image: load to-file i/text] [
                ; alert "No image selected"
                photo/image: none
            ]
            photo/text: ""
            show gui
        ]
    ]
    
  4. Noteleks

    Noteleks New Member

    Man, you are awesome. This is the most help I have ever received from anyone that had to do with programming. I was a little worried because there are not as many tutorials as there are with C, C++ and so forth. I ran the first code you gave me and it shows me the GUI, but not any info. I then ran this new one and I get this error:

    Access Error: Cannot open /C/Documents and Settings/pe/My Docu
    ments/My Dropbox/Rebol/StudentList.csv
    ** Where: halt-view
    ** Near: write %StudentList.csv {STUDENTID,LASTNAME,FIRSTNAME,DOB,GRAD
    E
    111111,Doe,Steven D,6/16/1992,12
    111112,Doe,Jonathan Dani...

    I made sure that I had StudentList.csv in the same folder.

    Yes, What I need to have is what I did in FileMaker pro. I import all the student's information into Filemaker Pro. I am able to search by ID number, names, birthdates. I have over 2500 students to import. Then a button that I can advance the records forward or backwards. Yes, the images correlate with the student's ID number. Each number is unique. I keep the images in a folder called Photos in the C:\. Hope this helps. Thank you so much.
  5. Graham

    Graham Developer Staff Member

    That error says it can't write to the file.

    So, you must have a file lock on it somewhere. Does Excel have that file open? Or, is dropbox trying to sync the file the time you are writing it?
  6. Graham

    Graham Developer Staff Member

    Actually, remove this code

    Code:
    
    write %StudentList.csv {STUDENTID,LASTNAME,FIRSTNAME,DOB,GRADE
    111111,Doe,Steven D,6/16/1992,12
    111112,Doe,Jonathan Daniel,12/16/1991,12
    111113,Smith,Karen J,12/3/1991,12
    111114,Jones,Michael J,6/4/1992,12
    111115,Taylor,Ryan C,1/10/1992,12
    111116,Adam,Kaitlan C,4/30/1992,12
    111117,Washington,Gabryela,3/31/1992,12
    111118,Travolta,Juan D,1/24/1992,12
    111119,Cruise,Amber E,5/8/1992,12}
    
    as it will over write your csv file.

    It's there to provide some demo data
  7. notchent

    notchent Member

    Noteleks, from the the sound of your last questions, it seems like you could use some more general understanding of how things work in REBOL. Saving and reading files, learning to represent and manipulate data using series and variables, adding buttons to GUIs to perform simple tasks, etc. - those sorts of things are all pretty straightforward in REBOL. You mentioned that there aren't many tutorials for REBOL, but the text at http://re-bol.com should teach you more than enough to understand how to build the type of application you're trying to create here, and there are links to many other relevant documents in each section of that tutorial. The code I gave you here started with a simple example straight from that text, and there are a number of case studies there to help you learn to think more deeply in REBOL. The benefit of learning to think in code is that you can learn to take any computing concept, and create you own application, from the ground up, and design it to look and perform exactly the way you want. REBOL allows you to write cross platform applications, web site apps, etc., and it tends to be simpler than other languages for simple tasks, so the payoff is very productive. It sounds like you may have a bit of a learning curve to get past if you want to overcome the limitations of Filemaker, Access, etc., but it's really not that tough.

    To add next and previous buttons, you could try something like this:

    Code:
        btn "next"  [
            if (to-integer n/text) < 111111 [return]
            n/text: form ((to-integer n/text) + 1)
            ; "previous" button would need:  n/text: form ((to-integer n/text) - 1)
            show n
            marker: index? find database n/text
            a/text: pick database (marker + 1)
            p/text: pick database (marker + 2)
            o/text: pick database (marker + 3)
            g/text: pick database (marker + 4)
            i/text: pick database (marker + 5)
            if error? try [photo/image: load to-file i/text] [
                ; alert "No image selected"
                photo/image: none
            ]
            photo/text: ""
            show gui
        ]
    
    At this point, I would wrap most of the above code into a function, since it's been reused (copied/pasted) several times.
  8. notchent

    notchent Member

    You haven't mentioned the exact naming convention of the image files, but if they were something like C:/Photos/image_111111.jpg, you could use the following code:

    Code:
         for counter 6 ((length? database) + 12) 6 [
            insert (at database counter) to-file rejoin [
                "%/C/Photos/image_" (pick database (counter - 5)) ".jpg"
            ]
        ]
    
    Instead of:

    Code:
        for counter 6 ((length? database) + 12) 6 [
             insert (at database counter) %none
        ]
    
  9. notchent

    notchent Member

    Here are all the changes so far, with an improved search function that allows you to select the search field. Run it from somewhere other than your dropbox folder (your desktop, or anywhere that doesn't have restricted file write permissions). To test it, DO NOT include your own CSV file (this example writes out the example data file that you posted). When you're ready to try it with your exported data file, DELETE the lines of code that write out that data file:

    Code:
    REBOL [title: "Student Photos"]
    
    ; Here's an example CSV data file, exported from Excel
    ; (not really part of this program, but included here
    ; to demonstrate a fully working example):
    
    write %StudentList.csv {STUDENTID,LASTNAME,FIRSTNAME,DOB,GRADE
    111111,Doe,Steven D,6/16/1992,12
    111112,Doe,Jonathan Daniel,12/16/1991,12
    111113,Smith,Karen J,12/3/1991,12
    111114,Jones,Michael J,6/4/1992,12
    111115,Taylor,Ryan C,1/10/1992,12
    111116,Adam,Kaitlan C,4/30/1992,12
    111117,Washington,Gabryela,3/31/1992,12
    111118,Travolta,Juan D,1/24/1992,12
    111119,Cruise,Amber E,5/8/1992,12}
    
    ; Program starts here:
    
    either exists? %data.txt [
        database: load %data.txt
    ][
        filename: %StudentList.csv
        database: copy []
        lines: read/lines filename
        foreach line lines [
            append database parse/all line ","
        ]
        remove/part database 5  ; get rid of headers
        for counter 6 ((length? database) + 12) 6 [
            insert (at database counter) to-file rejoin [
                "/C/Photos/image_" (pick database (counter - 5)) ".jpg"
            ]
        ]
        save %data.txt database
    ]
    
    update: func [marker] [
        n/text: pick database marker
        a/text: pick database (marker + 1)
        p/text: pick database (marker + 2)
        o/text: pick database (marker + 3)
        g/text: pick database (marker + 4)
        i/text: pick database (marker + 5)
        if error? try [photo/image: load to-file i/text] [
            ; alert "No image selected"
            photo/image: none
        ]
        photo/text: ""
        show gui
    ]
    
    view center-face gui: layout [
        text "Load an existing record:"
        name-list: text-list blue 300x80 data sort (extract database 6) [
            if value = none [return]
            marker: index? find database value
            update marker
        ]
        text "ID:"       n: field 300
        text "Last:"     a: field 300
        text "First:"    p: field 300
        text "BD:"       o: field 300
        text "Grade:"    g: field 300
        text "Image:"    i: btn 300 [
            i/text: to-file request-file 
            photo/image: load to-file i/text
            show gui
        ]
        at 340x20 photo: image white 300x300
        across
        btn "Save" [
            if n/text = "" [alert "You must enter a name." return]
            if find (extract database 6) n/text [
                either true = request "Overwrite existing record?" [
                   remove/part (find database n/text) 6
                ] [
                   return
                ]
            ]
            save %data.txt repend database [
                n/text a/text p/text o/text g/text i/text
            ]
            name-list/data: sort (extract copy database 6)
            show name-list
        ]
        btn "Delete" [
            if true = request rejoin ["Delete " n/text "?"] [
                remove/part (find database n/text) 6
                save %data.txt database
                do-face clear-button 1
                name-list/data: sort (extract copy database 6)
                show name-list
            ]
        ]
        clear-button: btn "New" [
            n/text: copy  ""
            a/text: copy  ""
            p/text: copy  ""
            o/text: copy  ""
            g/text: copy  ""
            i/text: copy  ""
            photo/image: none
            show gui
        ]
        next-btn: btn "next"  [attempt [
            n/text: form ((to-integer n/text) + 1)
            show n
            marker: index? find database n/text
            update marker
        ]]
        prev-btn: btn "previous"  [attempt [
            n/text: form ((to-integer n/text) - 1)
            show n
            marker: index? find database n/text
            update marker
        ]]
        key keycode [down] [do-face next-btn 1]
        key keycode [up] [do-face prev-btn 1]
        at 340x340 d1: drop-down 300 data ["Last Name" "First Name" "Birthday" "Grade"]
        at 340x380 f2: field 300 "Select search field above, type search text here" [
            if d1/data = none [alert "Select a search field above" return]
            search-field: to-integer select ["Last Name" 2 "First Name" 3 "Birthday" 4 "Grade" 5] d1/data
            results: copy []
            for counter search-field (length? database) 6 [
                if find (pick database counter) copy f2/text [
                    append results pick database (counter - search-field + 1)
                ]
            ]
            t/data: copy results  show t
            if [] = results [alert "None found"]
        ]
        at 340x420 t: text-list 300x60 [
            name-list/picked: copy value
            show name-list
            if value = none [return]
            marker: index? find database value
            update marker
        ]
    ]
    
    Notice that keyboard up and down arrows do the same thing as the "next" and "previous" GUI buttons.
  10. Noteleks

    Noteleks New Member

    Amazing. I am buying the REBOL for Dummies. This program is amazing. I really appreciate your help. How can I do the following:

    When I search for a student the student information comes up with the picture. I actually figured out how to change the path. Anyway, when I look at the infomation and then hit "next" it goes to the next increment of the ID number. Example:

    The student I am looking at is 111234. I want to see the next student. Next advances the screen to 111235 and so forth. I need it to advance to the next number in my EXCEL database. I may not have the 111235 because that student may go to another school, not here. Hope that makes sense. Thank you.
  11. Graham

    Graham Developer Staff Member

    This is the code for the next button

    Code:
    next-btn: btn "next"  [attempt [
            n/text: form ((to-integer n/text) + 1)
            show n
            marker: index? find database n/text
            update marker
        ]]
    
    Which just increments the current index by 1.

    To get the next record, we have to skip 6 ahead in the database since 6 is the record size
    If we don't find anything there, we must be at the last record.

    So, untested ...

    Code:
    next-btn: btn "next" [
    	if marker: index? find database n/text [
    		either marker: pick database marker + 6 [
    			n/text: form marker
    			show n
    			update marker
    		][
    			alert "At last record!"
    		]
    	]
    ]
    
  12. Noteleks

    Noteleks New Member

    I change the coding as you suggested. I know that you put untested. Here is the errors I recieved when I hit the next button. The program would freeze. It would go to the next ID number in the Database I think, unless it is going to the end. It will not change the picture or the information. It just freezes. Here are the errors:

    Script Error: pick expected index argument of type: number logic pair
    ** Where: update
    ** Near: n/text: pick database marker
    a/text:
  13. Graham

    Graham Developer Staff Member

    Try this ...

    Code:
    next-btn: btn "next" [
    	if marker: find database n/text [
    		either marker: pick database 6 + index? marker  [
    			n/text: form marker
    			show n
    			update marker
    		][
    			alert "At last record!"
    		]
    	]
    ]
    
  14. notchent

    notchent Member

    I did this:

    Code:
    REBOL [title: "Student Photos"]
    
    ; Here's an example CSV data file, exported from Excel
    ; (not really part of this program, but included here
    ; to demonstrate a fully working example):
    
    write %StudentList.csv {STUDENTID,LASTNAME,FIRSTNAME,DOB,GRADE
    111111,Doe,Steven D,6/16/1992,12
    111112,Doe,Jonathan Daniel,12/16/1991,12
    111113,Smith,Karen J,12/3/1991,12
    111114,Jones,Michael J,6/4/1992,12
    111115,Taylor,Ryan C,1/10/1992,12
    111116,Adam,Kaitlan C,4/30/1992,12
    111117,Washington,Gabryela,3/31/1992,12
    111118,Travolta,Juan D,1/24/1992,12
    111119,Cruise,Amber E,5/8/1992,12}
    
    ; Program starts here:
    
    either exists? %data.txt [
        database: load %data.txt
    ][
        filename: %StudentList.csv
        database: copy []
        lines: read/lines filename
        foreach line lines [
            append database parse/all line ","
        ]
        remove/part database 5  ; get rid of headers
        for counter 6 ((length? database) + 12) 6 [
            insert (at database counter) to-file rejoin [
                "/C/Photos/image_" (pick database (counter - 5)) ".jpg"
            ]
        ]
        save %data.txt database
    ]
    
    update: func [marker] [
        n/text: pick database marker
        a/text: pick database (marker + 1)
        p/text: pick database (marker + 2)
        o/text: pick database (marker + 3)
        g/text: pick database (marker + 4)
        i/text: pick database (marker + 5)
        if error? try [photo/image: load to-file i/text] [
            ; alert "No image selected"
            photo/image: none
        ]
        photo/text: ""
        show gui
    ]
    
    view center-face gui: layout [
        text "Load an existing record:"
        name-list: text-list blue 300x80 data sort (extract database 6) [
            if value = none [return]
            marker: index? find database value
            update marker
        ]
        text "ID:"       n: field 300
        text "Last:"     a: field 300
        text "First:"    p: field 300
        text "BD:"       o: field 300
        text "Grade:"    g: field 300
        text "Image:"    i: btn 300 [
            i/text: to-file request-file 
            photo/image: load to-file i/text
            show gui
        ]
        at 340x20 photo: image white 300x300
        across
        btn "Save" [
            if n/text = "" [alert "You must enter a name." return]
            if find (extract database 6) n/text [
                either true = request "Overwrite existing record?" [
                   remove/part (find database n/text) 6
                ] [
                   return
                ]
            ]
            save %data.txt repend database [
                n/text a/text p/text o/text g/text i/text
            ]
            name-list/data: sort (extract copy database 6)
            show name-list
        ]
        btn "Delete" [
            if true = request rejoin ["Delete " n/text "?"] [
                remove/part (find database n/text) 6
                save %data.txt database
                do-face clear-button 1
                name-list/data: sort (extract copy database 6)
                show name-list
            ]
        ]
        clear-button: btn "New" [
            n/text: copy  ""
            a/text: copy  ""
            p/text: copy  ""
            o/text: copy  ""
            g/text: copy  ""
            i/text: copy  ""
            photo/image: none
            show gui
        ]
        next-btn: btn "Next"  [
            if error? try [
                old-num: copy n/text
                marker: (index? find database n/text) + 6
                n/text: form (pick database marker)
                show n
                update marker
            ] [n/text: copy old-num show n alert "No more records"]
        ]
        prev-btn: btn "Previous"  [
            if error? try [
                old-num: copy n/text
                marker: (index? find database n/text) - 6
                n/text: form (pick database marker)
                show n
                update marker
            ] [n/text: copy old-num show n alert "No more records"]
        ]
        key keycode [down] [do-face next-btn 1]
        key keycode [up] [do-face prev-btn 1]
        at 340x340 d1: drop-down 300 data [
            "Last Name" "First Name" "Birthday" "Grade"
        ]
        at 340x380 f2: field 300 "Select field above, type search text here" [
            if d1/data = none [alert "Select a search field above" return]
            search-field: to-integer select [
                "Last Name" 2 "First Name" 3 "Birthday" 4 "Grade" 5
            ] d1/data
            results: copy []
            for counter search-field (length? database) 6 [
                if find (pick database counter) copy f2/text [
                    append results pick database (counter - search-field + 1)
                ]
            ]
            t/data: copy results  show t
            if [] = results [alert "None found"]
        ]
        at 340x420 t: text-list 300x60 [
            name-list/picked: copy value
            show name-list
            if value = none [return]
            marker: index? find database value
            update marker
        ]
    ]
    
  15. Graham

    Graham Developer Staff Member

    I take it my little patch didn't work then?
  16. Noteleks

    Noteleks New Member

    I want to thank you to both of you for the great help so far. Graham the coding kept hanging up when I would click on next. Notchent the coding you gave me worked fine so far. I am still testing.

    QUESTION: I have been reading the coding and understand most of it. My question is though, how do I learn it. I have been looking at the tutorials but they do not show everything you guys have been coding. What is the best book to get? I am a principal at a high school and really excited with this program and want to progress in it. Thank you.
  17. notchent

    notchent Member

    Noteleks, every programming language uses variables, functions, loops, conditions, and data structures of some sort. In REBOL, the primary data structure is the "series" ("blocks"). Learning the mechanical basics of how to assign data to variable, run a for loop, execute an "if" condition check, store pieces of data in a block, etc. only takes a few minutes. Syntax concepts like that are covered in the first 50 or so pages of my tutorial at http://re-bol.com . Learning how to "think" in code - how to take an imagined concept, create a program outline, design a user interface, and fill in pseudo-code algorithms with detailed working code syntax, etc. takes several stages of learning. In my experience, most people learn to program by first learning the basics of coding syntax, using short examples. The next step is to see and understand how little bits of code go together to form complete programs (i.e., analyzing pre-designed programs). The final step is to build full programs from the ground up using outlines, pseudo-code, and other typical techniques. Case studies of the creative process are the perfect way to learn how that creative process works. I cover all those stages in my tutorial at http://re-bol.com . It's about 450 pages long, and it's a very easy read, intended for absolute beginners. It should take no more than a week to read, at a casual pace, and it covers just about every practical programming technique that you'll ever need in REBOL. There are about 60 complete programs, 21 case studies, and tons of useful documented code. If you read through the entire text, especially the documented code and case studies, you should have more than enough of an understanding to write just about any type of program you'd ever imagine in REBOL. Give it a solid read, and then ask questions when you're working on your next bit of code :)
  18. Noteleks

    Noteleks New Member

    Thank you notchent. I will do exactly what you suggested.
  19. Noteleks

    Noteleks New Member

    I click on the new button and add a new student. I then hit save. But when I go and look up the new student the student does not come up. But the student is in the data.txt. What am i doing wrong?

Share This Page