Page 1 sur 1
[Issue][Base] Import CSV incorrect sous Firebird
Publié : 29 août 2019 19:52
par Ernest
Bonjour,
Suivant le lien ci joint:
https://forum.openoffice.org/fr/forum/v ... +import%2A, j' ai modifié la macro afin de l' adapter à mon besoin. J' ai du commettre une erreur quelque part car je me retrouve avec l' erreur suivante;
La requête ne peut pas être executée. Elle ne contient pas de table valide
Macro modifiée;
Code : Tout sélectionner
Dim maConnexion as Object, oConnexion as Object, oForm As Object
Sub AjoutDonnees
Dim DrvMan As Object, maRequete as Object
Dim cheminCSV As String, URLbdcsv As String, instrSQL as String
Dim Infos(3) As New com.sun.star.beans.PropertyValue
ThisDatabaseDocument.CurrentController.connect("","")
maConnexion = ThisDatabasedocument.CurrentController.ActiveConnection
DrvMan = CreateUnoService("com.sun.star.sdbc.DriverManager")
cheminCSV = "/home/elfouste/Documents/Python/Svg_Csv/DnExif.csv"
URLbdcsv = "sdbc:flat:" & cheminCSV
Infos(0).Name = "HeaderLine"
Infos(0).Value = True
Infos(1).Name = "FieldDelimiter"
Infos(1).Value = chr(44)
Infos(2).Name = "StringDelimiter"
Infos(2).Value = ","
Infos(3).Name = "Extension"
Infos(3).Value = "csv"
oConnexion = DrvMan.getConnectionWithInfo(URLbdcsv, Infos())
instrSQL = "DELETE FROM ""Tp_Pht"""
maRequete = maConnexion.createStatement()
maRequete.executeUpdate(instrSQL)
oForm = thisComponent
GererBarresOutils("f_mise_a_jour")
CopierDonnees
End Sub
'========================================================================================================
Sub CopierDonnees
On Error GoTo CopierDonnees_Err
Dim unRowSet as Object, maRequete as Object, resuQuery as Object, maRequete2 as object, Resultat as Object
Dim Fenetre as Object, FenetreForm as Object, avance as Object
Dim instrSQL as String, instrSQL2 as String, i as Integer, dteNaiss as Date, Compte as Integer, x as Integer
Fenetre = ThisDatabaseDocument.CurrentController.Frame.ContainerWindow
FenetreForm = oForm.currentcontroller.Frame.ContainerWindow
Fenetre.Enable = False
FenetreForm.Enable = False
avance = oForm.CurrentController.StatusIndicator
unRowSet = createUnoService("com.sun.star.sdb.RowSet")
instrSQL = "SELECT * FROM ""Tp_Pht"" ORDER BY ""Cf_Pht"""
instrSQL2 = "SELECT COUNT(*) as ""nb"" FROM ""Tp_Pht"""
maRequete = oConnexion.createStatement()
maRequete2 = oConnexion.createStatement()
Resultat = maRequete2.executeQuery(instrSQL2)
Resultat.Next
With unRowSet
.ActiveConnection = maConnexion
.CommandType = com.sun.star.sdb.CommandType.TABLE
.Command = "Tp_Pht"
.Execute
x = 1
avance.start("Veuillez patienter ...", Compte)
Do While resuQuery.Next
.moveToInsertRow
For i = 1 to 10
Select Case .Columns.getByIndex(i -1).TypeName
Case "INTEGER"
.Columns.getByIndex(i -1).updateInt(resuQuery.getInt(i))
' Case "VARCHAR"
' .Columns.getByIndex(i -1).updateString(resuQuery.getString(i))
' Case "NUMERIC"
' .Columns.getByIndex(i -1).updateInt(resuQuery.getInt(i))
End Select
If i = 1 Then
.insertRow
Else
.UpdateRow
End If
Next i
avance.Value = x
avance.Text = "Ligne " & x & " recopiée"
x = x + 1
Loop
avance.Text = "Terminé " & Compte & " lignes recopiées"
End With
oConnexion.Dispose
unRowSet.Dispose
Wait 800
avance.End
FenetreForm.Enable = True
Fenetre.Enable = True
'ThisDatabaseDocument.FormDocuments.getByName("f_mise_a_jour").Close
CopierDonnees_Exit:
On Error GoTo 0
Exit Sub
CopierDonnees_Err:
MsgBox(Error, 16)
FenetreForm.Enable = True
Fenetre.Enable = True
oConnexion.Dispose
unRowSet.Dispose
Resume CopierDonnees_Exit
End Sub
L' erreur se produit tout le temps sur la même ligne;
Au bout de trois tentatives pour joindre la base (et pourtant elle était vide), je ne peux que vous transmettre la structure de la table:
1; Cf_Pht Integer et clé primaire
2; ChmPht Texte varchar
3: NmPht Texte varchar
Et pour finir, le fichier.csv;
Code : Tout sélectionner
['Cf_Pht', 'ChmPht', 'NmPht', 'XtnPht']
[1, '/elfouste/El_Casot/Yvon/Phototeque1/A_Trier/Noel', 'DSCF0068']
Avez-vous une idée du problème sachant que la base est sur Firebird?
Cordialement
Re: [Base]-Importer fichier.csv dans une table
Publié : 30 août 2019 07:30
par Dude
Salut,
Le lien que tu donnes ne fonctionne pas.
Ernest a écrit :Avez-vous une idée du problème sachant que la base est sur Firebird?
Si tu parcours un minimum ce forum, tu verras que ce SGBD n'est pas recommandé pour l'instant.
Commence par faire le test avec le format natif commun HSQL.
Si l'erreur est toujours présente, joins le fichier ODB qu'on puisse le tester.
Re: [Base]-Importer fichier.csv dans une table
Publié : 30 août 2019 10:00
par Ernest
Bonjour,
Tout d' abord, voici le nouveau lien:
https://forum.openoffice.org/fr/forum/v ... p?p=277809
En espérant qu' il fonctionne
Pour ce qui est de Firebird, j' y avais pensé et le résultat est identique avec HSQL.
Cordialement
Re: [Base]-Importer fichier.csv dans une table
Publié : 30 août 2019 10:25
par Dude
Ernest a écrit : et le résultat est identique avec HSQL.
Bis repetitae :
Dude a écrit :Si l'erreur est toujours présente, joins le fichier ODB qu'on puisse le tester.
Re: [Base]-Importer fichier.csv dans une table
Publié : 30 août 2019 11:48
par Ernest
Comme je l' ai déja précisé ci-dessus, même compressé à 37.3 MO, votre serveur refuse le fichier. A part d' une autre solution, je ne vois pas comment faire.
Re: [Base]-Importer fichier.csv dans une table
Publié : 30 août 2019 12:11
par Dude
Ernest a écrit :Comme je l' ai déja précisé ci-dessus
Tu n'as rien précisé du tout...
Ernest a écrit :même compressé à 37.3 MO, votre serveur refuse le fichier.
Et tu crois que ce forum gratuit ferait comment s'il permettait l'hébergement de telles PJ ?
Il t'appartient de nous fabriquer un ODB exhaustif et limité à ta seule problématique.
Re: [Base]-Importer fichier.csv dans une table
Publié : 30 août 2019 16:01
par Ernest
Bon voici une ODB
Re: [Base]-Importer fichier.csv dans une table
Publié : 30 août 2019 16:31
par Dude
Si tu veux qu'on avance sur ton problème, il faudrait que tu fasses ce qu'on te demande.
Dude a écrit :Commence par faire le test avec le format natif commun HSQL.
L'ODB que tu fournis est paramétré avec
Firebird :
Capture.PNG
Et ajoute également un fichier
CSV (que tu encapsuleras en ZIP puisque l'extension n'est pas autorisé).
Re: [Base]-Importer fichier.csv dans une table
Publié : 30 août 2019 20:40
par Ernest
Ci-joint, les fichiers demandés.
Re: [Base]-Importer fichier.csv dans une table
Publié : 31 août 2019 09:35
par Dude
As-tu au moins fait un test d'importation du CSV dans Calc ?
Capture.PNG
Cela ne fonctionne pas ou alors, on a n'importe quoi dans les colonnes importées.
Ton fichier ne respecte pas la
normalisation de ce format.
Re: [Base]-Importer fichier.csv dans une table
Publié : 31 août 2019 10:04
par Ernest
Bonjour,
Après le test dans Calc, pas de soucis, sa fonctionne. Par contre, je ne comprends pas votre remarque concernant le format puisque dans votre lien les exemples montre que mes données et séparateurs sont corrects.
Cordialement
Re: [Base]-Importer fichier.csv dans une table
Publié : 31 août 2019 15:13
par Dude
Ernest a écrit :je ne comprends pas votre remarque concernant le format puisque [...] que mes données et séparateurs sont corrects
Et comment gères-tu les crochets ?
Regarde la copie écran, tu vois bien que ton 1er champ en garde trace.
Lors de l'importation, le type détecté (STRING) ne pourra pas être raccord avec celui déclaré dans la table (INTEGER).
Re: [Base]-Importer fichier.csv dans une table
Publié : 31 août 2019 15:29
par Ernest
Comme je vous l' ai dis, l' importation dans calc c' est bien passé. J' ai fait plusieurs test;
crochets + '+ espace
' + espace
'
Dans les trois cas, l' importation fonctionne dans calc. Malgré tout et dans le but de simplifier les importations, j' ai modifié le script python à la base de ce fichier csv.
Jusqu' à maintenant, j' utilisé les listes avec des espaces entre chaque champs d' ou la formulation ['Cf_Pht', 'ChmPht', etc...].
Le programme modifié me donne le résultat suivant le fichier joint. Vous constaterez qu'il est plus épuré, je n' ai conservé que la virgule comme séparateur. Un tel fichier sera plus simple à contrôler si j' arrive à importer ces données dans une table.
Pour l' instant, sa me parait pas très bien parti.
Cordialement
Re: [Base]-Importer fichier.csv dans une table
Publié : 01 sept. 2019 12:30
par Ernest
Bonjour,
J' ai réussi à progresser. Pour l' instant et suivant le code ci_dessous, j' arrive à importer un fichier.csv dans une table de base HSQL. Par contre, la ligne
provoque l' erreur suivante lorsque je veux importer ces même données dans une table de base Firebird :
Une exception c' est produite:
Type: com.sun.star.sdbc.SQL.Exception
Message: Erreur de séquence de fonction.
Code : Tout sélectionner
Dim maConnexion as Object, oConnexion as Object, oForm As Object
Sub AjoutDonnees
Dim DrvMan As Object, maRequete as Object, Coding as Object
Dim cheminCSV As String, URLbdcsv As String, instrSQL as String
Dim Infos(3) As New com.sun.star.beans.PropertyValue
Dim x As Long '***
Dim sNomFichier As String '***
Dim lsNomFichier As Integer '***
ThisDatabaseDocument.CurrentController.connect("","")
maConnexion = ThisDatabasedocument.CurrentController.ActiveConnection
DrvMan = CreateUnoService("com.sun.star.sdbc.DriverManager")
Coding = CreateUnoService("com.sun.star.sdbc.FLATConnectionProperties")
cheminCSV = "/home/elfouste/Documents/Python/Svg_Csv/DnExif.csv"
' extraction du nom de fichier sélectionné '***
sNomFichier = cheminCSV
lsNomFichier = len(sNomFichier)
x = lsNomFichier
while mid(sNomFichier,x,1) <> "/"
x = x-1
wend
sNomFichier = mid(sNomFichier,x + 1,lsNomFichier-x-4)
URLbdcsv = "sdbc:flat:" & cheminCSV
Infos(0).Name = "HeaderLine"
Infos(0).Value = True
Infos(1).Name = "FieldDelimiter"
Infos(1).Value = chr(44)
Infos(2).Name = "StringDelimiter"
Infos(2).Value = ","
Infos(3).Name = "Extension"
Infos(3).Value = "csv"
oConnexion = DrvMan.getConnectionWithInfo(URLbdcsv, Infos())
maRequete = maConnexion.createStatement()
oForm = thisComponent
instrSQL = "DELETE FROM ""Tp_Pht"""
maRequete.executeUpdate(instrSQL)
CopierDonnees(sNomFichier)
End Sub
'========================================================================================================
Sub CopierDonnees(NomFichier)
On Error GoTo CopierDonnees_Err
Dim unRowSet as Object, maRequete as Object, resuQuery as Object, maRequete2 as object, Resultat as Object
Dim Fenetre as Object, FenetreForm as Object, avance as Object
Dim instrSQL as String, instrSQL2 as String, i as Integer, dteNaiss as Date, Compte as Integer, x as Integer
Fenetre = ThisDatabaseDocument.CurrentController.Frame.ContainerWindow
FenetreForm = oForm.currentcontroller.Frame.ContainerWindow
Fenetre.Enable = False
FenetreForm.Enable = False
avance = oForm.CurrentController.StatusIndicator
unRowSet = createUnoService("com.sun.star.sdb.RowSet")
instrSQL = "SELECT * FROM " & NomFichier
instrSQL2 = "SELECT COUNT(*) as ""nb"" FROM " & NomFichier
maRequete = oConnexion.createStatement()
maRequete2 = oConnexion.createStatement()
Resultat = maRequete2.executeQuery(instrSQL2)
Resultat.Next
Compte = resultat.getInt(1)
resuQuery = maRequete.executeQuery(instrSQL)
With unRowSet
.ActiveConnection = maConnexion
.CommandType = com.sun.star.sdb.CommandType.TABLE
.Command = "Tp_Pht"
.Execute
x = 1
avance.start("Veuillez patienter ...", Compte)
Do While resuQuery.Next
.moveToInsertRow
For i = 1 to 17
Select Case .Columns.getByIndex(i -1).TypeName
Case "INTEGER"
.Columns.getByIndex(i -1).updateInt(resuQuery.getInt(i))
Case "VARCHAR"
.Columns.getByIndex(i -1).updateString(resuQuery.getString(i))
Case "NUMERIC"
.Columns.getByIndex(i -1).updateInt(resuQuery.getInt(i))
End Select
If i = 1 Then
.insertRow
Else
.UpdateRow
End If
Next i
avance.Value = x
avance.Text = "Ligne " & x & " recopiée"
x = x + 1
Loop
avance.Text = "Terminé " & Compte & " lignes recopiées"
End With
oConnexion.Dispose
unRowSet.Dispose
Wait 800
avance.End
FenetreForm.Enable = True
Fenetre.Enable = True
CopierDonnees_Exit:
On Error GoTo 0
Exit Sub
CopierDonnees_Err:
MsgBox(Error, 16)
FenetreForm.Enable = True
Fenetre.Enable = True
oConnexion.Dispose
unRowSet.Dispose
Resume CopierDonnees_Exit
End Sub
Sauriez-vous m' en dire plus?
Cordialement
Re: [Base]-Importer fichier.csv dans une table
Publié : 01 sept. 2019 13:47
par Dude
Ta table contient une clé primaire.
Il faut donc que chaque ligne du CSV puisse être insérée en respectant cela.
Re: [Base]-Importer fichier.csv dans une table
Publié : 01 sept. 2019 14:30
par Ernest
Bonjour,
Le fichier csv ne contient que deux lignes. La première ligne est la liste des noms des champs à importer et correspondent aux noms des champs de la table. Cette ligne est normalement ignorée, me semble-t-il par la macro. Le compteur ne trouve qu' une ligne à importer. Maintenant, il est évident que je n' ai aucune sertitude sur celle qui a été retenue. La deuxième contient toutes les valeurs à enregistrer dont le premier champ est un ID.
J' envisage de remplaçer la ligne
par une requête SQL Insert?
Cordialement
Re: [Base]-Importer fichier.csv dans une table
Publié : 01 sept. 2019 14:45
par Dude
Il contient 2 lignes mais le nombre de colonnes ne correspond pas à la structure de la table.
Capture.PNG
Ça commence à être fatiguant.
Re: [Base]-Importer fichier.csv dans une table
Publié : 01 sept. 2019 15:30
par Ernest
Afin de parler le même langage, je vous joint deux fichiers portant les dernières évolutions du projet.
Re: [Base]-Importer fichier.csv dans une table
Publié : 01 sept. 2019 17:56
par Dude
Test_Csv_Firebird.7z
Et relire ma demande du 30 août.
Ernest a écrit :Afin de parler le même langage
On se demande effectivement...
Re: [Base]-Importer fichier.csv dans une table
Publié : 01 sept. 2019 18:20
par Ernest
Je confirme pour la énième fois que sous HSQL l ' importation se passe très bien. La solution simpliste consisterai à changer pour HSQL. Pourtant, j' aimerai comprendre pourquoi, sa ne fonctionne pas sous Firebird. Visiblement dans la séquence ci dessous
Code : Tout sélectionner
Do While resuQuery.Next
.moveToInsertRow
For i = 1 to 10
Select Case .Columns.getByIndex(i -1).TypeName
Case "INTEGER"
.Columns.getByIndex(i -1).updateInt(resuQuery.getInt(i))
Case "VARCHAR"
.Columns.getByIndex(i -1).updateString(resuQuery.getString(i))
Case "NUMERIC"
.Columns.getByIndex(i -1).updateInt(resuQuery.getInt(i))
End Select
Dans HSQLB; les données collectés sont correctes. En pas à pas, la macro trouve le bon type de données et donc enregistre chacun des champs.
En Firebird le contenu de resuQuery est incohérent. Le pas à pas montre bien qu' elle n' arrive pas à trouver le type de donnée. La question est donc pourquoi ?
D' autre part, est-il possible de connaitre le résultat de la requête, cela apporterai peut-être un début de réponse.
Re: [Base]-Importer fichier.csv dans une table
Publié : 02 sept. 2019 06:48
par Dude
Résumons l'historique...
Ernest a écrit :Avez-vous une idée du problème sachant que la base est sur Firebird?
Dude a écrit :Si tu parcours un minimum ce forum, tu verras que ce SGBD n'est pas recommandé pour l'instant.
Ernest a écrit :Pour ce qui est de Firebird, j' y avais pensé et le résultat est identique avec HSQL.
Ernest a écrit :Je confirme pour la énième fois que sous HSQL l ' importation se passe très bien.
Conclusion : tu as dû trouver une énième bogue pour Firebird qu'il faut faire
remonter aux développeurs.
Une fois fait, tu reviens ici en rapporter le numéro et tu modifies ton titre pour
[Issue][Base] Import CSV incorrect sous Firebird
Re: [Base]-Importer fichier.csv dans une table
Publié : 03 sept. 2019 19:07
par Ernest
Bonsoir,
Comme je vous l' avais annoncé, j' ai modifié la macro par une requête INSERT INTO. La présentation n' est pas top toutefois j' ai récupéré toutes les données que j' utilise.
Toutefois, le transfert ne se fait pas et une erreur m' est renvoyé:
Message firebird_sdbc error
Dynamic SQL Error
SQL error code = -104
Unexpected end of command - line1, column 1
caused by
isc_dsql_prepare
Est-ce dû à une erreur d' écriture de la requête?
Je vous joins deux fichiers à jour.
Pour ce qui est du bug, je ne pense pas, et croyer le bien, que je sois capable de le créer. En effet, je ne connais absolument pas l' anglais et à part de le rédiger en français je ne vois pas comment faire. C' est très regrettable car ce serait rendre service à tout le monde. Désolé.
A+
Re: [Base]-Importer fichier.csv dans une table
Publié : 04 sept. 2019 07:17
par Dude
Ernest a écrit :je ne connais absolument pas l' anglais et à part de le rédiger en français je ne vois pas comment faire
Reverso ou G**gle fournit un service de traduction assez efficace.
Mais bon, comme je suis dans un bon jour, j'ai fait la recherche à ta place.
Le rapport
118094 montre que Firebird ne supporte pas le service
com.sun.star.sdb.RowSet dans sa globalité.
A toi de jouer pour le reste...
Dude a écrit :et tu modifies ton titre pour [Issue][Base] Import CSV incorrect sous Firebird
Re: [Base]-Importer fichier.csv dans une table
Publié : 04 sept. 2019 19:28
par Ernest
Bonsoir
Merci de votre intervention. Je vais regarder le lien que vous avez indiqué et balisé cette discussion. Dommage que pour l' instant le problème ne soit pas résolu. Retourner sur HSQL, pourquoi pas mais à chaque ouverture de LO on a droit au message pour nous inciter a passer sous Firebird !
Cordialement
PS, Je vais ouvrir une nouvelle discussion car j' ai un autre soucis avec une erreur SQL 104
Re: [Base]-Importer fichier.csv dans une table
Publié : 05 sept. 2019 09:51
par Dude
Ernest a écrit :Dommage que pour l' instant le problème ne soit pas résolu.
Le dire ici n'a pas d'intérêt car aucun développeur ne vient sur ce forum.
Comme je te l'ai (déjà/encore) expliqué, le seul vecteur de communication est l'outil
Bugzilla.
Il faut donc ajouter ce commentaire au rapport de bogue.