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 : Sélectionner tout - Visualiser dans une fenêtre à part
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 : Sélectionner tout - Visualiser dans une fenêtre à part
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