Gambas France BETA


Pas de compte ? Incription

Result + variable 'colonne'

12
AuteurMessages
Zyfriala#16 Posté le 6/3/2017 à 10:41:47
agricola felem videtBonjour à tous,
j'ai du m'absenter quelques jours et j'ai découvert vos nombreuses réponses ce matin
et je vous en remercie.
Comme je le soulignais, le "but ultime" n'était pas de passer des variables dans le SQL
(quoique ce soit fort utile) mais de variabiliser le nom de colonne par rapport au Result
de façon à récupérer n'importe quelle colonnne incluse dans le SQL et...
j'ai en fin trouvé la solution :D
J'espérais que ce soit une question de "syntaxe" et...c'était exactement ça!

Je ne sais pas à quoi sert exactement le ! après Result mais dès que je l'ai enlevé tout a fonctionné... :shock:

Mon but c'était, dans ce cas, (mais le 'modèle' est bien sur modifiable et extensible) de récupérer les valeurs
de 3 colonnes : 2 "fixes" (déjà déterminées) et 1 colonne variable.
- Les valeurs 's_TableChoisie_h' et 's_ColonneChoisie_h' sont les variables ayant récupéré les valeurs
des choix 'Table' et 'Colonne' dans 2 combobox
- Suivant l'idée de Gambix je créé 2 variables (s_Col1, s_Col2) pour mes colonnes "fixes"
- j'inclus mes variables 'colonnes' et 'schéma/table' dans mon SQL
- j'exécute mon Result
- je récupère mes colonnes d'après leur nom de variable et j'écris les valeurs
récupérées dans une gridView
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
DIM s_col1 AS STRING
DIM s_col2 AS STRING
DIM s_SchemaTable AS STRING

s_col1 = "c_lignes"
s_col2 = "c_nomcommun"
s_SchemaTable = "s_plantes0." & s_TableChoisie_h
s_Query_h = "SELECT " & s_col1 & " , " & s_col2 & ", " & s_ColonneChoisie_h & " From " & s_SchemaTable & ""
r_Result_h = ModConn.ConMain.Exec(s_Query_h, s_col1, s_col2, s_ColonneChoisie_h)
IF i_ResultItems_h > 0 THEN
r_Result_h.MoveFirst()
FOR EACH r_Result_h
s_rCol1 = r_Result_h[s_col1] '===COLONNE 1
fo_GridView1_Ecrit(i_row, i_col_0, s_rCol1)
s_rCol2 = r_Result_h[s_col2] '=== COLONNE 2
fo_GridView1_Ecrit(i_row, i_col_0 + 1, s_rCol2)
s_rCol3 = r_Result_h[s_ColonneChoisie_h] '=== COLONNE CHOISIE (3)
fo_GridView1_Ecrit(i_row, i_col_0 + 2, s_rCol3)
'=== COMPTEUR
i_row = i_row + 1
NEXT
END IF

L'intérêt évident de pouvoir faire cela c'est qu'on peut lire "à volonté" n'importe quelle
colonne du Result sans avoir à la nommer..."nommément" :D
Si j'ai (par exemple) 20 tables (Combobox 1) avec 20 colonnes (Combobox 2) chacune je peux récupérer les 400 valeurs possibles au travers d'une seule procédure.
Si on ajoute à ça la possiblité de passer des paramètres à la fonction les possibilités sont infinies.
Ce sont des procèdures que j'emploie "classiquement" avec les autres langages que j'ai cité (VB, C#, Java) ça m'étonnait qu'on ne puisse pas le faire avec Gambas :roll:
J'espère être clair pour tous, sinon n'hésitez pas à poser d'autres questions.
Merci à tous. ;)
Zyfriala#17 Posté le 6/3/2017 à 10:54:00
agricola felem videtencore plus simple même, en ce qui concerne l'écriture dans la GridView :D
1
2
3
4
5
6
7
8
9
10
11
12
13
IF i_ResultItems_h > 0 THEN
r_Result_h.MoveFirst()

FOR EACH r_Result_h
fo_GridView1_Ecrit(i_row, i_col_0, r_Result_h[s_col1]) '===COLONNE 1
fo_GridView1_Ecrit(i_row, i_col_0 + 1, r_Result_h[s_col2]) '=== COLONNE 2
fo_GridView1_Ecrit(i_row, i_col_0 + 2, r_Result_h[s_ColonneChoisie_h]) '=== COLONNE CHOISIE (3)

'=== COMPTEUR
i_row = i_row + 1

NEXT
END IF

gambix#18 Posté le 7/3/2017 à 08:51:02
Faire simple !Je me dois de réagir car ton code ressemble a tout sauf a du Gambas.

Primo évite les underscores (_) ils ont un fonction précise au niveau du langage et surtout pour l'ide.

Sub Toto_change est un évènement
Sub _Toto est une fonction masquée.


Ensuite le fameux ! est un SUCRE (Sugar). C'est a dire que c'est une macro fonction traduite par gambas avant compilation.

Donc Result!MonChamp devient Result["MonChamp"] avant d'être compilé. Ça fonctionne aussi avec les collections bien sur. Disons que c'est plus facile a saisir quand les champs appelés sont fixes.

Il y a trois domaines a connaitre en Gambas enfin trois widgets Gridview (event Data), DrawingArea (event Draw), et les conteneurs avec l'arrangement automatique. Quand on a maîtrisé ces trois objets tout le reste est basé sur les même archétypes.

Bien Voici un code semblable au tiens, il affiche tout le contenu d'un result dans une table quel que soit le nombre de champ ou de lignes. De plus tu peux avoir 1 million de resultats que l'affichage restera instantané même sur un rasp.

Nécéssite un Formulaire, une gridview et un bouton


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
' Gambas class file

PRIVATE $hResult AS Result

PUBLIC SUB _new()

Connections["Connection1"].Open

GridView1.Header = GridView.Both

END

PUBLIC SUB Button1_Click()

DIM sSql AS STRING = "Select * FROM &1"
DIM hField AS ResultField
DIM i AS INTEGER
'J'aurais pu utiliser DB.Find("parcelles") aussi
$hResult = db.Exec(sSql, "parcelles")

'Mise a jour des colonnes de la table
GridView1.Columns.Count = $hResult.Fields.Count

FOR EACH hField IN $hResult.Fields
GridView1.Columns[i].Text = hField.Name
INC i
NEXT

'Détermination du nombre de lignes a afficher
GridView1.Rows.Count = $hResult.Count

END

PUBLIC SUB GridView1_Data(Row AS INTEGER, Column AS INTEGER)

DIM i AS INTEGER

'Retourne la valeur a afficher en fonction de row/column
$hResult.MoveTo(Row)
LAST.Data.Text = $hResult[LAST.Columns[Column].Text]

'Auto réglage de la largeur de la colonne
i = GridView1.Font.TextWidth(LAST.Data.text) + 10
IF LAST.Columns[Column].Width < i THEN LAST.Columns[Column].width = i

'Normalement mettre Columns[n].Width=-1 devrait avoir le même effet ... mais
'il doit y avoir un bug

END
Moins de texte dans une signature c'est agrandir son espace.
Patrick#19 Posté le 7/3/2017 à 16:49:29
Bonjour,
D'abord merci pour toutes ces astuces très intéressantes, j'aurais néanmoins une précision à demander : quand on écrit
1
"Select * FROM &1"
il me semblait que le &1 servait à quoter une variable et là le nom du fichier n'a pas besoin d'être quoté ?
1
"Select * FROM parcelles"
Fonctionne parfaitement, aurai-je loupé quelque chose ?
gambix#20 Posté le 7/3/2017 à 17:23:49
Faire simple !
aurai-je loupé quelque chose ?


Non tu n'a rien raté. Je met ça juste pour me rendre intéressant et aussi un peu pour rendre le code plus flexible car par ce biais une variable peu être utilisépour passer la table.

Et sisi , le nom de table doit être quoté aussi.


Mon but est de vous montrer le maximum de raccourci possible en gambas et dieu qu'il y en a !
Moins de texte dans une signature c'est agrandir son espace.
Zyfriala#21 Posté le 7/3/2017 à 18:29:12
agricola felem videt
Je me dois de réagir car ton code ressemble a tout sauf a du Gambas.

Il n'y a en fait que quelques jours (en cumulé) que j'ai retrouvé Gambas mais je me dois d'intervenir à mon tour... :D
La posture "gardien du temple" n'invite pas au dialogue...
Malgré tout ce que j'ai pu faire je ne détiens aucune vérité, je me considère comme un "novice", ce que je suis peut être encore
au bout de 15 années passées à développer et ça ne me viendrait jamais à l'idée de dire à quelqu'un que son code n'est pas "orthodoxe",
au contraire je trouverais ça intéressant...


Primo évite les underscores (_) ils ont un fonction précise au niveau du langage et surtout pour l'ide.

Sub Toto_change est un évènement
Sub _Toto est une fonction masquée.

Je suppose que tu parles de "conventions d'écriture" et non de contraintes réelles au niveau de l'interpréteur
(mon code date de 2011, Gambas est bien toujours interprété?)
Si'il y avait un "souci" j'imagine que l'interpréteur (le compilateur?) lèverait une erreur, non?
En conséquence de quoi mon/mes "erreur(s)" d'écriture ne pourrait exister...
Si par exemple je considère ceci...
1
$hResult

Ce genre d'écriture, même si tu m'affirmes que c'est la notation Gambas 'standard' est pour moi un cauchemar visuel,
le '$' attire l'oeil bien plus qu'il ne le faudrait, on ne voit que lui !
Répété des dizaines ou des centaines de fois dans le codage d'un form je crois que ça me rendrait dingue...
Au fil des années j'ai développé ma propre notation, qui me permet de lire et re-lire
très rapidement même du code "oublié" depuis longtemps au fond d'une application (enfin...s'il n'est pas trop vieux).
Elle n'est pas figée, elle s'adapte aux nécessités et contraintes que je peux rencontrer...
Il est vrai que je n'ai pas la contrainte de devoir "partager" professionnellement mon code avec d'autres...
Quand je "revisite" d'anciennes appplications il m'arrive bien souvent de sourire devant mon code d'alors,
c'est rafraîchissant et ça remet souvent les choses en perspective...


Ensuite le fameux ! est un SUCRE (Sugar). C'est a dire que c'est une macro fonction traduite par gambas avant compilation. (?)

Donc Result!MonChamp devient Result["MonChamp"] avant d'être compilé. Ça fonctionne aussi avec les collections bien sur. Disons que c'est plus facile a saisir quand les champs appelés sont fixes.

C'était exactement l'explication ce que je cherchais. Enfin :D

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
'
'J'AI RELEVE DES ELEMENTS INTERESSANTS...JE COUPE UN PEU DANS LA STRUCTURE DU CODE...

'Mise a jour des colonnes de la table
GridView1.Columns.Count = $hResult.Fields.Count 'OK, très utile

FOR EACH hField IN $hResult.Fields 'l'ensemble très utile aussi
GridView1.Columns[i].Text = hField.Name
INC i
NEXT

'JE N'AI PAS BIEN COMPRIS COMMENT TU FAISAIS LE LIEN AVEC LE RESTE DU CODE...
'S'IL Y A DES PARAMETRES PASSES A LA FONCTION J'IMAGINE QU'IL Y A UN APPEL QUELQUE PART...?
'Egalement, d'où vient ton Data?

PUBLIC SUB GridView1_Data(Row AS INTEGER, Column AS INTEGER)

DIM i AS INTEGER

'Retourne la valeur a afficher en fonction de row/column
$hResult.MoveTo(Row)
LAST.Data.Text = $hResult[LAST.Columns[Column].Text]

'Auto réglage de la largeur de la colonne
i = GridView1.Font.TextWidth(LAST.Data.text) + 10
IF LAST.Columns[Column].Width < i THEN LAST.Columns[Column].width = i

'Normalement mettre Columns[n].Width=-1 devrait avoir le même effet ... mais
'il doit y avoir un bug

END

Merci à toi mais...un peu plus de "souplesse"...?
Bonne soirée à tous ;)
gambix#22 Posté le 7/3/2017 à 21:22:27
Faire simple !
Il n'y a en fait que quelques jours (en cumulé) que j'ai retrouvé Gambas mais je me dois d'intervenir à mon tour... :D
La posture "gardien du temple" n'invite pas au dialogue...


Bien je m'excuse d'avoir utilisé des termes a l'emporte pièce... j'avoue que j'ai manqué de tact.

Pour les underscores effectivement il s'agit bien d'une convention qui est a respecter pour que l'ide puisse bien repérer les events et les fonctions ou classe cachées.

Ce genre d'écriture, même si tu m'affirmes que c'est la notation Gambas 'standard' est pour moi un cauchemar visuel,
le '$' attire l'oeil bien plus qu'il ne le faudrait, on ne voit que lui !


le $ est surtout la pour indiquer les variables globales privée c'est a dire déclarée via private.

'JE N'AI PAS BIEN COMPRIS COMMENT TU FAISAIS LE LIEN AVEC LE RESTE DU CODE...
'S'IL Y A DES PARAMETRES PASSES A LA FONCTION J'IMAGINE QU'IL Y A UN APPEL QUELQUE PART...?
'Egalement, d'où vient ton Data?

PUBLIC SUB GridView1_Data(Row AS INTEGER, Column AS INTEGER)


C'est un évènement de GridView levé par chacune des cases affichée (visible). Gambas a été surtout dévelloppé dans un esprit évènementiel. Beaucoup de chose s'effectue dans le code des évènements et c'est assez sympa au final a coder. Même si ça demande au début un peu de réapprentissage.

http://gambaswiki.org/wiki/comp/gb.qt4/gridview/.data?l=fr

Donc c'est dirctement l'objet GridView qui appelle cette fonction quand on lui a fournit le nombre de lignes et de colonnes. Dès que gridview a quelque chose a afficher il appelle la fonction data. Sauf si on a fait un assignation directe a une case. Dans ce cas l'évènement n'est plus généréet on est en mode conteneur de donnée. Grace au mode évènementiel on est dans une posture Donnée/Vue ou le gridview n'est qu'un afficheur des données contenues dans un result ou bien un au conteneur type tableau ou bien collection.

GridView est bien plus encore c'est en faite un outil qui sert aussi de base a d'autre widget ayant un layout type table. Comme ListView, GridView, ColumnView, TableView. Dans leur cas on utilise l'event Draw

http://gambaswiki.org/wiki/comp/gb.qt4/gridview/.draw?l=fr

Il permet de dessiner le contenu de la case. Grace a la classe Paint on peut dessiner tout ce qu'on veut.

Pour finir je ne suis pas Le gardien du temple... J'ai trouvé ton code intéressant et le problème n'était pas ta syntaxe mais le faite d'utiliser un code redondant qui est le contraire de ce qu'il faut faire pour bénéficier de la pleine puissance de Gb. Je connais certainement moins de languages que toi. Mais je connais Gambas plutot très bien. Mon but n'est pas de te vexer mais de te mettre sur le bon chemin. Gambas manque cruellement de documentation et de bon exemples.
Et j'en suis en parti le responsable et aussi en partie parce que je manque de temps et le peu de temps que j'ai, je le passe a coder des widgets pour Gambas.
Moins de texte dans une signature c'est agrandir son espace.
Zyfriala#23 Posté le 8/3/2017 à 11:08:56
agricola felem videt

Pour finir je ne suis pas Le gardien du temple... J'ai trouvé ton code intéressant et le problème n'était pas ta syntaxe mais le faite d'utiliser un code redondant qui est le contraire de ce qu'il faut faire pour bénéficier de la pleine puissance de Gb. Je connais certainement moins de languages que toi. Mais je connais Gambas plutot très bien. Mon but n'est pas de te vexer mais de te mettre sur le bon chemin. Gambas manque cruellement de documentation et de bon exemples.
Et j'en suis en parti le responsable et aussi en partie parce que je manque de temps et le peu de temps que j'ai, je le passe a coder des widgets pour Gambas.

C'est ce que j'avais perçu, tu as certainement de grandes compétences au niveau de Gambas mais,ce serait dommage de gâcher ça parce que
tes réponses sont un peu trop "rugueuses", ce qui tend immanquablement à faire fuir les gens...
Quand je dis ça je ne pense pas qu'à moi mais aussi à tous ceux qui arpentent les forums "à la recherche de solutions que jamais ils ne trouveront" (clin d'oeil
pour les + anciens ;) ). Je sais à quel point il est parfois difficile de trouver des réponses claires même pour des langages aussi documentés que Java
par exemple... :x
Tu as absolument raison sur "la pleine puissance" d'un composant et dans tous les cas il vaudrait mieux s'en servir "de la bonne manière"
mais j'ai tellement passé de temps à chercher des réponses que je sais que pour un "débutant", quelqu'un de moins expérimenté,
et qui va peut être lire notre discussion, il sera sans doute plus facile de comprendre et de s'approprier un "vieux" code
("redondant") que d'appréhender le comportement d'un composant.
Ici ce n'était pas fait à dessein, mon code est ce qu'il était en 2011 et je sais que Gambas a beaucoup évolué, mais je ne peux l'utiliser
professionnellement et j'y reviens aujourd'hui pour acquérir (en dehors de Java) l'expérience d'un "modèle" "Open Source/Linux" d'application
en relation avec une base PostgreSQL.
On "avance", on s'améliore et puis on utilise les nouveaux outils qu'on comprend enfin, et c'est d'ailleurs parfois extrèmement couteux en
terme de réécriture du code :|
Ta signature est "Faire simple!", je suis le premier à en être convaincu : je n'ai jamais été aussi heureux que le jour (c'était il y a bien longtemps)
où j'ai réduit le code d'un de mes formulaires Access de 6000 lignes à 2000 lignes rien qu'en utilisant des arrays... :tongue:
J'ai eu l'impression d'être un magicien :D

Ne t'en fais pas personne ne peut t'en vouloir de "ne pas avoir le temps", j'ai passé plus de 10 heures hier au bureau et
j'ai eu l'impression de n'avoir rien fait...
Je vais soigneusement prendre le temps de lire la doc que tu as mise en liens. ;)
Patrick#24 Posté le 8/3/2017 à 11:14:37
Et sisi , le nom de table doit être quoté aussi.

Ne voulant pas mourir idiot, je me suis recherché une requête pas trop compliquée que j'ai transformé ainsi :
1
$restour = Utils.db.Exec("SELECT * FROM &1 ORDER BY code", "Fiches_tourne")

A l’exécution j'ai le message :
Query failed : You have an error in your SQL syntax;
Zyfriala#25 Posté le 8/3/2017 à 12:58:51
agricola felem videtHum, en comparant ton code à celui de Gambix ça semble bon...
Questions idiotes :D
- ta connection est-elle ouverte ?
- As-tu bien une colonne "code" dans ta table?

Si tu peux metttre un peu plus de ton code ça peut éclairer un peu la situation :D
Patrick#26 Posté le 8/3/2017 à 13:52:04
Oui oui tout est ok, ça gère un petit formulaire qui fonctionne avec :
1
$restour = Utils.db.Exec("SELECT * FROM Fiches_tourne ORDER BY code")

Zyfriala#27 Posté le 8/3/2017 à 15:06:30
agricola felem videtle chemin du composant (et de sa fonction) dans l'API est
comp • gb.db • db • exec
Essaie de supprimer "Utils"...
Patrick#28 Posté le 15/3/2017 à 18:02:13
Ça y est ... le site refonctionne :cheers:
Utils est un module
Utils.db est la variable public de connexion.
12