Discussione:
Campi numerici contenenti blanks
(troppo vecchio per rispondere)
MarcoP
2015-12-15 09:04:23 UTC
Permalink
Ho un problema nel verificare la validità dei dati numerici in una DS.

In sostanza sposto i dati da un file senza DDS, quindi con un unico
campo alfanumerico, nella DS che però contiene anche dati numerici.

Se però il campo dal file contiene tutti blanks, non ricevo alcun
errore per dati numerici non validi dei campi della DS.

Vorrei evitare di testare i valori dei singoli campi, perché la DS in
questione può essere modificata, con l'aggiunta di altri dati numerici
e non, o cambiando la disposizione dei dati.

Se dopo le modifiche alla DS, ci sono campi numerici che contengono
dati errati, devo semplicemente fare la clear della DS, il problema è
che non me lo dice...

Devo per forza verificare il valore dei campi numerici o c'è un altro
modo?


Grazie
--
Marco
Obelix
2015-12-15 13:49:27 UTC
Permalink
Post by MarcoP
Devo per forza verificare il valore dei campi numerici o c'è un altro
modo?
Cosi' a stima:

d dsDati e ds Inz
d DsDati2 ds LikeDS(dsDati) Inz

(do whatever to fill dsdati)

Monitor ;
eval-Corr dsDati2 = DsDati ;
on-error ;
Reset dsDati ;
EndMon ;

eval-corr copia campo per campo, se in uno hai un valore nuerico non
valido ti scatena l'on-error e ci fai quel che serve.
Enigmista
2015-12-15 13:54:37 UTC
Permalink
Eval-corr , mai sentita... si impara sempre qualcosa!
Roberto Tempesti
2015-12-15 14:56:54 UTC
Permalink
d dsDati e ds Inz
d DsDati2 ds LikeDS(dsDati) Inz
(do whatever to fill dsdati)
Monitor ;
eval-Corr dsDati2 = DsDati ;
on-error ;
Reset dsDati ;
EndMon ;
eval-corr copia campo per campo, se in uno hai un valore nuerico non
valido ti scatena l'on-error e ci fai quel che serve.
Hai notizie per me?.....scusate l'intrusione
MarcoP
2015-12-15 15:49:20 UTC
Permalink
Post by Obelix
Post by MarcoP
Devo per forza verificare il valore dei campi numerici o c'è un altro
modo?
d dsDati e ds Inz
d DsDati2 ds LikeDS(dsDati) Inz
(do whatever to fill dsdati)
Monitor ;
eval-Corr dsDati2 = DsDati ;
on-error ;
Reset dsDati ;
EndMon ;
eval-corr copia campo per campo, se in uno hai un valore nuerico non
valido ti scatena l'on-error e ci fai quel che serve.
Ho fatto una prova, e da quel che ho visto mi sembra che eval-corr
faccia la "copia" dei singoli campi con stesso nome delle DS, ma mi
resta il problema: i campi numerici accettano i blanks!!

Comunque neanche io sapevo dell'esistenza del codice operativo eval-
corr, e mi sembra si possa rivelare molto utile...

Al momento ho risolto in altro modo: essendo la DS un formato record di
un DSPF, ho fatto la write del formato record con il monitor dell'errore
(monitor, write, on-error per capirci), e dato che ha dati numerici
errati posso fare la clear della DS.

Dato che sono a inizio programma posso farlo senza nessun problema in
questo modo, ma mi piacerebbe capire se posso risolvere la
cosa "nativamente", senza dover testare un singolo campo o fare la write
di un formato record.

Quindi se ci sono altri metodi da provare...
--
Marco
Obelix
2015-12-15 16:30:04 UTC
Permalink
Post by MarcoP
ma mi
resta il problema: i campi numerici accettano i blanks!!
Ma quando mai...

Piu' che altro, mi da l'impressione che eval-corr se le DS sono
identiche, copia l'intera DS senza 'sttodividere' i campi...

e infatti:

When the source and target data structures or corresponding source and
target subfields which are both data structures are defined the same way
with LIKEDS or LIKEREC, that is, both data structures are defined like
the same data structure, *the compiler will optimize the* *assignment
and assign the data structure as a whole*, and not as a series of
individual subfield assignments.

e infatti :

d dsPara e ds Extname(Ocmov00f)
d dspara2 e ds Extname(Ocmov00f) Qualified

//******************************
/Free

Eval-corr dsPara2 = dspara ;

*inlr = *on ;

mi genera un bel

Si è verificato un errore di dati decimali (C G D F).

laddove

d dsPara e ds Extname(Ocmov00f)
d dspara2 ds LikeDS(dsPara)

non lo genera. QED.
MarcoP
2015-12-16 13:17:00 UTC
Permalink
Post by Obelix
Post by MarcoP
ma mi
resta il problema: i campi numerici accettano i blanks!!
Ma quando mai...
Piu' che altro, mi da l'impressione che eval-corr se le DS sono
identiche, copia l'intera DS senza 'sttodividere' i campi...
When the source and target data structures or corresponding source and
target subfields which are both data structures are defined the same way
with LIKEDS or LIKEREC, that is, both data structures are defined like
the same data structure, *the compiler will optimize the* *assignment
and assign the data structure as a whole*, and not as a series of
individual subfield assignments.
d dsPara e ds Extname(Ocmov00f)
d dspara2 e ds Extname(Ocmov00f) Qualified
//******************************
/Free
Eval-corr dsPara2 = dspara ;
*inlr = *on ;
mi genera un bel
Si è verificato un errore di dati decimali (C G D F).
laddove
d dsPara e ds Extname(Ocmov00f)
d dspara2 ds LikeDS(dsPara)
non lo genera. QED.
Grazie mille, ho provato e ottenuto il risultato che volevo!!

Sbagliavo proprio nella definizione delle DS, utilizzando per la seconda il
LIKEDS.

Provando con entrambe le DS vuote (quindi con anche i campi numerici a
blank), ho visto anche che se non specifico INZ per quella su cui voglio
testare i valori, l'EVAL-CORR se ne frega dei campi numerici, dato che non
cambia niente da prima a dopo la specifica.

Con INZ nelle specifiche D, invece, si attiva l'on-error.

Grazie ancora, credo che mi tornerà molto utile in futuro!
--
Marco
Enigmista
2015-12-15 13:49:34 UTC
Permalink
Post by MarcoP
Ho un problema nel verificare la validità dei dati numerici in una DS.
In sostanza sposto i dati da un file senza DDS, quindi con un unico
campo alfanumerico, nella DS che però contiene anche dati numerici.
Se però il campo dal file contiene tutti blanks, non ricevo alcun
errore per dati numerici non validi dei campi della DS.
Vorrei evitare di testare i valori dei singoli campi, perché la DS in
questione può essere modificata, con l'aggiunta di altri dati numerici
e non, o cambiando la disposizione dei dati.
Se dopo le modifiche alla DS, ci sono campi numerici che contengono
dati errati, devo semplicemente fare la clear della DS, il problema è
che non me lo dice...
Devo per forza verificare il valore dei campi numerici o c'è un altro
modo?
Grazie
--
Marco
Anche io non conosco altri sistemi se non testare il valore dei campi
numerici.
Sono curioso anche io sull'esistenza di sistemi alternativi

FFILPRV IF F 4 disk
Dfilprvds ds
Dcmp1p 2
Dcmp2p 2 0
IFILPRV NS
I 1 2 CMP1
I 3 4 0CMP2Num
I 3 4 CMP2AlF
I 1 4 filprvds
/free
setll 1 filprv ;
dow 0=0;
read filprv ;
if %eof ;
leave ;
endif ;
if cmp2alf = *blank ;
clear filprvds;
endif ;
enddo ;
*inlr = *on ;
/end-free
Loading...