Problema su formattazione della data

giovedì 21 maggio 2009 - 14.35

gabriel81 Profilo | Junior Member

Buongiorno a tutti. Sto realizzando un applicazione per la memorizzazione di schede di riparazione.
Il db è access l'applicazione vb.net.
per la memorizzazione di una scheda esiste una query di INSERT con dei parametri

INSERT INTO Riparazioni ( campo1,campo2, campo3...)
SELECT [PARAM1] AS Espr1, [PARAM2] AS Espr2, [PARAM3] AS Espr3, .....;

che aziono tramite oledbcommand e oledbparameters.

Funziona benone tranne quando non inserisco una data.
Ho perfino provato a creare un campotesto personalizzato:

Public Class CampoTestoMascherato
Inherits MaskedTextBox
Public ReadOnly Property ValoreData()
Get
Dim _val As Date
If Me.Text = " / /" Then
_val = Convert.ToDateTime("")
Else
_val = Convert.ToDateTime(Me.Text)
End If
Return _val
End Get
End Property
End Class

ma mi dice che non riesce a convertire la stringa in data...
se gli passo nothing dice che non è stato immesso un valore per il parametro

La mia domanda è questa: cosa caspita gli devo passare per dirgli che non c'è data???? (su access se lascio il campo vuoto non fà nessuna storia)

vi prego aiutatemi.... grazie
http://www.myspace.com/madmack1981

luxsor Profilo | Guru

Ciao Gabriel,
in Access il campo data deve essere racchiuso tramite gli #:
Formato compatibile: #21/05/2009#

quindi per funzionare dovresti fare una cosa del genere:
CampoData = (#" & format(cdate(Date),"dd/mm/yyyy") & "#)

>La mia domanda è questa: cosa caspita gli devo passare per dirgli
>che non c'è data???? (su access se lascio il campo vuoto non
>fà nessuna storia)

Se vuoi specificare un campo vuoto, basto lo metti in NULL

Fammi sapere



------------------------
Luxsor

gabriel81 Profilo | Junior Member

se gli metto la data nel campo funziona, non funziona solo se il campo è vuoto...

ho provato a mettere valore "nothing" ma non va bene... NULL è diverso da nothing? come faccio?
http://www.myspace.com/madmack1981

luxsor Profilo | Guru

Basta scrivi assegni alla variabile il testo NULL

Variabile="NULL"



------------------------
Luxsor

gabriel81 Profilo | Junior Member

no... mi dice tipi di dati non corrispondenti nell'espressione criterio....
http://www.myspace.com/madmack1981

luxsor Profilo | Guru

Prova così:

NomeVariabile=ISNULL("Valore da assegnare")

Se non dovesse funzionare neache così, allora posta il codice che lo controllo



------------------------
Luxsor

Jeremy Profilo | Guru

Ciao Gabriel.
Prova ad usare il metodo Date.TryParse


Facci sapere...
Ciao

gabriel81 Profilo | Junior Member

i seguenti danno false

Dim _date As New Date
MsgBox(Date.TryParse("0", _date))
anche se al posto di 0 mettiamo NULL ISNULL #NULL# #ISNULL#


... vi posto il codice.. grazie ragazzi
http://www.myspace.com/madmack1981

gabriel81 Profilo | Junior Member

Questo è il codice che esegue crea il comando da eseguire (i commenti sono prove precedenti) :


Private Sub SalvaNuovaScheda()
Dim _cmd As New OleDbCommand()
Dim _prm1 As New OleDbParameter()
Dim _prm2 As New OleDbParameter()
Dim _prm3 As New OleDbParameter()
Dim _prm4 As New OleDbParameter()
Dim _prm5 As New OleDbParameter()
Dim _prm6 As New OleDbParameter()
Dim _prm7 As New OleDbParameter()
Dim _prm8 As New OleDbParameter()
Dim _prm9 As New OleDbParameter()
Dim _prm10 As New OleDbParameter()
Dim _prm11 As New OleDbParameter()
Dim _prm12 As New OleDbParameter()
Dim _prm13 As New OleDbParameter()
Dim _prm14 As New OleDbParameter()

Dim _Dif As New InterfacciaDatabase

_cmd.CommandType = CommandType.StoredProcedure
_cmd.CommandText = "SYS_NuovaScheda"
_prm1.ParameterName = "CODCLIENTE"
_prm1.Value = Me.TXTCODCLIENTE.Text
_prm2.ParameterName = "CODARTICOLO"
_prm2.Value = Me.TXTCODARTICOLO.Text
_prm3.ParameterName = "Matricola"
_prm3.Value = Me.TXTMatricola.Text
_prm4.ParameterName = "DataBollaCliente"
_prm4.Value = Me.TXTDataBollaCliente.Text

_prm5.ParameterName = "N_BollaCliente"
_prm5.Value = Me.TXTN_BollaCliente.Text
_prm6.ParameterName = "DataRicezione"
_prm6.Value = Me.TXTDataRicezione.Text
_prm7.ParameterName = "Garanzia"
_prm7.Value = Me.Garanzia.Checked
_prm8.ParameterName = "CODFORNITORE"
_prm8.Value = Me.TXTCODFORNITORE.Text
_prm9.ParameterName = "CODASSISTENZA"
_prm9.Value = Me.TXTCODASSISTENZA.Text
_prm10.ParameterName = "DataInvio"
_prm10.DbType = OleDbType.Empty
'_prm10.Value = "NULL"
'_prm10.Value = Me.TXTDataBollaInvio.ValoreData
_prm11.ParameterName = "DataRitorno"
_prm11.DbType = OleDbType.Empty
'_prm11.Value = "NULL"
'_prm11.Value = Me.TXTDataBollaRitorno.ValoreData
_prm12.ParameterName = "N_BollaInvio"
_prm12.Value = Me.TXTN_BollaInvio.Text
_prm13.ParameterName = "N_BollaRitorno"
_prm13.Value = Me.TXTN_BollaRitorno.Text
_prm14.ParameterName = "DurataGaranzia"
If Me.TXTDurataGaranzia.Text = Nothing Then
_prm14.Value = 0
Else
_prm14.Value = Me.TXTDurataGaranzia.Text
End If


_cmd.Parameters.Add(_prm1)
_cmd.Parameters.Add(_prm2)
_cmd.Parameters.Add(_prm3)
_cmd.Parameters.Add(_prm4)
_cmd.Parameters.Add(_prm5)
_cmd.Parameters.Add(_prm6)
_cmd.Parameters.Add(_prm7)
_cmd.Parameters.Add(_prm8)
_cmd.Parameters.Add(_prm9)
_cmd.Parameters.Add(_prm10)
_cmd.Parameters.Add(_prm11)
_cmd.Parameters.Add(_prm12)
_cmd.Parameters.Add(_prm13)
_cmd.Parameters.Add(_prm14)

_Dif.eseguiQuery(_cmd)
End Sub
http://www.myspace.com/madmack1981

gabriel81 Profilo | Junior Member

Questa è la query:

INSERT INTO Riparazioni ( CODCLIENTE, CODARTICOLO, Matricola, DataBollaCliente, N_BollaCliente, DataRicezione, Garanzia, CODFORNITORE, CODASSISTENZA, DataInvio, DataRitorno, N_BollaInvio, N_BollaRitorno, DurataGaranzia )
SELECT [CODCLIENTE] AS Espr1, [CODARTICOLO] AS Espr2, [Matricola] AS Espr3, [DataBollaCliente] AS Espr4, [N_BollaCliente] AS Espr5, [DataRicezione] AS Espr6, [Garanzia] AS Espr7, [CODFORNITORE] AS Espr8, [CODASSISTENZA] AS Espr9, [DataInvio] AS Espr10, [DataRitorno] AS Espr11, [N_BollaInvio] AS Espr12, [N_BollaRitorno] AS Espr13, [DurataGaranzia] AS Espr14;

http://www.myspace.com/madmack1981

luxsor Profilo | Guru

Scusami, ma nella struttura del DB hai impostato che questi campi accettano valori Nulli?


------------------------
Luxsor

gabriel81 Profilo | Junior Member

Access mi permette di impostare solo "Richiesto" dove ho messo ovviamente No.....
(Le classi che ho fatto per SQL Server, hanno la stessa struttura... e vanno che è una meraviglia...)

gabriel81 Profilo | Junior Member

un altra cosa se lancio la query da access, mi compaiono i vari prompt per l'inserimento del parametro, quando è il momento della data lascio vuoto, è il record lo inserisce....
http://www.myspace.com/madmack1981

luxsor Profilo | Guru

Purtroppo sul PC che sto utilizzando, non c'è Access.
Se puoi allegarmi un esempio completo con DB e codice.



------------------------
Luxsor

gabriel81 Profilo | Junior Member

la vedo dura... il db di access è collegato ad AS400... vedo un po'

comunque è vero che a prima vista sembra tutto a posto?
a me non sembra di aver fatto degli errori esorbitanti...

ora vado a casa, ci medito e domani vi faccio sapere... grazie tante!
http://www.myspace.com/madmack1981

luxsor Profilo | Guru

Basta anche un db con qualche campo.



------------------------
Luxsor

gabriel81 Profilo | Junior Member

Ecco il db.
ci sono tutte le tabelle, la query incriminata, e ho replicato anche tutte le relazioni

grazie infinite ragazzi
http://www.myspace.com/madmack1981

luxsor Profilo | Guru

Allora, eseguiendo la query da access accetta il valore Null nel campo. Quindi utilizzando una query in formato stringa funziona.

Per far accettare il paramentro NULL alla classe Parameter devi settare la proprietà IsNullable a True

Es.
_prm11.ParameterName = "DataRitorno"
_prm11.IsNullable = True
'_prm11.Value = Me.TXTDataBollaRitorno.ValoreData

In questo case se la textbox databollaritorno restituisce un valore vuoto, tale funzione te lo setta a NULL




------------------------
Luxsor

gabriel81 Profilo | Junior Member

ma a te funziona?

a me no...

comunque sai cosa ho pensato? io mi scrivo una funzione che converte
campo vuoto -> 01/01/1900 in scrittura
01/01/1900 0.00.00 -> "" in lettura

aggiro il problema, tanto non è un programma che dovranno usare nelle multinazionali... anche se mi scoccia usare questi accrocchi...

Tuttavia mi consolo perchè credo che facendo così (eliminando valori NULL sulla colonna data) dovrei migliorare le performance in ricerca

se poi a te funziona è un altro discorso... vediamo di farlo funzionare anche a me..
http://www.myspace.com/madmack1981

luxsor Profilo | Guru

Si a me funziona, ma dipende dal codice, non vorrei che tu non usi correttamente la classe parameter.

Allega un esempio con il codice che utilizzi così controllo.




------------------------
Luxsor

gabriel81 Profilo | Junior Member

il codice l'ho già postato... cosa ti manca?


l'unica cosa che non hai è la classe di interfacciamento col db:

Public Class InterfacciaDatabase
Public StringaConnessione As String = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=./assistenza.mdb;"
Public Connessione As New OleDbConnection(StringaConnessione)

Public Function getDT(ByVal Comando As OleDbCommand)
Cursor.Current = Cursors.WaitCursor
Dim _dt As New DataTable()

Connessione.Open()
Try
Comando.Connection = Connessione
Dim _adapter As OleDbDataAdapter = New OleDbDataAdapter(Comando)
_adapter.Fill(_dt)
Catch ex As OleDbException
MsgBox(ex.Message)
End Try
Connessione.Close()
Cursor.Current = Cursors.Default
Return _dt
End Function

Public Sub eseguiQuery(ByVal Comando As OleDbCommand)
Cursor.Current = Cursors.WaitCursor

Connessione.Open()
Try
Comando.Connection = Connessione
Comando.ExecuteNonQuery()
Catch ex As OleDbException
MsgBox(ex.Message & ex.ErrorCode)
End Try
Connessione.Close()
Cursor.Current = Cursors.WaitCursor

End Sub

End Class



http://www.myspace.com/madmack1981

luxsor Profilo | Guru

Non sto riuscendo a capire il codice:
>_Dif.eseguiQuery(_cmd)

se alla funzione eseguiQuery gli passi la collection di parametri la insert dove la passi?




------------------------
Luxsor

rob88 Profilo | Junior Member

Salve a tutti....io ti consiglierei di gestire le date come tipo stringa...

alexmed Profilo | Guru

Ciao
Scusate ma qui:

_prm10.ParameterName = "DataInvio"
_prm10.DbType = OleDbType.Empty
'_prm10.Value = "NULL"
'_prm10.Value = Me.TXTDataBollaInvio.ValoreData

Quando specifichi il tipo di dato, non dovrebbe essere di tipo Date (_prm10.DbType = OleDbType.Date)?

Dopodichè non potresti sostituire le varie TextBox ("Me.TXTDataBollaInvio") con dei DateTimePicker?

Ciao

alexmed

gabriel81 Profilo | Junior Member

Scusa il ritardo!!!
quel codice è una routine che accetta un vuole oledbcommand del quale esegue il metodo executenonquery() (la classe te l'ho postata..)
la parte insert la prende dal oledbcommand.commandtext="nome_Query_access" e con oledbcommandtype = storedprocedure





http://www.myspace.com/madmack1981

AntCiar Profilo | Expert

Ciao.

Per precisare il formato delle date in access è '#mm/dd/yyyy#'.
Per quanto riguarda il tuo problema, se nella tabella il campo data accetta valori nulli, allora passa "NULL" come valore. Nel caso in cui non accetta valori nulli, puoi passargli il valore DateTime.MinValue (01/01/0001). Se usi questa seconda opzione devi poi fare in modo che quando leggi un valore uguale a DateTime.Minvalue devi considerarlo come se non ci fosse scritto nulla.
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2025
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5