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

WinDev Discussion :

POO suppression dans une table


Sujet :

WinDev

  1. #1
    Membre confirmé Avatar de wd_newbie
    Homme Profil pro
    Développeur
    Inscrit en
    Mars 2007
    Messages
    723
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2007
    Messages : 723
    Points : 627
    Points
    627
    Par défaut POO suppression dans une table
    Bonjour .. et joyeux Noël

    J'en suis toujours à me prendre la tête avec la POO et Windev, j'ai assez bien appréhendé sur sur des modèles simples : clients / produiuts / etc...

    Je bloque par contre sur l'utilisation d'une fenêtre facture + lignes de factures

    Pour l'affichage d'une facture (sur une base existante) , par de soucis :

    - récupération de la facture
    - récupération de ses lignes liées par l'ID de la facture

    Dan la fenêtre j'ai une table TABLE_LignesFactures liée à mon tableau d'objet gclFactures_Lignes, la valeur de retour est l'élément courant.

    le (les !) soucis :

    - pour ajouter ou supprimer une ligne dans le tableau en mode "saisie en cascade". Dans la doc on peut lire

    Cas 2. Ajout d'un élément dans le champ Table (Saisie en cascade)
    Pour gérer la saisie en cascade, les ajouts doivent être réalisés par programmation dans la source.
    Il est conseillé de*:

    Faire les ajouts au fur et à mesure dans le code de sortie de ligne.
    Utiliser la fonction TableAffiche (avec la constante taInit) pour mettre à jour les "liaisons" entre les lignes du champ Table et les éléments de la source.
    J'ai créer ce code en sortie de ligne :

    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
    	clLigne est un MFactures_Lignes
     
    // -- si c'est une nouvelle entrée manuellement = pas d'ID en provenance de la BDD --
    SI COL_LIGNFAC_ID = "" ALORS 
     
    	clLigne.m_sLIGNFAC_Produit 		= COL_LIGNFAC_Produit
    	clLigne.m_nLIGNFAC_Quantite	= COL_LIGNFAC_Quantite
    	clLigne.m_moLIGNFAC_Prix		= COL_LIGNFAC_Prix
    	clLigne.m_rLIGNFAC_Remise		= COL_LIGNFAC_Remise
    	clLigne.m_rLIGNFAC_TauxTVA		= COL_LIGNFAC_TauxTVA
     
     
    	TableauAjoute(gtabClLignesFacture,clLigne) 
    	TableAffiche(TABLE_Lignes_Facture, taInit) 
     
    FIN
    Jusque là ... tout juste ?

    J'ai bien une nouvelle entrée dans mon tableau d'objets, si je liste les objets, j'ai bien le nouvel objet dans mon tableau et je fais des modification manuelle dans la table celles-ci sont bien reportées dans mes objets.

    Par contre pour supprimer ... je tourne en rond

    Selon la doc :

    Cas 2. Suppression d'un élément à partir de son indice dans le champ Table
    Il faut supprimer manuellement l'élément dans le champ Table et dans la source.
    La fonction TableCherche permet de retrouver l'indice dans la source correspondant à l'élément supprimé dans le champ Table.
    Mon problème est que, pour les lignes existantes j'ai bien un ID unique : le m_nLIGNFAC_Facture issu de la clé de ma BDD, mais pas pour les ajouts pas encore enregistrés et il est possible d'avoir deux lignes identiques.
    Pour le faire il faudrait que je puisse "dire" a Windev de supprimer l'élément courant, celui retourné par la ligne sélectionnée dans ma table...

    Du moment que la table me renvoie le Tableau[x] ... comment connaitre x pour faire un TableauSupprime(gtabClLignesFacture, x) ?

    je suis certain de passer a côté d'un truc simple ...

  2. #2
    Membre habitué Avatar de mous97
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2018
    Messages
    119
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 26
    Localisation : Sénégal

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Février 2018
    Messages : 119
    Points : 175
    Points
    175
    Par défaut
    Dans l'événement en sortie de ligne de ta table (donc qui peut correspondre à un ajout ou une modification biensur) récupère l'objet de la ligne en question et répercute les modifications dans ton fichier

  3. #3
    Membre confirmé Avatar de wd_newbie
    Homme Profil pro
    Développeur
    Inscrit en
    Mars 2007
    Messages
    723
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2007
    Messages : 723
    Points : 627
    Points
    627
    Par défaut
    Merci pour la réponse.

    Le truc c'est que je veux travailler uniquement sur mes objets, et ne les enregistrer dans la base uniquement au moment de l'enregistrement de la facture.
    Je voudrais eviter d'enregistrer dans la base pour supprimer ensuite si je ne valide pas la facture

  4. #4
    Membre habitué Avatar de mous97
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2018
    Messages
    119
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 26
    Localisation : Sénégal

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Février 2018
    Messages : 119
    Points : 175
    Points
    175
    Par défaut
    Ah d'accord j'avais mal compris

    Du coup ce que je te propose c'est d'identifier un membre qui est toujours renseigné quand on saisit une nouvelle ligne, et donc faire ta recherche dessus pour identifier l'objet en question

  5. #5
    Expert confirmé
    Avatar de Voroltinquo
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Juin 2017
    Messages
    2 807
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Chef de projet en SSII

    Informations forums :
    Inscription : Juin 2017
    Messages : 2 807
    Points : 5 263
    Points
    5 263
    Billets dans le blog
    1
    Par défaut
    Bonjour,
    Je suppose que tu as "bindé" ton champ table sur ton tableau de ligne.
    Pourquoi écrire du code, pour l'ajout et la modif, cela se fait automatiquement.
    En ce qui concerne la suppression, c'est sans objet dans ce cas. Toutefois, en général, cela se fait via
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    TableSupprime(TABLE_MaTable,TableSelect(TABLE_MaTable))
    Une autre chose m'étonne, pourquoi créer un tableau de ligne facture alors qu'il en existe déjà un dans ta classe facture ?
    Il y a peut-être plus simple, mais ça tourne.
    Quand tout a échoué utilisez l'option RTFM

  6. #6
    Membre confirmé Avatar de wd_newbie
    Homme Profil pro
    Développeur
    Inscrit en
    Mars 2007
    Messages
    723
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2007
    Messages : 723
    Points : 627
    Points
    627
    Par défaut
    Bon je viens de tester en mettant un identifiant unique dans mes objets ( je le crée lors de la construction de mon objet)

    Pour tenter de supprimer, je récupère la colonne de cet identifiant COL_UniqueID par un parcours (il semble que TableauCherche() ne fonctionne pas sur les tableaux d'objets ...)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    clLigne est un MFactures_Lignes
    POUR i = 1 À gtabClLignesFacture..Occurrence
    	clLigne = gtabClLignesFacture[i]
    	SI clLigne.m_nUniqueID = COL_UniqueID ALORS
    		TableauSupprime(gclLignesFacture,i) 
    	FIN
    FIN
    Mais j'ai une erreur :

    Erreur à la ligne 5 du traitement Clic sur BTN_Supprimer.
    Vous avez appelé la fonction TableauSupprime.
    Cette fonction n'est pas disponible pour un élément de type 'MFactures_Lignes'.

    J'ai tenté de mettre mon tableau en :

    gtabClLignesFacture est un tableau dynamique de MFactures_Lignes

    Sans plus de succès ...

    EDIT : bon visiblement c'est de ma faute, dans mon code ci-dessus je supprime dans gclLignesFactureet non gtabClLignesFacture ....

    C'est ça de passer le 24 décembre au soir sur son PC je suppose :-)

  7. #7
    Expert confirmé
    Avatar de Voroltinquo
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Juin 2017
    Messages
    2 807
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Chef de projet en SSII

    Informations forums :
    Inscription : Juin 2017
    Messages : 2 807
    Points : 5 263
    Points
    5 263
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par wd_newbie Voir le message
    il semble que TableauCherche() ne fonctionne pas sur les tableaux d'objets
    Si, c'est la 4° syntaxe :
    Recherche d'un élément dans un tableau de structures, de classes, de types avancés à 1 dimension ou d'enregistrements
    <Résultat> = TableauCherche(<Tableau WLangage> , <Type de recherche> , <Membres recherchés> [, <Valeur recherchée 1> [, <Valeur recherchée 2> [... [, <Valeur recherchée N>]]]] [, <Indice de départ>])
    Attention les membres recherchés sont de type chaîne
    Exemple :
    Pour un tableau de CClient défini comme suit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    CClient est une Classe
    PRIVE
    	m_pkClient		est un entier sur 8 octets
    	m_saNoClient		est une chaîne ANSI
    	m_saNomClient		est une chaîne ANSI
    	m_saEtc_Client		est une chaîne ANSI
    FIN
    le code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    TableauCherche(gtabListeClient,tcLinéaire,"m_saNomClient","Toto")
    Recherche le premier client nommé Toto
    Dans le même ordre d'idée
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    TableauTrie(gtabListeClient,ttMembre,"m_saNomClient")
    Trie le tableau sur le nom du client.

    As tu testé mon code qui est nettement moins lourd ?
    Il y a peut-être plus simple, mais ça tourne.
    Quand tout a échoué utilisez l'option RTFM

  8. #8
    Membre confirmé Avatar de wd_newbie
    Homme Profil pro
    Développeur
    Inscrit en
    Mars 2007
    Messages
    723
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2007
    Messages : 723
    Points : 627
    Points
    627
    Par défaut
    Merci pour tes retours toujours à propos !

    Je suppose que tu as "bindé" ton champ table sur ton tableau de ligne.
    Pourquoi écrire du code, pour l'ajout et la modif, cela se fait automatiquement.
    Selon mes test ... j'aurais dit que non ... ça n'est pas automatique... mais j'ai de grande chance de me fourvoyer :-)


    Pour un test :

    Soit un table qui est liée à un tableau de lignes de factures :

    - table liaison : → tableau de lignes de facture
    - colonnes tables → liaisons sur les membres de la classe
    - source parcourue : → tableau de lignes de facture
    - variable mémorisée : → tableau de lignes de facture[x] (renvoie l'objet en cours.)
    - table en saisie : vrai
    - enregistrer en sortie de ligne : vrai
    - saisie en cascade : vrai


    Avec un bouton de test qui me liste mon tableau d'objets :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    clLigne est un MFactures_Lignes
    POUR i = 1 À gtabClLignesFacture..Occurrence
    	clLigne = gtabClLignesFacture[i]
    	Trace(clLigne.m_nLIGNFAC_ID + " / " + clLigne.m_moLIGNFAC_Prix + " / " + clLigne.TotalLigne) 
    FIN


    1 - modification : si je modifie une valeur dans la table → la modification est reportée sur l'objet : OK
    2 - ajout : si j'ajoute une ligne manuellement en fin de table → le tableau d'objet n'est pas modifié : NOK

    .. ça devrait ajouter un nouvel objet directement ?


    Une autre chose m'étonne, pourquoi créer un tableau de ligne facture alors qu'il en existe déjà un dans ta classe facture ?
    Non je n'ai pas de de tableau de lignes de facture dans ma classe facture ... mais à te lire ça devrait être le cas : récupérer les lignes directement depuis cette classe ?
    Actuellement les récupère depuis la classe Factures_Lignes.Lister(IDFacture)

  9. #9
    Expert confirmé
    Avatar de Voroltinquo
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Juin 2017
    Messages
    2 807
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Chef de projet en SSII

    Informations forums :
    Inscription : Juin 2017
    Messages : 2 807
    Points : 5 263
    Points
    5 263
    Billets dans le blog
    1
    Par défaut
    Tes données sont bien bindées.
    En ce qui concerne l'ajout, il ne faut pas oublier de valider via Entrée. Pour plus de sécurité l'enregistrement de la dernière ligne peut se faire en sortie du champ table (ceinture et bretelles.).
    Un truc du style :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    SI TABLE_Ligne..Occurence<>clMaFacture:p_TabLigneFacture..Occurence ALORS
         TABLE_Ligne=TABLE_Ligne..Occurence //On se positionne sur le dernier enregistrement
         TableEnregistre(TABLE_Ligne)
    FIN
    En ce qui concerne ton tableau, ta classe MFacture doit grosso modo ressembler à ça.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    MFacture est classe <Mapping=Facture>
     
    PRIVE
         <MAPPING>
         //Mappage de facture
         <FIN>
         m_tagLigneFacture est tableau de MLigneFacture //MLigneFacture est mappé sur REQ_LigneFacture
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    Constructeur(pkFacture est entier sur 8=0)
    Si pkFacture <>0
         //Affectation des membres mappés
         HLitRecherchePremier(Facture,PK_Facture,pkFacture)
         FichierVersMémoire(objet,Facture)
         //Affectation des lignes de factures
         REQ_Facture.pFacture=pkFacture
         HExcécuteRequête(REQ_LigneFacture)
         FichierVersTableau(:m_tabLigneFacture,REQ_LigneFacture)
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    --REQ_LigneFacture
    SELECT
         ...
    FROM
         LigneFacture
    WHERE
         FK_Facture={pFacture}

    Enfin, concernant la suppression, si l'on veut rester POO, il faut créer une méthode SupprimerLigne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    PROCEDURE SupprimeLigne(nNoLIgne est entier)
    //NoLigne : Ligne du tableau qu'il faut supprimer
     
    //Utilisation:
    //clMaFacture:SupprimerLigne(TableSelect(TABLE_Ligne))
     
         TableauSupprime(:m_tabLigneFacture,nNoLigne)
    Il y a peut-être plus simple, mais ça tourne.
    Quand tout a échoué utilisez l'option RTFM

  10. #10
    Membre confirmé Avatar de wd_newbie
    Homme Profil pro
    Développeur
    Inscrit en
    Mars 2007
    Messages
    723
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2007
    Messages : 723
    Points : 627
    Points
    627
    Par défaut
    Encore merci pour ta réponse.

    Je n'ai pas eu le temps de pousser les tests, mais les quelques essais que j'ai fait hier soir au niveau de l'enregistrement automatique en sortie de table n'ont pas fonctionnés, je vais tacher de m'y remettre.

    Pour ton exemple de code, je me pose la question de pourquoi mettre la récupération des lignes de facture dans le constructeur de la classe "MFacture" ... si je désire afficher que la liste des factures dans une table, pourquoi charger automatiquement les lignes ? Je mets le montant total dans le fichier Facture pour éviter de le calculer a chaque chargement d'une facture.


    J'aime bien l'idée de mettre la récupération des lignes de facture dans l'objet Facture, mais ne serait-il pas plus judicieux de mettre une fonction "gListeLignesFacture()" pour retourner un tableau de m_tabLigneFacture ?

    Désolé si les questions semble un peu basiques

  11. #11
    Expert confirmé
    Avatar de Voroltinquo
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Juin 2017
    Messages
    2 807
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Chef de projet en SSII

    Informations forums :
    Inscription : Juin 2017
    Messages : 2 807
    Points : 5 263
    Points
    5 263
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par wd_newbie Voir le message
    J'aime bien l'idée de mettre la récupération des lignes de facture dans l'objet Facture, mais ne serait-il pas plus judicieux de mettre une fonction "gListeLignesFacture()" pour retourner un tableau de m_tabLigneFacture ?
    Ça, ce n'est plus "objet". Un objet est une entité unique et indépendante. Il n'interagit avec l'extérieur qu'avec des méthodes, des getter et des setter (les getters et les setters sont ce que le WL appelle les propriétés.)
    Pour les méthodes, il n'y a pas de problèmes, J'ai donné un exemple dans mon post précédent.
    Dans ton cas rien n'empêche de modifier ton constructeur de la manière suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    Constructeur(pkFacture est entier sur 8=0)
    Si pkFacture <>0
         //Affectation des membres mappés
     
    FIN
    Les getters et les setters permettent d'accéder, entre autre, aux membres de la classe qui généralement1 sont "privés".
    Le setter sert à affecter une valeur à un membre, le getter permet de récupérer la valeur de ce membre (éventuellement un résultat concernant plusieurs membres)
    Dans notre cas, "gListeLignesFacture()" est le getter de m_tabLigneFacture
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    FONCTION p_tabLigneFacture(): tableau de MLigneFacture
              //Affectation des lignes de factures
              REQ_Facture.pFacture=:m_pkFacture
              HExcécuteRequête(REQ_LigneFacture)
              FichierVersTableau(:m_tabLigneFacture,REQ_LigneFacture)
    RENVOYER :m_tabLigneFacture
    L'accès "extérieur" à nos lignes de facture se fait donc via
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    clMaFacture:p_tabLigneFacture
    L'inconvénient est que l'accès aux lignes de facture exécutera la requête à chaque fois. Cela peut être contourné en exécutant la requête dans le constructeur, mais on aura toujours le "FichierVersTableau" qui sera appelé. Un test sur les 3 solutions via l'analyseur de performance (avec un nombre de données réaliste.) te permettra de voir quelle solution adopter. C'est l'éternel combat entre la rapidité d'exécution t l'occupation mémoire.

    Ça c'est le cas nominal. On peut imaginer un autre getter.
    On ne peut pas comparer directement 2 instances d'une classes.
    Une solution est de comparer le résultat de leur sérialisation.
    On peut donc imaginer un getter p_Valeur défini comme suit:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    FONCTION p_Valeur():buffer
    bufRes est buffer
    Sérialise(objet,bufRes,psdBinaire) //cf <sup>1</sup>
    RENVOYER bufRes
    La comparaison de fait alors de la manière suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    SI clClasse1:p_Valeur=clClasse2:p_Valeur ALORS
    .....
    FIN
    ou alors d'une manière encore plus "objet" avec une méthode Compare
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    FONCTION Compare(clClasse est CClasse)
    SI objet:p_Valeur=clClasse:p_Valeur ALORS
         RENVOYER Vrai
    SINON
         RENVOYER Faux
    FIN
    La comparaison se fait alors comme suit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SI clClasse1:Compare(clClasse2) ALORS
    ...

    1 Dans le cas d'une sérialisation JSON ou XML, les membres "privés" ne sont pas pris en compte il faut donc déclarer "public" les membres que l'on veut envoyer via le RSO, ou utiliser une sérialisation binaire.

    Concernant, la manière ton est rempli ton champ table, dans liaison la case "Les ajout/suppression etc..." est elle bien cochée.
    Par ailleurs, il st préférable que la valeur retournée soit "aucun". (récupération du n° de ligne)
    Il y a peut-être plus simple, mais ça tourne.
    Quand tout a échoué utilisez l'option RTFM

  12. #12
    Membre confirmé Avatar de wd_newbie
    Homme Profil pro
    Développeur
    Inscrit en
    Mars 2007
    Messages
    723
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2007
    Messages : 723
    Points : 627
    Points
    627
    Par défaut
    Je viens de refaire un test :

    - fenêtre de test avec 1 bouton de test et un table
    la table est liée à une tableau de lignes de facture :

    • Source parcourue : gtabClLignesFacture
    • Liaison : gtabClLignesFactures
    • Toutes les colonnes liées aux membres de la classe LignesFacture


    Un bouton de test :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
     
    clLigne est un MFactures_Lignes
     
    POUR i = 1 À gtabClLignesFacture..Occurrence
    	clLigne = gtabClLignesFacture[i]
    	Trace(clLigne.m_nLIGNFAC_ID + " / " + clLigne.m_moLIGNFAC_Prix + " / " + clLigne.TotalLigne) 
    FIN 
    Trace("--------------")

    J'ai beau tenter toutes les configs ( sauf la bonne visiblement...) a chaque ajout dans la table (avec et sans ceintures et bretelles) j'ai jamais mon tableau d'objets incrémenté avec la nouvelle ligne...

  13. #13
    Expert confirmé
    Avatar de Voroltinquo
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Juin 2017
    Messages
    2 807
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Chef de projet en SSII

    Informations forums :
    Inscription : Juin 2017
    Messages : 2 807
    Points : 5 263
    Points
    5 263
    Billets dans le blog
    1
    Par défaut
    Voici les paramètres que j'utilise et qui fonctionnent (c'est un tableau de Client, mais le principe est là.) En fait, ce sont les valeurs par défaut.
    Détail du champ:
    Nom : 2022-12-29_19h01_22.png
Affichages : 214
Taille : 41,2 Ko
    Contenu du champ:
    Nom : 2022-12-29_19h03_14.png
Affichages : 211
Taille : 7,7 Ko
    Les liaisons sont sur les propriétés.

    En ce qui concerne les tests, je préfère les scénarii mais, une chose à la fois, voici les codes
    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
     
    nControle est un entier
     
    TraceConstruit("Nb ligne du champ table : %1",TABLE_ListeClient..Occurrence)
    TraceConstruit("Nb ligne du tableau : %1",gtabListeClient..Occurrence)
    SI TABLE_ListeClient..Occurrence=gtabListeClient..Occurrence ALORS
    	POUR nControle=1 _À_ TABLE_ListeClient..Occurrence
    		Trace("Champ table")
    		TraceConstruit("N° client : %1 - Nom Client : %2",COL_NoClient[nControle],COL_NomClient[nControle])
    		Trace("Tableau")
    		gtabListeClient[nControle]:AfficheClient()	//ça, c'est objet, tout se fait "à l'intérieur"
                    Trace("--------")
    	FIN
    SINON
    	Trace("Le tableau est le champ table ne sont pas de la même taille")
    FIN
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    PROCÉDURE AfficheClient()
    TraceConstruit("N° client : %1 - Nom Client : %2",:p_saNoClient,:p_saNomClient)
    Données initiales :
    Code Texte : 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
     
    Nb ligne du champ table : 4
    Nb ligne du tableau : 4
    Champ table
    N° client : 1 - Nom Client : Toto
    Tableau
    N° client : 1 - Nom Client : Toto
    --------
    Champ table
    N° client : 2 - Nom Client : Titi
    Tableau
    N° client : 2 - Nom Client : Titi
    --------
    Champ table
    N° client : 3 - Nom Client : Tuta
    Tableau
    N° client : 3 - Nom Client : Tuta
    --------
    Champ table
    N° client : 4 - Nom Client : Tutu
    Tableau
    N° client : 4 - Nom Client : Tutu
    --------
    Modification de Tuta en Tata
    Ajout du client Nouveau
    RQ après l'ajout, je n'ai même pas validé.
    Code Texte : 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
     
    Nb ligne du champ table : 5
    Nb ligne du tableau : 5
    Champ table
    N° client : 1 - Nom Client : Toto
    Tableau
    N° client : 1 - Nom Client : Toto
    --------
    Champ table
    N° client : 2 - Nom Client : Titi
    Tableau
    N° client : 2 - Nom Client : Titi
    --------
    Champ table
    N° client : 3 - Nom Client : Tata
    Tableau
    N° client : 3 - Nom Client : Tata
    --------
    Champ table
    N° client : 4 - Nom Client : Tutu
    Tableau
    N° client : 4 - Nom Client : Tutu
    --------
    Champ table
    N° client : 5 - Nom Client : Nouveau
    Tableau
    N° client : 5 - Nom Client : Nouveau
    --------
    Il y a peut-être plus simple, mais ça tourne.
    Quand tout a échoué utilisez l'option RTFM

  14. #14
    Membre confirmé Avatar de wd_newbie
    Homme Profil pro
    Développeur
    Inscrit en
    Mars 2007
    Messages
    723
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2007
    Messages : 723
    Points : 627
    Points
    627
    Par défaut
    Bon je crois que j'ai compris ...

    Nom : image.png
Affichages : 336
Taille : 15,4 Ko


    Visiblement en 23 .... pas cette option !

    Je vais continuer avec la méthode d'enregistrement en sortie de table.

    Dans tous les cas, un grand merci pour ton aide et ta patience !


  15. #15
    Expert confirmé
    Avatar de Voroltinquo
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Juin 2017
    Messages
    2 807
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Chef de projet en SSII

    Informations forums :
    Inscription : Juin 2017
    Messages : 2 807
    Points : 5 263
    Points
    5 263
    Billets dans le blog
    1
    Par défaut
    Vu sous cet angle, en effet, ça fonctionne beaucoup moins bien
    Il y a peut-être plus simple, mais ça tourne.
    Quand tout a échoué utilisez l'option RTFM

  16. #16
    Membre habitué Avatar de mous97
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2018
    Messages
    119
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 26
    Localisation : Sénégal

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Février 2018
    Messages : 119
    Points : 175
    Points
    175
    Par défaut
    Citation Envoyé par wd_newbie Voir le message
    Bon je crois que j'ai compris ...

    Nom : image.png
Affichages : 336
Taille : 15,4 Ko


    Visiblement en 23 .... pas cette option !

    Je vais continuer avec la méthode d'enregistrement en sortie de table.

    Dans tous les cas, un grand merci pour ton aide et ta patience !

    Petit complément d'information :

    En choisissant l'objet courant comme valeur de retour, la table te retourne l'objet de ligne sélectionnée lorsque tu récupères la ligne

    Table[Indice1] tu retournes l'objet de la ligne 'Indice1'

    Du coup tu peux manipuler l'objet facilement en faisant => MonObjet est une 'TaClasse' dynamique <- Table[Indice1]

Discussions similaires

  1. Suppression dans une table à partir d'une requete
    Par Dokko974 dans le forum Requêtes et SQL.
    Réponses: 7
    Dernier message: 10/07/2008, 16h07
  2. Réponses: 1
    Dernier message: 25/08/2006, 13h54
  3. suppression dans une table qui contient une clé etrangère
    Par zana74 dans le forum Décisions SGBD
    Réponses: 13
    Dernier message: 08/08/2006, 10h58
  4. Problème de suppression dans une table
    Par Splinter dans le forum Bases de données
    Réponses: 3
    Dernier message: 17/10/2005, 10h55
  5. Combler les trous lors d'une suppression dans une table
    Par Billybongjoe dans le forum PostgreSQL
    Réponses: 5
    Dernier message: 08/04/2004, 14h02

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