Gambas France BETA


Pas de compte ? Incription

Result + variable 'colonne'

12
AuteurMessages
Zyfriala#1 Posté le 23/2/2017 à 17:05:13
agricola felem videtBonjour,
je récupère un (des) nom(s) de colonne(s) dans une variable,
est-il ensuite possible de l'utiliser avec Result?

s_Item = Result!s_ColonneChoisie

J'ai essayé différentes syntaxes mais à chaque fois j'ai une erreur,
"L'opérateur '!' doit être suivi d'un identificateur"

merci d'avance.
spheris#2 Posté le 25/2/2017 à 13:14:34
Bonjour,
Je ne comprends pas trop la question posée, mais j'en déduis que :
s_Item est ta variable qui récupère la chaine de la colonne.

de quelle colonne parles-tu? une gridview, une columnview, ou une base de données.

Quant à Result, il est comme son nom l'indique le résultat d'une bdd sous forme String pour ce cas là.
Si c'est pour la colonne d'une bdd, j'écrirais :
1
S_Item = monresultat!nomduchampdanslabdd

;)


Zyfriala#3 Posté le 27/2/2017 à 11:52:34
agricola felem videtBonjour et merci, ce que tu me donnes c'est ce qui existe déjà :D

Je réexplique :

- je choisis une table dans une 1ere combobox, exemple t_arbresfruitiers

- ce choix va (par procédure) lister les colonnes de la table dans une 2eme combobox ou une liste, peu importe

- je choisis une colonne, par exemple 'fruit', et récupère son nom dans une variable, s_ColonneChoisie

- j'écris mon sql avec cette variable : Query = "SELECT lignes," & s_ColonneChoisie_h & " FROM schema.t_arbresfruitiers " (base PostgreSQL)
(apparemment on ne peut pas non plus variabiliser le nom de la table...)

- connection à ma base, lancement du Result --> je récupère bien mes données dans le Result, il s'agit maintenant d'extraire les données
correspondant à ma colonne

Je peux donc tout à fait écrire
s_Item = r_Result!fruit
et récupérer ensuite mes données (la liste des fruits) dans une boucle

mais imaginons que j'ai 20 tables avec 20 colonnes chacune (et ma base sera certainement + grande),
si je dois écrire le code

if macolonne = sonNom
s_Item = r_Result!sonNom
end if

correspondant à chaque colonne il faut déjà que j'écrive 1200 lignes de code !

Le problème est donc, dans la lecture du Result, de substituer au nom 'réel' le nom 'variabilisé'
mais je ne pense pas que la procédure Gambas qui lit le Result puisse le faire...telle est ma question.

Ceci dit je me trompe peut être...
Ceci dit il existe peut être (sans doute) des solutions que je ne vois pas :)


Zyfriala#4 Posté le 27/2/2017 à 11:54:24
agricola felem videtil s'agit bien de s_ColonneChoisie (oubliez le '_h'), en fait peu importe le nom de lavariable :D
Patrick#5 Posté le 27/2/2017 à 14:09:03
Bonjour,
Peut-être une piste, qui fonctionne avec mysql, dans la requête :
1
2
3
4
monfichier="schema.t_arbresfruitiers"
Query = "SELECT lignes," & s_ColonneChoisie_h & "AS nom_standard FROM " & monfichier

s_Item = r_Result!nom_ standart


AS nom_standard renomme la colonne en "nom_standard", si ce n'est pas la bonne syntaxe en PostgreSQL, il doit bien y avoir une équivalence.
Mettre en variable la partie droite d'un result doit être possible, il me semble l'avoir vu dans un exemple mais je n'ai jamais pu le retrouver. Ça m'aurait bien intéressé aussi.
Zyfriala#6 Posté le 27/2/2017 à 16:01:42
agricola felem videtMerci Patrick,
le fait de définir la partie après le 'FROM', avec le nom de la table, AVANT de l'inclure dans la requête c'est tout bon.
1
s_SchemaTable = "s_plantes0." & s_TableChoisie_h

puis
1
s_Query_h = "SELECT lignes ," & s_ColonneChoisie_h & " FROM " & s_SchemaTable & " "

Même si je n'ai pour l'instant qu'un seul schéma actif j'imagine que le schéma lui-même peut être intégré en tant que variable...
Il me semble bien avoir remarqué ce "problème" d'intégration avec une autre partie de mon code...
je ne me rappelle plus où :D
Ca permet déjà de 'variabiliser' le nom de la table pour peu qu'il soit écrit dans la liste de choix
tel qu'il figure dans la base...et c'est déjà beaucoup :)

Par contre le fait d'utiliser un ALIAS pour la colonne n'a pas fonctionné, je reçois l'erreur "Objet attendu..."
Je continue à chercher... :cyclops:
Zyfriala#7 Posté le 27/2/2017 à 16:31:50
agricola felem videt

Il me semble bien avoir remarqué ce "problème" d'intégration avec une autre partie de mon code...
je ne me rappelle plus où :D

Je viens de retrouver cette partie, c'est pour l'utilisation d'une recherche SQL avec joker...
En effet le joker ne passe pas dans une concaténation directe au niveau de la requête.On ne pourra pas avoir...
1
s_Query_h = "SELECT c_cols FROM " & s_SchemaTable & " WHERE c_cols LIKE '" & s_AZ_col_LettreChoisie_i & "%" & "' "

mais on peut l'écrire préalablement à son intégration dans le SQL.
Si par exemple je choisis une lettre dans une combobox, j'y ajoute (pour rechercher ici des noms de colonnes dans une table
de "description" de la table principale) un préfixe et un suffixe 'joker',
1
s_AZ_col_LettreChoisie_i = "c_" & s_AZ_col_LettreChoisie_h & "%"

ce qui va me donner par exemple, recherche de toutes les colonnes commençant par "c_f%"
1
s_Query_h = "SELECT c_cols FROM " & s_SchemaTable & " WHERE c_cols LIKE '" & s_AZ_col_LettreChoisie_i & "' "

spheris#8 Posté le 27/2/2017 à 16:55:51
...correspondant à chaque colonne il faut déjà que j'écrive 1200 lignes de code !

Le problème est donc, dans la lecture du Result, de substituer au nom 'réel' le nom 'variabilisé'
mais je ne pense pas que la procédure Gambas qui lit le Result puisse le faire...telle est ma question....


je ne comprends pas pourquoi tu dois écrire 1200 lignes de code.
si tu stockes dans ta boucle l'ensemble des monresultat!fruit dans une combobox par la commande Add, tu as 'variabilisé' tes données sous forme de string et tu accèdes tout simplement avec l'index du combobox.

exemple pour accéder à la 220eme item du combobox:
1
ma variable = combobox1[199].text


Je ne vois pas trop où est la difficulté.
Je pense que tu as probablement des petits soucis avec sql.
;)
Zyfriala#9 Posté le 27/2/2017 à 17:21:20
agricola felem videtspheris, il ne s'agit pas de récupérer les valeurs de Result mais de variabiliser le nom de la colonne,
relis bien ce que je dis, particulièrement dans le 3eme post.
Pour ce qui est du SQL j'en écris depuis 2006, je l'utilise en VBA, en C#, en Java et avec Gambas,no souci :)
Patrick#10 Posté le 27/2/2017 à 17:25:55
Après un rapide coup d’œil sur interne, les allias ont l'aire de fonctionner de la même façon. J'ai trouvé 2 exemples :
1
2
3
4
5
6
SELECT column1, column2....
FROM table_name AS alias_name
WHERE [condition];
SELECT column_name AS alias_name
FROM table_name
WHERE [condition];

Donc tous se mets en allias.
Après le faire comme ça ou en combobox tout dépend ... des données du problème et de ton imagination ...
Flachy Joe#11 Posté le 27/2/2017 à 21:06:45
Iguane : Il Gambas Uniquement pour Activer ses NEuronesSalut,
avec la syntaxe classique d’accès aux tableaux il n'y a pas de souci, ou alors j'ai rien compris...

(J'ai utilisé la base de donnée de DataBaseExemple de Keywild que l'on trouve sur la logithèque)

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
PUBLIC $Con AS NEW Connection

PUBLIC SUB Form_Open()

$Con.Close()
$Con.Type = "sqlite"
$Con.Host = Application.Path
$Con.Name = "DBSample.DB3"
$Con.Open()

END

PUBLIC SUB Button1_Click()
DIM $Query AS STRING
DIM $Result AS Result

DIM what AS STRING
DIM first AS STRING

what = "Comment"
first = "B"

$Query = "SELECT " & what & " FROM ShowTitle WHERE " & what & " LIKE '" & first & "%'"
$Result = $Con.Exec($Query)
Message($Result[what])

END


L’accès aux données avec le point d'exclamation n'est qu'un raccourci. Les Result sont hérités des collections.
On peut aussi utiliser le point d'exclamation sur les collections :
1
2
3
DIM truc AS NEW Collection
truc.Add("machin", "bidule")
Message(truc!bidule) 'Affiche "machin"
;) Flachy Joe ;)
spheris#12 Posté le 27/2/2017 à 22:45:07
Zyfriala,
Je viens de comprendre ce que tu dis dans ton post 3, et je te dis que je ne vois pas de difficultés particulières.
pour exemple :
clic premiere combobox liste les tables fruits, legume, feculents....
si je selectionne les fruits, la deuxieme combo affichera pomme, banane, tomate, peche, poires.... par un
1
sql = "SELECT * FROM " & combo2.text & " WHERE id LIKE '%'"


et si tu cliques sur la pomme, tu pourras ecrire ceci :
1
sql = "SELECT * FROM 'fruits' WHERE fruits LIKE 'pomme'"


ou plutot :
1
sql = "SELECT * FROM ' " & combo1.text &" ' WHERE ' " & combo2.text & " ' LIKE ' " & combo3.text & " ' "

en résumé pour variabiliser une donnée dans une requete sql, il suffit de la mettre entre les deux symboles apostrophe 'toto'
Flachy Joe#13 Posté le 28/2/2017 à 11:01:56
Iguane : Il Gambas Uniquement pour Activer ses NEuronesSalut spheris
WHERE id LIKE '%'"
c'est l'equivalent de
1
IF TRUE THEN
Non ?
Autant faire directement
1
sql = "SELECT * FROM " & combo2.text


Par ailleurs, ATTENTION AUX INJECTIONS SQL en utilisant des variables qui peuvent être modifiées par l'utilisateur.
;) Flachy Joe ;)
Patrick#14 Posté le 28/2/2017 à 18:37:55
Et que la lumière fut ...
Une collection !!! Merci Flachy Joe.
gambix#15 Posté le 28/2/2017 à 19:11:16
Faire simple !
1
2
$Query = "SELECT " & what & " FROM ShowTitle WHERE " & what & " LIKE '" & first & "%'"
$Result = $Con.Exec($Query)

je préfère
1
2
$Query = "SELECT &1 FROM ShowTitle WHERE &1 LIKE &2"
$Result = $Con.Exec($Query, what, first & "%")



Comme ça ça limite les risques d'injections car toute les inclusions sont quotée
Moins de texte dans une signature c'est agrandir son espace.
12