PC SOFT

FORUMS PROFESSIONNELS
WINDEVWEBDEV et WINDEV Mobile

Accueil → WINDEV 2025 → Comment optimiser l'ajout plusieurs lignes sur table mémoire ?
Comment optimiser l'ajout plusieurs lignes sur table mémoire ?
Débuté par testeur, 07 juin 2025 20:57 - 5 réponses
Posté le 07 juin 2025 - 20:57
Bonjour à tous
Sur une fenêtre de windev25 j'ai une table mémoire de 48 colonnes , j'affiche les affaires des milliers ( besoin d'utilisateur ) , voilà le code :

TBL_CHARGE.SupprimeTout()

req_aff est une Source de Données
i est un entier = 1

sSQL_Select est une chaîne = GetSQL_Select()

sSQL_FromWhere est une chaîne = [
FROM Charge_aff, Affaires
LEFT JOIN Gestionnaire ON Gestionnaire.IDGestionnaire = Affaires.IDGestionnaire
LEFT JOIN SocieteGestion ON SocieteGestion.IDSocieteGestion = Affaires.IDSocieteGestion
LEFT JOIN Client ON Client.IDClient = Affaires.IDClient

]
ListeConditions est une chaîne = ""

// Ajout du filtre gestionnaire si non admin
SI UserAdmin = Faux ALORS
AjouteCondition(ListeConditions, " Affaires.IDGestionnaire = " + id_gestionaire_connecte + " AND WL.DateSys() <= Charge_aff.DateFin")
FIN

SI DateRecp1 <> "" ALORS
SI DateValide(DateRecp1) _ET_ DateValide(DateRecp2) ALORS
AjouteCondition(ListeConditions, " Affaires.Datereception BETWEEN '" + DateRecp1 + "' AND '" + DateRecp2 + "'")

FIN
FIN

SI ONG_FILTRE.Combo_StatutAffaire..ValeurAffichée <> cs_tous_statut ALORS

AjouteCondition(ListeConditions, " Affaires.StatutAff = "+"'"+ONG_FILTRE.Combo_StatutAffaire..ValeurAffichée+"'")
FIN

SI SansEspace(SAI_NAFFAIRE) <> "" ALORS
AjouteCondition(ListeConditions, " Affaires.numeroAff LIKE '%"+SAI_NAFFAIRE+"%'")
FIN

SI SansEspace(SAI_NOM) <> "" _AND_ Taille(SAI_NOM) > 1 ALORS
AjouteCondition(ListeConditions, "Client.nomClient LIKE '%" + SAI_NOM + "%'")
FIN

SI SansEspace(SAI_CIN) <> "" _AND_ Taille(SAI_CIN) > 1 ALORS
AjouteCondition(ListeConditions, "Client.CIN LIKE '%" + SAI_CIN + "%'")
FIN
SI SansEspace(SAI_TEL_CLIENT) <> "" _AND_ Taille(SAI_TEL_CLIENT) > 1 ALORS
AjouteCondition(ListeConditions, "Client.Tel LIKE '%" + SAI_TEL_CLIENT + "%'")
FIN

SI SansEspace(SAI_RC) <> "" _AND_ Taille(SAI_RC) > 1 ALORS
AjouteCondition(ListeConditions, " Client.raisonSociale'%"+SAI_RC+"%'")
FIN

SI SansEspace(SAI_TIERS) <> "" _AND_ Taille(SAI_TIERS) > 1 ALORS
AjouteCondition(ListeConditions, " Affaires.Tiers'%"+SAI_TIERS+"%'")
FIN

SI INT_TOUS_SORT = Faux ALORS
Sort_ est une chaîne

POUR k = 1 _À_ INT_CLI_JOINABLE..Occurrence
SI INT_CLI_JOINABLE[k]..Valeur ALORS

SI Sort_ = "" ALORS
SI k = 1 _OU_ k = 2 ALORS

Sort_ = " AND ( Client.joignable = "+modulo(k,2)


SINON
Sort_ = " AND ( Client.Erroné_sansReponse_Etient = "+ (k-2)
FIN

SINON

SI k = 1 _OU_ k = 2 ALORS
Sort_ += " OR Client.joignable = " +modulo(k,2)
SINON

Sort_ += " OR Client.Erroné_sansReponse_Etient = "+ (k-2)
END

FIN
FIN

FIN
SI Sort_ <> "" ALORS
Sort_ += " ) "

FIN
SI Sort_ <> "" ALORS ListeConditions += Sort_

FIN


SI ONG_FILTRE.Combo_Gestionnaire..ValeurAffichée <> cs_tous_gest ALORS
AjouteCondition(ListeConditions, "Affaires.IDGestionnaire = "+"'"+ONG_FILTRE.Combo_Gestionnaire..ValeurMémorisée+"'")
FIN

SI ONG_FILTRE.CMB_STE_GESTION..ValeurAffichée <> cs_tous_st ALORS
AjouteCondition(ListeConditions, "Affaires.IDSocieteGestion = "+"'"+ONG_FILTRE.CMB_STE_GESTION..ValeurMémorisée+"'")
FIN

SI ONG_FILTRE.CMB_STADE..ValeurAffichée <> cs_tous_stade ALORS
AjouteCondition(ListeConditions, "Affaires.Stade = "+"'"+ONG_FILTRE.CMB_STADE..ValeurMémorisée+"'")
FIN


SI INT_TYPE_PRELEVEMENT ALORS
valeurs est une chaîne = ConcatValeursDepuisZR("ZR_TYPE_PR", "LIB_TYPE_PR")
ListeConditions += AjouterConditionIN(valeurs, "Affaires.TypePrelevement")
FIN


SI INT_CATEGORIE ALORS

valeurs est une chaîne = ConcatValeursDepuisZR("ZR_CATEGORIE", "LIB_TYPE_PR")
ListeConditions += AjouterConditionIN(valeurs, "Affaires.Categorie")
FIN

sSQL_Order est une chaîne = " ORDER BY SocieteGestion.NomSociete, Stade"

sSQL_Where est chaîne = [
WHERE (Charge_aff.IDCharge_aff = Affaires.IDCharge_aff AND Charge_aff.SUP = 0)
AND (Affaires.StatutAff NOT IN ('DECES','DÉCÈS','ARCHIVE','SOLDE','VEHICULE RECUPERE','SORTIE de PORTEFEUILLE'))
]
SI ListeConditions <> "" ALORS
sSQL_Where += ListeConditions
FIN

sSQL_Order = " ORDER BY SocieteGestion.NomSociete, Stade"

sSQL_Final est une chaîne = sSQL_Select + sSQL_FromWhere + sSQL_Where + sSQL_Order


SI HExécuteRequêteSQL(req_aff, hRequêteDéfaut, sSQL_Final) = Faux ALORS
Matrace(sSQL_Final)
ErreurInfo(errComplet)
RETOUR

END

POUR TOUT req_aff

ind est un entier = TBL_CHARGE.AjouteLigne()

TBL_CHARGE.Col_N_AFFAIRE[ind] = req_aff.numeroAff

TBL_CHARGE.COL_RMBRS[ind] = req_aff.rmb
TBL_CHARGE.Col_adresse[ind] = req_aff.adresseDom
TBL_CHARGE.COL_STATUT[ind] = Majuscule(req_aff.StatutAff)
TBL_CHARGE.COL_AdressePro[ind] = req_aff.adresseEmployeur
TBL_CHARGE.COL_VILLE[ind] = req_aff.Ville
TBL_CHARGE.COL_MT_RECL_INI[ind] = req_aff.MontantReclaméInitial
TBL_CHARGE.COL_BANQUE[ind] = req_aff.banque
TBL_CHARGE.col_capital[ind] = req_aff.Capital
TBL_CHARGE.COL_CAT[ind] = req_aff.Categorie
TBL_CHARGE.COL_CIN[ind] = req_aff.CIN
TBL_CHARGE.COL_CLIENT[ind] = req_aff.nomClient
TBL_CHARGE.COL_RIB[ind] = req_aff.RIB

TBL_CHARGE.COL_DATE_ENTR_CTX[ind] = req_aff.DateCtx

TBL_CHARGE.COL_DATE_PRD[ind] = req_aff.DateMiseProd
TBL_CHARGE.COL_DATE_RECEPTION[ind] = req_aff.Datereception


TBL_CHARGE.Col_DateRejet[ind] = req_aff.DateRejet
TBL_CHARGE.COL_DATE_DER_ECHE[ind] = req_aff.dernierEch
TBL_CHARGE.COL_DURE_CRED[ind] = req_aff.durée

SI UserAdmin ALORS
TBL_CHARGE.COL_GESTIONNAIRE[ind] = req_aff.nomgestionnaire
TBL_CHARGE.COL_IDGestionnaire[ind] = req_aff.IDGestionnaire
FIN

TBL_CHARGE.COL_ID_AFFAIRE[ind] = req_aff.IDAffaires
TBL_CHARGE.Col_id_client[ind] = req_aff.IDClient
TBL_CHARGE.COL_IDSocieteGestion[ind] = req_aff.IDSocieteGestion
TBL_CHARGE.COL_MARQUE_VEH[ind] = req_aff.MarqueVehicule
TBL_CHARGE.COL_MATRICULE[ind] = req_aff.Matricule
TBL_CHARGE.Col_MENSUALITE[ind] = req_aff.Mensualité
TBL_CHARGE.COL_MT_RECLAMLE[ind] = req_aff.MontantReclamé
TBL_CHARGE.COL_MotifRejetCheque[ind] = req_aff.MotifRejetCheque
TBL_CHARGE.COL_nomAvocat[ind] = req_aff.nomAvocat
TBL_CHARGE.COL_DATE_PRE_ECH[ind] = req_aff.premiereEch
TBL_CHARGE.COL_ProcJudiciaire[ind] = req_aff.ProcJudiciaire
TBL_CHARGE.COL_RefDossierAvocat[ind] = req_aff.RefDossierAvocat
TBL_CHARGE.COL_RegistreCommerce[ind] = req_aff.RegistreCommerce
TBL_CHARGE.COL_SORT_VEH[ind] = req_aff.sortVehicule
TBL_CHARGE.COL_STADE[ind] = req_aff.Stade
TBL_CHARGE.COL_TIERS[ind] = req_aff.Tiers
TBL_CHARGE.COL_TitreFoncier[ind] = req_aff.TitreFoncier
TBL_CHARGE.COL_TYPE_PRE[ind] = req_aff.TypePrelevement
TBL_CHARGE.COL_CLIENT_JOINABLE[ind] = req_aff.joignable
TBL_CHARGE.COL_NON_JNBL[ind] = req_aff.Erroné_sansReponse_Etient
TBL_CHARGE.COL_TEL_CLIENT[ind] = req_aff.tel
TBL_CHARGE.Col_ste_gest[ind] = req_aff.NomSociete

FIN

req_aff.LibèreRequête()

SI TBL_CHARGE..Occurrence = 0 ALORS

messageToast("Aucun affaires trouvées.")

FIN


Comment améliorer l'efficacité du rendu des lignes à l'affichage ?
merci d'avance
Posté le 10 juin 2025 - 11:40
Bonjour,

Tu peux optimiser le "POUR TOUT req_aff" en spécifiant "SANSSAUVEPOSITION", à la suite de la ligne

"POUR TOUT req_aff SANSSAUVEPOSITION" évite les hsauveposition/hretourposition qui sont inutile dans une boucle de chargement.

Tu peux désactiver le rafraichissement de la table avec un :
TBL_CHARGE.AffichageActif = Faux // en début de code

TBL_CHARGE.AffichageActif = Vrai // En fin de code.

Mais surtout, tu dois utiliser au maximum la syntaxe :

ind est un entier = TBL_CHARGE.AjouteLigne(val,val,val,val,val,val)
L'affectation d'une ligne en spécifiant les valeurs directement est beaucoup plus efficace que un AjouteLigne vide, puis l'affectation des colonnes une par une.

Bon Dev,
Lionel


testeur a écrit :
Bonjour à tous
Sur une fenêtre de windev25 j'ai une table mémoire de 48 colonnes , j'affiche les affaires des milliers ( besoin d'utilisateur ) , voilà le code :

[code:wl]
TBL_CHARGE.SupprimeTout()

req_aff est une Source de Données
i est un entier = 1

sSQL_Select est une chaîne = GetSQL_Select()

sSQL_FromWhere est une chaîne = [
FROM Charge_aff, Affaires
LEFT JOIN Gestionnaire ON Gestionnaire.IDGestionnaire = Affaires.IDGestionnaire
LEFT JOIN SocieteGestion ON SocieteGestion.IDSocieteGestion = Affaires.IDSocieteGestion
LEFT JOIN Client ON Client.IDClient = Affaires.IDClient

]
ListeConditions est une chaîne = ""

// Ajout du filtre gestionnaire si non admin
SI UserAdmin = Faux ALORS
AjouteCondition(ListeConditions, " Affaires.IDGestionnaire = " + id_gestionaire_connecte + " AND WL.DateSys() <= Charge_aff.DateFin")
FIN

SI DateRecp1 <> "" ALORS
SI DateValide(DateRecp1) _ET_ DateValide(DateRecp2) ALORS
AjouteCondi
Posté le 10 juin 2025 - 21:05
Lionel a écrit :
Bonjour,

Tu peux optimiser le "POUR TOUT req_aff" en spécifiant "SANSSAUVEPOSITION", à la suite de la ligne

"POUR TOUT req_aff SANSSAUVEPOSITION" évite les hsauveposition/hretourposition qui sont inutile dans une boucle de chargement.

Tu peux désactiver le rafraichissement de la table avec un :
TBL_CHARGE.AffichageActif = Faux // en début de code

TBL_CHARGE.AffichageActif = Vrai // En fin de code.

Mais surtout, tu dois utiliser au maximum la syntaxe :

ind est un entier = TBL_CHARGE.AjouteLigne(val,val,val,val,val,val)
L'affectation d'une ligne en spécifiant les valeurs directement est beaucoup plus efficace que un AjouteLigne vide, puis l'affectation des colonnes une par une.

Bon Dev,
Lionel


testeur a écrit :
Bonjour à tous
Sur une fenêtre de windev25 j'ai une table mémoire de 48 colonnes , j'affiche les affaires des milliers ( besoin d'utilisateur ) , voilà le code :

[code:wl]
TBL_CHARGE.SupprimeTout()

req_aff est une Source de Données
i est un entier = 1

sSQL_Select est une chaîne = GetSQL_Select()

sSQL_FromWhere est une chaîne = [
FROM Charge_aff, Affaires
LEFT JOIN Gestionnaire ON Gestionnaire.IDGestionnaire = Affaires.IDGestionnaire
LEFT JOIN SocieteGestion ON SocieteGestion.IDSocieteGestion = Affaires.IDSocieteGestion
LEFT JOIN Client ON Client.IDClient = Affaires.IDClient

]
ListeConditions est une chaîne = ""

// Ajout du filtre gestionnaire si non admin
SI UserAdmin = Faux ALORS
AjouteCondition(ListeConditions, " Affaires.IDGestionnaire = " + id_gestionaire_connecte + " AND WL.DateSys() <= Charge_aff.DateFin")
FIN

SI DateRecp1 <> "" ALORS
SI DateValide(DateRecp1) _ET_ DateValide(DateRecp2) ALORS
AjouteCondi


Bonjour
J'ai obtenu de meilleurs résultats en chargeant les données dans une variable tableau de structures via un thread, puis en liant ce tableau au champ table.

Merci lionel
Membre enregistré
4 231 messages
Posté le 11 juin 2025 - 14:53
Bonjour,
Pourquoi ne pas simplement utiliser la fonction FichierVersTableMemoire ?

--
Il y a peut être plus simple, mais, ça tourne
Quand tout a échoué, utilise l'option RTFM
Posté le 13 juin 2025 - 11:18
Voroltinquo a écrit :
Bonjour,
Pourquoi ne pas simplement utiliser la fonction FichierVersTableMemoire ?

--
Il y a peut être plus simple, mais, ça tourne
Quand tout a échoué, utilise l'option RTFM


Bonjour
@Voroltinquo Veux-tu dire que je dois associer la table à la requête, puis exécuter FichierVersTableMemoire ?

merci je vais regarder cette solution et voir
Bonne weekend à tous
Membre enregistré
4 231 messages
Posté le 14 juin 2025 - 13:18
C'est plus ou moins ça.
FichierVersTableMémoire remplit les colonnes sans se soucier de leur contenu. C'est a dire que si tu as un champ table avec n colonne et que tes tuples ont n-i colonnes, les colonnes n-i+1 à n de ton champ table seront vide.
Dans ton cas, il va falloir ruser
-Dans un premier temps tu dois créer ton champ table avec toutes les colonnes possibles (COL_Data1,....COL_Datan)
-Il faut modifier légèrement ton code e.g.
SI Cond_n ALORS
AjouteCondition(ListeCondition,"MaTable.Data_i AS Data_i")
SINON
//On force une valeur pour la colonne
AjouteCondition(ListeCondition,"0 AS Data_i")
//On cache la colonne du champ table
COL_Data_1..Visible=Faux
FIN


L'affichage des données se fait par :
HExécuteRequêteSQL(REQ_aff, hRequêteDéfaut, sSQL_Final)
FichierVersTableMémoire(TABLE_MaTable,REQ_aff)


--
Il y a peut être plus simple, mais, ça tourne
Quand tout a échoué, utilise l'option RTFM