2017-06-06 2 views
2

Dans VBA, j'ai une collection de jeux d'enregistrements ADO sur lesquels je veux faire des calculs et stocker les valeurs dans le jeu d'enregistrements en mémoire pendant que l'utilisateur utilise le formulaire.Comment modifier le type de données d'un champ de jeu d'enregistrements ADO?

Mes problèmes: après avoir fait un calcul sur, disons, et entier, je reçois un double/float. Lorsque j'essaie de stocker cela dans le jeu d'enregistrements, il est converti en un entier. Je veux que la précision du double/float après le calcul soit préservée.

Mon idée: changer le type de données du champ Je suis le calcul et le stockage. Je ne vois pas comment le faire. Comment je fais ça? Puis-je faire cela?

Ex:

Option Explicit 
Sub test() 

Dim rs As ADODB.Recordset 
Dim sql As String 
sql = "select * from test;" 
Set rs = frsGetPgRecordset(sql) 

Do While rs.EOF = False 
    Debug.Print rs!x & "<- original" 
    Debug.Print Application.WorksheetFunction.Log(rs!x) & "<- what I want stored" 
    rs.Fields("x") = Application.WorksheetFunction.Log(rs!x) 
    Debug.Print rs!x & "<- what I get" 
    rs.MoveNext 
Loop 

End Sub 

Je reçois:

8<- original 
0.903089986991944<- what I want stored 
1<- what I get 
20<- original 
1.30102999566398<- what I want stored 
1<- what I get 

Remarque, cela ne change pas la base de données parce que frsGetPgRecordset (fournit pas parce qu'il est pas critique à la question) je:

rs.CursorType = adOpenKeyset 
rs.CursorLocation = adUseClient 
rs.LockType = adLockBatchOptimistic 

Vous pouvez obtenir plus d'informations ici sur cette partie, car les gens vont demander: https://docs.microsoft.com/en-us/sql/ado/reference/ado-api/cursortype-property-ado Update recordset without updating database

+0

Donc, vous voulez le logarithme de la valeur stockée? Si c'était la base, quelle était la valeur? Aussi, doit-il être stocké dans le RS, pouvez-vous écrire les résultats dans un tableau double? – Absinthe

+0

Y at-il une raison pour laquelle vous ne pouvez pas ajouter à votre jeu d'enregistrements un nouveau champ avec le type «double» et stocker les résultats de calcul là? – RADO

+1

Je ne pense pas que vous puissiez changer les types de données, donc la meilleure solution serait ce que @RADO a suggéré. –

Répondre

3

Je voudrais simplement stocker des calculs des résultats dans un nouveau champ plutôt que de tenter de changer un champ existant:

rs.Fields.Append "New_Field", adDouble