IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

VB.NET Discussion :

Extraction par lot dans 1 fichier Excel


Sujet :

VB.NET

  1. #1
    Membre habitué Avatar de lolymeupy
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2006
    Messages
    402
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Service public

    Informations forums :
    Inscription : Octobre 2006
    Messages : 402
    Points : 180
    Points
    180
    Par défaut Extraction par lot dans 1 fichier Excel
    Bonjour,
    je bloque sur un problème qui est le suivant :
    j'ai 1 appli qui extracte d'une base SQL server vers 1 fichier Excel.
    Comme les quantités extraites sont importantes, on fait une extraction "par lot" (comme en vb.net, pas de Lot DTS)...
    Ca marche bien sauf que ça ne gère pas si on dépasse les 65536 lignes autorisées dans 1 onglet excel...
    Résultat il manque des enreg. dans les fichiers générés.

    Voici le code utilisé pour l'extract :
    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
     
    appExcel.DisplayAlerts = False
    xlBook = appExcel.Workbooks.Open(Extraction_DI.sNomRepSource & "temp.xls")
    xlSheet = xlBook.Sheets.Item(1)
    xlSheet.Name = "Résultats"
    xlSheet.Activate()
     
    With xlSheet.QueryTables.Add(sChaineExcel, xlSheet.Range("A1"))
                .CommandText = sSQL
                .Name = "Résultats"
                .FieldNames = True
                .RowNumbers = False
                .FillAdjacentFormulas = False
                .PreserveFormatting = True
                .RefreshOnFileOpen = False
                .BackgroundQuery = True
                .RefreshStyle = Excel.XlCellInsertionMode.xlOverwriteCells
                .SavePassword = False
                .SaveData = False
                .AdjustColumnWidth = True
                .RefreshPeriod = 0
                .PreserveColumnInfo = True
                .Refresh(BackgroundQuery:=False)
    End With
    xlSheet.Range("A1").Select()
    appExcel.ActiveWorkbook.SaveAs(sFichier)
    appExcel.ActiveWorkbook.Close()
    Si quelqu'un connait le moyen de gerer cette "limite" de 65536 dans une extraction par lot ?
    Merci d'avance

  2. #2
    Rédacteur/Modérateur
    Avatar de Skalp
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2006
    Messages
    1 694
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 694
    Points : 2 927
    Points
    2 927
    Par défaut
    Citation Envoyé par lolymeupy Voir le message
    Si quelqu'un connait le moyen de gerer cette "limite" de 65536 dans une extraction par lot ?
    Que veux-tu dire par "gérer" ?
    Tu veux n'extraire que les 65536 premières lignes ou tu veux ajouter les résultats supplémentaires sur une nouvelle feuille/fichier ?

  3. #3
    Membre habitué Avatar de lolymeupy
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2006
    Messages
    402
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Service public

    Informations forums :
    Inscription : Octobre 2006
    Messages : 402
    Points : 180
    Points
    180
    Par défaut
    Je veux ajouter les résultats supplémentaires sur une nouvelle feuille/fichier.

  4. #4
    Membre habitué Avatar de lolymeupy
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2006
    Messages
    402
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Service public

    Informations forums :
    Inscription : Octobre 2006
    Messages : 402
    Points : 180
    Points
    180
    Par défaut
    Pas d'idée ?

  5. #5
    Rédacteur/Modérateur
    Avatar de Skalp
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2006
    Messages
    1 694
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 694
    Points : 2 927
    Points
    2 927
    Par défaut
    Citation Envoyé par lolymeupy Voir le message
    Pas d'idée ?
    J'avais bien une idée, mais je n'ai pas eu le temps de la tester.
    L'idée ce serait de découper ta requête SQL en portions de 65535 lignes.

    Facile à dire
    Plus difficile est la rédaction de la/des requête(s) ! Les fonctions Transact-SQL pourraient t'aider : Fonctions (Transact-SQL)
    En parcourant rapidement la doc, j'ai vu que les mots-clés ROW_NUMBER et/ou RANK pourraient peut-être te servir.

  6. #6
    Membre habitué Avatar de lolymeupy
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2006
    Messages
    402
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Service public

    Informations forums :
    Inscription : Octobre 2006
    Messages : 402
    Points : 180
    Points
    180
    Par défaut
    Merci beaucoup pour les infos Skalp
    Je pense que ROW_NUMBER va m'être utile.
    Je vais tester ça pour voir les performances, et je ferais un retour sur ce post.

  7. #7
    Membre habitué Avatar de lolymeupy
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2006
    Messages
    402
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Service public

    Informations forums :
    Inscription : Octobre 2006
    Messages : 402
    Points : 180
    Points
    180
    Par défaut
    J'avais un peu oublié ce Post, mais comme je préfère laisser des "résolus" derrière moi, voici la solution à mon problème

    J'utilise en effet ROW_NUMBER, et une CTE (COMMON TABLE EXPRESSIONS)
    Voici la requête que j'utilise :
    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
     
    sSQL_INIT = " With mCte (DI, Nb_Retour, Article, DesignationArticle, Ns_PFin, Rb_NoClientDO, Rb_NomClientDO, Rb_NoClientLivre, "
    sSQL_INIT += " Rb_NomClientLivre, Critere_Recherche, Famille, SousFamille, Design_SousFamille, DateSolde,Annee_Fab, "
    sSQL_INIT += " Quant_Fab, PaysClient, DefautFTT, CommentFTT, LibelleDefautFTT, Defaut_client, Defaut_Diag, LibelleDefautDiag, "
    sSQL_INIT += " Matricule_Diag, Date_Diag, Ex_Defaut10 , Ex_LibelleDefaut10, Poste_Saisie10, Badge10, Ex_Fonction10, Ex_SousEnsemble10, "
    sSQL_INIT += " Ex_Element10, Ex_Matr_Elt10, Ex_Date_Elt10, Ex_Defaut20, Ex_LibelleDefaut20, Poste_Saisie20, Badge20, Ex_Fonction20, "
    sSQL_INIT += " Ex_SousEnsemble20, Ex_Element20, Ex_Matr_Elt20, Ex_Date_Elt20, Ex_Defaut30, Ex_LibelleDefaut30, Poste_Saisie30, "
    sSQL_INIT += " Badge30, Ex_Fonction30, Ex_SousEnsemble30, Ex_Element30, Ex_Matr_Elt30, Ex_Date_Elt30, Ex_SousEnsRepare, "
    sSQL_INIT += " Indice_Evolution, DefautTechno, td_lib, repereTopo, composant, cs_designation, observation, Rb_NoBL, Rb_DateBL, "
    sSQL_INIT += " Code_NewPFIN, ar_libelle, ReferenceClient, Statut_DI, Libelle_StatutDI, TypeFlux, DateFlux, Date_DI, RB_NoUM, "
    sSQL_INIT += " Date_Paletisation, Co_Code1, Co_Lib1, Co_Code2, Co_Lib2, Co_Code3, Co_Lib3, Co_Code4, Co_Lib4, Co_Code5, Co_Lib5, "
    sSQL_INIT += " Accessoire1, Accessoire2, Accessoire3, Accessoire4, Accessoire5,RowNumber)"
    sSQL_INIT += " As("
    sSQL_INIT += " Select E.DI, E.Nb_Retour, E.Article, E.DesignationArticle, E.Ns_PFin, E.Rb_NoClientDO, E.Rb_NomClientDO,"
    sSQL_INIT += " E.Rb_NoClientLivre, E.Rb_NomClientLivre, E.Critere_Recherche, E.Famille, E.SousFamille, E.Design_SousFamille, E.DateSolde,"
    sSQL_INIT += " CAST(E.Annee_Fab AS nvarchar(4)) + '/' + CASE WHEN E.mois_fab < 10 THEN '0' + E.Mois_Fab ELSE E.Mois_Fab END AS Annee_Fab , "
    sSQL_INIT += " E.Quant_Fab, E.PaysClient, E.DefautFTT, E.CommentFTT, E.LibelleDefautFTT, E.Defaut_client, E.Defaut_Diag, E.LibelleDefautDiag, "
    sSQL_INIT += " E.Matricule_Diag, E.Date_Diag, E.Ex_Defaut10 , E.Ex_LibelleDefaut10, E.Poste_Saisie10, E.Badge10, E.Ex_Fonction10, E.Ex_SousEnsemble10, "
    sSQL_INIT += " E.Ex_Element10, E.Ex_Matr_Elt10, E.Ex_Date_Elt10, E.Ex_Defaut20, E.Ex_LibelleDefaut20, E.Poste_Saisie20, E.Badge20, E.Ex_Fonction20, "
    sSQL_INIT += " E.Ex_SousEnsemble20, E.Ex_Element20, E.Ex_Matr_Elt20, E.Ex_Date_Elt20, E.Ex_Defaut30, E.Ex_LibelleDefaut30, E.Poste_Saisie30, "
    sSQL_INIT += " E.Badge30, E.Ex_Fonction30, E.Ex_SousEnsemble30, E.Ex_Element30, E.Ex_Matr_Elt30, E.Ex_Date_Elt30, E.Ex_SousEnsRepare, "
    sSQL_INIT += " E.Indice_Evolution, E.DefautTechno, E.td_lib, E.repereTopo, E.composant, E.cs_designation, E.observation, E.Rb_NoBL, E.Rb_DateBL, "
    sSQL_INIT += " E.Code_NewPFIN, E.ar_libelle, E.ReferenceClient, E.Statut_DI, E.Libelle_StatutDI, E.TypeFlux, E.DateFlux, E.Date_DI, E.RB_NoUM, "
    sSQL_INIT += " E.Date_Paletisation, E.Co_Code1, E.Co_Lib1, E.Co_Code2, E.Co_Lib2, E.Co_Code3, E.Co_Lib3, E.Co_Code4, E.Co_Lib4, E.Co_Code5, E.Co_Lib5, "
    sSQL_INIT += " E.Accessoire1, E.Accessoire2, E.Accessoire3, E.Accessoire4, E.Accessoire5,Row_Number() over (order by DI asc) as RowNumber"
    sSQL_INIT += " From T_ExtraitDISoldees E " & sFinRequete
    sSQL_INIT += " )"
    sSQL_INIT += " Select *"
    sSQL_INIT += " From mCte C "
     
    sSQL = sSQL_INIT & " Where RowNumber Between 1 and 65535 "
    Je calcule donc au début le nb de ligne en tout, et selon le nb, j'execute ma requête autant de fois que nécessaire en ne modifiant que la dernière ligne...

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 0
    Dernier message: 09/07/2014, 10h37
  2. Réponses: 6
    Dernier message: 04/01/2011, 22h38
  3. remplacement carré par ; dans un fichier excel crée par une macro
    Par om51ft dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 22/11/2007, 16h00
  4. {VBA excel}OUverture,Extraction et Copie d'un fichier Excel dans un autre
    Par Thomas69 dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 01/06/2007, 09h43
  5. extraction de données formatées dans un fichier excel
    Par slausseur dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 14/03/2007, 15h00

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo