Newsgroup: it.comp.appl.access
Titolo: Come definire un campo Ado come Decimal(18,8) ?

Sto cercando di usare un recordset Ado creato 'al volo' per memorizzare 
delle righe contabili, l'intento e' di avere un campo 'imponibile' 
definito come decimal(18,8) che quindi possa avere 8 cifre dopo la virgola
Uso questo codice:
 
.....
Set MyRsRigheContabili = New ADODB.Recordset
MyRsRigheContabili.Fields.Append "id_movimenticontabilitestate", integer
MyRsRigheContabili.Fields.Append "imponibile", adDecimal, 18, 8
.....
 
ma evidentemente c'e' qualcosa di sbagliato nella definizione del campo 
aliquota_iva perche' se vado a memorizzarci qualcosa mi viene tenuta 
solo la parte intera, e quindi se vado a fare un
 
MyRsRigheIva("imponibile") = Nz(txtIvaImponibile, 0) / 100
 
dove txtIvaImponibile contiene un 1856 nel campo del recordset ci viene 
scritto un bel 18 e basta al posto del 18,56 che vorrei scriverci
Immagino che sia la riga
 
MyRsRigheContabili.Fields.Append "imponibile", adDecimal, 18, 8
 
che non va bene
Quindi la domanda e':  come fare per definire all'interno di un 
recordset Ado un campo decimal 18 interi e 8 posti dopo la virgola?
 
 

Se inserisci così cosa succede:
MyRsRigheContabili.Fields.Append "imponibile", adDecimal
 
@Alex


Ho provato, col Decimal e basta tiene solo gli interi, un  87.45 viene 
memorizzato e quando vai a richiamarlo tira fuori un  87 e basta
Temporaneamente, e per favorire chi avesse lo stesso problema che sto 
riscontrando, ho risolto cosi'
 
............................
MyRsRigheIva.Fields.Append "imposta", adDecimal, 18, 8
Set fa = MyRsRigheIva.Fields("imposta")
fa.NumericScale = 18
fa.Precision = 8
 
MyRsRigheIva.Fields.Append "imponibile", adDecimal, 18, 8
Set fa = MyRsRigheIva.Fields("imponibile")
fa.NumericScale = 18
fa.Precision = 8
............................
 
ma spero ci sia una modalita' piu' sintetica perche' sono numerosi i 
campi cui devo assegnare il decimal(18,8) e passare da due righe a 8 
righe di codice e' un vero obbrobrio

It happens that RobertoA formulated :

Definisci nella tabella il campo:
Field Name: XX     Data Type: Number
 
Field Size = Decimal
Precision  = 18
Scale      =  8
Decimal Places   = Auto
 
Bruno


Non capisco la tua indicazione
Non sto parlando del db fisico
Ma di un recordset ado che vorrei creare 'al volo' per mantenere delle 
informazioni che mi servono per dei conteggi intermedi
Quello che vorrei trovare e' una notazione sintetica per indicare la 
creazione di un recordset ado che abbia uno  o piu' campi decimal, 
precision 18, scale 8
Ho trovato un modo che funziona ed e' questo
 
MyRsRigheIva.Fields.Append "imposta", adDecimal, 18, 8
Set fa = MyRsRigheIva.Fields("imposta")
fa.NumericScale = 18
fa.Precision = 8
 
ma se trovassi modo di ottenere lo stesso con una riga al posto delle 4 
righe di codice sopra, sarebbe meglio

RobertoA brought next idea :


Bruno Campanini explained :

Io invece mi riferivo al campo della tabella:
Quando quello è definito come sopra, il recordset che ne legge
il valore ha le stesse proprietà Decimal(18,8).
 
Se non serve... butta via!
 
Bruno


In effetti su db fisico gia' c'ho alcuni campi definiti come 
decimal(18,8), non e' quello il problema
Ma la richiesta iniziale, e' basata sull'ipotesi della creazione in ram 
della struttura necessaria per tenermi alcuni record relativi alle righe 
iva di un documento, e su questo farci dei conteggi
E quindi non leggo dal db fisico ma vorrei creare il recordset in ram, 
terminati i conteggi lo distruggo  :)

> MyRsRigheIva.Fields.Append "imposta", adDecimal, 18, 8 
 
La sintassi prevede:
 
fields.Append Name, Type, DefinedSize, Attrib, FieldValue  
 
Analizzando la tua:
 
Name="TuoNome"
Type = adDecimal
DefinedSize = 18 (numero di Byte)
Attrib=8 (questo mi perplime... se guardo l'enum sarebbe [adFldUnknownUpdatable])
 
Per l'enum degli attributi:
https://docs.microsoft.com/en-us/sql/ado/reference/ado-api/fieldattributeenum?view=sql-server-ver15
 
 
Quindi temo che, non esista l'equivalente di Precision come Attribute...
 
@Alex


E gia', probabilmente ho scritto quell'8 andando 'a naso'
Ora verifico cosa diavolo riesco a memorizzare su questi campi
Come faresti a definire un campo 18 interi + 8 decimali?
 

 Come faresti a definire un campo 18 interi + 8 decimali?
 
Fatico a capirne l'utilità reale di quello stai operando.
 
Il campo Decimal, è rappresentato da queste caratteristiche:
https://docs.microsoft.com/it-it/dotnet/visual-basic/language-reference/data-types/decimal-data-type
 
 
Ne consegue che la definizione di quello che dici è puramente a scopo di Rappresentazione, come mettere nelle Tabelle Numero Decimali = 2 su  un campo Double... e pensare che il campo abbia solo 2 Decimali...
 
Questa cosa è una pura fantasia ovviamente in quanto il campo in oggetto è di Tipo Double... e quelle proprietà NON modificano il Campo ma condizionano la VISUALIZZAZIONE del dato.
Accomunabile alla FORMAT(Valore,"#.00")... o a quando imposti il Formato nella TextBox.
Ora il pechè tu abbia questa necessità è ben da capire se sia Funzionale o Grafica.
 
@Alex

RobertoA has brought this to us :

Un recordset si crea solo in RAM!
 
Crea una seconda tabella con le proprietà di campo che ti interessano
[Decimal (8,18)], copiaci tutta la prima tabella originale,
lavoraci su magari con una query poi elimina la seconda tabella
(automaticamente viene eliminata anche la query).
Delle cazzate se ne fan tante... si può fare anche così.
 
Bruno

 Bruno
 
Bruno, si sta parlando di Recordset disconnessi, credo tu non abbia compreso la differenza.
 
@Alex


Si certo potrei fare anche cosi'
Mi secca creare una tabella solo per fare quattro calcoli
Oltre al fatto che sarei curioso di capire come fare tutto in ram


L'utilita' e' mantenere una copia 'specchio' di alcuni record del db, 
modificarli, e poi se necessario salvarli sul db fisico
 
Non capisco perche' parli di mera 'rappresentazione'
Da link che hai indicato
 
"...Contiene valori Signed a 128 bit (16 byte) che rappresentano numeri 
di tipo Integer a 96 bit (12 byte) scalati in base a una potenza 
variabile di 10. Il fattore di scala specifica il numero di cifre a 
destra del separatore decimale. è compreso tra 0 e 28...."
 
quel che capisco io e' che il tipo Decimal possa contenere numeri per i 
quali e' definibile un 'fattore di scala' compreso tra 0 e 28
Dove per fattore di scala si intendono i decimali alla destra del numero 
stesso, che nel suo complesso sara' un signed 128 bit
In questo senso non mi pare che il tuo esempo sia calzante, si tratta di 
definire dov'e' la virgola di quel numero
Ed io vorrei definire la posizione della virgola virgola in modo da 
poter contenere 8 decimali
 

Si ho capito cosa dici, ma ci siamo fraintesi...
un campo di tipo Decimal in Tabella non consente la modifica di quei PARAMETRI, che rimangono fissi, ma con Transact SQL(SQL SERVER), si possono modificare facendo il CASTING dei dati su campi Calcolati ad esempio, ma readonly, questo equivale con JET ad usare la funzione FORMAT come ti dicevo, che tuttavia impatta SOLO sulla visualizzazione del dato non sul contenuto.
 
Invece, giustamente su RS non associati è possibile modificare subito i valori in fase di CREAZIONE del Nuovo Campo, come recita quì:
https://docs.microsoft.com/it-it/sql/ado/reference/ado-api/numericscale-property-ado?view=sql-server-ver15
 
 
Quindi il LINK che ti cito sopra spiega che quello che hai usato è l'UNICO metodo per farlo.
;-)
 
@Alex