Skip to content
windev
WinDev - WebDev - Windev Mobile
  • Pages
    • Accueil
    • Déroulés
      • Installation de Windev
      • Création d'un projet
      • GDS
      • Tables de paramètres
    • WebDev - 5 jours
      • Jour 1 - Découvrir WebDev et le WLangage
      • icon picker
        Jour 2 - Données, imports et tableau de bord

Jour 2 - Données, imports et tableau de bord


6. Création et gestion d’une base HFSQL

6.1. Définir des tables dans l’analyse

Pour créer une table dans l’éditeur d’analyses :
ouvrir l’analyse (menu Projet > Charger l’analyse)
clic droit dans l’éditeur > Nouveau fichier de données
saisir le nom de la table (exemple : Vente)
ajouter les rubriques une par une en précisant le nom, le type et la taille
Exemple de structure pour une table « Vente » :
Rubrique
Type
Taille
Clé
IDVente
Identifiant automatique
8 octets
Clé unique
DateVente
Date
8
Clé avec doublons
Catégorie
Chaîne
50
Clé avec doublons
Source
Chaîne
30
Clé avec doublons
Montant
Monétaire
-
-
Quantité
Entier
-
-
There are no rows in this table

6.2. Clés et relations

Identifiant automatique : rubrique dont la valeur est générée automatiquement à chaque ajout (auto-incrément)
Clé unique : garantit l’unicité de chaque valeur dans la rubrique
Clé avec doublons : permet les recherches rapides sans imposer l’unicité
Liaison : relie deux tables. Par exemple, une table Commande contient une rubrique IDClient qui pointe vers la table Client

6.3. Générer la base

Après avoir décrit l’analyse, vous devez la générer pour créer physiquement les fichiers de données :
menu Analyse > Génération
WebDev crée les fichiers .fic, .ndx et .mmo correspondants

7. Requêtes SQL dans WebDev

7.1. Écrire une requête SQL en code (syntaxe préfixée)

// Déclarer une source de données pour stocker le résultat de la requête
sdReqVentes est une Source de Données

// Écrire et exécuter la requête SQL
// La fonction ExécuteRequêteSQL est appelée sur la source de données
sdReqVentes.ExécuteRequêteSQL(
"SELECT Catégorie, SUM(Montant) AS TotalMontant, AVG(Montant) AS MoyenneMontant " + ...
"FROM Vente " + ...
"GROUP BY Catégorie " + ...
"ORDER BY TotalMontant DESC"
)
// La requête regroupe les ventes par catégorie
// SUM() calcule la somme des montants
// AVG() calcule la moyenne des montants
// GROUP BY regroupe les résultats par catégorie
// ORDER BY trie les résultats par total décroissant

// Parcourir les résultats
POUR TOUT sdReqVentes
// Pour chaque ligne de résultat, on accède aux colonnes par leur alias
Trace(sdReqVentes.Catégorie + " : " + sdReqVentes.TotalMontant)
FIN

7.2. Les fonctions d’agrégation SQL

SUM(rubrique) : somme des valeurs
AVG(rubrique) : moyenne des valeurs
COUNT(*) : nombre d’enregistrements
MIN(rubrique) : valeur minimale
MAX(rubrique) : valeur maximale
GROUP BY : regroupement par une ou plusieurs rubriques

7.3. Requêtes paramétrées

// Requête avec un paramètre pour filtrer par catégorie
sCatégorieChoisie est une chaîne = "Alimentation"

sdReqFiltrée est une Source de Données
sdReqFiltrée.ExécuteRequêteSQL(
"SELECT DateVente, Montant, Quantité " + ...
"FROM Vente " + ...
"WHERE Catégorie = '" + sCatégorieChoisie + "' " + ...
"ORDER BY DateVente"
)
// Le paramètre sCatégorieChoisie est injecté dans la clause WHERE

// Parcourir et afficher les résultats
POUR TOUT sdReqFiltrée
Trace(sdReqFiltrée.DateVente + " | " + sdReqFiltrée.Montant)
FIN
Attention : dans un projet réel, il est recommandé d’utiliser des requêtes paramétrées via l’éditeur de requêtes ou la fonction HExécuteRequêteSQL avec des paramètres nommés, afin d’éviter les risques d’injection SQL.

8. Lecture et importation de fichiers CSV et Excel

8.1. Importer un fichier CSV

// Charger le contenu du fichier CSV en mémoire
sContenuCSV est une chaîne = fChargeTexte("C:\Données\ventes.csv")
// fChargeTexte() lit l'intégralité du fichier et le place dans une chaîne
// Le fichier CSV contient des lignes séparées par RC (retour chariot)
// et des colonnes séparées par ";" (point-virgule)

// Ignorer la première ligne (en-têtes)
bPremièreLigne est un booléen = Vrai

// Parcourir chaque ligne du fichier
POUR TOUTE CHAÎNE sLigne DE sContenuCSV SÉPARÉE PAR RC
// RC est une constante WLangage qui représente le retour à la ligne

// Sauter la ligne d'en-tête
SI bPremièreLigne ALORS
bPremièreLigne = Faux
// On passe la première itération sans traitement
CONTINUER
// CONTINUER passe directement à l'itération suivante
FIN

// Découper la ligne en colonnes
sDateVente est une chaîne = ExtraitChaîne(sLigne, 1, ";")
// ExtraitChaîne() extrait le Nième élément d'une chaîne découpée
// Ici : le 1er élément séparé par ";"
sCatégorie est une chaîne = ExtraitChaîne(sLigne, 2, ";")
sSource est une chaîne = ExtraitChaîne(sLigne, 3, ";")
rMontant est un réel = Val(ExtraitChaîne(sLigne, 4, ";"))
// Val() convertit une chaîne en valeur numérique
nQuantité est un entier = Val(ExtraitChaîne(sLigne, 5, ";"))

// Affecter les valeurs aux rubriques du fichier de données
Vente.DateVente = ChaîneVersDate(sDateVente, "JJ/MM/AAAA")
// ChaîneVersDate() convertit une chaîne au format date HFSQL
Vente.Reset()
Vente.Catégorie = sCatégorie
Vente.Source = sSource
Vente.Montant = rMontant
Vente.Quantité = nQuantité

// Ajouter l'enregistrement dans la base HFSQL
Vente.Ajoute()
// En syntaxe préfixée : le fichier est suivi du point et de la fonction

FIN

Info("Import terminé avec succès.")
// Info() affiche une boîte de dialogue informative

8.2. Importer un fichier Excel

// Ouvrir le fichier Excel
sCheminExcel est une chaîne = "C:\Données\ventes.xlsx"
nIDFichier est un entier = xlsOuvre(sCheminExcel)
// xlsOuvre() ouvre un classeur Excel et renvoie un identifiant

SI nIDFichier = -1 ALORS
Erreur("Impossible d'ouvrir le fichier Excel.")
// Erreur() affiche une boîte de dialogue d'erreur
RETOUR
FIN

// Récupérer le nombre de lignes (en excluant l'en-tête)
nNbLignes est un entier = xlsNbLigne(nIDFichier)
// xlsNbLigne() renvoie le nombre total de lignes du classeur

// Parcourir les lignes à partir de la ligne 2 (après l'en-tête)
POUR nLigne = 2 À nNbLignes
// Lire chaque cellule de la ligne
Vente.Catégorie = xlsDonnée(nIDFichier, nLigne, 1)
// xlsDonnée() lit la valeur d'une cellule (identifiant, ligne, colonne)
Vente.Source = xlsDonnée(nIDFichier, nLigne, 2)
Vente.Montant = Val(xlsDonnée(nIDFichier, nLigne, 3))
Vente.Quantité = Val(xlsDonnée(nIDFichier, nLigne, 4))

// Ajouter l'enregistrement
Vente.Ajoute()
FIN

// Fermer le fichier Excel
xlsFerme(nIDFichier)

Info("Import Excel terminé.")

8.3. Automatiser avec contrôles d’erreurs

// Procédure complète d'import avec gestion des erreurs
PROCÉDURE ImporterCSV(sCheminFichier est une chaîne)

// Vérifier que le fichier existe
SI PAS fFichierExiste(sCheminFichier) ALORS
// fFichierExiste() vérifie la présence d'un fichier sur le disque
Erreur("Le fichier " + sCheminFichier + " n'existe pas.")
RENVOYER Faux
// RENVOYER quitte la procédure et retourne une valeur
FIN

// Charger le fichier
sContenu est une chaîne = fChargeTexte(sCheminFichier)

SI sContenu = "" ALORS
Erreur("Le fichier est vide.")
RENVOYER Faux
FIN

nLignesImportées est un entier = 0
nLignesErreur est un entier = 0
bPremièreLigne est un booléen = Vrai

POUR TOUTE CHAÎNE sLigne DE sContenu SÉPARÉE PAR RC

SI bPremièreLigne ALORS
bPremièreLigne = Faux
CONTINUER
FIN

// Ignorer les lignes vides
SI sLigne = "" ALORS
CONTINUER
FIN

// Tenter l'import avec gestion d'erreur
QUAND EXCEPTION DANS
// QUAND EXCEPTION DANS ... FAIRE ... permet de gérer les erreurs
Vente.Catégorie = ExtraitChaîne(sLigne, 1, ";")
Vente.Source = ExtraitChaîne(sLigne, 2, ";")
Vente.Montant = Val(ExtraitChaîne(sLigne, 3, ";"))
Vente.Quantité = Val(ExtraitChaîne(sLigne, 4, ";"))
Vente.Ajoute()
nLignesImportées++
FAIRE
// Ce bloc s'exécute en cas d'erreur
Want to print your doc?
This is not the way.
Try clicking the ··· in the right corner or using a keyboard shortcut (
CtrlP
) instead.