Visualizzazione dei risultati da 1 a 10 su 10
  1. #1

    [VB.NET] Controllo date

    La richiesta è semplicissima (non per me)...

    Dati 2 controlli DateTimePicker in una form il programma deve estrarre dalla tabella clienti , tutti quelli che compiono gli anni in quel range di date.
    Il cliente ha il campo DATADINASCITA ed i dati sono memorizzati in SQL Server 2005.

    Non riesco ad utilizzare il comando Format nella query per poter "cambiare" l'anno della data di nascita e controllarne i risultati.

    Il codice (LinqToSql) è :
    (caso in cui le date inserite sono dello stesso anno)

    Dim clienti = From cliente In dc2011.Clienti Where (Format(cliente.datanascita, "dd/mm/" + Str(anno1)) >= DateTimePicker1.Text) And (Format(cliente.datanascita, "dd/mm/" + Str(anno1)) <= DateTimePicker2.Text) Select cliente

    dove anno1 è l'anno della prima data nonchè della seconda data.

    L'errore che esce è :
    Non sono supportate conversioni a SQL per il metodo 'System.String Format(System.Object, System.String).

    Grazie
    Alberto

  2. #2
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,472

    Re: [VB.NET] Controllo date

    Originariamente inviato da babystuta
    L'errore che esce è :
    Non sono supportate conversioni a SQL per il metodo 'System.String Format(System.Object, System.String).
    Non puoi utilizzare Format all'interno dell'espressione LINQ, poiché non è traducibile nell'espressione finale di destinazione in formato SQL.

    Sostituisci Format con una forma equivalente (es. concatenamento), oppure estrailo dall'espressione e determina prima il suo valore passandolo all'espressione LINQ.

    Ciao!
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Twitch | Altro...

  3. #3
    Concatenamento ti permette di unire più parti del campo.
    Quindi nell'espressione Linq dovrei riCREARE il campo datadinascita in formato dd/mm/yyyy con il metodo concatenamento ?

  4. #4
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,472
    Originariamente inviato da babystuta
    Quindi nell'espressione Linq dovrei riCREARE il campo datadinascita in formato dd/mm/yyyy con il metodo concatenamento ?
    Secondo me, è sufficiente che sostituisca Format con concatenamenti (tramite l'operatore "+") e metodi ToString per convertire valori "non stringa" in stringa.

    In alternativa, spiega meglio cosa dovrebbe restituirti l'espressione LINQ in questione per vedere se c'è una forma migliore in cui esprimere il tipo di query che desideri eseguire.
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Twitch | Altro...

  5. #5
    Perfetto : l'espressione LINQ mi deve restituire tutti i clienti che compiono gli anni tra 2 date impostate dall'utente.

  6. #6
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,472
    Originariamente inviato da babystuta
    Perfetto : l'espressione LINQ mi deve restituire tutti i clienti che compiono gli anni tra 2 date impostate dall'utente.
    Dovrebbe essere sufficiente una cosa del genere:

    codice:
    ' Determinazione dell'intervallo delle date (da ricavare dall'input dell'utente)
    Dim BeginDate As DateTime = New DateTime(DateTime.Now.Year, 9, 1)
    Dim EndDate As DateTime = New DateTime(DateTime.Now.Year, 10, 31)
    
    ' Selezione dei clienti che compiono gli anni in quell'intervallo
    From cliente in dc2011.Clienti _
    Let Birthday = New DateTime(DateTime.Now.Year, cliente.DataNascita.Month, cliente.DataNascita.Day) _
    Where (Birthday >= BeginDate) And (Birthday <= EndDate) _
    Select cliente
    Il codice chiaramente è a titolo esemplificativo: le date dell'intervallo (BeginDate, EndDate) vanno determinate in base ai valori inseriti dall'utente; inoltre, l'anno è ininfluente e può essere fissato (poiché non si filtra per la data di nascita, ma per il giorno/mese del compleanno, quindi l'anno è un dato superfluo).

    Ciao!
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Twitch | Altro...

  7. #7
    Innanzitutto grazie il tuo aiuto mi ha STRA illuminato ....
    Però c'è una casistica che non convalida ...

    se faccio gli anni il 01/01 e lancio il range 28/12/2011 al 05/01/2012

    non vengo inserito ....

  8. #8
    Utente di HTML.it L'avatar di cassano
    Registrato dal
    Aug 2004
    Messaggi
    3,002
    Perchè usare Let Birthday ???.

  9. #9
    Con Let assegno a Birthday il valore della data di nascita con anno = anno odierno.

    X Alka :
    Ho unito (tramite Union) alla tua query una identica con cambio anno impostato a quello della data 2 ed ho risolto
    Infinitamente GRAZIE

  10. #10
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,472
    Originariamente inviato da babystuta
    se faccio gli anni il 01/01 e lancio il range 28/12/2011 al 05/01/2012
    non vengo inserito ....
    Se entra in gioco non solo un intervallo nello stesso anno, ma un intervallo di date vero e proprio, il mio esempio non va più bene, ma non dovrebbe essere difficile adattarlo per farlo funzionare in senso più generico (l'importante è il concetto di fondo).

    Ciao!
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Twitch | Altro...

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.