Newsgroup: it.comp.lang.visual-basic
Titolo: Da RecordSet a Variabile

Ciao a tutti,
stavo pensando di scrivere una funzioncina che mi assegni ad una variabile
il contenuto di un Adodb.Field, senza fare #n Funzioni per ogni tipo avevo
pensato ad un variant:
Sarebbe da usare in questo senso:
Dim MyCur as currency
Rs2var myCur, Rs.Fields("IMPORTO")
dim MyDate as Date
Rs2var myDate, Rs.Fields("DATANASCITA")
Ovviamente do' per valido che l'adodb.Field sia di un tipo corretto
rispetto alla variabile in cui voglio metterlo.
Sinceramente però non mi piace come l'ho fatta...
-----------------------------------------------------------
Public Sub Rs2Var(ByRef vntOut As Variant, RsField As ADODB.Field)
 
  Select Case VarType(vntOut)
 
    Case vbLong
      If Not IsNull(RsField.Value) Then
        vntOut = CLng(RsField.Value)
      Else
        vntOut = 0
      End If
    Case vbCurrency
      If Not IsNull(RsField.Value) Then
        vntOut = CCur(RsField.Value)
      Else
        vntOut = 0
      End If
 
    Case vbDate
      If Not IsNull(RsField.Value) Then
        vntOut = CDate(RsField.Value)
      Else
        'vntOut = vbEmpty
      End If
 
    Case vbString
      If Not IsNull(RsField.Value) Then
        vntOut = CStr(RsField.Value)
      Else
        vntOut = ""
      End If
    'ecc gli altri tipi
  End Select
  Debug.Print vntOut
End Sub
-- 
DBMS Firebird
VB6 + Ado


Beh, se si chiama Rs2Var dovrebbe funzionare come
Rs2var Rs.Fields("DATANASCITA"), myDate
o meglio ancora
myDate = Rs2var(Rs.Fields("DATANASCITA"))
Ma sinceramente non ne vedo l'utilità, in particolare se tu conosci già il 
tipo di destinazione.
Io usavo qualcosa del genere:
Function NullDef(ByVal Value as Variant, optional byval Default As Variant) 
As Variant
    If IsNull(Value) Or IsEmpty(Variant) Then
        If IsMissing(Default) Then
            NullDef = 0
        Else
            NullDef = Default
        End If
    Else
        NullDef = Value
    End If
End Function
da usare così
myDate = NullDef(Rs.Fields("DATANASCITA"))
o
myDate = NullDef(Rs.Fields("DATANASCITA"), Now)
Ciao

 myDate = NullDef(Rs.Fields("DATANASCITA"))
Ecco, io ne ho una simile, NoNull ma di tipo stringa, e usata per buttare
sulle textbox. Ora prenderò spunto dalla tua e ne farò una nuova generica.
PS: se un Rs.Fields(i) è ad esempio numerico con virgola e lo assegno ad
una variabile currency non ho mica problemi di virgole e opzioni di
separatori?
Cioè
myCurr= Rs.Fields("IMPORTO").Value
Funziona sempre e in ogni caso? (escluso il caso Null ovviamente)
Tnx


 Funziona sempre e in ogni caso? (escluso il caso Null ovviamente)
Funziona sempre in rapporto alle regole di conversione implicita di VB (che 
poi segue un po' il classico cast per i tipi base, es. tra numerici, e 
conversione tra tipi eterogenei, es. da numerici a stringa).
Il problema più grosso che potresti avere, a parte quello della perdita di 
precisione, è la possibilità di overflow se il tipo di destinazione non è un 
"supertipo".
Ciao 

 "supertipo".
Sisi allora mi sta bene. In quanto sarò ad assegnare variabili del giusto
tipo per quello che devo caricare.
Avrei un'altro dubbio, che riguarda un'altra cosa.
Sto partendo con un nuovo progetto e mi servirebbero proprietà aggiuntive
per le caselle di testo. Per ora ho usato la tag, caricandola all'avvio:
txt.Tag="DDATANASCITA|Data di Nascita"
Dove il primo carattere mi da il tipo, il secondo pezzo il campo sul DB,
l'ultima parte la caption per la label.
Mi servirebbe avere il modo di estendere le proprietà e avevo pensato ad un
array di Type da mandare in parallelo all'array di txt.
Type txtType
  Tipo Campo as string * 1 ' o una enun a questo punto
  NomeCampoDB as string
  NomeCaption as string
  SoloMaiuscole as boolean
  bModificato as boolan		'Se ho modificato il campo
  IndexLabelDesc as integer	'Qui mettere l'index di dove caricare la desc
del campo
end Type
E' una cosa fattibile oppure un è un po' gravosa?
