Ouvrir formulaire détaillé en cliquant ligne de LB

Bonjour. Impossible de me souvenir des 2 ou 3 lignes de code pour ouvrir le formulaire détaillé en cliquant sur la ligne d’une LB. Merci.

si ça part d’une listbox selection :
<code 4D>
si(événement formulaire=sur double clic)
listbox lire position cellule (*;“ListboxNom”;$colonne;$ligne)
si($ligne>0)
aller dans selection([laTable];$ligne)
//après il y a plusieurs façons d’enchainer : ouvrir ou non une fenêtre, dialogue ou modifier enregistrement, etc.
fin de si
Fin de si
</code 4D>

merci, mais j’ai oublié de préciser LB tableaux

Ah ben ça facile !
Il faut bien sûr avec une colonne qui sert pour les IDs des lignes.

Et sur l’événement

: ($evt=On Double Clicked)
$line:=T_LB
QUERY ([myTable];[myTable]id=T_LB_id{$line})
// et le reste pour afficher…

Ha, c’est différent…
il faut qu’une de tes colonnes contienne la clé primaire (PK) de l’enregistrement. Partant de là, une possibilité :
<code 4D>
$pointeurListbox:=objet lire pointeur(objet nommé;“listboxNom”)
$ligneSelectionnee:=chercher dans tableau($pointeurListbox->;vrai) //le tableau booléen de la listbox tableau
si($ligneSelectionnee>0)
$pointeurColonnePK:=objet lire pointeur(objet nommé;“ColonnePKNom”) //le tableau de la PK
$PK:=$pointeurColonnePK->{$ligneSelectionnee}
fin de si
</code 4D>

Le mieux est quand même avec des pointeurs sur les éléments de la listbox.
En gros, il en faut un sur la listbox elle-même pour récupérer la ligne, et un sur la colonne des IDs.

<code 4D>
: ($evt=On Double Clicked)
$ptr_LB:=OBJECT Get pointer(Object named;“LB_SET_visu”)
$ptr_LB_id:=OBJECT Get pointer(Object named;“lb_set_id”)

$line:=$ptr_LB->
QUERY($table->;Field(Table($table);1)->=$ptr_LB_id->{$line})
// et ici pour ouvrir le fomulaire

</code 4D>

GRAND luxe, tu auras obtenu deux façons de faire quasi identique.
Mais le chercher dans tableau n’est pas utile, la listbox donne directement la ligne cliquée.

je suis devenu parano de la sélection multiligne :oops:

Désolé mais je n'y arrive pas:

Nom de ma LB : “ListBox”
Tableau clé : tID

$pointeurListbox:=OBJET Lire pointeur(Objet nommé;“ListBox”)
//$pointeurListbox:=OBJET Lire pointeur(Objet courant)
$ligneSelectionnee:=Chercher dans tableau($pointeurListbox->;Vrai) //le tableau booléen de la listbox tableau
Si ($ligneSelectionnee>0)
$pointeurColonnePK:=OBJET Lire pointeur(Objet nommé;“tID”) //le tableau de la PK
$PK:=$pointeurColonnePK->{$ligneSelectionnee}
Fin de si
modifier selection ([PayPal])

Fallait partir de mon exemple : il manque le QUERY ou CHERCHER…

Oui mais…j’ai abandonné 4D depuis 10 ans. A l’époque, j’étais à l’aise avec la notion de pointeur et il n’existait pas les commandes “fixer pointeur” etc. Il faut que j’assimile ces news notions. Je vais encore chercher et surtout lire la doc…

en rouge les modifications proposées :

$pointeurListbox:=OBJET Lire pointeur(Objet nommé;“ListBox”)
assert(non(nil($pointeurListbox));“il n’y a pas d’objet avec ce nom”)
$ligneSelectionnee:=Chercher dans tableau($pointeurListbox->;Vrai) //le tableau booléen de la listbox tableau
Si ($ligneSelectionnee>0)
$pointeurColonnePK:=OBJET Lire pointeur(Objet nommé;“tID”) //le tableau de la PK
assert(non(nil($pointeurColonnePK));“il n’y a pas d’objet avec ce nom”)
$PK:=$pointeurColonnePK->{$ligneSelectionnee}
chercher([paypal];[paypal]PK=$PK)
modifier enregistrement ([PayPal])
Fin de si

Les ASSERT devraient t’aider à trouver l’erreur, à la dernière ligne c’est pas sélection mais enregistrement.

ps oups, corrigé ce qui manquait après coup

C’est l’occasion de faire du développement durable en passant aux collections !
Et de créer des formulaires avec une listbox d’un côté et un affichage détaillé dans un sous-formulaire de l’autre.

Bonjour Bernard

Peux tu donner un exemple pour pouvoir commencer avec les collections

Merci

L’autre Bernard

Merci Bernard pour cette découverte et ouverture. Je découvre cette notion de “Collection” mais je n’en vois pas l’avantage…pour le moment. Si tu peux développer un peu…

: Jerome YZEBE

je n’en vois pas l’avantage…
Une collection c’est comme un tableau, dans lequel chaque item peut avoir un type différent.

si dans un tableau on commence à l’élément 1 dans une collection on commence au zéro

'a’ut,
il y a un exemple de Gabriel Inzirillo https://forums.4d.com/Post/FR/27461408/2/27577981#27607115à récupérer ici> que j’ai trouvé aussi didactique que simple. Il permet d’appréhender quelques-unes des notions “modernes” - orda, entity selection, listbox collection, Form, This, multi fenêtres avec DIALOGUE(…;*).

Sinon, pour compléter ce qu’a dit Bertrand, une https://livedoc.4d.com/4D-Langage-18/Collections/Presentation-des-collections.300-4505865.fr.htmlcollection> est un genre de tableau dont chaque élément peut être n’importe quel type de données 4D. Dans un tableau on est limité par le type du tableau, toutes les valeurs sont du même type. Une collection peut être similaire à un tableau quand tous ses éléments sont des scalaires (texte, numérique, etc.), mais elle peut aussi engranger des données beaucoup plus complexes et structurées.
Pour le dire avec un exemple, tu peux avoir une collection “patients”, où chaque patient sera un objet où l’on peut mettre moult informations sur le patient :

  • nom = texte
  • prénom = texte
  • DDN = date
  • maladies = collection des maladies qu’il a eut (chaque élément = quelle maladie, quand, etc.)
  • contacts = collection de différents moyens de le joindre (numéros de téléphone, emails, etc.)
    S’il fallait faire la même chose avec des tableaux, ce serait possible pour les 3 premiers éléments avec 3 tableaux synchronisés ; par contre faire rentrer les maladies ou les contacts dans un tableau scalaire, ça ne rentre pas.
    L’autre aspect est la façon de coder, avec la notation à points on accède de façon assez naturelle aux contenus. Si je reprends mon exemple et que je veux ajouter la propriété “age” à chaque patient de ma collection, ça pourra s’écrire :
    <code 4D>
    pour chaque($patient;$patients) //on boucle sur la collection $patients
    $patient.age:=calculerAge($patient.DDN;date du jour) //on calcule l’age aujourd’hui et on l’ajoute en nouvelle propriété
    fin de chaque
    </code 4D>

Un grand merci. Vive le confinement qui me donne l’excuse de re-découvir les nouveautés de 4D sans limitation de temps. En revanche, le motif de ce confinement n’est pas à fêter.

Jérôme,

Il y a vraiment des avantages et ça bouge très vite ; les anciennes technos resteront valables un certain temps mais je trouve qu’il est parfois difficile de les mixer ; je suis en train d’essayer de migrer mon shell et ça ne peut pas être progressif.
Si tu fais de nouveaux développements, fais-les avec les nouvelles technologies, même si tu n’en comprends pas l’intérêt immédiat.
J’ai eu peur d’avoir du mal avec les paradigmes nouveaux dans 4D et pour moi, mais banals ailleurs, et finalement j’en suis satisfait.

Le principe est de :

  • mettre une collection dans la listbox
  • indiquer l’élément courant par ex “currentElement” *
    currentElement va contenir l’élément sélectionné
  • affecter un format de saisie au sous-formulaire ; il bénéficie de Form
  • les champs du sous-formulaire ont pour variable Form.MonChamp**
  • encore un conseil : mets-toi au camelCase (j’ai longtemps résisté…)