+ Rispondi al messaggio
Pagina 1 di 3 123 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 29

Verificare sovrapposizione date

  1. #1
    guil non è in linea Scolaretto
    Post
    140
    Like Inviati  
    0
    Like Ricevuti  
    0
    Salve a tutti amici, ho un db sql server 2014 in cui inserisco i periodi di ferie che il personale chiede al datore di lavoro. In fase di inserimento devo verificare se la data che sto inserendo non va a sovrapporsi a un intervallo di date già presente nel db. Mi spiego meglio, se un dipendente mi chiede ferie dal 10 febbraio 2017 al 15 febbraio 2017 devo verificare nel db se per quel lavoratore e in quel range di date sono già registrati altri giorni di ferie, in modo tale da evitare il sovrapporsi di periodi. Ora se per esempio effettuo una ricerca dal 10 febbraio 2017 al 15 febbraio 2017 la query mi restituisce ciò che desidero, mentre se effettuo una ricerca dal 12 febbraio al 14 febbraio non mi viene restituito nulla. Di seguito il codice:


    GridView2.DataSource = Nothing
            Dim MyConnection11 As New SqlConnection(WebConfigurationManager.ConnectionStrings("ConnectionString").ConnectionString)
            Dim sqlAd1 As New SqlClient.SqlDataAdapter("SELECT Codfisc, Dal, Al, Tipo, DATEDIFF(day, Dal, Al) + 1 AS 'N° Giorni' FROM Ferie where codfisc = '" & HiddenField1.Value & "' AND (Dal BETWEEN '" & TextBox1.Text & "' AND '" & TextBox2.Text & "' ) AND (Al BETWEEN '" & TextBox1.Text & "' AND '" & TextBox2.Text & "') Order by Dal", MyConnection11) ' adapter 
            ' creo il dataset con i dati del data adapter
            Dim Ds1 As New DataSet
            ' popolo il dataset
            sqlAd1.Fill(Ds1, "Ferie")
            ' associo il data set alla gridview
            GridView2.DataSource = Ds1
            GridView2.DataBind()
            If GridView2.Rows.Count >= 1 Then
                ClientScript.RegisterStartupScript(Me.GetType(), "AlertScript", "alert('Periodo già registrato!');", True)
    
            End If
    
    Il db è così composto:

    CREATE TABLE [dbo].[Ferie] (
        [Id]      INT           IDENTITY (1, 1) NOT NULL,
        [Codfisc] VARCHAR (16)  NOT NULL,
        [Dal]     DATE          NOT NULL,
        [Al]      DATE          NOT NULL,
        [Tipo]    VARCHAR (100) NOT NULL,
        CONSTRAINT [PK_Ferie] PRIMARY KEY CLUSTERED ([Id] ASC)
    );
    
    Potreste aiutarmi nella creazione della query?
    Grazie. Un saluto a tutti.

  2. #2
    L'avatar di Brontolo
    Brontolo non è in linea Very Important Person
    Post
    3,135
    Like Inviati  
    5
    Like Ricevuti  
    5
    E' sufficiente che Dal oppure Al cadano nell'intervallo specificato.
    Quote Originariamente inviato da guil Visualizza il messaggio
     ... AND (Dal BETWEEN '" & TextBox1.Text & "' AND '" & TextBox2.Text & "' ) OR (Al BETWEEN '" & TextBox1.Text & "' AND '" & TextBox2.Text ...
    
    ℹ️ Leggi di più su Brontolo ...

  3. #3
    guil non è in linea Scolaretto
    Post
    140
    Like Inviati  
    0
    Like Ricevuti  
    0
    Quote Originariamente inviato da Brontolo Visualizza il messaggio
    E' sufficiente che Dal oppure Al cadano nell'intervallo specificato.
    No non va così....

            Dim MyConnection11 As New SqlConnection(WebConfigurationManager.ConnectionStrings("ConnectionString").ConnectionString)
            Dim sqlAd1 As New SqlClient.SqlDataAdapter("SELECT Codfisc, Dal, Al, Tipo, DATEDIFF(day, Dal, Al) + 1 AS 'N° Giorni' FROM Ferie where codfisc = '" & HiddenField1.Value & "' AND (Dal BETWEEN '" & TextBox1.Text & "' AND '" & TextBox2.Text & "' ) OR (Al BETWEEN '" & TextBox1.Text & "' AND '" & TextBox2.Text & "') Order by Dal", MyConnection11) ' adapter 
            ' creo il dataset con i dati del data adapter
            Dim Ds1 As New DataSet
            ' popolo il dataset
            sqlAd1.Fill(Ds1, "Ferie")
            ' associo il data set alla gridview
            GridView2.DataSource = Ds1
            GridView2.DataBind()
            If GridView2.Rows.Count >= 1 Then
                ClientScript.RegisterStartupScript(Me.GetType(), "AlertScript", "alert('Periodo già registrato!');", True)
    
            End If
    
    Se ricerco 11/02/2017 al 11/02/2017 non mi restituisce nulla...

  4. #4
    L'avatar di gibra
    gibra non è in linea Very Important Person
    Post
    6,236
    Like Inviati  
    21
    Like Ricevuti  
    11
    Prima di tutto, la query è sbagliata, si deve usare un Command coi Paremetri.

    Configurazione dei parametri e tipi di dati dei parametri
    https://msdn.microsoft.com/it-it/lib...v=vs.110).aspx

    Riformula l'enunciato SQL correttamente, poi vediamo cosa non va...

    Secondo, perché usare un DataSet? Non ti basta un Reader...?
    ℹ️ Leggi di più su gibra ...

  5. #5
    guil non è in linea Scolaretto
    Post
    140
    Like Inviati  
    0
    Like Ricevuti  
    0
    Quote Originariamente inviato da gibra Visualizza il messaggio
    Prima di tutto, la query è sbagliata, si deve usare un Command coi Paremetri.

    Configurazione dei parametri e tipi di dati dei parametri
    https://msdn.microsoft.com/it-it/lib...v=vs.110).aspx

    Riformula l'enunciato SQL correttamente, poi vediamo cosa non va...

    Secondo, perché usare un DataSet? Non ti basta un Reader...?
    Hai perfettamente ragione, penso che la query è "pericolosamente" sbagliata poichè attaccabile tramite sql injection!! Altro errore, anche su questo punto hai ragione, è l'uso del dataset che in questo caso non è opportuno perchè devo soltanto "leggere" dei dati dal db. Ora ho impostato il codice così con qualche modifica nella select ma va bene così:

      Dim source7 As String = WebConfigurationManager.ConnectionStrings("ConnectionString").ConnectionString
            Dim sql7 As String = "SELECT Codfisc, Dal, Al FROM Ferie where Codfisc = @Codfisc and (Dal BETWEEN @Dal and @Al) OR (Al BETWEEN @Dal and @Al)"
            Dim conn7 As New SqlConnection(source7)
            conn7.Open()
            Dim cmd7 As New SqlCommand(sql7, conn7)
            cmd7.Parameters.Add("@Codfisc", SqlDbType.VarChar, 16).Value = HiddenField1.Value
            cmd7.Parameters.Add("@Dal", SqlDbType.Date).Value = TextBox1.Text
            cmd7.Parameters.Add("@Al", SqlDbType.Date).Value = TextBox2.Text
            Dim dr7 As SqlDataReader
            dr7 = cmd7.ExecuteReader()
            If dr7.Read() Then
                ClientScript.RegisterStartupScript(Me.GetType(), "AlertScript", "alert('Periodo già inserito!');", True)
                conn7.Close()
                Return
            End If
    
    Solito errore e cioè se ricerco 11/02/2017 al 11/02/2017 non mi viene restituito nulla...
    Grazie ancora.
    Ultima modifica di guil; 23-06-2017 15:16 

  6. #6
    L'avatar di Brontolo
    Brontolo non è in linea Very Important Person
    Post
    3,135
    Like Inviati  
    5
    Like Ricevuti  
    5
    Quote Originariamente inviato da guil Visualizza il messaggio
    No non va così....
    Se ricerco 11/02/2017 al 11/02/2017 non mi restituisce nulla...
    in che forma sono espresse le date nelle TextBox?
    (Per pensare alla sql injection c'è tempo...)

    L'uso dei parametri è una buona pratica, ma questo non significa che una query non debba funzionare senza di esse e, per questo motiva, debba essere considerata "sbagliata".
    La query è invece sbagliata per quanto riguarda la precedenza degli operatori logici AND e OR. Le due condizioni in OR devono essere racchiuse tra parentesi.
    Ultima modifica di Brontolo; 23-06-2017 15:57  Motivo: eliminata domanda superflua
    ℹ️ Leggi di più su Brontolo ...

  7. #7
    guil non è in linea Scolaretto
    Post
    140
    Like Inviati  
    0
    Like Ricevuti  
    0
    Quote Originariamente inviato da Brontolo Visualizza il messaggio
    in che forma sono espresse le date nelle TextBox?
    (Per pensare alla sql injection c'è tempo...)

    L'uso dei parametri è una buona pratica, ma questo non significa che una query non debba funzionare senza di esse e, per questo motiva, debba essere considerata "sbagliata".
    La query è invece sbagliata per quanto riguarda la precedenza degli operatori logici AND e OR. Le due condizioni in OR devono essere racchiuse tra parentesi.
    Le textbox sono impostate con "TextMode=Date" quindi "../../...."

    Provato così ma nulla:

    "SELECT Codfisc, Dal, Al FROM Ferie where Codfisc = @Codfisc and (Dal BETWEEN @Dal and @Al OR Al BETWEEN @Dal and @Al)"

  8. #8
    guil non è in linea Scolaretto
    Post
    140
    Like Inviati  
    0
    Like Ricevuti  
    0
    No allora ragionando se io avessi un dipendente che ha già usufruito di queste ferie:

    ID CODICE FISCALE DAL AL TIPO
    2 GHJTU986JMNHJKMG 10/02/2017 15/02/2017 FERIE
    8 GHJTU986JMNHJKMG 10/03/2017 20/03/2017 FERIE
    9 GHJTU986JMNHJKMG 08/04/2017 13/04/2017 FERIE
    10 GHJTU986JMNHJKMG 08/05/2017 12/05/2017 FERIE
    11 GHJTU986JMNHJKMG 20/06/2017 25/06/2017 FERIE
    12 GHJTU986JMNHJKMG 27/07/2017 28/07/2017 FERIE
    13 GHJTU986JMNHJKMG 10/08/2017 11/08/2017 FERIE
    14 GHJTU986JMNHJKMG 01/09/2017 15/09/2017 FERIE
    15 GHJTU986JMNHJKMG 10/10/2017 15/10/2017 FERIE
    16 GHJTU986JMNHJKMG 19/11/2017 22/11/2017 FERIE
    19 GHJTU986JMNHJKMG 09/12/2017 11/01/2018 FERIE

    e mi chiede un periodo di ferie per esempio dal 07/07/2017 al 27/07/2017 come imposto la query per verificare se il periodo richiesto è libero o si sovrappone a un intervallo già registrato? L'operatore BETWEEN non mi sembra appropriato al caso.
    Ultima modifica di guil; 23-06-2017 18:53 

  9. #9
    guil non è in linea Scolaretto
    Post
    140
    Like Inviati  
    0
    Like Ricevuti  
    0
    Risolto così, ho fatto tutte le prove e va bene:

      Dim source7 As String = WebConfigurationManager.ConnectionStrings("ConnectionString").ConnectionString
            Dim sql7 As String = "SELECT Codfisc, Dal, Al FROM Ferie where Codfisc = @Codfisc and ((Dal) >= @Dal and (Al) <= (@Al)) or ((Dal) <= @Dal and (Al) >= (@Al)) or (Dal between @Dal and @Al)"
            Dim conn7 As New SqlConnection(source7)
            conn7.Open()
            Dim cmd7 As New SqlCommand(sql7, conn7)
            cmd7.Parameters.Add("@Codfisc", SqlDbType.VarChar, 16).Value = HiddenField1.Value
            cmd7.Parameters.Add("@Dal", SqlDbType.Date).Value = TextBox1.Text
            cmd7.Parameters.Add("@Al", SqlDbType.Date).Value = TextBox2.Text
            Dim dr7 As SqlDataReader
            dr7 = cmd7.ExecuteReader()
            If dr7.Read() Then
                ClientScript.RegisterStartupScript(Me.GetType(), "AlertScript", "alert('Periodo già inserito!');", True)
                conn7.Close()
                Return
            End If
    
    Grazie di tutto.
    Un saluto.

  10. #10
    L'avatar di gibra
    gibra non è in linea Very Important Person
    Post
    6,236
    Like Inviati  
    21
    Like Ricevuti  
    11
    Quote Originariamente inviato da Brontolo Visualizza il messaggio
    in che forma sono espresse le date nelle TextBox?
    (Per pensare alla sql injection c'è tempo...)

    L'uso dei parametri è una buona pratica, ma questo non significa che una query non debba funzionare senza di esse e, per questo motiva, debba essere considerata "sbagliata".
    Di sicuro è che, al giorno d'oggi, mettersi a formattare le stringhe SQL è da suicidio, sia quando le si crea che poi quando si deve fare manutenzione.
    Ognuno è libero di pensarla come vuole, comunque.

    Ci tengo a ricordare che i forum sono pieni zeppi e stracolmi di questi problemi sulle query che sono scritte male in quanto piene di errori, sia di sintassi che di formattazione. Solo perché ci si ostina a scriverle come 30 anni fa, non usando né Command né Parametri che, detto per inciso, Microsoft ha creato appositamente per semplificarci la vita, per una codifica più 'solida' e 'semplice'.

    Poi, come sempre, ognuno 'codifica' come gli pare.
    ℹ️ Leggi di più su gibra ...

+ Rispondi al messaggio
Pagina 1 di 3 123 ultimoultimo

Potrebbero interessarti anche ...

  1. Verificare data tra due date
    Da tizike nel forum Visual Basic 6
    Risposte: 13
    Ultimo Post: 05-03-2020, 17:59
  2. sovrapposizione colonne-righe
    Da riccardo ponsiani nel forum Microsoft Word
    Risposte: 11
    Ultimo Post: 06-07-2010, 15:02
  3. [CSS] Sovrapposizione DIV come?
    Da tonyuk nel forum HTML, CSS e JavaScript
    Risposte: 2
    Ultimo Post: 07-11-2009, 18:14
  4. Sovrapposizione di funzioni
    Da _gas nel forum Visual Basic 6
    Risposte: 3
    Ultimo Post: 24-05-2006, 21:02
  5. Sovrapposizione di grafici
    Da pedros nel forum Microsoft Word
    Risposte: 6
    Ultimo Post: 19-12-2005, 10:09