Noi che abbiamo visto il basic…
gennaio 19th, 2007 by Voodoobytesman

Dove si parla di etruschi, barche e vecchi supporti…
Resistenti ai cambi di hardware, software, sistemi operativi, supporto di immagazzinamento (ricordate i "veri" floppies) ho ritrovato fra i mille backup dimenticati i miei primi programmi!
Erano in Basic (nemmeno in GW-BAsic che fu un'evoluzione!), oppure in PAscal o in DB3. Ilsistema operativo era il Dos 2.0.
Quello che segue, e che metto sotto licenza GNU
, è il primo programma in assolutoper il quale io sia stato pagato. Era la gestone dei lavori del cantiere navale nel quale lavoravo come Yacht Broker free lance (eh, sì, ho fatto anche questo, ho fatto anche questo…).
Ed infatti il programma si chiamava, mescolando bassa manovalanza e laurea filosofica fresca fresca KANTIERE.
Ricordo che ignaro di ogni consuetudine a proposito chiesi 500 Lire a riga di codice (commenti inclusi!!!) il che mi fece un bel gruzzoletto (visto che fra l'altro di barche non ne riuscivo a vendere).
Credo sia il programma meglio pagato della (mia) storia informatica, viste anche le scarse funzionalità (siccome non sapevo fare le ricerche altro che sequenzialmente per trovare una che si chiamava, ad esempio, Zuzzerellona il programma doveva scorrerle tutte…).
Ecco, lo "posto" qui, senza sapere nemeno io perchè e soprattuto a chi potrebbe interessare. Ma sono sicuro che fra i miei 12 lettori di manzoniana memoriaalmeno uno ce ne sarà cui scorrerà una lacrimuccia e ce lo leggera con la nostalgia della gioventù e la trepida emozione dell'archeologo di fronte ad un iscrizione etrusca appena scovata…
10 REM ******PROGRAMMA GESTIONE LAVORI CANTIERE *********************
20 OPTION BASE 130 N = 300
40 DIM E$(N, 7), F$(300), Z$(7)
50 CLS : COLOR 0, 7
60 KEY OFF
70 Z$(1) = "N. Ordine:"
80 Z$(2) = "Nome barca:"
90 Z$(3) = "Operaio:"
100 Z$(4) = "Data comm./Ter.cons.:"
110 Z$(5) = "Lavoro…:"
120 Z$(6) = "Lavoro…:"
130 Z$(7) = "Lavoro…:"
135 GOTO 3100
140 LOCATE 23, 1: INPUT "Biglietti da fare per il giorno ? (>Enter< se non interessa o va bene la data) "; GIORNO$
150 IF LEN(GIORNO$) = 0 THEN GIORNO$ = DATE$
160 COLOR 7, 0: CLS
170 COLOR 0, 7: LOCATE 1, 1: PRINT "Ore :"; TIME$
180 LOCATE 1, 50: PRINT "Data odierna :"; DATE$
190 LOCATE 23, 1: PRINT "Giorno in uso: "; GIORNO$
200 A$ = "** TECNOMAR – GESTIONE LAVORI **"
210 REM ************************** MENU ****************************************
220 LOCATE 4, 23: PRINT A$
230 COLOR 7, 0: LOCATE 5, 23: PRINT "——————————–"
240 COLOR 0, 7: LOCATE 7, 20: PRINT "Elaborazione dati di Simone Mazzucconi"
250 LOCATE 6, 25: PRINT "Capo cantiere: Andrea Sbrana"
260 COLOR 7, 0: LOCATE 10, 1: PRINT "*******************************************************************************"
270 LOCATE 11, 1: PRINT "1* Magazzino"
280 LOCATE 12, 1: PRINT "2* Inserimento dati "
290 LOCATE 13, 1: PRINT "3* Consultazione"
300 LOCATE 14, 1: PRINT "4* Correzioni"
310 LOCATE 15, 1: PRINT "5* Elenco"
320 LOCATE 16, 1: PRINT "6* Cambio data"
330 LOCATE 17, 1: PRINT "7* Copia dati"
340 LOCATE 18, 1: PRINT "8* Rubrica"
345 LOCATE 19, 1: PRINT "9* Fine"
350 LOCATE 20, 1: PRINT "*******************************************************************************"
360 OPEN "CONTA.REC" FOR INPUT AS 2
370 INPUT #2, LAST
380 CLOSE 2
390 OP$ = INPUT$(1)
395 IF OP$ = "K" THEN 3030
400 OP = VAL(OP$)
420 IF OP <> 5 THEN 550
430 LOCATE 15, 28: INPUT "Da quale record…"; RR$
435 IF RR$ = "<" THEN 160
440 LOCATE 15, 53: INPUT "a quale"; QUA
450 IF LEN(RR$) = 0 THEN RR = 1
460 RR = VAL(RR$)
470 LOCATE 16, 28: PRINT " N"
480 LOCATE 16, 28: INPUT "Vuoi la stampa…(S/N)"; STAM$
490 LOCATE 18, 28: INPUT "Come? 1)Totale 2)Clienti 3)Cantiere 4)Scelta"; PP
500 IF PP = 4 THEN LOCATE 20, 28: INPUT "Cosa cerchi"; SCA$ ELSE 540
510 IXP$ = SCA$
520 GOSUB 3430
530 SCA$ = NEWINP$
540 IF PP = 2 OR PP = 3 THEN SCA$ = "TECNOMAR"
550 IF OP > 9 THEN 390
560 ON OP GOTO 10000, 580, 980, 1850, 1600, 50, 3240, 5000, 3190
570 REM *********************** INSERZIONE DATI ******************************
580 OPEN "lavori.dat" FOR APPEND AS 1
590 Y = 0
600 W = 0
610 POX = N – LAST – W + 1
620 W = W + 1
630 COLOR 0, 7: CLS
640 LOCATE 1, 65: PRINT "INSERZIONE"
650 LOCATE 22, 1: PRINT "Battere >ERR< per correggere"
660 LOCATE 23, 1: PRINT "Ancora disponibili "; POX; " posti in archivio."
670 IF POX < 15 THEN LOCATE 22, 1: PRINT "ATTENZIONE, HAI POCHI POSTI DISPONIBILI IN MEMORIA! INTERPELLARE Simone Mazzucconi…"
680 FOR X = 1 TO 7
690 LOCATE 4, 23: PRINT A$
700 TEMP$ = E$(W, X)
710 IF X >= 6 THEN Y = Y + 3
720 COLOR 7, 0: Y = Y + 1: LOCATE 5 + Y, 1: PRINT Z$(X): LOCATE 5 + Y, 20: INPUT E$(W, X)
725 IF E$(W, X) = "<" THEN CLOSE 1: GOTO 160
730 IF LEN(E$(W, X)) = 0 THEN E$(W, X) = TEMP$: GOTO 800
740 IXP$ = E$(W, X)
750 GOSUB 3430
760 E$(W, X) = NEWINP$
770 IF E$(W, X) <> "ERR" THEN 790
780 Y = 0: X = 1: GOTO 690
790 PRINT : PRINT : IF X > 6 AND LEN(E$(W, X)) = 0 THEN E$(W, X) = "X"
800 NEXT X
810 COLOR 0, 7: LOCATE 24, 51: INPUT "Memorizzo…(S/n)"; ME$
820 IF ME$ = "n" OR ME$ = "N" THEN GOSUB 3510 ELSE 840
830 GOTO 900
840 FOR X = 1 TO 7
850 PRINT #1, E$(W, X)
860 NEXT X
870 LOCATE 24, 51: INPUT "Vuoi la stampa (s/N)"; ST$
880 IF ST$ = "S" OR ST$ = "s" THEN GOSUB 3510 ELSE 890
890 AQ = AQ + 1
900 LOCATE 24, 51: INPUT "Altra inserzione…(s/N)"; ANN$
910 Y = 0
920 IF ANN$ = "S" OR ANN$ = "s" THEN 610 ELSE 930
930 CLOSE 1
940 PASS = 0
950 LAST = LAST + AQ
960 GOTO 2860
970 REM *********************** CONSULTAZIONE ********************************
980 IF PASS > 0 THEN 1000
990 GOSUB 3850
1000 COLOR O, 7: CLS
1010 Y = 6: LOCATE 1, 65: PRINT "CONSULTAZIONE"
1020 FOR X = 1 TO 7
1030 Y = Y + 2
1040 COLOR 7, 0: LOCATE Y, 1: PRINT "*"; X; Z$(X)
1050 NEXT X
1060 COLOR 0, 7: LOCATE 4, 23: PRINT A$
1070 LOCATE 13, 31: INPUT "Sotto quale rubrica cerco…"; RUB
1075 IF RUB = 0 THEN 160
1080 IF RUB = 4 THEN QUICK$ = "P": GOTO 1100
1090 LOCATE 15, 31: INPUT "Ricerca per intero (veloce) o parziale (I/p)"; QUICK$
1095 IF QUICK$ = "<" THEN 1070
1100 LOCATE 17, 31: INPUT "Cosa cerchi…"; S$
1105 IF S$ = "<" THEN 1090
1110 IXP$ = S$
1120 GOSUB 3440
1130 S$ = NEWINP$
1140 Y = 2
1150 FOR W = LAST TO 1 STEP -1
1160 IF LEN(E$(W, 1)) = 0 THEN 1520
1170 LOCATE 23, 75: PRINT W
1180 X = RUB
1190 IF X = 4 THEN 1260
1200 IF QUICK$ = "P" OR QUICK$ = "p" THEN 1260
1210 REM ****************** RICERCA VELOCE DATI *****************************
1220 IF LEN(E$(W, X)) = 0 THEN 1240
1230 IF ASC(S$) <> ASC(E$(W, X)) THEN 1520
1240 IF E$(W, X) = S$ THEN 1310 ELSE 1520
1250 REM **********************************************************************
1260 J = LEN(E$(W, X))
1270 FOR Q = 1 TO J
1280 IF MID$(E$(W, X), Q, LEN(S$)) = S$ THEN 1310 ELSE 1290
1290 NEXT Q
1300 GOTO 1520
1310 COLOR 7, 0: CLS
1320 COLOR 0, 7: LOCATE 1, 23: PRINT A$
1330 COLOR 7, 0: LOCATE 3, 1: PRINT "Scheda numero"; W
1340 LOCATE 4, 1: PRINT "——————————————————————————-"
1350 LOCATE 3, 55: PRINT "Fiumicino…"; GIORNO$
1360 LOCATE 5, 1: PRINT Z$(3); E$(W, 3); SPACE$(10); Z$(1); E$(W, 1)
1370 LOCATE 6, 1: PRINT Z$(2); E$(W, 2)
1380 LOCATE 7, 1: PRINT Z$(4); E$(W, 4)
1390 Y = 5
1400 FOR X = 5 TO 7
1410 Y = Y + 4: LOCATE Y, 1: PRINT Z$(X); E$(W, X)
1420 NEXT X
1430 COLOR 0, 7: LOCATE 20, 1: INPUT "Da correggere (s/N)"; EL$: IF EL$ = "s" OR EL$ = "S" THEN CC = CC + 1: COLOR 7, 0: GOTO 2210
1440 COLOR 0, 7: LOCATE 21, 1: PRINT "***************************"
1450 LOCATE 22, 1: PRINT "* *"
1460 LOCATE 23, 1: PRINT "***************************"
1470 LOCATE 22, 3: PRINT " N"
1480 LOCATE 22, 3: INPUT "VUOI LA STAMPA (s/N)"; STAM$
1485 IF STAM$ = "<" THEN 1430
1490 IF STAM$ = "s" OR STAM$ = "S" THEN GOSUB 3510
1500 LOCATE 23, 61: INPUT "CONTINUO (s/N)"; CON$
1510 IF CON$ = "s" OR CON$ = "S" THEN 1520 ELSE Y = 2: GOTO 1560
1520 NEXT W
1530 COLOR 0, 7: CLS
1540 LOCATE 12, 27: COLOR 16, 7: PRINT "FINE DATI IN ARCHIVIO!!!"
1550 FOR WAI = 1 TO 199: NEXT WAI
1560 LOCATE 24, 55: COLOR 0, 7: INPUT "ALTRA RICERCA…?(S/n)"; RIC$
1570 IF RIC$ = "n" OR RIC$ = "N" THEN 1580 ELSE 1000
1580 IF CC > 0 THEN 2740 ELSE 160
1590 REM ********************* ELENCO *****************************************
1600 COLOR 0, 7: CLS : LOCATE 1, 65: PRINT "ELENCO": LOCATE 4, 23: PRINT A$
1610 Q = 0
1620 IF PASS > 0 THEN 1640
1630 GOSUB 3850
1640 IF QUA > LAST THEN QUA = LAST
1650 FOR W = RR TO QUA
1660 ON PP GOTO 1690, 1670, 1680, 1680
1670 IF INSTR(1, E$(W, 2), SCA$) < 1 THEN 1690 ELSE 1810
1680 IF INSTR(1, E$(W, 2), SCA$) < 1 THEN 1810
1690 PRINT W; "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"
1700 FOR X = 1 TO 7
1710 IF X > 3 THEN PRINT
1720 COLOR 0, 7: PRINT E$(W, X); " * ";
1730 NEXT X
1740 PRINT "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"
1750 Q = Q + 1
1760 IF STAM$ = "S" OR STAM$ = "s" THEN GOSUB 3990 ELSE 1780
1770 GOTO 1810
1780 IF Q < 1 THEN 1810
1790 COLOR 7, 0: INPUT " >ENTER< continua ::: >C< elimina ::: >M< menu"; RI$
1800 IF RI$ = "M" OR RI$ = "m" THEN 1815
1802 Q = 0
1804 IF RI$ = "C" OR RI$ = "c" THEN E$(W, 1) = "": PU = PU + 1
1810 NEXT W
1815 IF PU > 0 THEN 2730
1820 LOCATE 22, 1: INPUT "Battere >ENTER< per tornare al menu."; MMM$
1830 GOTO 160
1840 REM *********************** CORREZIONI **********************************
1850 COLOR 0, 7: CLS
1860 PUP = 0
1870 LOCATE 4, 23: PRINT A$
1880 IF PASS > 0 THEN 1900
1890 GOSUB 3850
1900 BUB = 1
1910 CLS : LOCATE 10, 1: INPUT "Barca da correggere…"; COR$
1920 IF LEN(COR$) > 0 THEN KA = 2: GOTO 1940
1930 KA = 3: LOCATE 10, 1: INPUT "Operaio da ricercare…"; COR$
1940 IXP$ = COR$
1950 GOSUB 3440
1960 COR$ = NEWINP$
1970 J = LEN(COR$)
1980 X = KA
1990 FOR W = BUB TO LAST
2000 LOCATE 23, 1: PRINT W
2010 IF LEN(E$(W, X)) = 0 THEN 2060
2020 IF ASC(COR$) <> ASC(E$(W, X)) THEN 2060
2030 FOR Q = 1 TO J
2040 IF MID$(E$(W, X), Q, LEN(COR$)) = COR$ THEN 2110
2050 NEXT Q
2060 NEXT W
2070 LOCATE 20, 1: PRINT "ASSENTE IN ARCHIVIO"
2080 INPUT "Vuoi cercare sotto altro nome…(s/N)"; AL$
2090 IF AL$ = "S" OR AL$ = "s" THEN 1900
2100 IF PUP > 0 THEN 2740 ELSE 160
2110 BUB = W + 1: COLOR 7, 0: CLS : LOCATE 2, 23: PRINT A$
2120 COLOR 0, 7: LOCATE 1, 65: PRINT "CORREZIONI"
2130 Y = 2
2140 FOR X = 1 TO 7
2150 IF X = 5 THEN Y = Y + 1
2160 IF X >= 6 THEN Y = Y + 3
2170 Y = Y + 1: COLOR 7, 0: LOCATE Y, 1: PRINT X; "*"; Z$(X): LOCATE Y, 25: PRINT E$(W, X)
2180 NEXT X
2190 LOCATE 21, 1: INPUT "E' questo…(s/N)"; Q$
2200 IF Q$ = "S" OR Q$ = "s" THEN 2210 ELSE 1970
2210 LOCATE 21, 1: INPUT "Quale dato devi correggere…(zero per eliminare tutto il dato)"; CORR
2220 IF CORR = 0 THEN E$(W, 1) = "": COLOR 0, 7: LOCATE 23, 1: PRINT "DATO ELIMINATO " ELSE 2230
2225 IF CC > 0 THEN 2540 ELSE 2610
2230 COLOR 0, 7: LOCATE 22, 1: PRINT E$(W, CORR)
2240 COLOR 7, 0: LOCATE 24, 1: INPUT "Aggiunta, Derubricazione o Nuovo dato (A/D/N)"; AG$
2250 LOCATE 23, 1: PRINT " "
2260 IF AG$ = "D" OR AG$ = "d" THEN 2270 ELSE 2450
2270 LOCATE 23, 1: INPUT "Eliminare da dove…(prime tre lettere; se fino alla fine del dato, battere XXX)"; DATEL$
2280 IXP$ = DATEL$
2290 GOSUB 3440
2300 DATEL$ = NEWINP$
2310 IF DATEL$ <> "XXX" THEN 2380
2320 LOCATE 24, 1: INPUT "Da che punto…"; PUN$
2330 IXP$ = PUN$
2340 GOSUB 3440
2350 PUN$ = NEWINP$
2360 URCA = INSTR(E$(W, CORR), PUN$)
2370 NEZ$ = LEFT$(E$(W, CORR), URCA – 1): GOTO 2500
2380 LOCATE 24, 1: INPUT "…a dove (tutta la prima parola dopo la fine della cancellazione) "; DATEL2$
2390 IXP$ = DATEL2$
2400 GOSUB 3440
2410 DATEL2$ = NEWINP$
2420 DOV = INSTR(1, E$(W, CORR), DATEL$)
2430 DOV1 = INSTR(1, E$(W, CORR), DATEL2$)
2440 NEZ$ = LEFT$(E$(W, CORR), DOV – 1) + MID$(E$(W, CORR), DOV1 – 1): GOTO 2500
2450 LOCATE 23, 1: INPUT "Nuovo dato…"; NEZ$
2460 IXP$ = NEZ$
2470 GOSUB 3440
2480 NEZ$ = NEWINP$
2490 IF AG$ = "A" OR AG$ = "a" THEN NEZ$ = E$(W, CORR) + " " + NEZ$
2500 T = T + 1
2510 E$(W, CORR) = NEZ$
2520 COLOR 0, 7: LOCATE 23, 1: PRINT "CORREZIONE EFFETTUATA. "
2530 FOR TEMPO = 1 TO 400: NEXT TEMPO
2540 GOSUB 2930
2550 IF CC > 0 THEN 1430
2560 COLOR 0, 7: LOCATE 21, 49: PRINT "***************************"
2570 LOCATE 22, 49: PRINT "* *"
2580 LOCATE 23, 49: PRINT "***************************"
2590 LOCATE 22, 51: INPUT "Vuoi la stampa…(s/N)"; ST$
2600 IF ST$ = "S" OR ST$ = "s" THEN GOSUB 3510 ELSE 2610
2610 LOCATE 3, 50: PRINT "****************************"
2620 FOR TR = 4 TO 7
2630 LOCATE TR, 50: PRINT "* *"
2640 NEXT TR
2650 LOCATE 8, 50: PRINT "****************************"
2660 LOCATE 4, 53: PRINT "Premere:"
2670 LOCATE 5, 53: PRINT "B* altra barca"
2680 LOCATE 6, 53: PRINT "D* altro dato"
2690 PUP = PUP + 1
2700 LOCATE 7, 53: INPUT "F* fine correzioni"; LZ$
2710 IF LZ$ = "B" OR LZ$ = "b" THEN 1900
2720 IF LZ$ = "d" OR LZ$ = "D" THEN 2210
2730 REM ******************** REGISTRAZIONE CORREZIONI ************************
2740 COLOR 0, 7: LOCATE 1, 55: PRINT "REGISTRAZIONE CORREZIONI": KILL "lavori.dat"
2750 PQ = 0
2760 PASS = 0
2770 OPEN "lavori.dat" FOR APPEND AS 1
2780 FOR W = 1 TO LAST
2790 IF LEN(E$(W, 1)) = 0 THEN PQ = PQ + 1: GOTO 2830
2800 FOR X = 1 TO 7
2810 PRINT #1, E$(W, X)
2820 NEXT X
2830 NEXT W
2840 CLOSE 1
2850 LAST = W – PQ
2860 OPEN "conta.rec" FOR OUTPUT AS 2
2870 PRINT #2, LAST
2880 CLOSE 2
2890 RESET
2910 CC = 0: PU = 0
2920 GOTO 160
2930 REM ****************** MASCHERA VIDEO DATI CORRETTI **********************
2940 CLS
2950 LOCATE 4, 23: PRINT A$
2960 Y = 4
2970 FOR X = 1 TO 7
2980 IF X >= 6 THEN Y = Y + 3
2990 Y = Y + 1: LOCATE Y, 1: PRINT X; "*"; Z$(X): LOCATE Y, 20: PRINT E$(W, X)
3000 NEXT X
3010 RETURN
3020 REM ******************** DISTRUZIONE DATI *******************************
3030 CLS
3040 LOCATE 10, 10: PRINT "ATTENZIONE, CON QUESTA SCELTA SI DISTRUGGONO TUTTI I DATI MEMORIZZATI!!!"
3050 LOCATE 12, 10: PRINT "SEI SICURO E, SOPRATTUTTO, SEI AUTORIZZATO A FARLO?"
3060 LOCATE 14, 10: INPUT "INSERISCI LA PAROLA CHIAVE"; CLEF$
3070 IF CLEF$ <> "tanatos" THEN 160
3080 KILL "lavori.dat"
3090 GOTO 160
3100 REM ************************ ISTRUZIONI ***********************************
3110 CLS : COLOR 0, 7: LOCATE 4, 27: PRINT " *** DATA MARINAS ***"
3120 LOCATE 10, 1: PRINT "Questo programma, scaturito da un'idea di Andrea Sbrana, e` stato concepito e realizzato dal Dott. Simone Mazzucconi nel dicembre 1987. Suo scopo e` la ge_ stione dei lavori del cantiere. "
3130 LOCATE 13, 1: PRINT "Il suo uso e` stato reso di facile e immediata applicazione; basta seguire le indicazioni che appaiono sullo schermo."
3140 LOCATE 16, 1: PRINT "Istruzioni essenziali:"
3150 LOCATE 17, 1: PRINT "Battere sempre *ENTER* (freccetta grigia a destra) dopo ogni scelta o inserimento dati."
3160 LOCATE 19, 1: PRINT "I dati possono essere inseriti in maiuscolo o minuscolo. Solo le virgole e le virgolette non possono essere utilizzati."
3180 GOTO 140
3190 LOCATE 21, 1: PRINT "FINE LAVORI! ÿPrima sarebbe meglio comunque che tu facessi una copia dei dati…Non si sa mai!"
3200 LOCATE 23, 1: INPUT "Batti C se vuoi la copia, >ENTER< se hai proprio deciso di finire…"; COCCO$
3210 IF COCCO$ = "C" OR COCCO$ = "c" THEN 3240
3220 SYSTEM
3230 REM **************** COPIA DATI SU DISCHETTO *****************************
3240 CLS
3250 LOCATE 4, 1: PRINT "CON QUESTA SCELTA SI COPIA IL FILE DEI DATI SUL DISCHETTO (DRIVE A)"
3260 LOCATE 7, 1: PRINT "INSERISCI UN DISCHETTO INIZIALIZZATO NEL DRIVE A…"
3270 LOCATE 10, 1: INPUT "QUANDO SEI PRONTO BATTI >ENTER<…"; FGH$
3280 IF PASS > 0 THEN 3300
3290 GOSUB 3850
3300 PRINT : PRINT LAST; " records su hard-disk."
3310 KILL "A:lavori.dat"
3320 LOCATE 18, 1: PRINT "STO COPIANDO…"
3330 OPEN "a:lavori.dat" FOR OUTPUT AS 1
3340 FOR W = 1 TO LAST
3350 FOR X = 1 TO 7
3360 PRINT #1, E$(W, X)
3370 NEXT X
3380 NEXT W
3390 CLOSE 1
3400 LOCATE 18, 1: PRINT "DATI COPIATI "
3410 FOR QAZ = 1 TO 1000: NEXT QAZ
3420 GOTO 160
3430 REM ********************* TRANSLITTERAZIONE *******************************
3440 NEWINP$ = ""
3450 FOR M = 1 TO LEN(IXP$)
3460 KU = ASC(MID$(IXP$, M, 1))
3470 IF KU > 96 THEN KU = KU – 32
3480 NEWINP$ = NEWINP$ + CHR$(KU)
3490 NEXT M
3500 RETURN
3510 REM ********************** STAMPA DATI **********************************
3520 LPRINT "……………………………………………….Fiumicino, "; GIORNO$: LPRINT
3530 LPRINT CHR$(14); E$(W, 3): LPRINT
3540 FOR X = 1 TO 4
3550 IF X = 3 THEN 3570
3560 LPRINT Z$(X); "….."; E$(W, X): LPRINT
3570 NEXT X
3580 LPRINT "Descrizione lavoro: ": PRINT : PRINT : PRINT : PRINT
3590 T = 0
3600 FOR X = 5 TO 7
3610 H$ = ""
3620 IF LEN(E$(W, X)) < 4 THEN 3780
3630 FOR G = 1 TO LEN(E$(W, X))
3640 LOCATE 23, 75: PRINT G
3650 IF ASC(E$(W, X)) > 57 THEN G = LEN(E$(W, X)): H$ = E$(W, X): GOTO 3710
3660 U$ = MID$(E$(W, X), G, 1)
3670 IF ASC(U$) > 57 THEN 3690
3680 IF ASC(U$) > 47 AND MID$(E$(W, X), G + 1, 1) = "." THEN T = T + 1: GOTO 3710
3690 H$ = H$ + U$
3700 IF G = LEN(E$(W, X)) THEN 3710 ELSE 3770
3710 IF LEN(H$) = 0 THEN 3770
3720 LOCATE 17, 1: PRINT STRING$(240, " ")
3730 COLOR 0, 7: LOCATE 17, 1: PRINT H$
3740 COLOR 7, 0: LOCATE 23, 1: INPUT "Stampo questo lavoro (Fine/s/N):"; R$
3750 IF R$ = "f" OR R$ = "F" THEN 3790
3760 IF LEN(R$) = 0 THEN H$ = "": GOTO 3770 ELSE LPRINT " * "; RIGHT$(H$, LEN(H$) – 1); " (ore….)": H$ = ""
3770 NEXT G
3780 NEXT X
3790 LOCATE 24, 1: INPUT "Devi aggiungere qualcosa nelle note "; NOTE$
3800 IF LEN(NOTE$) > 0 THEN LPRINT "Note :"; NOTE$: LPRINT
3810 LPRINT : LPRINT "BUON LAVORO, "; E$(W, 3)
3820 IF E$(W, 3) = "GIORGIO" THEN LPRINT "RICORDATI DI CONSEGNARE OGNI SERA I BIGLIETTI FATTI": LPRINT "—————————————————"
3830 LPRINT : LPRINT : LPRINT
3840 RETURN
3850 REM *********************** INPUT DATI ***********************************
3860 COLOR 0, 7: LOCATE 13, 34: PRINT "ATTENDERE…"
3870 OPEN "LAVORI.dat" FOR INPUT AS 1
3880 PASS = PASS + 2
3890 FOR W = 1 TO N
3900 LOCATE 23, 76: PRINT W
3910 FOR X = 1 TO 7
3920 INPUT #1, E$(W, X)
3930 IF EOF(1) = -1 THEN 3960
3940 NEXT X
3950 NEXT W
3960 CLOSE 1
3970 LAST = W
3980 RETURN
3990 REM ***************** STAMPA ELENCO ***************************************
4000 LPRINT W; "<<<"
4010 FOR X = 1 TO 7
4020 LPRINT E$(W, X); " * ";
4030 NEXT X
4040 LPRINT "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~": LPRINT : LPRINT
4050 RETURN
5000 REM ************************* RUBRICA ***********************************
5001 REM carica ——————————————–
5010 CLS : KEY OFF
5030 OPEN "I", #3, "tel.dat"
5040 FOR X = 1 TO 500
5060 INPUT #3, F$(X)
5070 IF EOF(3) = -1 THEN 5090
5080 NEXT X
5090 DER = X
5100 CLOSE #3
5110 REM —————————-menu`———————
5120 CLS : PRINT : PRINT "NUMERO DATI", DER, "Usare lettere maiuscole": PRINT
5130 COLOR 16, 7
5140 PRINT " "
5150 PRINT " NON OCCORRE BATTERE >ENTER< PER LE VARIE SELEZIONI "
5160 PRINT " "
5170 COLOR 7, 0: PRINT : PRINT : PRINT " MENU`": PRINT : PRINT
5180 PRINT " 1 STAMPA ELENCO": PRINT
5190 PRINT " 2 RICERCA": PRINT
5200 PRINT " 3 NUOVO NUMERO": PRINT
5210 PRINT " 4 CORREZIONE": PRINT
5220 PRINT " 5 ORDINE ALFABETICO": PRINT
5230 PRINT " 6 FINE USO": PRINT
5240 PRINT
5250 W$ = INPUT$(1): W = VAL(W$)
5260 IF W = 1 THEN 5320
5270 IF W = 2 THEN 5390
5280 IF W = 3 THEN 5790
5290 IF W = 5 THEN 5670
5300 IF W = 4 THEN 5530
5310 IF W = 6 THEN 160 ELSE 5250
5320 REM————————–ELENCO———————————–
5330 CLS : COLOR 0, 7
5340 PRINT " ELENCO "
5350 COLOR 7, 0: PRINT : PRINT
5360 FOR X = 1 TO DER
5361 A = A + 1
5362 IF A <= 22 THEN 5368
5364 K$ = INPUT$(1)
5366 A = 0
5367 IF K$ = "N" OR K$ = "n" THEN A = 0: GOTO 5120
5368 PRINT X; F$(X): NEXT X: PRINT : PRINT : A = 0
5370 INPUT "PREMERE Enter PER TORNARE AL MENU`", M$
5380 GOTO 5120
5390 REM——————————–RICERCA—————-
5400 CLS : COLOR 0, 7
5410 PRINT " RICERCA "
5420 COLOR 7, 0: PRINT : PRINT
5430 PRINT : PRINT " PREMERE Enter PER TORNARE AL MENU`"
5440 PRINT : PRINT
5450 INPUT " QUALE NOME"; R$: PRINT
5455 IXP$ = R$: GOSUB 3430
5456 R$ = NEWINP$
5460 R = LEN(R$): IF R = 0 THEN 5110
5470 FOR X = 1 TO DER
5480 A$ = LEFT$(F$(X), R)
5490 IF A$ = R$ THEN PRINT F$(X)
5500 NEXT X
5510 GOTO 5430
5520 REM———————–correzione———————————–
5530 CLS : COLOR 0, 7
5540 PRINT " CORREZIONE "
5550 COLOR 7, 0: PRINT : PRINT
5560 PRINT " PREMERE Enter per tornare al menu`"
5570 PRINT
5580 INPUT "QUALE NOME"; L$
5585 IXP$ = L$: GOSUB 3430
5586 L$ = NEWINP$
5590 L = LEN(L$): IF L = 0 THEN 5720
5600 FOR X = 1 TO DER
5610 S$ = LEFT$(F$(X), L)
5620 IF S$ = L$ THEN 5650
5630 NEXT X
5640 GOTO 5670
5650 PRINT : PRINT F$(X): PRINT : INPUT "NOME CORRETTO"; F$(X)
5660 GOTO 5580
5670 REM———————–ORDINE——————————–
5680 FOR J = DER – 1 TO 1 STEP -1: FLAG = -1
5690 FOR K = 1 TO J
5700 IF F$(K) > F$(K + 1) THEN FLAG = 0: SWAP F$(K), F$(K + 1)
5710 NEXT K
5711 IF FLAG = 0 THEN
GOTO 5712
ELSE
GOTO 5720
END IF
5712 NEXT J
5720 KILL "tel.dat": OPEN "tel.dat" FOR APPEND AS 3
5730 FOR X = 1 TO DER
5740 IF LEN(F$(X)) = 0 THEN 5760
5750 PRINT #3, F$(X)
5760 NEXT X
5770 CLOSE #3
5780 GOTO 5030
5790 REM ******************** OUTPUT DATI **************************************
5800 COLOR 0, 7: CLS
5810 OPEN "tel.dat" FOR APPEND AS 3
5820 X = X + 1: INPUT "Nuovo dato"; F$(X)
5830 TAT = TAT + 1
5840 IF LEN(F$(X)) = 0 THEN 5870
5850 PRINT #3, F$(X)
5860 PRINT : PRINT : PRINT : GOTO 5820
5870 CLOSE #3: COLOR 7, 0
5880 DER = DER + TAT
5890 GOTO 5670
10000 REM *********************** MAGAZZINO **********************************
10001 DEFINT A-Z
10020 CLS : COLOR 0, 7
10030 BELL$ = CHR$(7)
10040 REM **************** APERTURA FILE INVENTARIO ****************************
10050 OPEN "R", #5, "INVENT.DAT", 38
10060 REM ************** RECORD DI INTESTAZIONE *******************************
10070 FIELD #5, 1 AS STAT$, 2 AS NART$
10080 REM ************************RECORD DATI*********************************
10090 REM *********************************************************************
10100 FIELD #5, 30 AS DESC$, 2 AS QNT$, 2 AS SCRT$, 4 AS PRZ$
10110 IF LOF(5) = 0 THEN 10170
10120 GET #5, 1
10130 IF STAT$ = "C" THEN 10150
10140 PRINT BELL$; ">>–> ATTENZIONE: file precedentemente non chiuso"
10150 NART = CVI(NART$)
10160 GOTO 10190
10170 NART = 0
10180 LSET NART$ = MKI$(0)
10190 LSET STAT$ = "O" 'STATO DEL FILE OPEN
10200 PUT #5, 1
10210 PRINT : PRINT
10220 CLS
10230 PRINT " Ci sono "; NART; " articoli nel file. "
10240 PRINT
10250 PRINT "Scegliere una delle seguenti opzioni:"
10260 PRINT "1….Controllo di un articolo esistente"
10270 PRINT "2….Introduzione nuovo articolo"
10280 PRINT "3….Modifica articolo esistente"
10290 PRINT "4….Vendita"
10300 PRINT "5….Acquisto"
10310 PRINT "6….Elenco articoli sotto scorta minima"
10320 PRINT "7….Fine programma"
10330 PRINT "—————————————-": VV = 0
10340 SEL$ = INPUT$(1): SEL = VAL(SEL$)
10350 IF SEL >= 1 AND SEL <= 7 THEN 10380
10360 PRINT "Sono ammesse solo selezioni tra 1 e 7."
10370 GOTO 10340
10380 IF NART > 0 OR SEL = 2 OR SEL = 7 THEN 10410
10390 PRINT BELL$; ">>–> File vuoto."
10400 GOTO 10340
10410 ON SEL GOSUB 10460, 10540, 10650, 10750, 10810, 10870, 11060
10420 GOTO 10210
10430 '
10440 'controllo di un articolo esistente
10450 '
10460 OOP$ = " controllare "
10470 GOSUB 11540 'cerca l'articolo
10480 GOSUB 11170 'stampa dati articolo
10490 PRINT : INPUT "Premer >ENTER< per continuare…", AA$
10500 RETURN
10510 '
10520 'introduzione nuovo articolo
10530 '
10540 PRINT
10550 NART = NART + 1: ART = NART
10560 LSET DESC$ = "NUOVO ART."
10570 LSET QNT$ = MKI$(0): LSET SCRT$ = MKI$(0): LSET PRZ$ = MKS$(0)
10580 GOSUB 11260 'inserimento nuovo articolo
10590 PRINT : INPUT "altri articoli da introdurre ?(s/n)", AA$
10600 IF AA$ = "S" OR AA$ = "s" THEN 10540
10610 RETURN
10620 '
10630 ' MODIFICA ARTICOLO ESISTENTE
10640 '
10650 OOP$ = "modificare"
10660 GOSUB 11540
10670 GOSUB 11260
10680 PRINT
10690 INPUT "Altri articoli da modificare? (s/n)", AA$
10700 IF AA$ = "S" OR AA$ = "s" THEN 10660
10710 RETURN
10720 '
10730 ' vendita di un articolo
10740 '
10750 OOP$ = "vendere": SEGNO = -1
10760 GOSUB 11400
10770 RETURN
10780 ' Acquisto
10790 '
10800 '
10810 OOP$ = "acquistare": SEGNO = 1
10820 GOSUB 11400 'calcolo dati acquisto
10830 RETURN
10840 '
10850 ' elenco articoli esistenti
10860 '
10870 CNT = 0
10880 FOR ART = 1 TO NART
10890 GET #5, ART + 1
10900 QNT = CVI(QNT$): SCRT = CVI(SCRT$)
10910 IF QNT > SCRT THEN 10980
10920 CNT = CNT + 1
10930 GOSUB 11170 'stampa articoli sotto scorta
10940 PRINT ">>–>";
10950 IF QNT = SCRT THEN PRINT " in"; ELSE PRINT SCRT – QNT; " al disotto della";
10960 PRINT " scorta minima."
10970 VV = VV + 1: IF VV > 2 THEN VV$ = INPUT$(1): VV = 0
10980 NEXT ART
10990 IF CNT = 0 THEN PRINT "Nessun "; ELSE PRINT : PRINT CNT;
11000 PRINT "articolo al disotto della scorta minima."
11010 PRINT : INPUT "Premere >ENTER< per continuare…", AA$
11020 RETURN
11030 '
11040 ' fine programma – chiusura file
11050 '
11060 LSET STA$ = "C" 'stato file=chiuso
11070 LSET NART$ = MKI$(NART)
11080 PUT #5, 1
11090 CLOSE #5
11100 GOTO 160
11110 '
11120 'legge numero articolo
11130 '
11140 '
11150 ' stampa dati su articolo
11160 '
11170 PRINT
11180 PRINT "Num. art."; ART; TAB(18); "Descrizione: "; DESC$
11190 PRINT "Quantita` disponibile:"; CVI(QNT$)
11200 PRINT "Scorta minima:"; CVI(SCRT$)
11210 PRINT "Prezzo unitario:"; CVS(PRZ$)
11220 RETURN
11230 '
11240 ' modifica articolo
11250 '
11260 PRINT "Num. art.:"; ART; " (>ENTER< se nessuna modifica.)"
11270 PRINT "Descrizione: "; DESC$; TAB(45); : INPUT ": ", AA$
11275 IXP$ = AA$: GOSUB 3430
11276 AA$ = NEWINP$
11280 IF AA$ <> "" THEN LSET DESC$ = AA$
11290 PRINT "Quantita` disponibile:"; CVI(QNT$); TAB(45); : INPUT ". ", AA$
11300 IF AA$ <> "" THEN LSET QNT$ = MKI$(VAL(AA$))
11310 PRINT "Scorta minima:"; CVI(SCRT$); TAB(45); : INPUT ": ", AA$
11320 IF AA$ <> "" THEN LSET SCRT$ = MKI$(VAL(AA$))
11330 PRINT "Prezzo unitario:"; CVS(PRZ$); TAB(45); : INPUT ": ", AA$
11340 IF AA$ <> "" THEN LSET PRZ$ = MKS$(VAL(AA$))
11350 PUT #5, ART + 1
11360 RETURN
11370 '
11380 ' vendite o acquisti
11390 '
11400 GOSUB 11540 'cerca l'articolo
11410 GOSUB 11170 'stampa dati su articoli
11420 QNT = CVI(QNT$): SCRT = CVI(SCRT$): PRZ! = CVS(PRZ$)
11430 PRINT : PRINT "Introdurre numero dei pezzi da "; OOP$; : INPUT ": ", A
11440 IF QNT + SEGNO * A >= 0 THEN 11470
11450 PRINT "Non disponibili piu` di"; QNT; "pezzi."
11460 GOTO 11430
11470 QNT = QNT + SEGNO * A
11480 PRINT "Ora ci sono"; QNT; "pezzi disponibili."
11490 LSET QNT$ = MKI$(QNT)
11500 PUT #5, ART + 1
11510 PRINT : PRINT "Altri articoli da "; OOP$; : INPUT "? (s/n)", AA$
11520 IF AA$ = "S" THEN 11400
11530 RETURN
11540 ZUT = 0: INPUT "Articolo da ricercare…(>ENTER< per elenco)"; SER$
11545 IXP$ = SER$: GOSUB 3430
11546 SER$ = NEWINP$
11550 CX = 0
11560 CLS
11570 FOR ART = 1 TO NART
11580 GET #5, ART + 1
11590 LL = LEN(SER$)
11600 JER$ = LEFT$(DESC$, LL)
11610 IF JER$ = SER$ THEN ZUT = ZUT + 1: CX = CX + 1: PRINT ART; DESC$
11620 IF CX < 22 THEN 11640 ELSE 11630
11630 J$ = INPUT$(1): CX = 0
11640 NEXT ART
11650 IF ZUT = 0 THEN INPUT "ARTICOLO INESISTENTE….Battere >ENTER< per tornare al menu`", ENT$: GOTO 10210
11660 INPUT "Quale…"; ART
11670 GET #5, ART + 1
11680 RETURN