Requêtes ODBC Hyper File 7 dans Csv
Bonjours à tout le Forum,
Dans le cadre d’un de mes projets en cours, j’utilise des CSV comme bases et j’alimente tous les contrôles de mes USF en y faisant des requêtes.
Le but étant de générer des nomenclatures de pièces, codifiées, en CSV pour importation dans notre GPAO.
A aucun moment je n’utilise une seule Range
Mon problème fut :
Je dois effectuer des requêtes dans notre GPAO pour ramener des informations dans les USF
Et que de ce fait je me retrouvais à utiliser une feuille Excel….
Ceci ne me plaisant pas j’ai donc cherché une solution pour :
Effectuer la requête sans Query, et de rapatrier le résultat dans un fichier texte et d’y faire des requêtes plus ciblées
Notre GPAO est développée avec Windev, L’ODBC est faite avec un pilote Hyper File 7
D’ou le code pour ceux que cela peu intéresser
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70
| Sub RequeteDansCsv()
Dim SourceODBC As String
Dim TexteRequete As String
Dim CompA As Long
SourceODBC = "ODBC;DSN=Base Clip CMIE4;;ANA=C:\PROGRAM FILES\CLIPPER 4\WCLIP.WD7\WCLIP.WDD;;REP=U:\FICHIERS\CMIE\;"
TexteRequete = "Select POINT.NAF, POINT.GACLEUNIK, POINT.CODEEMP, POINT.TPSPASSE, POINT.DAT, POINT.COFRAIS, EMPLOYE.NOMEMP, EMPLOYE.PRENOMEMP " & _
"From EMPLOYE, POINT Where EMPLOYE.CODEEMP = POINT.CODEEMP And ((POINT.NAF>10000)) " & _
"Order by POINT.CODEEMP, POINT.DAT, POINT.COFRAIS"
'----------------------- requêtes via Query
' Dim Connection As QueryTable
' Cells.ClearContents
'Set Connection = ActiveSheet.QueryTables.Add(Connection:=SourceODBC, _
' Destination:= Range("A1"), Sql:=TexteRequete)
'Connection.Refresh
'-----------------------
'----------------------- requêtes Avec Reference Microsoft DAO 3.6 Object Library
Dim Donnees As DAO.Database
Dim Requete As Recordset
Set Donnees = DAO.OpenDatabase(SourceODBC, False, False, SourceODBC)
Set Requete = Donnees.OpenRecordset(TexteRequete, DAO.dbOpenSnapshot)
'-----------------------Récupération du résultat dans Excel
' Dim Cellule As Range
'Cells.ClearContents
'Set Cellule = Range("A1")
'For CompA = 0 To Requete.Fields.Count - 1
' Cellule.Offset(0, CompA).Value = Requete.Fields(CompA).Name
'Next CompA
'Range("A2").CopyFromRecordset Requete
'-----------------------
'-----------------------Récupération dans Fichier Texte
Dim Appli As Object
Dim Creation As Object
Dim Ouverture As Object
Dim Enregistrement As String
Set Appli = CreateObject("Scripting.FileSystemObject")
On Error GoTo A:
Set Creation = Appli.CreateTextFile("U:\ETAT_JPC_CLIPPER\Information\Point.csv", True)
A:
Enregistrement = Requete.Fields(0).Name recuperation des noms de champs
For CompA = 1 To Requete.Fields.Count - 1
Enregistrement = Enregistrement & ";" & Trim(Requete.Fields(CompA).Name)
Next CompA
Creation.Write Enregistrement & vbCrLf
Do While Not (Requete.EOF)
Enregistrement = Trim(Requete.Fields(0).Value)
For CompA = 1 To Requete.Fields.Count - 1
If CompA = 2 Then
Enregistrement = Enregistrement & ";_" & Trim(Requete.Fields(CompA).Value) 'ajout du _ pour code employe
Else
Enregistrement = Enregistrement & ";" & Trim(Requete.Fields(CompA).Value)
End If
Next CompA
Creation.Write Enregistrement & vbCrLf
Requete.MoveNext
Loop
'-----------------------
Creation.Close
Requete.Close
Donnees.Close
Set Requete = Nothing
Set Donnees = Nothing
End Sub |
Ceci est un test, les requêtes seront moins longues, dans le cas présent, y a une jonction de table, un tri sur 3 champs et le nombre d’enregistrement est de 212 676 : durée de 4,57 minutes
J’aurais pu utiliser ACCES comme moteur, mais pour être aussi rapide il faut que la base soit en local sinon … Réseau lent sans doute mais…….
Bonne journée à tous
Jean-Pierre
Il est aussi possible de faire des sommes et des regroupements en adaptant le Sql d’ACCES
Code:
1 2 3 4
| TexteRequete = "Select POINT.NAF, Sum(POINT.TPSPASSE) AS SommeDeTPSPASSE, CFRAIS.LIBRETXT6" & _
" From POINT, CFRAIS Where POINT.COFRAIS = CFRAIS.COFRAIS And" & _
" (((POINT.NAF)>10000) And ((Left([LIBRETXT6],5))=""HEURE""))" & _
" Group by POINT.NAF, CFRAIS.LIBRETXT6" |
Moins rapide qu’ACCES tout de même
Jean-Pierre