Sono nuovamente quì a chiedere aiuto...
Ho creato il listato che mi dovrebbe permettermi di fare questo:
Appena avvii il programma controllo se le ore 07.00 sono già passate o se siamo fra le 24.00 e le 06.59.
Nel primo caso genera un file che avrà come nome la data attuale nel formato ggmmaaaa.txt.
Nel secondo caso il nome del file sarà uguale al giorno precedente+il mese+l'anno, controllando però sempre se siamo al primo dell'anno o al primo del mese stabilendo così il giorno precedente....
Questo solo per l'avvio... poi una volta creato il file lo chiuderà solamente alle ore 07.00 per crearne uno nuovo.
Il mio problema è a mezzanotte.
Di seguito inserico il codice che ho fatto con quel poco che so di qbasic.
Inserisco anche l'output dove c'è il problema.
Dopo un'infinità di modifiche e di prove per risolvere il problema attualmente il codice è questo:
TYPE DateTime
Year AS INTEGER
Month AS INTEGER
Day AS INTEGER
Hour AS INTEGER
Minutes AS INTEGER
Seconds AS INTEGER
END TYPE
DECLARE SUB GetDateTime (dt AS DateTime)
DIM dt AS DateTime
GetDateTime dt
Inizio:
tempo& = 1
t! = TIMER
begfrac! = t! - FIX(t!)
REM ---- Calcolo del mese precedente
IF dt.Day = 1 AND dt.Month = 1 THEN ' Se il giorno corrente Š 1 e il mese Š gennaio
meseprec = 12 ' il mese precedente Š dicembre (12)
annoprec = dt.Year - 1
ELSE IF dt.Day > 1 THEN meseprec = dt.Month
annoprec = dt.Year
ELSE
meseprec = dt.Month - 1 'Diversamente il precedente Š l'attuale meno 1
annoprec = dt.Year
END IF
REM ---- Fine calcolo
REM ---- Calcolo del giorno precedente
IF dt.Day > 1 THEN
giornoprec = dt.Day - 1
ELSE
IF meseprec = 1 OR 3 OR 5 OR 7 OR 8 OR 10 OR 12 THEN
giornoprec = 31
ELSEIF meseprec = 4 OR 6 OR 9 OR 11 THEN
giornoprec = 30
ELSEIF meseprec = 2 THEN
IF dt.Year MOD 4 = 0 THEN
giornoprec = 29
ELSE
giornoprec = 28
PRINT "L'anno non Š bisestile e il giorno precedente e' il "; giornoprec
END IF
END IF
END IF
REM ---- Fine calcolo
REM ---- Calcolo anno precedente
REM annoprec = dt.Year - 1
REM ---- Fine calcolo
DIM giorno AS STRING ' definisce la variabile giorno come stringa
DIM mese AS STRING ' definisce la variabile mese come stringa
DIM anno AS STRING ' definisce la variabile anno come stringa
IF FIX(TIMER) > 25199 AND FIX(TIMER) < 86399.99 THEN ' se l'orario e' compreso fra le sette e le 23.59.59
IF dt.Day < 10 THEN ' e il giorno e' compreso fra 1 e 9
giorno = "0" + LTRIM$(STR$(dt.Day)) ' la variabile giorno sara' uguale a dt.Day aggiungendo lo zero se e' un giorno compreso fra l'1 e il 9 e la converte in stringa eliminando il posto per il segno (+ o -)
ELSE
giorno = LTRIM$(STR$(dt.Day))
END IF
IF dt.Month < 10 THEN
mese = "0" + LTRIM$(STR$(dt.Month)) ' converte la variabile dt.Month in stringa
ELSE
mese = LTRIM$(STR$(dt.Month))
END IF
anno = LTRIM$(STR$(dt.Year)) ' converte la variabile dt.Year in stringa
nomefile$ = giorno + mese + anno + ".txt" ' compone il nome del file
ELSE
IF giornoprec < 10 THEN ' e il giorno e' compreso fra 1 e 9
giorno = "0" + LTRIM$(STR$(giornoprec)) ' la variabile giorno sara' uguale a dt.Day aggiungendo lo zero se e' un giorno compreso fra l'1 e il 9 e la converte in stringa eliminando il posto per il segno (+ o -)
ELSE
giorno = LTRIM$(STR$(giornoprec))
END IF
IF meseprec < 10 THEN
mese = "0" + LTRIM$(STR$(meseprec)) ' converte la variabile dt.Month in stringa
ELSE
mese = LTRIM$(STR$(meseprec))
END IF
anno = LTRIM$(STR$(annoprec)) ' converte la variabile dt.Year in stringa
nomefile$ = giorno + mese + anno + ".txt" ' compone il nome del file
END IF
OPEN nomefile$ FOR APPEND AS #20 ' apre un nuovo file in modalita' APPEND
PRINT "Il nomefile prima del loop e' "; nomefile$
DO
t! = FIX(TIMER) + begfrac! + tempo&
IF t! >= 86400! THEN t! = t! - 86400
i$ = INKEY$
IF i$ = CHR$(27) THEN END
CLS
PRINT dt.Year, dt.Month, dt.Day, dt.Hour, dt.Minutes, dt.Seconds
REM ---- Calcolo del mese precedente
IF dt.Day = 1 AND dt.Month = 1 THEN ' Se il giorno corrente Š 1 e il mese Š gennaio
meseprec = 12 ' il mese precedente Š dicembre (12)
annoprec = dt.Year - 1
ELSE IF dt.Day > 1 THEN meseprec = dt.Month
ELSE
meseprec = dt.Month - 1 'Diversamente il precedente Š l'attuale meno 1
annoprec = dt.Year
END IF
PRINT "meseprec="; meseprec
REM ---- Fine calcolo
REM ---- Calcolo del giorno precedente
IF dt.Day > 1 THEN
giornoprec = dt.Day - 1
PRINT "giornoprec="; giornoprec
ELSE
IF meseprec = 1 OR 3 OR 5 OR 7 OR 8 OR 10 OR 12 THEN
giornoprec = 31
PRINT giornoprec
ELSEIF meseprec = 4 OR 6 OR 9 OR 11 THEN
giornoprec = 30
PRINT giornoprec
ELSEIF meseprec = 2 THEN
IF dt.Year MOD 4 = 0 THEN
giornoprec = 29
PRINT giornoprec
PRINT "L'anno e' bisestile e il giorno precedente e' il "; giornoprec
ELSE
giornoprec = 28
PRINT giornoprec
PRINT "L'anno non Š bisestile e il giorno precedente e' il "; giornoprec
END IF
END IF
END IF
REM ---- Fine calcolo
REM ---- Calcolo anno precedente
annoprec = dt.Year - 1
REM ---- Fine calcolo
IF FIX(TIMER) > 25199 AND FIX(TIMER) < 86399.99 THEN ' se l'orario e' compreso fra le sette e le 23.59.59
PRINT "TIMER > 25199 < 86399"
PRINT TIMER
IF dt.Day < 10 THEN ' e il giorno e' compreso fra 1 e 9
giorno = "0" + LTRIM$(STR$(dt.Day)) ' la variabile giorno sara' uguale a dt.Day aggiungendo lo zero se e' un giorno compreso fra l'1 e il 9 e la converte in stringa eliminando il posto per il segno (+ o -)
ELSE
giorno = LTRIM$(STR$(dt.Day))
END IF
IF dt.Month < 10 THEN
mese = "0" + LTRIM$(STR$(dt.Month)) ' converte la variabile dt.Month in stringa
ELSE
mese = LTRIM$(STR$(dt.Month))
END IF
anno = LTRIM$(STR$(dt.Year)) ' converte la variabile dt.Year in stringa
nomefile$ = giorno + mese + anno + ".txt" ' compone il nome del file
PRINT giorno
PRINT TIME$
PRINT nomefile$
PRINT giorno
PRINT mese
PRINT anno
ELSE
PRINT "siamo dopo la mezzanotte"
IF giornoprec < 10 THEN ' e il giorno e' compreso fra 1 e 9
giorno = "0" + LTRIM$(STR$(giornoprec)) ' la variabile giorno sara' uguale a dt.Day aggiungendo lo zero se e' un giorno compreso fra l'1 e il 9 e la converte in stringa eliminando il posto per il segno (+ o -)
ELSE
giorno = LTRIM$(STR$(giornoprec))
END IF
IF meseprec < 10 THEN
mese = "0" + LTRIM$(STR$(meseprec)) ' converte la variabile dt.Month in stringa
ELSE
mese = LTRIM$(STR$(meseprec))
END IF
anno = LTRIM$(STR$(annoprec)) ' converte la variabile dt.Year in stringa
nomefile$ = giorno + mese + anno + ".txt" ' compone il nome del file
PRINT nomefile$
PRINT DATE$
PRINT TIME$
END IF
PRINT #20, DATE$, TIME$, TIMER
IF TIME$ = "06:59:59" THEN
CLOSE #20
DO
LOOP UNTIL TIMER >= t!
GOTO Inizio
ELSE
DO
LOOP UNTIL TIMER >= t!
END IF
LOOP WHILE i$ = ""
CLOSE #20
END
SUB GetDateTime (dt AS DateTime)
'Qui ci sarebbe una race condition... :-(
mdate$ = DATE$
mtime$ = TIME$
dt.Month = VAL(LEFT$(mdate$, 2))
dt.Day = VAL(MID$(mdate$, 4, 2))
dt.Year = VAL(RIGHT$(mdate$, 4))
dt.Hour = VAL(LEFT$(mtime$, 2))
dt.Minutes = VAL(MID$(mtime$, 4, 2))
dt.Seconds = VAL(RIGHT$(mtime$, 2))
END SUB
------ FINE CODICE ------
I commenti sono lunghi e risultano trocati....![]()