{"id":6665,"date":"2024-02-22T14:56:40","date_gmt":"2024-02-22T13:56:40","guid":{"rendered":"https:\/\/msxitalia.org\/?p=6665"},"modified":"2024-02-22T15:00:19","modified_gmt":"2024-02-22T14:00:19","slug":"lezione-23-i-dati-gestiti-dal-msx-2-parte","status":"publish","type":"post","link":"https:\/\/msxitalia.org\/en\/lezione-23-i-dati-gestiti-dal-msx-2-parte\/","title":{"rendered":"LESSON 23 \u2013 THE DATA MANAGED BY THE MSX (2nd Part)"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">Riprendiamo la nostra lezione della volta scorsa, di cui la mia ultima spiegazione \u00e8 stata sui comandi per poter &#8220;lavorare&#8221; con i files. Oggi parler\u00f2 come creare i files sequenziali, ma prima di non aver detto 2 parole del comando MAXFILES=. questo comando ci fa lavorare con pi\u00f9 files contemporaneamente. All&#8217;accensione del Nostro MSX, il suddetto \u00e8 per default 1, perci\u00f2 non possiamo aprire pi\u00f9 di un file alla volta, ad esempio se stiamo lavorando in modo grafico ed abbiamo aperto la periferica GRP per scrivere su di esso, non possiamo aprire nessun&#8217;altro file. Modificando questo parametro, abbiamo risolto il problema. Il comando inizializzer\u00e0 tutti le variabili, perci\u00f2 conviene usarlo sempre all&#8217;inizio del programma: MAXFILES=3. Adesso possiamo lavorare con 3 files contemporaneamente. Esso riserver\u00e0 spazio in memoria per ogni file che verr\u00e0 aggiunto, perci\u00f2 conviene usarlo solo quando serve. Per creare un file dati usiamo il comando OPEN e visto che \u00e8 un nuovo file dobbiamo crearlo per la scrittura: OPEN &#8220;[Unit\u00e0:]Nome File&#8221; FOR OUTPUT AS #[numero di porta]. Unit\u00e0, come ho detto nella lezione precedente pu\u00f2 essere il registratore e in questo caso sar\u00e0 CAS: oppure il DRIVE A: o B: . Le regole sono uguali a quello che ho detto, sempre nella lezione precedente, 6 caratteri senza estensione per le cassette ed 8 caratteri + estensione (anche se non \u00e8 obbligatoria) per i Drives. Vi ricordate quel programma che ho scritto qualche lezione fa, un&#8217;agenda, ecco, useremo quello per i nostri esempi. Avevo messo il Nome, L&#8217;indirizzo \u00e8 il Numero telefonico. Dopo averli creati li possiamo salvare sul nostro file, che chiameremo &#8220;AGENDA.DAT&#8221; su disco. Per il registratore sar\u00e0: CAS:AGENDA. La riga di programma sar\u00e0: OPEN &#8220;AGENDA.DAT&#8221; FOR OUTPUT AS #1. Se possediamo pi\u00f9 di un drive e vogliamo creare il nostro disco dati sull&#8217;altro, basta aggiungere il nome del drive prima del nome file: &#8220;B:AGENDA.DAT&#8221;, tutto quello che faremo su di esso, sar\u00e0 trasferito sul drive B. Salviamo i nostri dati con il comando PRINT #1. Creeremo il record diviso in 3 campi. Adesso prestate attenzione a quello che dir\u00f2 in seguito. Se vogliamo registrare 3 campi nello stesso record, usando PRINT #1 N$,I$,T$, che sarebbero le variabili di Nome, Indirizzo e Telefono, mettendo le virgole come ho fatto, li vedr\u00e0 come segni di spaziatura ma non come divisori di variabili, e quando verranno letti, saranno visti come unica variabile. Per fare capire all&#8217;MSX che sono pi\u00f9 variabili, dobbiamo inserirli dentro con il corrispettivo codice ASCII oppure tra virgolette: PRINT #1, N$; &#8220;,&#8221;; I$; &#8220;,&#8221;; T$. Ogni volta che inseriremo un nuovo record verr\u00e0 accodato sempre dietro l&#8217;ultimo, questo avverr\u00e0 fino a quando non chiuderemo il file con il comando CLOSE: CLOSE #1 . Usato senza cancelletto e numero di porta chiuder\u00e0 tutti i files aperti. Su cassetta, una volta chiuso il file sequenziale non potr\u00e0 pi\u00f9 essere modificato, perch\u00e9 se lo riapriamo in output canceller\u00e0 tutto il suo contenuto, la stessa cosa vale anche su disco. Ma su quest&#8217;ultimo c&#8217;\u00e8 la possibilit\u00e0 di poterlo aprire senza cancellare il suo contenuto. OPEN &#8220;AGENDA.DAT&#8221; FOR APPEND AS #1. Cos\u00ec facendo continueremo ad aggiungere i nostri dati sul file. Possiamo salvare anche dati formattati usando PRINT #1, USING &#8220;Stringa Formato&#8221;; variabile, variabile, . . Possiamo usare anche una variabile a stringa invece del Nome File. Ad esempio, un programma che lavora con tanti files ed il nome verr\u00e0 specificato all&#8217;interno di esso: INPUT &#8220;Nome del File&#8221;; NF$: OPEN NF$ FOR OUTPUT AS#1. Passiamo alla fase di lettura dei dati. Adesso il file verr\u00e0 aperto in entrata, cio\u00e8 in modalit\u00e0 lettura: OPEN&#8221;AGENDA.DAT&#8221; FOR INPUT AS #1. Per leggere i dati scritti in precedenza useremo il comando INPUT #1 oppure LINE INPUT #1. La differenza tra i due 2 \u00e8 che il primo legger\u00e0 un campo alla volta mentre il secondo tutto il record anche se abbiamo aggiunto le virgole di separazione. Per fare un esempio, con il salvataggio dei dati fatto sopra, se vogliamo leggere un campo alla volta per inserirlo in 3 variabili, useremo: INPUT #1, N$,I$,T$, se invece vogliamo leggere tutto il record, useremo : LINE INPUT #1, A$. La variabile A$ sar\u00e0 N$+I$+T$. Quando l&#8217;MSX legge i dati dal file sequenziale, dovr\u00e0 sapere quando questi finiranno, per questo c&#8217;\u00e8 la funzione EOF (Numero porta). EOF (End Of File) controlla se ci sono ancora dati da leggere. La linea di programma da inserire sempre prima della lettura del file \u00e8 cos\u00ec composta: IF EOF(1) THEN CLOSE #1. Eviteremo un increscioso errore che ci dar\u00e0 l&#8217;MSX se facciamo leggere un file dove non ci saranno pi\u00f9 dati. Come detto sopra, di seguito inserisco il programma con tutte le modifiche per lavorare con il file. E&#8217; valido solo per i dischetti, ma con qualche modifica pu\u00f2 essere usato anche per il registratore a cassette.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">5 KEY OFF: SCREEN 0,,,2: WIDTH 40: CLEAR(2000):DEFINT A-Z: DIM M$(50,2)<br>10 ON ERROR GOTO 1000: CN=0: GOSUB 600<br>20 CLS:LOCATE 15,1: PRINT &#8220;M E N U&#8221;: GOSUB 100<br>30 S$=INKEY$: IF S$=&#8221;&#8221; THEN 30<br>40 IF S$&lt;&#8220;1&#8243; OR S$&gt;&#8221;4&#8221; THEN 30<br>50 ON VAL(S$) GOSUB 200,300,400,500<br>60 GOTO 30<br>100 LOCATE 1,4 : PRINT&#8221;1 &#8211; INSERIMENTO DATI&#8221;<br>110 LOCATE 1,8 : PRINT&#8221;2 &#8211; MODIFICA DATI&#8221;<br>120 LOCATE 1,12: PRINT&#8221;3 &#8211; VISUALIZZA DATI&#8221;<br>130 LOCATE 1,20: PRINT&#8221;4 &#8211; USCITA PROGRAMMA&#8221;<br>140 RETURN<br>200 IF FRE(&#8220;&#8221;)&lt;50 OR CN=50 THEN PRINT &#8220;ATTENZIONE !! Non si possono fare piu&#8217; inserimenti&#8221;: FOR R=0 TO 2000:NEXT R: RETURN ELSE OPEN &#8220;AGENDA.DAT&#8221; FOR APPEND AS#1 205 CLS: LOCATE 12,0: PRINT &#8220;INSERIMENTO&#8221; 210 LOCATE 1,4: LOCATE 1,4:INPUT &#8220;NOME (MAX 10 CARAT.)&#8221;;N$ 215 IF LEN(N$)=0 OR LEN(N$)&gt;10 THEN LOCATE 0,4:PRINT SPACE$(39): GOTO 210<br>220 LOCATE 1,8: INPUT &#8220;INDIRIZZO (MAX 18 CARAT.)&#8221;;I$<br>225 IF LEN(I$)=0 OR LEN(I$)&gt;18 THEN LOCATE 0,8:PRINT SPACE$(39): GOTO 220<br>230 LOCATE 1,12:INPUT &#8220;TELEFONO (MAX 10 CARAT.)&#8221;; T$<br>235 IF LEN(T$)=0 OR LEN(T$)&gt;10 THEN LOCATE 0,12:PRINT SPACE$(39): GOTO 230<br>240 LOCATE 1,18: PRINT &#8220;CORRETTO (S\/N)? &#8220;<br>250 S$=INKEY$: IF S$=&#8221;&#8221; THEN 250<br>260 IF S$=&#8221;s&#8221; OR S$=&#8221;S&#8221; THEN PRINT #1,N$;&#8221;,&#8221;;I$;&#8221;,&#8221;;T$:CN=CN+1:M$(CN,0)=N$:M$(CN,1)=I$:M$(CN,2)=T$:GOTO 280<br>270 IF S$=&#8221;N&#8221; OR S$=&#8221;N&#8221; THEN 205 ELSE 250<br>280 LOCATE 1,18: PRINT &#8220;ALTRO INSERIMENTO (S\/N)?&#8221;<br>285 S$=INKEY$: IF S$=&#8221;&#8221; THEN 285<br>290 IF S$=&#8221;N&#8221; OR S$=&#8221;N&#8221; THEN CLOSE #1: RETURN 20<br>295 IF S$=&#8221;s&#8221; OR S$=&#8221;S&#8221; THEN 205 ELSE 285<br>300 CLS:LOCATE 15,0: PRINT &#8220;MODIFICA&#8221;<br>303 INPUT &#8220;INSERIRE IL NOME DA RICERCARE&#8221;;NO$<br>306 FOR I=1 TO CN:IF NO$=M$(I,0) THEN 310<br>308 NEXT: PRINT &#8220;Nome non trovato&#8221;: FOR R=0 TO 2000:NEXT: RETURN 20<br>310 LOCATE 0,4:INPUT &#8220;NOME(Confermare per non cambiare)&#8221;;N$<br>320 IF N$=&#8221;&#8221; THEN LOCATE 0,5:PRINT M$(I,0) ELSE M$(I,0)=N$<br>330 LOCATE 0,8: INPUT &#8220;INDIRIZZO(Confermare per non cambiare)&#8221;;I$<br>340 IF I$=&#8221;&#8221; THEN LOCATE 0,9:PRINT M$(I,1) ELSE M$(I,1)=I$<br>350 LOCATE 0,12:INPUT &#8220;TELEFONO(Confermare per non cambiare)&#8221;;T$<br>360 IF T$=&#8221;&#8221; THEN LOCATE 0,13:PRINT M$(I,2) ELSE M$(I,2)=T$<br>370 OPEN &#8220;AGENDA.DAT&#8221; FOR OUTPUT AS #1<br>380 FOR I=1 TO CN: PRINT #1, M$(I,0);&#8221;,&#8221;;M$(I,1);&#8221;,&#8221;;M$(I,2):NEXT I<br>390 CLOSE #1: RETURN 20<br>400 CLS:LOCATE 10,0: PRINT &#8220;VISUALIZZAZIONE&#8221;<br>410 FOR I=1 TO CN<br>420 PRINT M$(I,0);TAB(11);M$(I,1);TAB(30);M$(I,2)<br>430 IF IMOD10=0 THEN GOSUB 450<br>440 NEXT: GOSUB 450: RETURN 20<br>450 PRINT:PRINT &#8220;Premere spazio per continuare&#8221;<br>460 IF INKEY$=&#8221; &#8221; THEN RETURN ELSE 460<br>500 CLS:END<br>600 OPEN &#8220;AGENDA.DAT&#8221; FOR INPUT AS #1<br>610 IF EOF(1) THEN CLOSE #1: RETURN<br>620 CN=CN+1:INPUT #1,M$(CN,0),M$(CN,1),M$(CN,2)<br>630 GOTO 610<br>1000 IF ERR=53 THEN OPEN &#8220;AGENDA.DAT&#8221; FOR OUTPUT AS #1: CLOSE #1: RESUME 20<br>1010 RESUME NEXT<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">La spiegazione del programma la far\u00f2 nella prossima puntata.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Grazie a tutti e arri sentirci.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Riprendiamo la nostra lezione della volta scorsa, di cui la mia ultima spiegazione \u00e8 stata sui comandi per poter &#8220;lavorare&#8221; con i files. Oggi parler\u00f2 come creare i files sequenziali, ma prima di non aver detto 2 parole del comando MAXFILES=. questo comando ci fa lavorare con pi\u00f9 files contemporaneamente. All&#8217;accensione del Nostro MSX, il [&hellip;]<\/p>\n","protected":false},"author":4,"featured_media":6311,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_et_pb_use_builder":"","_et_pb_old_content":"","_et_gb_content_width":"","footnotes":""},"categories":[14],"tags":[],"dipi_cpt_category":[],"class_list":["post-6665","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-msx-basic"],"_links":{"self":[{"href":"https:\/\/msxitalia.org\/en\/wp-json\/wp\/v2\/posts\/6665","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/msxitalia.org\/en\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/msxitalia.org\/en\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/msxitalia.org\/en\/wp-json\/wp\/v2\/users\/4"}],"replies":[{"embeddable":true,"href":"https:\/\/msxitalia.org\/en\/wp-json\/wp\/v2\/comments?post=6665"}],"version-history":[{"count":6,"href":"https:\/\/msxitalia.org\/en\/wp-json\/wp\/v2\/posts\/6665\/revisions"}],"predecessor-version":[{"id":6699,"href":"https:\/\/msxitalia.org\/en\/wp-json\/wp\/v2\/posts\/6665\/revisions\/6699"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/msxitalia.org\/en\/wp-json\/wp\/v2\/media\/6311"}],"wp:attachment":[{"href":"https:\/\/msxitalia.org\/en\/wp-json\/wp\/v2\/media?parent=6665"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/msxitalia.org\/en\/wp-json\/wp\/v2\/categories?post=6665"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/msxitalia.org\/en\/wp-json\/wp\/v2\/tags?post=6665"},{"taxonomy":"dipi_cpt_category","embeddable":true,"href":"https:\/\/msxitalia.org\/en\/wp-json\/wp\/v2\/dipi_cpt_category?post=6665"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}