Newsgroup: it.comp.lang.vo-clipper
Titolo: Unrecoverable error 667: Eval stack fault

Salve, qualcuno mi sa spiegare perchè la seguente funzione, che serve ad
ottenere da un numero una stringa punteggiata (es. 1000->1.000
1999689->1.999.689)
quando viene usata con numeri da 0 a 999 (max tre cifre) mi fa uscire dal
programma con il messaggio:
PUNTATO (0)  Unrecoverable error 667: Eval stack fault
FUNCTION PUNTATO(IMPORTO,CAR)
LOCAL STRINGA, OUT, STRINGA2, IMPORTO2
  OUT:=""
  STRINGA := STR(IMPORTO)
  If LEN(STRINGA) <= 3
     OUT = STRINGA
  ELSE
     STRINGA2:=LEFT(STRINGA,LEN(STRINGA)-3)
     IMPORTO2:=VAL(STRINGA2)
     OUT = PUNTATO(IMPORTO2)+CAR+RIGHT(STRINGA,3)
  ENDIF
RETURN OUT
--
Live Long And Prosper
Emanuele Manco
Every generation has a legend... Every journey has a first step... Every
saga has a beginning...
E-mail: 
ma...@tiscalinet.it
ICQ# 36161907
Home Page: 
http://hpdma2.math.unipa.it/Manco/source.html
Stardate Home Page: 
http://hpdma2.math.unipa.it/Manco/stardate.htm

 Emanuele Manco
--
by(e) Doriano.
E-MAIL: doria~N~o@skyli~N~
k.it
PS: sostituisci  ~N~ con n per rispondere...
        To reply, replace ~N~ with n

 PUNTATO (0)  Unrecoverable error 667: Eval stack fault
A parte quanto ti ha detto Doriano, che e' sicuramente giusto, il
motivo per cui ti e' uscito l'errore 667 e' che la funzione va in
loop senza fine richiamandosi all'infinito e quando finisce lo stack
delle chiamate ti da quell'errore.
Comunque ad occhio il motivo e' che il comando str aggiunge spazi
alla stringa risultante, prova:
FUNCTION PUNTATO(IMPORTO,CAR)
LOCAL STRINGA, OUT, STRINGA2, IMPORTO2
  OUT:=""
  STRINGA := LTRIM(STR(IMPORTO)) // questa e' la riga modificata
  If LEN(STRINGA) <= 3
     OUT = STRINGA
  ELSE
     STRINGA2:=LEFT(STRINGA,LEN(STRINGA)-3)
     IMPORTO2:=VAL(STRINGA2)
     OUT = PUNTATO(IMPORTO2)+CAR+RIGHT(STRINGA,3)
  ENDIF
RETURN OUT
Ciao...
Claudio Driussi
http://www.swit.net/csoft
mailto:
cldr...@swit.net

 ha scritto nel messaggio
news:3908422C...@libero.it...





   STRINGA := STR(IMPORTO)


 OUT = TRAN( IMPORTO, "@E 9,999,999,999" )
Meglio utilizzare il nome completo TRANSFORM().
EMG

 EMG


 Miii, ma che casino che vai a fare per trasformare un importo :)))))))))
Sai ho messo meno tempo a scrivere la funzione che a cercare TRANSFORM nella
NG.
Il problema č che non lavoro sul clipper con molto entusiasmo, lo devo usare
per la manutenzione di programmi obsoleti, non tanto per il linguaggio ma
per la pedestre analisi degli archivi fatta a suo tempo da chi mi ha
preceduto.
Sto migrando tali applicazioni in ambienti piů moderni ma la transizione č
lunga....
E voi nel newsgroup per cosa usate il clipper? Per lo sviluppo di nuovi
applicativi o per la manutenzione di vecchi?


 Emanuele Manco
--


 archivi di base, puoi durare anni senza ritoccare troppo i programmi.
Sicuramente su applicazioni stand-alone il livello di efficienza di una
applicazione clipper è notevole. E' la povertà del'interfaccia che mi
riporta indietro di anni... non programmavo in ambiente DOS dal  1992...
imparare il clipper dal punto di vista professionale non è un miglioramento,
ma bisogna pur guadagnarsi la pagnotta...
Quanto al formato DBF avrà pure i suoi pregi ma anche qualche difetto come i
campi numerici che non sono in realtà numeri ma stringhe per esempio.
E poi mi manca la possibiltà di usare  SQL.
Comunque al mondo girano ancora milioni di applicazioni clipper,  se una
cosa è vecchia non è per forza brutta... pensate alle vecchie FIAT 500.
Quando funzionano sono dei gioiellini. Ma quando smettono di funzionare lo
fanno di botto e senza speranza...
--
Live Long And Prosper
Emanuele Manco
Every generation has a legend... Every journey has a first step... Every


 applicativi o per la manutenzione di vecchi?
Io lo uso, affiancato dalle Fivewin, per quasi tutto il mio lavoro. Solo
quando sono costretto da richieste specifiche allora uso il pessimo
Visual Basic.
EMG

Hello Emanuele.
28 Apr 00 17:51, you wrote to All:
 EM> i campi numerici che non sono in realtà numeri ma stringhe per
non ho capito, sui campi numerici puoi fare tutte le operazioni aritmetiche 
che clipper permette!!
Filippo

 fanno di botto e senza speranza...
Beh, il Clipper non c'è pericolo che cessi di funzionare all'improvviso.
:-)
EMG

 campi numerici che non sono in realtà numeri ma stringhe per esempio.
Questa non l'ho capita...me la spieghi?
Ciao
--
Ugo L.
http://space.tin.it/computer/uglatess/rete
http://digilander.iol.it/uglatess/rete
La mia rete casalinga con poco sforzo

 :-)
In questo ti do ragione. Anche se con il 2000 qualche problema dove ho
trovato la linea SET CENTURY OFF l'ho trovato.


 Ciao
Non mi sono ancora abituato a dover definire la lunghezza di un numero ed il
numero dei suoi!
Inoltre ho avuto qualche problema a utilizzare gli stessi archivi in Visual
Basic, dovevo ricordarmi di convertire i numeri in stringhe prima di
memorizzare i valori in una tabella e viceversa prima di usarli come numeri.


 numero dei suoi decimali!


 Con che cosa? Librerie aggiuntive? Mi interesserebbe saperne di più...
Si, ad esempio le Fivewin, se non vado errato, lo permettono (ma ti
avverto che io non ci ho mai provato in quanto preferisco di gran lunga
il procedurale o al più l'OO che l'SQL).
EMG

 Basic,
Ecco il tuo errore: usare Visual Basic! :-)
EMG

 solo il risultato viaggia in rete.
Dipende..............se sul server hai il file fisico sul quale lavora
l'RDBMS, viaggia tutto; in condizioni particolari, tipicamente in condizioni
distribuite, viaggiano intere tabelle.
Tante volte, usando RDBMS di tutti i tipi, ho maledetto i parser che
automaticamente decidono la politica di accesso e l'utilizzo degli indici.
Pensaci un attimo: potendo gestire la logica di join a livello procedurale,
hai un maggior dispendio di tempo (recuperabile mediante realizzazione di
componenti), ma un controllo estremamente spinto.
ciao    Enrico  
en...@nospamomnia.net

 Ecco il tuo errore: usare Visual Basic! :-)
Qui torniamo al discorso del guadagnarsi la pagnotta... il giorno che potrň
scegliere gli ambienti di sviluppo piů consoni alle mie esigenze (io adoro
Delphi) sarň contento.
:-)


 Emanuele Manco
--


 componenti), ma un controllo estremamente spinto.
Condivido al 100%.
EMG

Enrico Maria Giordano ha scritto:

Anch'io, e' una vita che dico che SQL non e' tutto quel gran che.
Inoltre volete mettere la comodita' di avere a disposizione Recno()
per il puntamento diretto ai record, in SQL bisogna costruirsi e gestire
una chiave primaria... una palla.


 


 Anch'io, e' una vita che dico che SQL non e' tutto quel gran che.
Però è anche vero, che usando il PL/SQL e le stored procedure si unisce la
praticità e la versatilità di un linguaggio di programmazione aille
istruzione di selezione Il fatto di poter usare una procedura come una
tabella di dati è per me impagabile.


Scusa se mi permetto, ma anche in SQL, almeno per gli RDBMS "seri" hai a
disposizione qualcosa di simile al Recno(), il Rowid(), che vale addirittura
a livello di database.
Piuttosto, da un punto di vista matematico (e dai mal di panza
dell'esperienza) si dimostra facilmente che SQL non copre tutte le necessità
transazionali, infatti se così fosse non ci sarebbe bisogno dei "procedural
languages" di appoggio e delle contorsioni per effettuare i join.+
Insomma, per bassa complessità SQL è semplice, come le cose si complicano è
una punizione, tanto più che la complicazione ricade in una terra di nessuno
tra analista e programmatore.
Ciao      Enrico       
en...@nospamomnia.net

 tra analista e programmatore.
Il problema e' che il mondo e' quasi sempre complesso e le eccezzioni sono la
norma, e' bene avere un approccio corretto, ma bisogna avere la possibilita' di
deviare dallo standard con una certa facilita'.
Comunque non dico che SQL sia negativo in senso assoluto, dico solo che
io preferisco un approccio diverso, altre presone con uno skill diverso ed
un approccio adeguato probabilmente sono piu' produttive usando SQL.


 un approccio adeguato probabilmente sono piu' produttive usando SQL.
Sono d'accordo. Io, lavorando in Visual Basic, mi sono trovato a dover
scrivere delle query (che a me sono apparse) mostruose per fare cose che
proceduralmente non dico sarebbero state più semplici ma almeno
affrontabili in modo più modulare e lineare.
EMG



FUNCTION PUNTATO(IMPORTO,CAR)
LOCAL STRINGA, 
OUT, STRINGA2, IMPORTO2
  OUT:=""
  STRINGA := 
STR(IMPORTO)
  If LEN(STRINGA) <= 3
     OUT = 
STRINGA
  ELSE
     
STRINGA2:=LEFT(STRINGA,LEN(STRINGA)-3)
     
IMPORTO2:=VAL(STRINGA2)
     OUT = 
PUNTATO(IMPORTO2)+CAR+RIGHT(STRINGA,3)
  ENDIF
RETURN 
OUT


A parte il fatto che ti conviene usare la funzione 
TRANSFORM, ma mandi in loop eterno la funzione PUNTATO che richiami direttamente 
dalla funzione stessa: potresti farla funzionare lo stesso se gestisci un 
contatore all' interno di un DO WHILE a fine stringa inserendo il punto per il 
contatore /3 = int(contatore/3)..