1. #1
    Membre éprouvé Avatar de romulus001
    Homme Profil pro
    Développeur VB.NET et Windev (21) sur produits SAGE
    Inscrit en
    mai 2009
    Messages
    1 080
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur VB.NET et Windev (21) sur produits SAGE

    Informations forums :
    Inscription : mai 2009
    Messages : 1 080
    Points : 1 285
    Points
    1 285

    Par défaut Optimiser temps de remplissage d'un champ table

    Bonjour,

    J'ai un champ table que je dois remplir, ce champ fait 39 colonnes, pour le mode de remplissage, j'ai choisi de faire du data biding sur une variable globale.

    Dans un premier test, la table avait 9 lignes, le temps de traitement était acceptable, par contre, pour 441 lignes, ça m'avait pris presque 3 minutes.
    J'ai ensuite apporter diverses corrections dans mes requêtes, le temps a été allongé, j'ai même arrêté le débogage.

    En ce qui concerne le remplissage colonne par colonne : je fais une requête sur SQL Server, malheureusement, il ne me sera pas possible de faire une unique requête pour remplir plusieurs colonnes en même temps.

    La question que j'aimerais vous poser : afin d'optimiser le temps de remplissage, est-ce qu'il serait intéressant de faire un entrepôt de données, où j'importerais les données du sgbd SQL Server vers HF Classic, puis je ferais mes requêtes vers HF Classic uniquement?

    Merci.

    PS: je travaille en fait en webdev 22 mais la question peut très bien concerner Windev
    Chat alors!

    (\ _ /)
    (='.'=) Voici Lapinou. Aidez le à conquérir le monde
    (")-(") en le reproduisant

  2. #2
    Expert éminent
    Homme Profil pro
    Développeur Freelance
    Inscrit en
    janvier 2009
    Messages
    3 270
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Développeur Freelance

    Informations forums :
    Inscription : janvier 2009
    Messages : 3 270
    Points : 6 908
    Points
    6 908

    Par défaut

    Bonjour,
    La première question à se poser est: qu'est-ce qui prend du temps exactement ?
    Que dit l'analyseur de performances ?
    3 minutes pour 441 lignes, c'est quand même un peu suspect.

    Tatayo.

  3. #3
    Membre actif
    Homme Profil pro
    Inscrit en
    mai 2003
    Messages
    160
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Réunion

    Informations forums :
    Inscription : mai 2003
    Messages : 160
    Points : 266
    Points
    266

    Par défaut

    Bonjour,

    On peut voir ton code pour essayer de définir ce qui cloche ?
    Philippe,


    N'hésitez à lever le pouce si mon aide vous a été utile.

  4. #4
    Membre éprouvé
    Homme Profil pro
    Responsable des études
    Inscrit en
    février 2010
    Messages
    520
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Responsable des études
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : février 2010
    Messages : 520
    Points : 1 011
    Points
    1 011

    Par défaut

    Si webdev essaye avec plusieurs navigateurs. J'ai eu de mauvaises surprises avec Firefox.

    Cela m'a obligé à modifier le type de table pour avoir des performances identiques entre navigateurs.

  5. #5
    Rédacteur/Modérateur

    Avatar de dsr57
    Homme Profil pro
    Analyste programmeur senior
    Inscrit en
    octobre 2003
    Messages
    1 126
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Analyste programmeur senior
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : octobre 2003
    Messages : 1 126
    Points : 4 758
    Points
    4 758
    Billets dans le blog
    22

    Par défaut

    Bonjour

    Regarde du coté de la propriété AffichageActif

    Bon dev
    ------------------------------------------------------------------------------------------------------------------------------------------
    Mon message vous a aidé, pensez à remercier . La discussion est résolue, n'oubliez pas le tag
    ------------------------------------------------------------------------------------------------------------------------------------------
    Site perso : Formation, Expérience, Réalisations, ...
    Blog : Le Blog de DSR57 - Programmation WinDev

  6. #6
    Membre actif
    Inscrit en
    octobre 2013
    Messages
    273
    Détails du profil
    Informations forums :
    Inscription : octobre 2013
    Messages : 273
    Points : 242
    Points
    242

    Par défaut

    Citation Envoyé par tatayo Voir le message
    Bonjour,
    La première question à se poser est: qu'est-ce qui prend du temps exactement ?
    Que dit l'analyseur de performances ?
    3 minutes pour 441 lignes, c'est quand même un peu suspect.

    Tatayo.
    totalement d'accord. Il y a forcément un loup.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    matable..affichageactif = faux
     
    //traitement
     
    matable..affichageactif = vrai
    enlever les codes qui pourraient s'executer sur les colonnes, sortie de ligne

  7. #7
    Membre éprouvé Avatar de romulus001
    Homme Profil pro
    Développeur VB.NET et Windev (21) sur produits SAGE
    Inscrit en
    mai 2009
    Messages
    1 080
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur VB.NET et Windev (21) sur produits SAGE

    Informations forums :
    Inscription : mai 2009
    Messages : 1 080
    Points : 1 285
    Points
    1 285

    Par défaut

    Bonjour,

    A ce jour, j'ai mis à jour le code pour alimenter entièrement ma table, désormais, pour ajouter mes 441 lignes, il me faut désormais un temps total de 3 min 10 secondes (tests réalisés sous firefox), j'ai pu alléger mon code en faisans appel à la fonction IniLit avant de rentrer dans la boucle, de même, j'ai fait mes différentes requêtes HF Classic avant de rentrer dans la boucle, où mes requêtes ne servaient qu'à récupérer des valeurs de constantes (6 constantes en tout).

    J'ai lancé un chrono à chaque itération et :
    - Sous Firefox : le temps d'exécution par ligne avoisine les 0.5 secondes, le temps maximal est de 1 seconde 395, et bizarrement, c'est justement la 1ere ligne (la ligne 2 est alimentée en 0.657 secondes)
    - Sous IE : le temps total est de 2 minutes 55 secondes, par ligne, le temps d'exécution avoisine les 0.4 secondes. En ce qui concerne la 1ere ligne, le temps d'exécution est de 0.749 secondes (contre 0.528 secondes pour la ligne 2)
    - Sous Chrome : temps total : 3 minutes 22 secondes, par ligne, le temps d'exécution avoisine les 0.5 secondes, le temps max a été de ... 4.142 secondes en ligne 15, 0.969 secondes en ce qui concerne la ligne 1

    J'en déduis que le problème vient juste du navigateur qui est utilisé, l'idéal serait de rester sous IE.

    Concernant les idées qui ont été données :
    - La propriété AffichageActif n'existe pas sous webdev
    - Mon champ table n'a pas de code défini dans ses différents événements, le champ fonctionne en mode Ajax

    Concernant le code que j'ai mis en place :

    Dans le code du bouton qui lance l'initialisation de la table : (un peu brouillon par moment, je l'avoue, faute de devoir reprendre le projet d'un autre collègue)
    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
    clSalarieSage est un SalarieSage
    clSalarieSage.gContexteSAGE=TypeSalarie //TypeSalarie est une énumération, tout comme TypeInterimaire
     
    l_idreq est une chaîne="REQ_SELECT_SALARIES"
    strSQL est une chaîne = "SELECT DISTINCT NumSalarie, dbo.getMatricule(NumSalarie) as MatriculeSalarie FROM dbo.T_HBNS WHERE DateHist = convert(date, '%1') ORDER BY NumSalarie"
    strSQL=ChaîneConstruit(strSQL,SAI_DateCloturePaie)
    aResult est un booléen = SQLExec(strSQL,l_idreq)
     
    l_infosalarie est un InfoSalarie dynamique
    l_listeRubriques est un DefinitionRubriquesPaie(TypeSalarie) //contient simplement une liste de 8 attributs, ces attributs sont alimentés à l'aide de la fonction IniLit
    l_listeCodesEntite est un DefinitionCodesEntitePaie(TypeSalarie) //contient simplement une liste de 5 attributs, ces attributs sont alimentés via des requêtes HF classic
     
    //Mon champ table est lié à la variable globale gf_ListeInfoSalaries qui est de type InfoSalaries
    SupprimeTout(gf_ListeInfoSalaries)
     
    //ChronoDébut(1)
    l_indiceIter est un entier=0
    SI aResult = Vrai ALORS		
    	SQLPremier(l_idreq)
    	TANTQUE PAS SQL.EnDehors
    		l_indiceIter++
     
    //		si enmodetest() ALORS
    //			SI l_indiceIter>10 ALORS
    //				SORTIR
    //			FIN
    //		FIN
     
    		clSalarieSage.gNumSalarie = SQLCol(l_idreq,1)
    		clSalarieSage.gMatriculeSage = SQLCol(l_idreq,2)
    		clSalarieSage.DonneesSalarie()
     
    		ChronoDébut(2)
    		l_infosalarie=allouer un InfoSalarie
    		l_infosalarie=clSalarieSage.RecupereInfoSalarie(SAI_DateCloturePaie, l_listeRubriques, l_listeCodesEntite)
    		l_infosalarie.DureeTraitementSalarie=DuréeVersChaîne(ChronoFin(2),"MM:SS:LLL")
     
     
    		Ajoute(gf_ListeInfoSalaries,l_infosalarie)
     
    		SQLSuivant(l_idreq)
    	FIN
    	SQLFerme(l_idreq)
    SINON
    	SQLInfoGene()
    	Erreur("Erreur de lecture de la base Sage Paie - Liste des salariés à traiter " + RC + "Code erreur : " + SQL.Erreur + RC + SQL.MesErreur)
    FIN
     
    TableAffiche(TABLE_DonneesSageVersFoed)
    //info(DuréeVersChaîne(chronofin(1),"MM:SS:LLL"))
    CELL_PATIENTER..Visible=Faux
    Code la procédure DonneesSalarie :
    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
    PROCEDURE DonneesSalarie()
    	l_idreq est une chaîne="REQ_DonneesSalarie"
    	clParam est un Parametres
    	clParam.m_nContexteSAGE = gContexteSAGE
    	strSQL est une chaîne = "SELECT t1.St10_5,t0.MatriculeSalarie,t0.Civilite,t0.Nom,t0.NomJeuneFille,t0.Prenom,t0.DateNaissance," +
    							"t0.CommuneNaissance,t0.DeptNaissance,t0.EMail," +
    							"t0.Telephone,t0.Telephone2 " +
    							"FROM T_SAL t0 " +
    							"INNER JOIN T_ZONESLIBRES t1 ON t0.SA_CompteurNumero = t1.NumSalarie " +
    							"WHERE t0.MatriculeSalarie='" + gMatriculeSage + "'"
    	aResult est un booléen = SQLExec(strSQL,l_idreq)
    	// Affiche la première ligne
    	SI aResult = Vrai ALORS		
    		SQLPremier(l_idreq)
    		SI PAS SQL.EnDehors
    			m_sMatriculeFoed = SQLCol(l_idreq,1)
    			m_sMatriculeSage = SQLCol(l_idreq,2)
    			m_sCivilite = SQLCol(l_idreq,3)
    			m_sNom = SQLCol(l_idreq,4)
    			m_sNomJeuneFille = SQLCol(l_idreq,5)
    			m_sPrenom = SQLCol(l_idreq,6)	
    			m_sDateNaissance = SQLCol(l_idreq,7)	
    			m_sVilleNaissance = SQLCol(l_idreq,8)
    			m_sDepartementNaissance = SQLCol(l_idreq,9)
    			m_sAdresseMailPersonnelle = SQLCol(l_idreq,10)
    			m_sTelephoneFixePersonnel = SQLCol(l_idreq,11)
    			m_sTelephonePortablePersonnel = SQLCol(l_idreq,12)		
    		SINON
    			m_sMatriculeFoed = ""
    			m_sMatriculeSage = ""
    			m_sCivilite = ""
    			m_sNom = ""
    			m_sNomJeuneFille = ""
    			m_sPrenom = ""
    			m_sDateNaissance = ""	
    			m_sVilleNaissance = ""
    			m_sDepartementNaissance = ""
    			m_sAdresseMailPersonnelle = ""
    			m_sTelephoneFixePersonnel = ""
    			m_sTelephonePortablePersonnel = ""
    		FIN
    		SQLFerme(l_idreq)
    	SINON
    		SQLInfoGene()
    		Erreur("Erreur de lecture de la base Sage Paie - Données salarié " + RC + "Code erreur : " + SQL.Erreur + RC + SQL.MesErreur)
    	FIN
    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
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    PROCEDURE RecupereInfoSalarie(param_dateHist est une chaîne, param_rubriquesPaie est un DefinitionRubriquesPaie, param_codesentite est un DefinitionCodesEntitePaie)
     
    l_retour est un InfoSalarie
    gDateHist=param_dateHist
     
    gp_DateEmbauche=FonctionsGlobales.RecupereDateEmbauche(gNumSalarie)
     
    AVEC l_retour
    	.NumSalarie=gNumSalarie
    	.MatriculeSAGE=gMatriculeSage
    	.MatriculeFoedris=gMatriculeFoed
    	.EmploiOccupe=RecupereEmploiOccupe()
    	.DateEffetEmploiOccupe=RecupereDateEffetEmploiOccupe(.EmploiOccupe)
    	.SalaireBase=RecupereSalaireBase(param_rubriquesPaie.SalaireBase, param_codesentite.entite_SALAIREBASE)
    	.DateEffetSalaireBase=RecupereDateEffetSalaireBase(Val(.SalaireBase),param_rubriquesPaie.SalaireBase, param_codesentite.entite_SALAIREBASE)
    	.SalaireBrut=RecupereSalaireBrut(param_codesentite.entite_BRUT)
    	.DateEffetSalaireBrut=RecupereDateEffetSalaireBrut(Val(.SalaireBrut),param_codesentite.entite_BRUT)
     
    	.ChargesPatronales=RecupereChargesPatronales(param_codesentite.entite_CHARGESPATRONALES)
    	.DateEffetChargesPatronales=RecupereDateEffetChargesPatronales(Val(.ChargesPatronales), param_codesentite.entite_CHARGESPATRONALES)
     
    	.SalaireBrutCharge=Val(.SalaireBrut)+Val(.ChargesPatronales)
     
    	SI DateValide(.DateEffetSalaireBrut) ET DateValide(.DateEffetChargesPatronales) ET .DateEffetSalaireBrut<>"" ET .DateEffetChargesPatronales<>"" ALORS
    		.DateEffetSalaireBrutCharge=Min(.DateEffetSalaireBrut,.DateEffetChargesPatronales)
    	SINON
    		SI DateValide(.DateEffetSalaireBrut) ET .DateEffetSalaireBrut<>"" ALORS
    			.DateEffetSalaireBrutCharge=.DateEffetSalaireBrut
    		SINON
    			SI DateValide(.DateEffetChargesPatronales) ET .DateEffetChargesPatronales<>"" ALORS
    				.DateEffetSalaireBrutCharge=.DateEffetChargesPatronales
    			SINON
    				.DateEffetSalaireBrutCharge=""
    			FIN
    		FIN
     
    	FIN
     
    	.PrimesPosteCumulees=RecuperePrimesPosteCumulees(param_rubriquesPaie.PrimePostesCumulees)
    	.DateEffetPrimesPosteCumulees=RecupereDateEffetPrimesPosteCumulees(Val(.PrimesPosteCumulees),param_rubriquesPaie.PrimePostesCumulees)
    	.PrimesSemestrielles=RecuperePrimesSemestrielles(param_rubriquesPaie.PrimeSemestrielle)
    	.DateEffetPrimesSemestrielles=RecupereDateEffetPrimesSemestrielles(Val(.PrimesSemestrielles),param_rubriquesPaie.PrimeSemestrielle)
    	.PrimesAnciennete=RecuperePrimesAnciennete(param_rubriquesPaie.PrimeAnciennete)
    	.DateEffetPrimesAnciennete=RecupereDateEffetPrimesAnciennete(Val(.PrimesAnciennete),param_rubriquesPaie.PrimeAnciennete)
    	.PrimesVacances=RecuperePrimesVacances(param_rubriquesPaie.PrimeVacance)
    	.DateEffetPrimesVacances=RecupereDateEffetPrimesVacances(Val(.PrimesVacances), param_rubriquesPaie.PrimeVacance)
    	.IKT=RecupereIKT(param_rubriquesPaie.IKT)
    	.DateEffetIKT=RecupereDateEffetIKT(Val(.IKT),param_rubriquesPaie.IKT)
    	.EpargneSalariale=RecupereEpargneSalariale()
    	.DateEffetEpargneSalariale=RecupereDateEffetEpargneSalariale(Val(.EpargneSalariale))
    	.CodeDepartement=RecupereCodeDepartement()
    	.CodeService=RecupereService()
    	.CodeUnite=RecupereUnite()
    	.CodeAnalytique=RecupereCodeAnalytique()
     
    	.DateEffetCodeUnite=RecupereDateEffetUnite(.CodeUnite)
     
    	SI .CodeDepartement<>"" ALORS
    		.DateEffetCodeDepartement=.DateEffetCodeUnite	
    	SINON
    		.DateEffetCodeDepartement=""
    	FIN
     
    	SI .CodeService<>"" ALORS
    		.DateEffetCodeService=.DateEffetCodeUnite
    	SINON
    		.DateEffetCodeService=""
    	FIN
     
    	SI .CodeAnalytique<>"" ALORS
    		.DateEffetCodeAnalytique=.DateEffetCodeUnite
    	SINON
    		.DateEffetCodeAnalytique=""	
    	FIN
     
    	.SalaireHoraireInterim=RecupereSalaireHoraireInterim(param_codesentite.entite_SALAIREHORAIRE)
    	.DateEffetSalaireHoraireInterim=RecupereDateEffetSalaireHoraireInterim(Val(.SalaireHoraireInterim), param_codesentite.entite_SALAIREHORAIRE)
    	.CoutGlobalMensuelle=RecupereCoutGlobalMensuelle(param_codesentite.entite_BRUT)
    	.DateEffetCoutGlobalMensuelle=RecupereDateEffetCoutGlobalMensuelle(Val(.CoutGlobalMensuelle), param_codesentite.entite_BRUT)
    	.HoraireMensuelle=RecupereHoraireMensuelle(param_rubriquesPaie.HoraireMensuel, param_codesentite.entite_HORAIREMENSUEL)
    	.DateEffetHoraireMensuelle=RecupereDateEffetHoraireMensuelle(Val(.HoraireMensuelle),param_rubriquesPaie.HoraireMensuel,param_codesentite.entite_HORAIREMENSUEL)
    	.CoeffHierarchique=RecupereCoeffHierarchique()
    	.DateEffetCoeffHierarchique=RecupereDateEffetCoeffHierarchique(Val(.CoeffHierarchique))
    	.PrimeOccasionelle=RecuperePrimeOccasionelle(param_rubriquesPaie.PrimeOccasionnelle)
    	.DateEffetPrimeOccasionelle=RecupereDateEffetPrimeOccasionelle(Val(.PrimeOccasionelle), param_rubriquesPaie.PrimeOccasionnelle)
    	.IndemniteDepostage=RecupereIndemniteDepostage()
    	.DateEffetIndemniteDepostage=RecuereDateEffetIndemniteDepostage(Val(.IndemniteDepostage))
    FIN
     
    gp_DateEmbauche=""
    RENVOYER l_retour
    Au sujet des fonctions RecupereXXX et RecupereDateEffetXXX, elles font toutes appel à des fonctions globales, dans certains cas, je dois récupérer des valeurs dans des rubriques de paie ou dans des constantes, voici mes fonctions globales :

    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
    PROCEDURE EvalueConstante(param_entite est un entier, param_numSalarie est un entier, param_dateHist est une Date) : numérique
     
    SI param_entite<1 ALORS
    	RENVOYER 0
    FIN
     
    l_retour est un numérique=0
     
    l_idreq est une chaîne="EvalueConstante_"+param_entite
    l_req est une chaîne=[
    	select ValeurCumul
    	from dbo.T_HCUM
    	where NumSalarie=%1
    	and Entite=%2
    	and DateHist=convert(date, '%3')
    ]
     
    l_req=ChaîneConstruit(l_req,param_numSalarie, param_entite,param_dateHist)	
     
    SI PAS SQLExec(l_req,l_idreq) ALORS
    	SQLInfoGene(l_idreq)
    	Erreur(SQL.MesErreur)
    SINON
    	SQLPremier(l_idreq)
    	SI PAS SQL.EnDehors ALORS
    		l_retour=Val(SQLCol(l_idreq,1))
    	FIN
    	SQLFerme(l_idreq)
    FIN
     
    RENVOYER l_retour
    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
    PROCEDURE EvalueRubrique(param_indiceRubrique est un entier, param_numSalarie est un entier, param_dateHist est une Date) : numérique
     
    SI param_indiceRubrique<1 ALORS
    	RENVOYER 0
    FIN
     
    l_retour est un numérique
    l_idreq est une chaîne="EvalueRubrique_"+param_indiceRubrique
    l_req est une chaîne=[
    	select ValeurMontant
    	from dbo.T_HBNS
    	where CodeRubrique=%1
    	and NumSalarie=%2
    	and DateHist=convert(datetime, '%3')
    ]
     
    l_req=ChaîneConstruit(l_req,param_indiceRubrique,param_numSalarie, param_dateHist)
     
    SI PAS SQLExec(l_req,l_idreq) ALORS
    	SQLInfoGene(l_idreq)
    	Erreur(SQL.MesErreur)
    SINON
    	SQLPremier(l_idreq)
    	SI PAS SQL.EnDehors ALORS
    		l_retour=Val(SQLCol(l_idreq,1))
    	FIN
    	SQLFerme(l_idreq)
    FIN
     
    RENVOYER l_retour
    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
    PROCEDURE RecupereCompteAnalytique(param_numSalarie est un entier, param_datehist est une Date) : chaîne
     
    l_retour est une chaîne=""
    l_idreq est une chaîne="CompteAnalytique"
    l_req est une chaîne=[
    	select CompteAnalytique
    	from dbo.T_HVAN
    	where DateEffet=convert(date, '%1') and CompteGeneral=dbo.GetMatricule(%2)
    ]
     
    l_req=ChaîneConstruit(l_req,param_datehist,param_numSalarie)
     
    SI PAS SQLExec(l_req,l_idreq) ALORS
    	SQLInfoGene(l_idreq)
    	Erreur(SQL.MesErreur)
    	RENVOYER ""
    SINON
    	SQLPremier(l_idreq)
    	SI PAS SQL.EnDehors ALORS
    		l_retour=SQLCol(l_idreq,1)
    	FIN
    	SQLFerme(l_idreq)
    FIN
     
    RENVOYER l_retour
    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
    PROCEDURE RecupereDateAffectationRubrique(param_numSalarie est un entier, param_idrubrique est un entier) : Date
     
    SI param_idrubrique<1 ALORS
    	RENVOYER ""
    FIN
     
    l_retour est une Date=""
    l_idreq est une chaîne="RecupereDateAffectationRubrique"
    l_req est une chaîne=[
    	select convert(varchar(8), min(datehist), 112)
    	from dbo.T_HBNS
    	where NumSalarie=%1
    	and CodeRubrique=%2
    ]
     
    l_req=ChaîneConstruit(l_req,param_numSalarie,param_idrubrique)
     
    SI PAS SQLExec(l_req,l_idreq) ALORS
    	SQLInfoGene(l_idreq)
    	Erreur(SQL.MesErreur)
    SINON
    	SQLPremier(l_idreq)
    	SI PAS SQL.EnDehors ALORS
    		l_retour=SQLCol(l_idreq,1)
    	FIN
    	SQLPremier(l_idreq)
    FIN
     
    RENVOYER l_retour
    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
    PROCEDURE RecupereDateEffetConstante(param_numSalarie est un entier, param_entite est un entier, param_valeur est un numérique) : chaîne
     
    SI param_entite<1 ALORS
    	RENVOYER ""
    FIN
     
    l_retour est un numérique
    l_idreq est une chaîne="RecupereDateEffetConstante"+param_entite
    l_req est une chaîne=[
    	select convert(varchar(8), DateHist, 112), ValeurCumul
    	from dbo.T_HCUM
    	where NumSalarie=%1
    	and Entite=%2
    ]
     
    l_req=ChaîneConstruit(l_req,param_numSalarie, param_entite)
     
    SI PAS SQLExec(l_req,l_idreq) ALORS
    	SQLInfoGene(l_idreq)
    	Erreur(SQL.MesErreur)
    SINON
    	SQLPremier(l_idreq)
    	TANTQUE PAS SQL.EnDehors
    		SI Val(SQLCol(l_idreq,2))=Val(param_valeur) ALORS
    			l_retour=Val(SQLCol(l_idreq,1))
    		FIN
    		SQLSuivant(l_idreq)
    	FIN
    	SQLFerme(l_idreq)
    FIN
     
     
    RENVOYER l_retour
    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
    71
    72
    73
    74
    75
    PROCEDURE RecupereDateEffetHistoPostes(param_numsalarie est un entier, param_dateHisto est une Date, param_champ est une chaîne, param_valeurChaine est une chaîne, param_valeurEntier est un entier=0, param_valeurNumerique est un numérique=0) : Date
     
    SI param_valeurChaine="" ET param_valeurEntier=0 ET param_valeurNumerique=0 ALORS
    	RENVOYER ""
    FIN
     
    l_nb est un entier=0
    l_retour est une Date=""
    l_idreq est une chaîne="RecupereDonnee_nb"
    l_req est une chaîne=[
    	select count(*)
    	from T_HST_AFFECTATION
    	where NumSalarie=%1
    	and (infoEnCours=1 or (InfoEnCours=0 and Departement is not null and Service is not null and unite is not null))
    ]
     
    l_req=ChaîneConstruit(l_req,param_numsalarie)
     
    SI PAS SQLExec(l_req,l_idreq) ALORS
    	SQLInfoGene(l_idreq)
    	Erreur(SQL.MesErreur)
    	RENVOYER ""
    SINON
    	SQLPremier(l_idreq)
    	SI PAS SQL.EnDehors ALORS
    		l_nb=SQLCol(l_idreq,1)
    	FIN
    	SQLFerme(l_idreq)
    FIN
     
    //si le salarie n'a aucun poste dans l'historique, on renvoit sa date d'embauche
    SI l_nb=1 ALORS
    	RENVOYER gp_DateEmbauche
    FIN
     
    l_idreq="Recuperedonnee"
    l_req=[
    	select convert(varchar(8), min(DateHisto), 112) as DateHistorique
    	from (
    		select %3, isnull(datehist, getdate()) as DateHisto
    		from T_HST_AFFECTATION
    		where NumSalarie=%1
    		and %3=%4
    		and (infoEnCours=1 or (InfoEnCours=0 and Departement is not null and Service is not null and unite is not null))
    		) Vue
    	where convert(varchar(8), datehisto, 112)<='%2'
    ]
     
    SI param_valeurChaine<>"" ALORS
    	l_req=ChaîneConstruit(l_req,param_numsalarie,param_dateHisto,param_champ, "'"+Remplace(param_valeurChaine,"'","''")+"'")
    SINON
    	SI param_valeurEntier<>0 ALORS
    		l_req=ChaîneConstruit(l_req,param_numsalarie,param_dateHisto,param_champ, param_valeurEntier)
    	SINON
    		l_req=ChaîneConstruit(l_req,param_numsalarie,param_dateHisto,param_champ, param_valeurNumerique)
    	FIN
    FIN
     
    SI PAS SQLExec(l_req,l_idreq) ALORS
    	SQLInfoGene(l_idreq)
    	Erreur(SQL.MesErreur)
    	RENVOYER ""
    SINON
    	SQLPremier(l_idreq)
    	SI PAS SQL.EnDehors ALORS
    		l_retour=SQLCol(l_idreq,1)
    	FIN
    	SQLFerme(l_idreq)
    FIN
     
    SI l_retour="" OU PAS DateValide(l_retour) ALORS
    	RENVOYER gp_DateEmbauche
    SINON
    	RENVOYER l_retour
    FIN
    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
    PROCEDURE RecupereDateEffetRubrique(param_numSalarie est un entier, param_id_rubrique est un entier, param_valeur est un numérique) : chaîne
     
    l_retour est une chaîne=""
     
    l_idreq est une chaîne="RecupereDateEffetRubrique_"+param_id_rubrique
    l_req est une chaîne=[
    	select convert(varchar(8), min(datehist), 112)
    	from dbo.T_HBNS
    	where NumSalarie=%1
    	and CodeRubrique=%2
    	and ValeurMontant=%3
    	and datehist is not null
    ]
     
    l_req=ChaîneConstruit(l_req,param_numSalarie,param_id_rubrique,param_valeur)
     
    SI PAS SQLExec(l_req,l_idreq) ALORS
    	SQLInfoGene(l_idreq)
    	Erreur(SQL.MesErreur)
    SINON
    	SQLPremier(l_idreq)
    	SI PAS SQL.EnDehors ALORS
    		l_retour=Val(SQLCol(l_idreq,1))
    	FIN
    	SQLFerme(l_idreq)
    FIN
     
    RENVOYER l_retour
    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
    PROCEDURE RecupereDateEmbauche(param_numSalarie est un entier) : Date
     
    l_retour est une Date=DateDuJour
    l_idreq est une chaîne="RecupereDateEmbauche"
    l_req est une chaîne=[
    	select convert(varchar(8), DateEmbauche, 112)
    	from T_HST_INFOSSOCIETE
    	where NumSalarie=%1 and InfoEnCours=1
    ]
     
    l_req=ChaîneConstruit(l_req,param_numSalarie)
     
    SI PAS SQLExec(l_req,l_idreq) ALORS
    	SQLInfoGene(l_idreq)
    	Erreur(SQL.MesErreur)
    	RENVOYER ""
    SINON
    	SQLPremier(l_idreq)
    	SI PAS SQL.EnDehors ALORS
    		l_retour=SQLCol(l_idreq,1)
    	FIN
    	SQLFerme(l_idreq)
    FIN
    RENVOYER l_retour
    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
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    PROCEDURE RecupereHistoriquePostes(param_numsalarie est un entier, param_dateHisto est une Date, param_champ est une chaîne) : chaîne
     
    l_nb est un entier=0
    l_retour est une chaîne=""
    l_idreq est une chaîne="RecupereDonnee_nb"
    l_req est une chaîne=[
    	select count(*)
    	from T_HST_AFFECTATION
    	where NumSalarie=%1
    	AND %2 is not null
    ]
     
    l_req=ChaîneConstruit(l_req,param_numsalarie, param_champ)
     
    SI PAS SQLExec(l_req,l_idreq) ALORS
    	SQLInfoGene(l_idreq)
    	Erreur(SQL.MesErreur)
    	RENVOYER ""
    SINON
    	SQLPremier(l_idreq)
    	SI PAS SQL.EnDehors ALORS
    		l_nb=SQLCol(l_idreq,1)
    	FIN
    	SQLFerme(l_idreq)
    FIN
     
    //si le salarie n'a aucun poste dans l'historique, on renvoit le poste avec InfoEnCours=1
    SI l_nb=1 ALORS
    	l_idreq="RecupereDonnee_InfoEnCours1"
    	l_req=[
    		select %2
    		from T_HST_AFFECTATION
    		where NumSalarie=%1
    		and %2 is not null
    	]
     
    	l_req=ChaîneConstruit(l_req,param_numsalarie,param_champ)
     
    	SI PAS SQLExec(l_req,l_idreq) ALORS
    		SQLInfoGene(l_idreq)
    		Erreur(SQL.MesErreur)
    		RENVOYER ""
    	SINON
    		SQLPremier(l_idreq)
    		SI PAS SQL.EnDehors ALORS
    			l_retour=SQLCol(l_idreq,1)
    		FIN
    		SQLFerme(l_idreq)
    	FIN
    	RENVOYER l_retour
    FIN
     
    l_idreq="Recuperedonnee"
    l_req=[
    	select %3
    	from (
    	select %3, isnull(datehist, getdate()) as DateHisto
    	from T_HST_AFFECTATION
    	where NumSalarie=%1
    		and ltrim(rtrim(%3))<>''
    		and %3 is not null
    	) Vue
    	where convert(varchar(8), datehisto, 112)<='%2'
    	order by datehisto desc	
    ]
     
    l_req=ChaîneConstruit(l_req,param_numsalarie,param_dateHisto,param_champ)
     
    SI PAS SQLExec(l_req,l_idreq) ALORS
    	SQLInfoGene(l_idreq)
    	Erreur(SQL.MesErreur)
    	RENVOYER ""
    SINON
    	SQLPremier(l_idreq)
    	SI PAS SQL.EnDehors ALORS
    		l_retour=SQLCol(l_idreq,1)
    	FIN
    	SQLFerme(l_idreq)
    FIN
    RENVOYER l_retour
    Au sujet des requêtes SQL que j'exécute : je ne pourrais rien changer dans la description des différentes tables, les tables sont des tables de la société SAGE
    Chat alors!

    (\ _ /)
    (='.'=) Voici Lapinou. Aidez le à conquérir le monde
    (")-(") en le reproduisant

  8. #8
    Rédacteur/Modérateur

    Homme Profil pro
    Ingénieur qualité méthodes
    Inscrit en
    décembre 2013
    Messages
    1 509
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur qualité méthodes
    Secteur : Conseil

    Informations forums :
    Inscription : décembre 2013
    Messages : 1 509
    Points : 3 151
    Points
    3 151

    Par défaut

    Si je comprends tout, pour 441 lignes et 39 colonnes, tu dois donc lancer à peu près 441*39 ordre SQLEXEC(). (

    Donc 15000 fois, le client appelle le serveur, demande une information, attend que l'information arrive, etc ...
    En caricaturant à peine, chaque SQLEXEC c'est : je décroche mon téléphone, je compose le n°, j'attends la tonalité, j'attends que mon interlocuteur dise allo... on dit ce qu'on a à dire, et on raccroche. Quitte à lancer un SQLEXEC(), autant essayer de récupérer un maximum d'information, et non pas une seule information.

    Tu ne peux pas récupérer les 39 colonnes via un appel. Ok.

    Mais tu peux peut-être lancer 39 requêtes : Chaque requête va renvoyer les 441 lignes voulues, et par des tablecherche, tu vas aller écrire la bonne information sur la bonne ligne.
    N'oubliez pas le bouton Résolu si vous avez obtenu une réponse à votre question.

  9. #9
    Membre confirmé

    Profil pro
    Inscrit en
    mars 2002
    Messages
    1 102
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : mars 2002
    Messages : 1 102
    Points : 566
    Points
    566

    Par défaut

    Je vais un peu dans le même sens que le post précédent.
    La solution serait de limiter le nombre de requetes en jouant sur des jointures de tables.
    Idem pour les fonctions qui peuvent être traitées au niveau SQL Serveur.

    Quitte à faire une procédure stockée.

    Vous pouvez quand même mesurer le temps d'exécution de chaque requête directement sous SQM Manager et vérifier que vous avez bien les index nécessaires

  10. #10
    Membre éprouvé
    Profil pro
    Inscrit en
    mars 2003
    Messages
    539
    Détails du profil
    Informations personnelles :
    Localisation : Laos

    Informations forums :
    Inscription : mars 2003
    Messages : 539
    Points : 1 148
    Points
    1 148

    Par défaut

    Bonjour,

    Vous pouvez gagner du temps, mais perdre un peu en fiabilité...
    Sous SqlServer, je me suis aperçu que sur des boucles de requêtes, le SQLFerme() est consommateur quand les itérations sont nombreuses.
    J'ai pu donc gagner facilement entre 30-40% du temps globale de certain algo en ne fermant les requêtes qu'à la toute fin du traitement...

    Cordialement.

Discussions similaires

  1. [WD20] Remplissage d'un champ table avec requete intégrée
    Par DavidArwen dans le forum WinDev
    Réponses: 1
    Dernier message: 06/02/2017, 15h14
  2. Réponses: 5
    Dernier message: 25/11/2016, 15h03
  3. Réponses: 4
    Dernier message: 03/05/2013, 17h01
  4. Remplissage d'un champ avec le contenu d'une table
    Par AudreyCtei dans le forum JSF
    Réponses: 1
    Dernier message: 06/08/2009, 11h28
  5. Réponses: 10
    Dernier message: 09/03/2007, 22h14

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