Page 1 sur 1

[..] Ecriture BDD  

Posté : mar. 21 juin 2022 19:21
par Yle
Bonjour

Je ne vois pas pourquoi ma BDD n'est pas sauvegardée avec les données de mon fichier Clubs_Essai.csv que je fourni en format XLSX car les fichiers joints n'acceptent pas le format .CSV

Code : Tout sélectionner

#include <SQLite.au3>
#include <SQLite.dll.au3>
#include <Array.au3>
Dim $aFile, $aSplit
Global $hQuery,$BDD=@ScriptDir & "\Affilies.sqlite"

if FileExists ($BDD) then FileDelete ($BDD)  ; Delete de la base pour essais...

_SQLite_Startup()
$OpenBDD = _SQLite_Open($BDD) 				; nom du fichier base de données
_SQlite_Exec(-1,' CREATE TABLE IF NOT EXISTS clubs (' & _
'Club_ID INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,  Cl_President CHAR NOT NULL COLLATE NOCASE, ' & _
'Cl_NomClub CHAR, Cl_Adresse CHAR, Cl_CP CHAR, Cl_Ville CHAR, Cl_Email CHAR,Cl_Site,Cl_Tel CHAR, Cl_Por CHAR, Cl_Saison CHAR, Cl_Date_Maj CHAR, Cl_Cotis CHAR,Cl_Affil INTEGER)');
_SQlite_Exec(-1,'CREATE UNIQUE INDEX "ixClub" ON "clubs" (Cl_NomClub)') ;

;~ ; Je remplis la table CLUBS de la base avec les clubs existants
_FileReadToArray(@ScriptDir & "\clubs_essai.csv", $aFile)

_SQLite_Exec(-1, 'BEGIN')
For $i = 1 To $aFile[0]
    $aSplit = StringSplit($aFile[$i], ";")
    ; _ArrayDisplay($aSplit)
	$aSplit[1] = $aSplit[1]
    $aSplit[2] = _SQLite_Escape($aSplit[2])
    $aSplit[3] = _SQLite_Escape($aSplit[3])
    $aSplit[4] = _SQLite_Escape($aSplit[4])
    $aSplit[5] =_SQLite_Escape( $aSplit[5])
    $aSplit[6] = _SQLite_Escape($aSplit[6])
    $aSplit[7] = _SQLite_Escape($aSplit[7])
    $aSplit[8] = _SQLite_Escape($aSplit[8])
    $aSplit[9] = _SQLite_Escape($aSplit[9])
    $aSplit[10] = _SQLite_Escape($aSplit[10])
    $aSplit[11] = _SQLite_Escape($aSplit[11])

     ; Préparation de requête SQL
    $sql = 'INSERT INTO clubs VALUES ('
    For $j = 1 To $aSplit[0]
        $sql &= $aSplit[$j] & ", "
    Next
    $sql = StringTrimRight($sql, 2) & ")"
    ConsoleWrite("- " & $sql & @CRLF)
     _SQLite_Exec(-1, $sql)
 Next
 _SQLite_Exec(-1, 'END') ; Fin de transaction d'écriture des CLUBS

 _SQLite_Close(-1)
 _SQLite_Shutdown()


D"avance merci

Re: [..] Ecriture BDD

Posté : mar. 21 juin 2022 22:57
par jchd
Le fichier xlsx, une fois transformé en .csv contient 11 champs. la DDL en contient 14.

Dans l'insert il faut préciser quels champs sont concernés.

Un minimum de traitement d'erreur aurait indiqué la cause du problème.

Re: [..] Ecriture BDD

Posté : mer. 22 juin 2022 16:41
par Yle

Code : Tout sélectionner

#include <SQLite.au3>
#include <SQLite.dll.au3>
#include <Array.au3>
Dim $aFile, $aSplit
Global $hQuery,$BDD=@ScriptDir & "\Affilies.sqlite"

if FileExists ($BDD) then FileDelete ($BDD)  ; Delete de la base pour essais...

_SQLite_Startup()
$OpenBDD = _SQLite_Open($BDD) 				; nom du fichier base de données
_SQlite_Exec(-1,' CREATE TABLE IF NOT EXISTS clubs (' & _
' Cl_President CHAR NOT NULL COLLATE NOCASE, ' & _
'Cl_NomClub CHAR, Cl_Adresse CHAR, Cl_Ville CHAR, Cl_Email CHAR,Cl_Site CHAR,Cl_Tel CHAR, Cl_Saison CHAR, Cl_Date_Maj CHAR, Cl_Cotis CHAR,Cl_Affil CHAR)')
_SQlite_Exec(-1,'CREATE UNIQUE INDEX "ixClub" ON "clubs" (Cl_NomClub)') ;

;~ ; Je remplis la table CLUBS de la base avec les clubs existants
_FileReadToArray(@ScriptDir & "\clubs_essai.csv", $aFile)
;_ArrayDisplay($aFile)

_SQLite_Exec(-1, 'BEGIN')
For $i = 1 To $aFile[0]
    $aSplit = StringSplit($aFile[$i], ";") ; attention qu'aucun champ du fichier Excel ne contiennent la caractère ; (séparateur d'un csv)
    ; _ArrayDisplay($aSplit)
	$aSplit[1] = $aSplit[1]
    $aSplit[2] = _SQLite_Escape($aSplit[2])
    $aSplit[3] = _SQLite_Escape($aSplit[3])
    $aSplit[4] = _SQLite_Escape($aSplit[4])
    $aSplit[5] =_SQLite_Escape( $aSplit[5])
    $aSplit[6] = _SQLite_Escape($aSplit[6])
    $aSplit[7] = _SQLite_Escape($aSplit[7])
    $aSplit[8] = _SQLite_Escape($aSplit[8])
    $aSplit[9] = _SQLite_Escape($aSplit[9])
    $aSplit[10] = _SQLite_Escape($aSplit[10])
    $aSplit[11] = _SQLite_Escape($aSplit[11])

     ; Préparation de requête SQL
    $sql = 'INSERT INTO clubs VALUES ('
    For $j = 1 To $aSplit[0]
        $sql &= $aSplit[$j] & ", "
    Next
    $sql = StringTrimRight($sql, 2) & ")"
    ConsoleWrite("- " & $sql & @CRLF)
     _SQLite_Exec(-1, $sql)
 Next
 _SQLite_Exec(-1, 'END') ; Fin de transaction d'écriture des CLUBS

 _SQLite_Close(-1)
 _SQLite_Shutdown()

Oui j'ai corrigé pour être en accord (11 colonnes) mais je ne vois par pourquoi mon fichier @ScriptDir & "\Affilies.sqlite ne s'écrit pas. Me manque t-il une fonction SQLITE ?

Re: [..] Ecriture BDD

Posté : mer. 22 juin 2022 17:12
par jchd
Je ne vois toujours aucun traitement d'erreur !
S'il y en avait un, on verrait que le délimiteur spécifié n'est peut-être pas le bon, du moins dans mon cas, suite à la conversion xlsx -> csv.
$aSplit = StringSplit($aFile[$i], ",")

Sinon le code fonctionne pour moi.
Il serait bon de stocker la date sous une forme compatible avec les fonctions "date" de SQLite, 2022-06-22 et non 22/06/2022

Re: [..] Ecriture BDD

Posté : mar. 05 juil. 2022 18:50
par Yle
Avec un peu de retard..

Je ne suis pas spécialiste SQL...
Mais ces 2 lignes me semblent correctes
$aSplit = StringSplit($aFile[$i], ";")
_ArrayDisplay($aSplit)
Dans mon tableau $aSplit j'ai bien mes 11 valeurs ce qui prouve que le délimiteur est bien le ;

Ensuite qd j'utilise $aSplit[1] = _SQLite_Escape($aSplit[1]) j'ai @error=1
J'avoue ne pas comprendre...

Re: [..] Ecriture BDD

Posté : mer. 06 juil. 2022 00:50
par jchd
Encore une fois, le code fonctionne pour moi, une fois qu'on utilise le bon séparateur de champ. Pourtant, un .CSV c'est "Comma Separated Values".

D'ailleurs, _SQLite_FastEscape() serait préférable.

Re: [..] Ecriture BDD

Posté : mer. 06 juil. 2022 21:53
par mikell
jchd a écrit : mer. 06 juil. 2022 00:50Pourtant, un .CSV c'est "Comma Separated Values"
Tsss encore un intégriste :mrgreen:

Re: [..] Ecriture BDD

Posté : jeu. 07 juil. 2022 01:18
par jchd
Bah, ayant dû télécharger un fichier .xlsx qu'il fallait reconvertir en .csv, j'ai choisi l'option "comma". L'OP aurait pu poster le fichier CSV en le nommant .txt tout simplement.

Il y a aussi les TSV (Tab *), les SCV (Semicolumn *), les BSV (Bar *), ...

Re: [..] Ecriture BDD

Posté : ven. 15 juil. 2022 11:10
par Yle
N'étant pas assez doué pour les bases de données, j'abandonne. Merci qd même

Re: [..] Ecriture BDD

Posté : ven. 15 juil. 2022 16:47
par walkson
Bonjour,
Il y a quelques années j'avais écrit un code pour convertir Excel ou un CSV en base de données. Il mériterait d'être améliorer mais il fonctionne.
La première ligne du tableau doit contenir les titres des colonnes. Parfois le code de la partie Excel beugue, il suffit de relancer le code.

Code : Tout sélectionner

#include <Array.au3>
#include <SQLite.au3>
HotKeySet('!x', 'MsgError');alt x
			Global $saveDB = FileSaveDialog("Sauvegarde de la base",@DesktopDir,"Base(*.db)",0,"BaseSQLite_1.db")
			If @error Then Exit MsgBox(0,"ERREUR",'Pas de choix Exit',2)
			If FileExists($saveDB) Then
				$rep = MsgBox(4,"LA BASE EXISTE","Voulez vous détruire la base ?")
				If $rep = 6 Then FileRecycle($saveDB)
			EndIf

			Global $table = InputBox("NOM DE LA TABLE","Entrez le nom de la table","MyTable")
			If @error Then Exit MsgBox(0,"ERREUR",'Pas de choix Exit',2)
			If $table = "" Then Exit MsgBox(0,"ERREUR",'Pas de choix Exit',2)
			Global $path = FileOpenDialog("CLASSEUR EXCEL",@DesktopDir,"Excel(*.xls;*.xlsx;*.xlsm;*.xlsb;*.csv)",0,"clubs_Essai.csv")
			If @error Then Exit MsgBox(0,"ERREUR",'Pas de choix Exit',2)
			Global $lire = InputBox("CHOIX DE LA FEUILLE EXCEL","Entrez le N° de la feuille",1)
			$lire = Int($lire)
			If @error Then Exit MsgBox(0,"ERREUR",'Pas de choix Exit',2)
			If $lire = "" Then Exit MsgBox(0,"ERREUR",'Pas de choix Exit',2)
			$temps = TimerInit()
			 Local $oExcel = ObjCreate("Excel.Application")
			 If @error Then Exit MsgBox(16,"Error","Echec Objet Excel")
			 ToolTip("Lecture d'Excel",100,110)
			 If Not FileExists($path) Then Exit MsgBox(16,"Error","Classeur inconnu")
			 $oWorkbook = $oExcel.WorkBooks.Open($path, Default, Default, Default, Default, Default)
			 $oExcel.Visible = 0
			 If $oExcel.Sheets.Count < $lire Then ExcelError("Feuille demandée inexistante")
			$oExcel.Sheets($lire).Select
			Local $arrayxls = $oExcel.ActiveSheet.UsedRange
			Local $array = $arrayxls.Value
			_ArrayTranspose($array)
			$arrayT = $array
			$oExcel.ActiveWorkbook.Saved = True
			$oExcel.WorkBooks.close
			$oExcel = 0

			If Not IsArray($arrayT) Then Exit MsgBox(16,"Error","Echec recherche Excel")
			$nbLignes = UBound($arrayT,1)
			$nbColonnes = UBound($arrayT,2)


			;_ArrayDisplay($arrayT)
			Local $_FileExists = FileExists($saveDB)
			_SQLite_Startup()
			If @error Then
				MsgBox(16, "SQLite Error", "SQLite3.dll Can't be Loaded!")
				Exit -1
			EndIf
			_SQLite_Open($saveDB)
			If @error Then MsgError()
			Local $aResult, $iRows, $iColumns
			If $_FileExists = 1 Then;si base existe
				_SQLite_GetTable2d(-1, "SELECT type,name FROM  sqlite_master;", $aResult, $iRows, $iColumns)
				;_ArrayDisplay($aResult)
				For $i = 1 To UBound($aResult) - 1
					If $aResult[$i][0] = "table" Then;si table
						If $aResult[$i][1] = $table Then;si même nom de table
							_SQLite_GetTable2d(-1, "PRAGMA table_info( "& $table &" );", $aResult, $iRows, $iColumns)
							If $nbColonnes = 0 Then
								$nbColonnesA = 1;1D
							Else
								$nbColonnesA = $nbColonnes;2D
							EndIf
							If $nbColonnesA  <> $iRows Then MsgError("nb colonnes différent");si nb colonnes différents
							ExitLoop
						EndIf
					EndIf
				Next
			EndIf

			Local $coll = "" ;noms des colonnes
			If $nbColonnes = 0 Then ;array 1d
				$coll = _SQLite_Escape($arrayT[0])
			Else

				For $i = 0 To $nbColonnes - 1 ;array 2d
						If $i <> $nbColonnes - 1 Then
							$virg = ", "
						Else
							$virg = ""
						EndIf
							;modifie nom de colonne en double
						$val = $arrayT[0][$i]
						$valN = $arrayT[1][$i]
						If StringInStr($coll,$val) > 0 Or $val = "" Then $val = $val & $i
						Local $format = " text"
						If IsString($valN) Then $format = " TEXT"
						If IsInt($valN) Then $format = " INTEGER"
						If IsFloat($valN) Then $format = " REAL"
						If StringLen($valN) = 14 And StringMid($valN, 9,6) = 000000 And StringMid($valN, 1,4) <= @YEAR + 1 And StringMid($valN, 5,2) < 13 And StringMid($valN, 7,2) <= 31 Then $format = " DATE"
						$coll &= _SQLite_Escape($val)  & $format & $virg
						;ConsoleWrite($valN &">>"& $format & @CRLF)

				Next
			EndIf

			If $SQLITE_OK <> _SQlite_Exec(-1, "CREATE TABLE IF NOT EXISTS "& $table &" ("& $coll &")") Then MsgError()
			_SQLite_Exec(-1, 'BEGIN')
			If $nbColonnes = 0 Then ;Array 1D
				For $i = 1 To $nbLignes - 1
					$sql = 'INSERT INTO '& $table &' VALUES ('

						$sql &= _SQLite_Escape($arrayT[$i])  & ")"


					If $SQLITE_OK <> _SQLite_Exec(-1, $sql) Then MsgError()
					ToolTip( $i &" /"& $nbLignes - 1,100,110)
					$sql = ""
				Next

			Else ;Array 2D

				For $i = 1 To $nbLignes - 1
					$sql = 'INSERT INTO '& $table &' VALUES ('
					For $y = 0 To $nbColonnes - 1
						$valeur = $arrayT[$i][$y]
						_SQLite_GetTable2d(-1, "PRAGMA table_info( "& $table &" );", $aResult, $iRows, $iColumns)
						ConsoleWrite($aResult[$y + 1][2] & @CRLF)
						If $aResult[$y + 1][2] = "DATE" Then
							$split1 = StringMid($valeur, 7,2)
							$split2 = StringMid($valeur, 5,2)
							$split3 = StringMid($valeur, 1,4)
							$valeur = StringFormat("%04i-%02i-%02i" ,$split3,$split2,$split1)
							$sql &= "DATE(" &  _SQLite_Escape($valeur) & "), "
						Else
							$sql &= _SQLite_Escape($valeur) & ", "
						EndIf


					Next
					$sql = StringTrimRight($sql, 2) & ");"
					If $SQLITE_OK <> _SQLite_Exec(-1, $sql) Then MsgError()
					ToolTip( $i &" /"& $nbLignes - 1,100,110)
					$sql = ""
				Next
			EndIf
			_SQLite_Exec(-1, 'END')

_SQLite_Close()
_SQLite_Shutdown()
$tempsX = (TimerDiff($temps)/1000)/60
ConsoleWrite("temps écoulé en mn " & $tempsX & @CR)
$ttp = (TimerDiff($temps))/$nbLignes - 1
ConsoleWrite("temps écriture/ligne " & $ttp & @CR)
ToolTip(">>>>>>>>> Réussite",50,150)
Sleep(2000)
ToolTip("")
Func ExcelError($msgXls)
	$oExcel.ActiveWorkbook.Saved = True
	$oExcel.WorkBooks.close
	$oExcel = 0
	Exit MsgBox(16,"Error",$msgXls)
EndFunc

Func MsgError($msg = "")
	If $msg = "" Then $msg = "Error Code: " & _SQLite_ErrCode() & @CRLF & "Error Message: " & _SQLite_ErrMsg()
MsgBox(16, "SQLite Error", $msg)
_SQLite_Close()
_SQLite_Shutdown()
ToolTip("")
Exit
EndFunc
Si la base existe, il est proposé de la détruire. Si vous dites non et que vous nommez la table du même nom de l'existante, les données seront rajoutées à la suite sauf si le nombre de colonnes n'est pas identique.

Re: [..] Ecriture BDD

Posté : lun. 18 juil. 2022 18:32
par Yle
Je comprends beaucoup mieux avec cet exemple qui fonctionne. Merci