begin process at 2012 02 13 18:03:01
  Trouver un code source :
 
dans
 
Accueil > Forum > 

Archive Visual Basic & VB.NET

 > 

Archives Visual Basic

 > 

J'AI BESOIN D'AIDE !!!! :)

 > 

vb .net sql et excel


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

vb .net sql et excel

vendredi 23 avril 2004 à 11:58:05 | vb .net sql et excel

helonear

salut

je suis actuellement en plein developpement d'une application de gestion d'horaire

et dans cette application on me demande d'exporter ma base de donnée sql dans un fichier Excel

ne sachant pas comment faire je me tourne vers vous pour vous demander conseil


d avance merci

vendredi 23 avril 2004 à 12:10:18 | Re : vb .net sql et excel

labout


labout

Il s'agit d'une table ou de toutes les tables ou du résultat d'une requete.

Dans le cas de requete je pourrai te donner le code (Long 600 lignes)
@+
vendredi 23 avril 2004 à 13:15:14 | Re : vb .net sql et excel

crenaud76

Le plus simple est sans doute de faire un lot DTS

Christophe R.
vendredi 23 avril 2004 à 14:00:20 | Re : vb .net sql et excel

labout


labout

Je te mets le code

Ce dode permet de tranférer vers Excel le contenu d'une requête avec encadrement et totaux éventuels.
Je me suis trompé (238 lignes)

Option Strict On
Option Explicit On
Module DocExcel
' nom du fichier xls total oui ou non
Function EtatExcel(ByRef rs As ADODB.Recordset, ByRef etat As String, ByRef bBol As Boolean) As Boolean
Dim fichier As String
Dim FrmSt As New FrmStatus
Dim i As Integer
Dim j As Integer
Dim nb As Integer
Dim sCols As String
Dim iFields As Integer
Dim ExcelWasNotRunning As Boolean
Dim iLastcol As Integer

Dim excelApp As New Excel.Application
Dim excelBook As Excel.Workbook = excelApp.Workbooks.Add
Dim excelWorksheet As Excel.Worksheet = _
CType(excelBook.Worksheets(1), Excel.Worksheet)
Dim rng As Excel.Range

' Unlike the Word demo, we'll make the spreadsheet visible so you can see
' the data being entered.
excelApp.Visible = True
On Error GoTo err_Renamed
FrmSt.Show("Création de la feuille Excel en cours." & vbCrLf & "Patientez...")
iFields = rs.Fields.Count - 1
fichier = New String(Chr(0), 100)
'Get the temporary path
GetTempPath(100, fichier)
fichier = CLeft(fichier, InStr(fichier, Chr(0)) - 1)

fichier = Trim(fichier) & etat & ".XLS"
If Dir(fichier) <> "" Then
Kill(fichier)
End If

With excelApp.Application
.Workbooks.Add()
.ActiveWorkbook.SaveAs(fichier)
For i = 0 To iFields
.Cells(1, i + 1) = rs.Fields(i).Name
Next
j = 2
nb = 0
Do While Not rs.EOF
System.Windows.Forms.Application.DoEvents()
nb = nb + 1
For i = 0 To iFields
System.Windows.Forms.Application.DoEvents()
.Cells(j, i + 1) = rs.Fields(i).Value
Next
j = j + 1
rs.MoveNext()
Loop

' on autorise 104 colonnes pour le moment
For i = 1 To iFields + 1
If i <= 26 Then
sCols = Chr(64 + i) & ":" & Chr(64 + i)
Else ' 64+27-26
If i <= 52 Then
sCols = "A" & Chr(64 + i - 26) & ":" & "A" & Chr(64 + i - 26)
Else
If i <= 78 Then
sCols = "A" & Chr(64 + i - 26) & ":" & "B" & Chr(64 + i - 52)
Else
sCols = "A" & Chr(64 + i - 26) & ":" & "C" & Chr(64 + i - 78)
End If
End If
End If
rng = .Range(sCols)
rng.EntireColumn.AutoFit()
Next
If iFields + 1 <= 26 Then
sCols = Chr(65) & "1:" & Chr(64 + iFields + 1) & "1" ' A1: E1
Else
If iFields + 1 <= 52 Then
sCols = Chr(65) & "1:" & "A" & Chr(64 + iFields + 1 - 26) & "1"
Else
If iFields + 1 <= 78 Then
sCols = Chr(65) & "1:" & "B" & Chr(64 + iFields + 1 - 52) & "1"
Else
sCols = Chr(65) & "1:" & "C" & Chr(64 + iFields + 1 - 78) & "1"
End If
End If
End If

.Range(sCols).Select()
rng = .Range(sCols)
With rng.Borders(Excel.XlBordersIndex.xlEdgeLeft)
.LineStyle = 1 'xlContinuous
.Weight = -4138 ' xlMedium
.ColorIndex = -4105 ' xlAutomatic
End With
With rng.Borders(Excel.XlBordersIndex.xlEdgeTop)
.LineStyle = 1 'xlContinuous
.Weight = -4138 ' xlMedium
.ColorIndex = -4105 ' xlAutomatic
End With

With rng.Borders(Excel.XlBordersIndex.xlEdgeRight)
.LineStyle = 1 ' xlContinuous
.Weight = -4138 ' xlMedium
.ColorIndex = -4105 ' xlAutomatic
End With

With rng.Borders(Excel.XlBordersIndex.xlEdgeBottom)
.LineStyle = 1 ' xlContinuous
.Weight = -4138 ' xlMedium
.ColorIndex = -4105 ' xlAutomatic
End With
With rng.Borders(Excel.XlBordersIndex.xlInsideVertical)
.LineStyle = 1
.Weight = -4138
.ColorIndex = -4105
End With
If iFields + 1 <= 26 Then
sCols = Chr(65) & "1:" & Chr(64 + iFields + 1) & nb + 1
Else
If iFields + 1 <= 52 Then
sCols = Chr(65) & "1:" & "A" & Chr(64 + iFields + 1 - 26) & nb + 1
Else
If iFields + 1 <= 78 Then
sCols = Chr(65) & "1:" & "B" & Chr(64 + iFields + 1 - 52) & nb + 1
Else
sCols = Chr(65) & "1:" & "C" & Chr(64 + iFields + 1 - 78) & nb + 1
End If
End If
End If
.Range(sCols).Select()
rng = .Range(sCols)
With rng.Borders(Excel.XlBordersIndex.xlEdgeLeft) ' left
.LineStyle = 1
.Weight = -4138
.ColorIndex = -4105
End With
With rng.Borders(Excel.XlBordersIndex.xlEdgeTop) ' top
.LineStyle = 1
.Weight = -4138
.ColorIndex = -4105
End With
With rng.Borders(Excel.XlBordersIndex.xlEdgeBottom) ' bottom
.LineStyle = 1
.Weight = -4138
.ColorIndex = -4105
End With
With rng.Borders(Excel.XlBordersIndex.xlEdgeRight) ' right
.LineStyle = 1
.Weight = -4138
.ColorIndex = -4105
End With
With rng.Borders(Excel.XlBordersIndex.xlInsideVertical) ' verticale
.LineStyle = 1
.Weight = -4138
.ColorIndex = -4105
End With
' total si bBol
If bBol Then
.Cells(nb + 2, 1) = "Total"
'
Select Case etat
Case "statistiques dr-drf"
sCols = Chr(65 + rs.Fields.Count - 1) & "2" & ":" & Chr(65 + rs.Fields.Count - 1) & nb + 1
.Cells(nb + 2, rs.Fields.Count) = "=Somme(" & sCols & ")"
sCols = Chr(65) & nb + 2 & ":" & Chr(65 + rs.Fields.Count - 1) & nb + 2
Case "coutdurisque"
sCols = Chr(65 + rs.Fields.Count - 3) & 2 & ":" & Chr(65 + rs.Fields.Count - 3) & nb + 1 ' &
.Cells(nb + 2, rs.Fields.Count - 2) = "=Somme(" & sCols & ")"
sCols = Chr(65 + rs.Fields.Count - 2) & 2 & ":" & Chr(65 + rs.Fields.Count - 2) & nb + 1
.Cells(nb + 2, rs.Fields.Count - 1) = "=Somme(" & sCols & ")"
Case "prodmensuelle"
sCols = Chr(65 + rs.Fields.Count - 3) & 2 & ":" & Chr(65 + rs.Fields.Count - 3) & nb + 1
.Cells(nb + 2, rs.Fields.Count - 2) = "=Somme(" & sCols & ")"
sCols = Chr(65 + rs.Fields.Count - 4) & 2 & ":" & Chr(65 + rs.Fields.Count - 4) & nb + 1
.Cells(nb + 2, rs.Fields.Count - 3) = "=Somme(" & sCols & ")"
End Select
If iFields <= 26 Then
sCols = Chr(65) & nb + 2 & ":" & Chr(65 + iFields) & nb + 2
Else
If iFields <= 52 Then
sCols = Chr(65) & nb + 2 & ":" & "A" & Chr(65 + iFields - 26) & nb + 2
Else
If iFields <= 78 Then
sCols = Chr(65) & nb + 2 & ":" & "B" & Chr(65 + iFields - 52) & nb + 2
Else
sCols = Chr(65) & nb + 2 & ":" & "C" & Chr(65 + iFields - 78) & nb + 2
End If
End If
End If

.Range(sCols).Select()
rng = .Range(sCols)
With rng.Borders(Excel.XlBordersIndex.xlEdgeTop) ' top
.LineStyle = 1
.Weight = -4138
.ColorIndex = -4105
End With
With rng.Borders(Excel.XlBordersIndex.xlEdgeBottom) ' bottom
.LineStyle = 1
.Weight = -4138
.ColorIndex = -4105
End With
With rng.Borders(Excel.XlBordersIndex.xlEdgeRight) ' right
.LineStyle = 1
.Weight = -4138
.ColorIndex = -4105
End With
With rng.Borders(Excel.XlBordersIndex.xlInsideVertical) ' verticale
.LineStyle = 1
.Weight = -4138
.ColorIndex = -4105
End With
End If
.Application.ActiveWorkbook.Save()
End With



FrmSt.Close()
FrmSt.Dispose()
excelApp.Visible = True

MsgBox("Pressez une touche et Excel va se fermer Excel" & vbCrLf & "Votre fichier s'appelle " & fichier, MsgBoxStyle.Information)
excelApp.Application.Quit()
Exit Function
err_Renamed:
TraceError("Module DocExcel Fonction EtatExcel", Err.Description, Err.Number, Err.Source)

MsgBox("Erreur: " & Err.Description, MsgBoxStyle.Critical)
Err.Clear()
excelApp.Application.Quit()
excelApp = Nothing
FrmSt.Close()
FrmSt.Dispose()
Exit Function
End Function
End Module

Cela vaudra mieux qu'un yaka
vendredi 23 avril 2004 à 14:01:35 | Re : vb .net sql et excel

labout


labout

Je te mets le code

Ce dode permet de tranférer vers Excel le contenu d'une requête avec encadrement et totaux éventuels.
Je me suis trompé (238 lignes)

Option Strict On
Option Explicit On
Module DocExcel
' nom du fichier xls total oui ou non
Function EtatExcel(ByRef rs As ADODB.Recordset, ByRef etat As String, ByRef bBol As Boolean) As Boolean
Dim fichier As String
Dim FrmSt As New FrmStatus
Dim i As Integer
Dim j As Integer
Dim nb As Integer
Dim sCols As String
Dim iFields As Integer
Dim ExcelWasNotRunning As Boolean
Dim iLastcol As Integer

Dim excelApp As New Excel.Application
Dim excelBook As Excel.Workbook = excelApp.Workbooks.Add
Dim excelWorksheet As Excel.Worksheet = _
CType(excelBook.Worksheets(1), Excel.Worksheet)
Dim rng As Excel.Range

' Unlike the Word demo, we'll make the spreadsheet visible so you can see
' the data being entered.
excelApp.Visible = True
On Error GoTo err_Renamed
FrmSt.Show("Création de la feuille Excel en cours." & vbCrLf & "Patientez...")
iFields = rs.Fields.Count - 1
fichier = New String(Chr(0), 100)
'Get the temporary path
GetTempPath(100, fichier)
fichier = CLeft(fichier, InStr(fichier, Chr(0)) - 1)

fichier = Trim(fichier) & etat & ".XLS"
If Dir(fichier) <> "" Then
Kill(fichier)
End If

With excelApp.Application
.Workbooks.Add()
.ActiveWorkbook.SaveAs(fichier)
For i = 0 To iFields
.Cells(1, i + 1) = rs.Fields(i).Name
Next
j = 2
nb = 0
Do While Not rs.EOF
System.Windows.Forms.Application.DoEvents()
nb = nb + 1
For i = 0 To iFields
System.Windows.Forms.Application.DoEvents()
.Cells(j, i + 1) = rs.Fields(i).Value
Next
j = j + 1
rs.MoveNext()
Loop

' on autorise 104 colonnes pour le moment
For i = 1 To iFields + 1
If i <= 26 Then
sCols = Chr(64 + i) & ":" & Chr(64 + i)
Else ' 64+27-26
If i <= 52 Then
sCols = "A" & Chr(64 + i - 26) & ":" & "A" & Chr(64 + i - 26)
Else
If i <= 78 Then
sCols = "A" & Chr(64 + i - 26) & ":" & "B" & Chr(64 + i - 52)
Else
sCols = "A" & Chr(64 + i - 26) & ":" & "C" & Chr(64 + i - 78)
End If
End If
End If
rng = .Range(sCols)
rng.EntireColumn.AutoFit()
Next
If iFields + 1 <= 26 Then
sCols = Chr(65) & "1:" & Chr(64 + iFields + 1) & "1" ' A1: E1
Else
If iFields + 1 <= 52 Then
sCols = Chr(65) & "1:" & "A" & Chr(64 + iFields + 1 - 26) & "1"
Else
If iFields + 1 <= 78 Then
sCols = Chr(65) & "1:" & "B" & Chr(64 + iFields + 1 - 52) & "1"
Else
sCols = Chr(65) & "1:" & "C" & Chr(64 + iFields + 1 - 78) & "1"
End If
End If
End If

.Range(sCols).Select()
rng = .Range(sCols)
With rng.Borders(Excel.XlBordersIndex.xlEdgeLeft)
.LineStyle = 1 'xlContinuous
.Weight = -4138 ' xlMedium
.ColorIndex = -4105 ' xlAutomatic
End With
With rng.Borders(Excel.XlBordersIndex.xlEdgeTop)
.LineStyle = 1 'xlContinuous
.Weight = -4138 ' xlMedium
.ColorIndex = -4105 ' xlAutomatic
End With

With rng.Borders(Excel.XlBordersIndex.xlEdgeRight)
.LineStyle = 1 ' xlContinuous
.Weight = -4138 ' xlMedium
.ColorIndex = -4105 ' xlAutomatic
End With

With rng.Borders(Excel.XlBordersIndex.xlEdgeBottom)
.LineStyle = 1 ' xlContinuous
.Weight = -4138 ' xlMedium
.ColorIndex = -4105 ' xlAutomatic
End With
With rng.Borders(Excel.XlBordersIndex.xlInsideVertical)
.LineStyle = 1
.Weight = -4138
.ColorIndex = -4105
End With
If iFields + 1 <= 26 Then
sCols = Chr(65) & "1:" & Chr(64 + iFields + 1) & nb + 1
Else
If iFields + 1 <= 52 Then
sCols = Chr(65) & "1:" & "A" & Chr(64 + iFields + 1 - 26) & nb + 1
Else
If iFields + 1 <= 78 Then
sCols = Chr(65) & "1:" & "B" & Chr(64 + iFields + 1 - 52) & nb + 1
Else
sCols = Chr(65) & "1:" & "C" & Chr(64 + iFields + 1 - 78) & nb + 1
End If
End If
End If
.Range(sCols).Select()
rng = .Range(sCols)
With rng.Borders(Excel.XlBordersIndex.xlEdgeLeft) ' left
.LineStyle = 1
.Weight = -4138
.ColorIndex = -4105
End With
With rng.Borders(Excel.XlBordersIndex.xlEdgeTop) ' top
.LineStyle = 1
.Weight = -4138
.ColorIndex = -4105
End With
With rng.Borders(Excel.XlBordersIndex.xlEdgeBottom) ' bottom
.LineStyle = 1
.Weight = -4138
.ColorIndex = -4105
End With
With rng.Borders(Excel.XlBordersIndex.xlEdgeRight) ' right
.LineStyle = 1
.Weight = -4138
.ColorIndex = -4105
End With
With rng.Borders(Excel.XlBordersIndex.xlInsideVertical) ' verticale
.LineStyle = 1
.Weight = -4138
.ColorIndex = -4105
End With
' total si bBol
If bBol Then
.Cells(nb + 2, 1) = "Total"
'
Select Case etat
Case "statistiques dr-drf"
sCols = Chr(65 + rs.Fields.Count - 1) & "2" & ":" & Chr(65 + rs.Fields.Count - 1) & nb + 1
.Cells(nb + 2, rs.Fields.Count) = "=Somme(" & sCols & ")"
sCols = Chr(65) & nb + 2 & ":" & Chr(65 + rs.Fields.Count - 1) & nb + 2
Case "coutdurisque"
sCols = Chr(65 + rs.Fields.Count - 3) & 2 & ":" & Chr(65 + rs.Fields.Count - 3) & nb + 1 ' &
.Cells(nb + 2, rs.Fields.Count - 2) = "=Somme(" & sCols & ")"
sCols = Chr(65 + rs.Fields.Count - 2) & 2 & ":" & Chr(65 + rs.Fields.Count - 2) & nb + 1
.Cells(nb + 2, rs.Fields.Count - 1) = "=Somme(" & sCols & ")"
Case "prodmensuelle"
sCols = Chr(65 + rs.Fields.Count - 3) & 2 & ":" & Chr(65 + rs.Fields.Count - 3) & nb + 1
.Cells(nb + 2, rs.Fields.Count - 2) = "=Somme(" & sCols & ")"
sCols = Chr(65 + rs.Fields.Count - 4) & 2 & ":" & Chr(65 + rs.Fields.Count - 4) & nb + 1
.Cells(nb + 2, rs.Fields.Count - 3) = "=Somme(" & sCols & ")"
End Select
If iFields <= 26 Then
sCols = Chr(65) & nb + 2 & ":" & Chr(65 + iFields) & nb + 2
Else
If iFields <= 52 Then
sCols = Chr(65) & nb + 2 & ":" & "A" & Chr(65 + iFields - 26) & nb + 2
Else
If iFields <= 78 Then
sCols = Chr(65) & nb + 2 & ":" & "B" & Chr(65 + iFields - 52) & nb + 2
Else
sCols = Chr(65) & nb + 2 & ":" & "C" & Chr(65 + iFields - 78) & nb + 2
End If
End If
End If

.Range(sCols).Select()
rng = .Range(sCols)
With rng.Borders(Excel.XlBordersIndex.xlEdgeTop) ' top
.LineStyle = 1
.Weight = -4138
.ColorIndex = -4105
End With
With rng.Borders(Excel.XlBordersIndex.xlEdgeBottom) ' bottom
.LineStyle = 1
.Weight = -4138
.ColorIndex = -4105
End With
With rng.Borders(Excel.XlBordersIndex.xlEdgeRight) ' right
.LineStyle = 1
.Weight = -4138
.ColorIndex = -4105
End With
With rng.Borders(Excel.XlBordersIndex.xlInsideVertical) ' verticale
.LineStyle = 1
.Weight = -4138
.ColorIndex = -4105
End With
End If
.Application.ActiveWorkbook.Save()
End With



FrmSt.Close()
FrmSt.Dispose()
excelApp.Visible = True

MsgBox("Pressez une touche et Excel va se fermer Excel" & vbCrLf & "Votre fichier s'appelle " & fichier, MsgBoxStyle.Information)
excelApp.Application.Quit()
Exit Function
err_Renamed:
MsgBox("Erreur: " & Err.Description, MsgBoxStyle.Critical)
Err.Clear()
excelApp.Application.Quit()
excelApp = Nothing
FrmSt.Close()
FrmSt.Dispose()
Exit Function
End Function
End Module

C'esu un code PERSO VB6 que j'ai adapté en VB.NET
Cela vaudra mieux qu'un yaka
vendredi 23 avril 2004 à 15:10:36 | Re : vb .net sql et excel

helonear

merci beaucoup pour vos contribution encore qu il faudrait peu etre m expliquer ce qu est le DTS

et merci grace a toi je vai encore utiliser 3 tubes d aspirines pour relire et comprendre ton code

en tout cas merci
vendredi 23 avril 2004 à 15:16:54 | Re : vb .net sql et excel

crenaud76

DTS veut dire Data Transformation Service ! Sur un SQLServer, tu as un service MSDTS qui permet d'importer/exporter des données depuis a peu près n'importe quoi (base sql, ficheir texte, excel, base access, oracle, ou odbc) vers ou depuis à peu près n'importe quoi ! C'est ultra-puissant, automatisable, et simple a programmer : il suffit de poser des "briques" fonctionnelles, un peu comme si tu dessinais ton algorithme de transfert, et ca roule.
Voir la doc de SQLServer sur le sujet, ou il y a un tres bon tutor (sur celle de la version 2000 toujours)

Christophe R.
vendredi 23 avril 2004 à 15:22:36 | Re : vb .net sql et excel

helonear


hum tres interessant encore merci pour ce cours de base de donnée dont j avais besoin merci
vendredi 23 avril 2004 à 15:51:48 | Re : vb .net sql et excel

labout


labout
Avec ce que je t'ai donné tu n'as rien à modifier
Il suffit de le mettre dans un module
et il te fuffit d'appeller la fonction avec les 3 parametres
cela te fait même les cadres.
Tu n'as même pas besoin de comprendre comment cela marche
@+
vendredi 23 avril 2004 à 16:41:19 | Re : vb .net sql et excel

crenaud76

Meme s'il n'a pas besoin de comprendre comment cela marche, j'espère pour lui qu'il essaiera de comprendre .... sinon je lui cause plus

Christophe R.

1 2

Cette discussion est classée dans : net, vb, application, sql, excel


Répondre à ce message

Sujets en rapport avec ce message

[.NET] SQL / EXCEL / VB.NET [ par guigui43 ] Je fais un programme ou j'extrais des données d'une base SQL Oracle et je les colle dans un datagrid.Je voudrai exporter ces données (je suis avec Off le nom du serveur a chaque fois vb.net [ par Boudchiche ] Salut à tout le mondeMon probleme est le suivantj'ai développer une application en vb.net et ma base de donnee est en sql server 2000dans mon applicat Application vb.net /sql server 2005 [ par onemonster ] Bonjour je travaille sur application en vb.net s'appyant sur une base de données Sql server 2005. Ma question:Est il possible d'utiliser mon applicat Excel et VB.net [ par whitepawn ] Bonjour a tous. J'espère que vous pourrez m'aider. Je suis en train de faire une application en VB2005 qui doit récupérer les coordonnées de la plage VB.NET pour piloter excel... [ par JCDussDuss ] Bonjour,Je débute en VB .NET, en sachant que j'arrive de VBA sans etre passé par la case VB... je galère donc...Je souhaite ouvrir puis commander un f utilisation de l'excel comme un intermédiaire entre vb.net et sql server [ par fattou86 ] j'ai besoin de présenteé un tableau de format un peux compliqué (fusion des cellules.....) dans vb.net, j'ai eu l'idée d'utiliser Excel comme solution Déploiment d'une application en VB.net avec une base de données sql [ par rida1986 ] Bjr tt le monde, je voudrais déployer une application en vb.net et une base de données sql, mais sans avoir sql server dans le poste du client, en pl vb.net et sql server [ par favella ] je vais développer une application sur la location de voiture un peu compliqué[30 filiales] (en principe avec asp,vb.net et sql server) je veux savoir application vb.net+excel [ par kha1987 ] bonjour je suis entrain de developper une application vb.net qui utilise excel je veux que mon application s'installe et ça marche avec n'import qu Application vb.net/sql server (2008) [ par drdre496 ] Bonjour, j'ai fini une application en vb.net avec une base de données Sql server 2008. Ma question:Est il possible d'utiliser l'executable de mon appl


Nos sponsors


Sondage...

CalendriCode

Février 2012
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
272829    

Consulter la suite du CalendriCode

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,328 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales