|
FORUMS PROFESSIONNELS WINDEV, WEBDEV et WINDEV Mobile |
| | | | | |
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 AjouteCondition(ListeCondition,"0 AS Data_i") 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 |
| |
| |
| | | |
|
| | | | |
| | |
| | |
| |
|
|
|