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 :

problème insert into avec boucle for


Sujet :

VB.NET

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    90
    Détails du profil
    Informations personnelles :
    Localisation : France, Marne (Champagne Ardenne)

    Informations forums :
    Inscription : Octobre 2009
    Messages : 90
    Points : 54
    Points
    54
    Par défaut problème insert into avec boucle for
    Bonjour = ), je vous explique mon problème.

    Je programme en vb.net avec une base de donnée sqlServer et je cherche à automatisé la table Historique congé chaque année, c'est à dire remettre à 0 la consommation de chaque agent, de leur attribué un nombre de jour de congé etc... j'ai le code suivant
    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
        Private Sub calcul()
            HS = 28
            HSARTT = 4
            CENTRALE = 28
            CENTRALEARTT = 4
            HB = 22.5
            HBARTT = 7.5
            HBO = 23.5
            HBOARTT = 7.5
            HA = 25
            HAARTT = 14
            Me.objDATA = New CLdata
            Me.rqSql = "SELECT dbo.Tbl_Agents.Index_Agent, Tbl_Horaires.Index_Horaire " & _
                       "FROM dbo.Tbl_Horaires INNER JOIN " & _
                       "dbo.Tbl_Historique_Fonctions ON dbo.Tbl_Horaires.Index_Horaire = dbo.Tbl_Historique_Fonctions.Index_Horaire RIGHT OUTER JOIN " & _
                       "dbo.Tbl_Agents ON dbo.Tbl_Historique_Fonctions.Index_Agent = dbo.Tbl_Agents.Index_Agent GROUP BY Tbl_Agents.Index_Agent, Tbl_Horaires.Index_Horaire"
            Me.DS = Me.objDATA.getRows(Me.rqSql, "TBL_Subdivision")
            Dim I = 0
            Dim NbEnreg As Integer = DS.Tables(0).Rows.Count - 1
            If DS.Tables(0).Rows(0).Item(1) IsNot DBNull.Value Then
                horaire = DS.Tables(0).Rows(0).Item(1)
          End If
            If DS.Tables(0).Rows(0).Item(0) IsNot DBNull.Value Then
                Index_Agent = DS.Tables(0).Rows(0).Item(0)
            End If
    
            For I = 0 To NbEnreg
                If horaire = 1 Then
                    Dim id As Integer
    
                    Me.rqSql = "INSERT INTO [GRH].[dbo].[Tbl_Historique_Conges]" & _
                               "(Droit_Normaux, Droit_ARTT, Consomation_Nom, Solde_Norm, Delta_N, Conso_ARTT, Solde_ARTT, Index_Agent)" & _
                               "VALUES(" & _
                               "'" & HB & "'" & _
                               ",'" & HBARTT & "'" & _
                               ",'" & 0 & "'" & _
                               ",'" & HB & "'" & _
                               ",'" & 0 & "'" & _
                               ",'" & 0 & "'" & _
                               ",'" & HBARTT & "'" & _
                               ",'" & Index_Agent & " ');" & _
                               "; SELECT SCOPE_IDENTITY();"
    
                    id = Me.objDATA.actionRows(Me.rqSql)
                End If
            Next
        End Sub

    Le code est bon aucune erreur sauf que quand j'exécute le boutton ma table sql se rempli de 150 champs avec l'index d'un seul agent le n°1
    j'ai alors essayé comme ca

    dim I = 0
    do until I = NbEnreg



    loop



    et la c'est 30000 enregistrements avec toujours l'index 1


    Merci d'avance

  2. #2
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 182
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 182
    Points : 25 137
    Points
    25 137
    Par défaut
    tu veux que le scope_identity retrouve quoi ?

    Me.objDATA.actionRows(Me.rqSql) sert à exécuter la requete ?

    le champ Index_Agent est un identity ?

    quel est le but de tout ca ? des fois un cross join permet de tout faire en une seule fois


  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    90
    Détails du profil
    Informations personnelles :
    Localisation : France, Marne (Champagne Ardenne)

    Informations forums :
    Inscription : Octobre 2009
    Messages : 90
    Points : 54
    Points
    54
    Par défaut
    j'ai toujours utilisé scope identity alors je ne me suis pas posé de question

    le actiongetrows permet en effet d'exécuter la requete, le champ index_agent est l'index de ma table agent en gros la clé primaire.

    Le but est que la table historique congé s'incrément de valeur automatiquement sans que je ne rentre tout à la main, et que chaque année un employé reparte à 0 c'est à dire une consommation de congé 0 un droit de congé annuel = au droit qu'il a en fonction de son statut, etc...

  4. #4
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 182
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 182
    Points : 25 137
    Points
    25 137
    Par défaut
    faudrait détailler un peu plus, sur les tables et sur le traitement que tu veux faire
    parce que là ca me semble bizarre ce que t'as écrit

    <mode boule de cristal>
    si tu veux ajouter dans une table une ligne pour chaque entrée dans une autre il faut faire
    insert into t (ch1,ch2,valeurtrouvéedansautretable) select 'ch1','ch2',autretable.champ from t cross join autretable
    </mode boule de cristal>


    de plus faire un select pour lire ligne par ligne puis faire un traitement en fonction de ce qui est ramené, c'est contreperformant
    autant tout faire en une seule fois en une seule requete ca va au moins 100x plus vite (et puis moins y a de lignes, mieux c'est)
    (et via un dataset en plus !)
    je pense qu'il te manque quelques notions sur les bases de données, des tutos/cours sont référencés par ce site (voir en haut)

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    90
    Détails du profil
    Informations personnelles :
    Localisation : France, Marne (Champagne Ardenne)

    Informations forums :
    Inscription : Octobre 2009
    Messages : 90
    Points : 54
    Points
    54
    Par défaut
    J'essai d'être plus clair.
    En gros j'ai une table Agent, chaque agent est unique grâce à l'index_agent (tbl_agent) , il y a aussi des status différents c'est à dire des heures différents etc... et ce statu donne droit à un certain nombre de congé qui est qui a comme clé unique Index_horaire(tbl.horaire). Chaque année le cumul des congés et remis à 0 et leur droit respectif aussi en gros j'ai un agent qui a 28 jours de congés il a une consommation de 6 jours il a donc un solde de 22 op on est en 2010 je clic sur le bouton une nouvelle ligne apparait (il ne faut pas perdre la derniere) droit de congé 28 consommation 0 Solde 28. (Tbl_Historique_Conge). En espérant etre plus clair.

    Ici la premiere requete SELECT permet d'avoir l'index de l'agent et l'index_horaire qu'il fait donc son statut. Je dis donc que la variable horaire correspond à toutes les valeurs remontées par le dataset et que l'index_agents aussi. et après il y a la boucle.

  6. #6
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 182
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 182
    Points : 25 137
    Points
    25 137
    Par défaut
    donc ca a l'air de correspondre à ce que je disais

    Citation Envoyé par Pol63 Voir le message
    si tu veux ajouter dans une table une ligne pour chaque entrée dans une autre il faut faire
    insert into t (ch1,ch2,valeurtrouvéedansautretable) select 'ch1','ch2',autretable.champ from t cross join autretable



    de plus faire un select pour lire ligne par ligne puis faire un traitement en fonction de ce qui est ramené, c'est contreperformant
    autant tout faire en une seule fois en une seule requete ca va au moins 100x plus vite (et puis moins y a de lignes, mieux c'est)
    (et via un dataset en plus !)
    je pense qu'il te manque quelques notions sur les bases de données, des tutos/cours sont référencés par ce site (voir en haut)

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    90
    Détails du profil
    Informations personnelles :
    Localisation : France, Marne (Champagne Ardenne)

    Informations forums :
    Inscription : Octobre 2009
    Messages : 90
    Points : 54
    Points
    54
    Par défaut
    Un petit bout de code pour m'aider?

  8. #8
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 182
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 182
    Points : 25 137
    Points
    25 137
    Par défaut
    If DS.Tables(0).Rows(0).Item(1) IsNot DBNull.Value Then
    horaire = DS.Tables(0).Rows(0).Item(1)

    ici ta requete va retourner plusieurs lignes, l'horaire ne dépend que de la première ligne ??

    il serait plus logique que ca et
    Index_Agent = DS.Tables(0).Rows(0).Item(0)
    soient dans la boucle !

  9. #9
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    90
    Détails du profil
    Informations personnelles :
    Localisation : France, Marne (Champagne Ardenne)

    Informations forums :
    Inscription : Octobre 2009
    Messages : 90
    Points : 54
    Points
    54
    Par défaut
    l'horaire ne dépend que de la 1ere ligne.

    J'ai mis Index_Agent = DS.Tables(0).Rows(0).Item(0) et horaire = DS.Tables(0).Rows(0).Item(1) dans la boucle j'ai maintenant une infinité de nouvelles lignes crées...

Discussions similaires

  1. Problème d'insert into avec inner join
    Par guivrator dans le forum Requêtes
    Réponses: 1
    Dernier message: 16/04/2009, 16h43
  2. Problème avec boucle for
    Par kayenne77 dans le forum Débuter
    Réponses: 1
    Dernier message: 10/03/2009, 09h09
  3. [batch] problème avec boucle for
    Par TanEk dans le forum Scripts/Batch
    Réponses: 2
    Dernier message: 22/04/2008, 15h41
  4. Problème avec boucle for() et action POST
    Par Oli_Ifre dans le forum Langage
    Réponses: 4
    Dernier message: 26/04/2007, 10h52
  5. [ActionScript] Problème avec boucle 'FOR'
    Par BnA dans le forum Flash
    Réponses: 7
    Dernier message: 02/11/2006, 10h26

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