PC SOFT

FOROS PROFESIONALES
WINDEVWEBDEV y WINDEV Mobile

Inicio → WINDEV 2025 → Type de données (rubrique) champ de requête
Type de données (rubrique) champ de requête
Iniciado por dj5f, 04,jun. 2020 01:57 - 6 respuestas
Miembro registrado
163 mensajes
Publicado el 04,junio 2020 - 01:57
J'aimerais pouvoir déterminer par programmation le type de données pour les rubriques d'une requête après exécution (date, entier, chaîne, ...).

Voici une partie de mon code :

Le code fonctionne très bien pour ajouter le résultat de la requête à une table, mais je ne peux pas formater les colonnes, ne sachant pas à les types de données des requêtes. J'utilise une fenêtre pour afficher les données de fichiers divers. Ce sont souvent des requêtes.

sListeRubriques est une chaîne = HListeRubrique("Req")
ListeAjoute(LISTE_rubriques,sListeRubriques)
nRubriques est un entier = ListeOccurrence(LISTE_rubriques)
nColonnes est un entier = TableOccurrence(TABLE_Fichier,toColonne)

i est un entier = 1

sNomColonne est une chaîne
sNomChamp est une chaîne

POUR TOUTE chaîne sRubrique de sListeRubriques SEPAREE PAR RC
SI i > nColonnes ALORS
sNomChamp = "COL_" + i
ChampClone(TableEnumèreColonne(TABLE_Fichier,i-1),sNomChamp)
FIN
sNomColonne = TableEnumèreColonne(TABLE_Fichier,i)

{sNomColonne,indChamp}..Libellé = sRubrique
{sNomColonne,indChamp}..LiaisonFichier = sRubrique

i++
FIN


--
__________________
Denis Jobin
Longueuil, Québec
Miembro registrado
4.362 mensajes
Publicado el 04,junio 2020 - 06:31
Bonjour,
Avec ChampClone, tu ne peux pas modifier le type de colonne, il faut utiliser ChampCrée

--
Il y a peut être plus simple, mais, ça tourne
Miembro registrado
134 mensajes
Publicado el 04,junio 2020 - 09:10
Bonjour,

Ci-dessous un exemple de code simplifié :

Soit resultat la source de données résultat de la requête
Soit TABLE_resultat une table en mode de remplissage Fichier /requête contenant uniquement une colonne COL_Ancrage en invisible

lproc_initialiser( resultat est une Source dede Données )

i, iMax est un entier
Rubrique est une chaîne
rubriques est un tableau de 0 chaîne
c est un Champ

// Nettoyage de la table résultat
TABLE_resultat..AffichageActif = Faux
TABLE_resultat..FichierParcouru = ""
iMax = TableOccurrence( TABLE_resultat, toColonne )
POUR i = iMax À 1 PAS -1
c <- TableEnumèreColonne( TABLE_resultat, i )
SI c..Nom <> COL_Ancrage..Nom ET ChampExiste( c..Nom ) ALORS ChampSupprime( c..Nom )
FIN // POUR i = 1 A iMax

HLitPremier( resultat )
SI PAS HEnDehors( resultat ) ALORS

ChaîneVersTableau( HListeRubrique( resultat ), rubriques, RC )

POUR TOUTE Rubrique de Rubriques

Rubrique = SansEspace( Rubrique )

SELON { resultat + "." + Rubrique, indRubrique }..Type
CAS hRubMémoBinaire :
c <- ChampCrée( TABLE_resultat..Nom + ".COL_" + Rubrique, typImage )
c..ImageMode = imgHC + imgHQ
AUTRE CAS :
c <- ChampCrée( TABLE_resultat..Nom + ".COL_" + Rubrique, typColonne )
FIN // SELON { rubriqueOrigine, indRubrique }..Type

SELON { resultat + "." + Rubrique, indRubrique }..Type

CAS hRubIdAuto, hRubIdAuto4 :
c..TypeSaisie = typSaisieNum
c..CadrageHorizontal = chDroite
CAS hRubDate6, hRubDate8 :
c..TypeSaisie = typSaisieDate
c..CadrageHorizontal = chDroite
CAS hRubDateHeure :
c..TypeSaisie = typSaisieDate
c..MasqueSaisie = "JJ/MM/AAAA HH:mm:SS"
c..FormatMémorisé = "AAAAMMJJHHmmSS"
c..CadrageHorizontal = chDroite
CAS hRubHeure :
c..TypeSaisie = typSaisieHeure
c..CadrageHorizontal = chDroite
CAS hRubEntier1, hRubEntier2, hRubEntier4, hRubEntier8, hRubEntierNonSigné1, hRubEntierNonSigné2, hRubEntierNonSigné4, hRubEntierNonSigné8, hRubNumérique, hRubRéel4, hRubRéel8, hRubRéelTurbo :
c..TypeSaisie = typSaisieNum
c..CadrageHorizontal = chDroite
CAS hRubMonétaire :
c..TypeSaisie = typSaisieMonétaire
c..MasqueSaisie = "MoneySystemMask$"
c..CadrageHorizontal = chDroite
CAS hRubBooléen :
c..CadrageHorizontal = chDroite
CAS hRubMémoBinaire :
// Rien
AUTRE CAS :
c..TypeSaisie = typSaisieTexte
c..CadrageHorizontal = chGauche

FIN // SELON { rubrique, indRubrique }..Type

c..Libellé = { resultat + "." + Rubrique, indRubrique }..Libellé
c..LiaisonFichier = resultat + "." + Rubrique
c..Visible = Vrai

FIN // POUR TOUTE rubrique DE rubriques

TABLE_resultat..FichierParcouru = resultat
TableAffiche( TABLE_resultat, taInit )
TableAjuste( TABLE_resultat )

FIN // SI PAS HEnDehors( resultat ) ALORS

TABLE_resultat..AffichageActif = Vrai
Miembro registrado
163 mensajes
Publicado el 04,junio 2020 - 15:17
Julien,

Merci pour le code. C'est beaucoup plus complet que le mien.

Par contre, il y a toujours de petits problèmes.
Notes :
1- les données proviennent d'une requête (celle-ci n'est pas incluse dans le projet (éditeur de requête) mais directement dans le code).
2- les données sont lues d'une base MySql

Voici les deux problèmes que je constate :
1- J'ai un champ dateheure - celui-ci est considéré comme texte, donc non détecté
2- Le libellé n'est pas lu - les colonnes n'ont pas de nom.

--
__________________
Denis Jobin
Longueuil, Québec
Miembro registrado
134 mensajes
Publicado el 04,junio 2020 - 15:34
Pour le nom des colonnes il est peut être possible d'extraire les alias de rubriques de la requête s'ils existent, sinon mettre le libellé s'il est rempli sinon directement la rubrique.

Ex.
i, iMax est un entier
rubriques, valeurs est un tableau de 0 chaîne
alias est un tableau associatif de chaîne

SI ChaîneOccurrence( sql, "SELECT" ) ALORS
ChaîneVersTableau( SansEspace( Remplace( ExtraitChaîne( sql, 2, [ "SELECT", "FROM" ] ), RC, "" ) ), valeurs, "," )
FIN // SI ChaîneOccurrence( sql, "SELECT" ) ALORS

iMax = TableauOccurrence( valeurs )

// Récupération des alias éventuels de la requête
POUR i = 1 À iMax
SI ChaîneOccurrence( valeurs[ i ], "AS", MotComplet ) > 0 ALORS
alias[ i ] = SansEspace( ExtraitChaîne( valeurs[ i ], 2, "AS" ) )
FIN // SI ChaîneOccurrence( valeurs[ i ], "AS", MotComplet ) > 0 ALORS
FIN // POUR i = 1 À iMax

[...]

iMax = TableauOccurrence( rubriques )
POUR i = 1 À iMax

// Utilisation de l'alias éventuel
SI alias[ i ]..Existe ALORS
c..Libellé = alias[ i ]
SINON SI { resultat + "." + Rubrique, indRubrique }..Libellé <> "" ALORS
c..Libellé = { resultat + "." + Rubrique, indRubrique }..Libellé
SINON
c..Libellé = Rubrique
FIN // SI alias[ i ]..Existe ALORS

FIN // POUR i = 1 À iMax
Miembro registrado
134 mensajes
Publicado el 04,junio 2020 - 15:42
Pour la date, si le type de la rubrique est texte au niveau de la source de données qui contient le résultat, peut être tester si le contenu de la rubrique du premier enregistrement vérifie la fonction DateValide

(Je n'ai pas testé ce code)
AUTRE CAS :
SI DateValide( { resultat + "." + Rubrique, indRubrique } ) ALORS
// Tester la longueur de la chaine pour savoir si date ou dateheure et reprendre formatage hRubDate6, hRubDate8 ou hRubDateHeure
SINON
c..TypeSaisie = typSaisieTexte
c..CadrageHorizontal = chGauche
FIN
Miembro registrado
163 mensajes
Publicado el 04,junio 2020 - 16:32
Julien,

Fantastique !!!!

Ça fonctionne très bien. Et pour le nom des colonnes et pour les dates.

Merci !!!

--
__________________
Denis Jobin
Longueuil, Québec