+ 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
    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
    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
    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
    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
    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
    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
    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
    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
    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
    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