Gambas France BETA


Pas de compte ? Incription

Transfert données TableView1 vers TableView2 pour traitement

1
AuteurMessages
pinky#1 Posté le 7/12/2024 à 10:04:45
Bonjour,
Je poursuis lentement mon application (Voir ce post).


Je suis bloqué depuis pas mal de jours.
Je n'arrive pas à trouver la solution pour copier les données contenues dans ma TableView1 afin de les déplacer vers ma TableView2 et de les traiter dans la TableView2.
Je n'ai pas trouvé d'exemples de codes sur le forum ou sur le net.
Mon but serait par exemple de récupérer les données de la 1ère colonne de ma TableView1 afin de les copier dans la première colonne de ma TableView2.
Je pensais pouvoir le faire avec le code suivant, mais ça ne m'affiche rien dans ma 1ère colonne de ma TableView2 :
1
TableView2.Columns[0].text = TableView1.Columns[0].Text

Je n'ai pourtant pas de message d'erreur.


Ensuite, à l'aide d'un Button1, je souhaiterai aussi récupérer les valeurs de la 2ème colonne de ma TableView1 et les déplacer dans la 2ème colonne de ma TableView2 en les multipliant par 2.75.

Je n'arrive pas à trouver le bon code pour sélectionner/copier uniquement la 1ère colonne, puis la 2ème colonne afin de pouvoir multiplier les valeurs par 2.75.


Mon code actuel pour la création de ma TableView1 est celui-ci :
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
PUBLIC SUB Form_Open()

DIM sData AS String[] = Split("0 0.088 5 1.104 10 3.125 15 4.143 20 5.161 25 6.176 30 8.192 35 9.3 40 9.655 45 9.78 50 9.998 55 10.22 ", " ")
DIM iRow, iCol, iCount AS INTEGER

WITH TableView1
.Columns.Count = 2'Pour avoir un tableau avec 2 colonnes
.Rows.Count = 12'Pour avoir un tableau avec 12 lignes
END WITH

FOR iRow = 0 TO 10'pour limiter le nbre de lignes de données affichées à 11
FOR iCol = 0 TO 1
TableView1[iRow, iCol].Text = sData[iCount]

INC iCount
NEXT
NEXT

END



PUBLIC SUB Button1_Click()

WITH TableView2
.Columns.Count = 2'Pour avoir 2 colonnes dans TableView2
.Rows.Count = TableView1.Rows.Count'Pour avoir le même nbre de lignes que dans TableView1

END WITH
TableView2.Columns[0].text = TableView1.Columns[0].Text
END



Si quelqu'un peut m'aiguiller un peu car je fais du surplace depuis pas mal de jours.

Merci d'avance.
Dolmen (table pierre) : Caillou préféré des Bretons (un dolmen de prédilection).
vuott#2 Posté le 7/12/2024 à 12:13:42
Ne cedere ineluctabili possimusDans la routine 'Button1', je proposerais ce code:
1
2
3
4
5
6
7
8
9
10
11
12
13
PUBLIC SUB Button1_Click()

WITH TableView2
.Columns.Count = 2'Pour avoir 2 colonnes dans TableView2
.Rows.Count = TableView1.Rows.Count'Pour avoir le même nbre de lignes que dans TableView1
END WITH

FOR c AS SHORT = 0 TO TableView1.Rows.Count - 2
TableView2[c, 0].Text = TableView1[c, 0].Text
TableView2[c, 1].Text = CSingle(TableView1[c, 1].Text) * 2.75
NEXT

END
« Vita non suavis esse potest, nec Mors amara. »
pinky#3 Posté le 7/12/2024 à 14:01:51
Encore merci vuott,
Ca fonctionne parfaitement. :cheers:
Je vais essayer de comprendre ton code et surtout cette partie :
1
CSingle(TableView1[c, 1].Text)

Je vais regarder dans la documentation Gambas à quoi sert CSingle. C'est une expression totalement inconnue pour moi.
Je vais aussi essayer de trouver seul comment limiter le résultat de la multiplication à 3 chiffres après la virgule.
Bon week-end.
Dolmen (table pierre) : Caillou préféré des Bretons (un dolmen de prédilection).
linuxos#4 Posté le 7/12/2024 à 14:20:31
Un peu de sel, de poivre et la crevette sera... Bonjour pinky,

Sans vouloir bouleverser ton projet, il me semble que si les données de base étaient stockées dans une variable ou un tableau, plutot que directement dans un TableView, cela serait plus facile.

En effet un Objet TableView, comme son nom l'indique sert a Visualiser les données d'un Table de données. Généralement cette table vient souvent d'une base de données.
Je ne pense pas qu'utiliser une base de données soit pertinant dans votre projet (bien que je ne connaisses pas votre projet).

Donc si les données étaient dans une Variable ou une Variable Tableau cela serait plus facile d'aller chercher les données a la base, et de juste l'afficher dans le TableView.

Lire les donnéees --> les stocker dans une Variable Tableau --> Afficher les données dans un TableView
--> Afficher les données *2.75 dans le TableView

Pas de soucis pour aider a faire cela si besoin.

Olivier

Lorsqu'on s'occupe d'informatique, il faut faire comme les canards... Paraître calme en surface et pédaler comme un forcené par en dessous.
pinky#5 Posté le 7/12/2024 à 15:47:09
Bonjour Olivier,
Au tout début de mon application, les données que je récupère proviennent d'un logiciels n'ayant rien à voir avec Gambas. Je copie/colle ces données dans la TextArea de mon application Gambas.
Ensuite, à l'aide d'un Button, les données dans la TextArea sont mises en forme sur deux colonnes dans ma TableView1.
J'ai choisi un TableView uniquement pour l'esthétique de la TableView. J'ai aussi fait des tests avec une Gridview qui peut aussi m'aller.
Mes données dans le TableView1 ne sont pas stockées dans une table de base de données. Par contre, par la suite, il est possible que je sauvegarde les données dans une petite base de données ou un fichier texte car il n'y aura pas beaucoup de données à conserver.
Pour l'instant, je suis en pleine phase de découverte du code, donc je ne vais pas compliquer mon application avec un système de stockage des données. J'ai déjà assez de mal comme ça. Je n'ai jamais eu de formation en informatique, donc c'est la pure découverte et de l'amusement pour mon cerveau.


Donc si les données étaient dans une Variable ou une Variable Tableau cela serait plus facile d'aller chercher les données a la base, et de juste l'afficher dans le TableView.

Je ne suis pas certain de bien comprendre cette phrase.
Je pensais que mes données étaient dans la variable nommée sData (Voir mon 1er message dans ce sujet).
Si tu as un exemple plus simple, n'hésite pas à le mettre et je testerai.
Dolmen (table pierre) : Caillou préféré des Bretons (un dolmen de prédilection).
linuxos#6 Posté le 7/12/2024 à 17:15:42
Un peu de sel, de poivre et la crevette sera... IL y a un moyen assez simple de faire un genre de mini base de données (evidement il ya des limitation par rapport a une vrai base de données comme SQLite, MySQL, PostGreSQL).


L'idée c'est d'utiliser une Class dans Gambas + une Collection

La Classe va servir a definir l'equivalent de la Structure de la base de données et la Collection sera l'équivalent de la Table de la base de données.

Exemple:

Voici ce que je te propose, laisse moi savoir si c'est trop compliqué a comprendre, je rajouterai plus s'explications/commentaires:

## Créer une Classe: ClassStructure

1
2
3
4
5
' Gambas class file

PUBLIC NumDonnee AS INTEGER ' Numéro de la donnée
PUBLIC Temps AS INTEGER ' Champs1 comme Entier
PUBLIC Valeur AS FLOAT ' Valeur comme nombre décimal - Flottant


## Dans le module Main
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
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
' Gambas module file

PUBLIC $cMaTable AS Collection


PUBLIC SUB Main()

DIM sData AS String[] = Split("0 0.088 5 1.104 10 3.125 15 4.143 20 5.161 25 6.176 30 8.192 35 9.3 40 9.655 45 9.78 50 9.998 55 10.22", " ")
DIM cNouvelEnregistrement AS ClassStructure
DIM iIndexValeur AS INTEGER
DIM iIndexEnreg AS INTEGER = 1

$cMaTable = NEW Collection ' Ici on instantie la Collection. On la créer physiquement dans la mémoire

' Analyse des données sources et stockage dans la Collection
IF sData.count > 0 THEN ' Si il y a bien des données source
FOR iIndexValeur = 0 TO sData.Max STEP 2 ' Boucle

IF iIndexValeur + 1 <= sData.Max THEN
' Création d'un nouvel Enregistrement de données
cNouvelEnregistrement = NEW ClassStructure
cNouvelEnregistrement.NumDonnee = iIndexEnreg
cNouvelEnregistrement.Temps = CInt(sData[iIndexValeur])

cNouvelEnregistrement.Valeur = CFloat(sData[iIndexValeur + 1])
$cMaTable.Add(cNouvelEnregistrement, iIndexEnreg)
END IF

INC iIndexEnreg

NEXT
END IF

Afficher_Donnees_brute()

PRINT ""
PRINT "--------------------------------------------------"
PRINT ""

Afficher_Donnees_Modifiees()

END


PUBLIC SUB Afficher_Donnees_brute()

' Affichage des données brute - non modifiées

PRINT "Liste des données brutes:"

DIM cEnregis AS ClassStructure

FOR EACH cEnregis IN $cMaTable
PRINT "Num: " & cEnregis.NumDonnee & ", Temps: " & cEnregis.Temps & ", Valeur: " & cEnregis.Valeur
NEXT

END


PUBLIC SUB Afficher_Donnees_Modifiees()

' Affichage des données modifiées

PRINT "Liste des données brutes modifiées: (*2.54)"

DIM cEnregis AS ClassStructure

FOR EACH cEnregis IN $cMaTable
PRINT "Num: " & cEnregis.NumDonnee & ", Temps: " & cEnregis.Temps & ", Valeur: " & (cEnregis.Valeur * 2.54)
NEXT


END


Je peux te fournir aussi le petit projet dans une archive.

Olivier
Lorsqu'on s'occupe d'informatique, il faut faire comme les canards... Paraître calme en surface et pédaler comme un forcené par en dessous.
vuott#7 Posté le 7/12/2024 à 17:20:58
Ne cedere ineluctabili possimus
Je vais regarder dans la documentation Gambas à quoi sert CSingle. C'est une expression totalement inconnue pour moi.

J'avais l'intention de transformer la représentation du nombre d'une chaîne de caractères en une valeur numérique à l'aide de la fonction « Val() », mais cette fonction native suit les conventions spécifiées dans la localisation.
J'ai dû opter pour « CSingle ».
Cependant, vous pouvez également utiliser cette affectation directement, Gambas se chargera de l'adaptation dans la multiplication entre la représentation de caractères et la valeur numérique.
1
TableView2[c, 1].Text = TableView1[c, 1].Text * 2.75



Je vais aussi essayer de trouver seul comment limiter le résultat de la multiplication à 3 chiffres après la virgule.

Vous pouvez utiliser la fonction « Format() »:
1
TableView2[c, 1].Text = Format(TableView1[c, 1].Text * 2.75, "0.000")
« Vita non suavis esse potest, nec Mors amara. »
pinky#8 Posté le 8/12/2024 à 08:33:28
Je peux te fournir aussi le petit projet dans une archive.
Olivier

Bonjour Olivier,
Je veux bien ton archive. Ca me permettra probablement de mieux comprendre ton code et de voir visuellement ce que ça donne. ;)

Vous pouvez utiliser la fonction « Format() »:
1
TableView2[c, 1].Text = Format(TableView1[c, 1].Text * 2.75, "0.000")

Bonjour vuott,
Je viens de tester et c'est adopté. En plus, avec Format, ton code me parle plus.
J'avais commencé à fouiner dans la documentation pour trouver comment limiter le nombre de chiffres après la virgule et j'étais arrivé sur la fonction "Round". Ca fonctionnait bien avec la console Gambas :
1
2
3
PUBLIC SUB Main()
PRINT Round(9854.25687, -3)
END


Par contre, je n'ai pas eu le temps de tester "Round" dans mon application. Je ne sais pas si "Round" était ce qui convenait le mieux. :roll:
Dolmen (table pierre) : Caillou préféré des Bretons (un dolmen de prédilection).
1