PC SOFT

GRUPOS DE DISCUSSÃO PROFISSIONAL
WINDEVWEBDEV e WINDEV Mobile

Inicio → WINDEV 2024 → Probleme de liaison entre un fichier HFSQL et une Table
Probleme de liaison entre un fichier HFSQL et une Table
Iniciado por Jerome Perriollat, abr., 06 2020 10:17 PM - 19 respostas
Membro registado
62 mensagems
Publicado em abril, 06 2020 - 10:17 PM
Re bonjour à ceux qui m'ont déjà aidé, mais la je coince

Je voudrai récupérer le contenu d'un fichier HFSQL dans une table
Le fichier contient une 20aine de colonnes mais je fais une requête qui ne sélectionne que le nom, prénom, Grade et Equipe.

Mon objectif changer l'équipe et sauvegarder le changement

J'ai essayé :
1/ Directement de la table grâce à la fonction cochée "Enregistrer en sortie de ligne" dans la description, rubrique Détail.
rien ne change

2/ J'ai donc essayé de tricher en créant 4 champs de saisies qui se remplissent quand clique sur une ligne de la table et avec un bouton qui fait
EcranversFichier (Fen_Accueil,BaseSP)
Hmodifie()
TableAffiche(TableSPP)
la j'ai comme erreur "Aucun enregistrement en cours n'est défini pour le fichier"

Du coup, je coince sur ce truc super simple...

Merci de votre aide
Membro registado
160 mensagems
Popularité : +18 (22 votes)
Publicado em abril, 06 2020 - 11:16 PM
Salut Jérôme,

à ta place je passerai directement par une requête SQL Update au lieux de la fonction "ecranversFichier "
Membro registado
213 mensagems
Popularité : +12 (12 votes)
Publicado em abril, 06 2020 - 11:38 PM
Jerome,

Tu utilises le mot "table" et je suppose un "champ table".
Si je suis en erreur ignore ma réponse.
;)


ÉcranVersFichier - FichierVersÉcran
Champ de saisie
Combo.
etc.

TableEnregistre - TableSupprime
Pour un "champ table".

Tu peux relier ta table à ta base de données.
Voir onglet "Contenu"

Puis tu relies tes colonnes à la base de données.
Au besoin, tu peux masquer des colonnes (Visible non coché).
Voir onglet "Liaison".

Mises à jour automatique ?
Voir onglet "Détail", "Paramètres de saisie".
Enregistrer en sortie de ligne (Modif.) doit être coché.


----------
En passant j'ai pris une approche différente...
https://forum.pcsoft.fr/fr-FR/pcsoft.fr.windev/238226-conseils-experience-238429/read.awp


Bon dev.

Serge
Membro registado
1.144 mensagems
Popularité : +50 (142 votes)
Publicado em abril, 07 2020 - 12:47 AM
Bonsoir

La proposition de Serge risque d'allonger le temps de chargement si la base de données est de type serveur, mais facile à mettre en place.
La proposition de freak per est bien si on ne cherche pas séparer le code métier de l'IHM.
On peut aussi utiliser des classes et des tableaux de classe...

Plusieurs pistes donc...
Membro registado
213 mensagems
Popularité : +12 (12 votes)
Publicado em abril, 07 2020 - 2:46 AM
Thierry,

Étant encore à découvrir Windev ta réponse titille ma curiosité.
Le champ table n'est-il pas optimisé pour charger de lui-même depuis une base de données ?
Locale ou serveur...

Si tel est le cas, quelle approche préconises-tu ?

Merci

Désolé Jérôme, je détourne légèrement sur ton sujet...

Serge
Membro registado
62 mensagems
Publicado em abril, 07 2020 - 9:54 AM
Merci a tous
Serge oui. Je parle de champs table.
Mais je pensais en laissant une colonne en Saisie pouvoir la modifier
Mais je comprends que ma table doit contenir toutes les colle de ma base. Et que je dois masquer celle que jebnnutilise pas.
C'est ca ?
Je ne colprends pas alors pourquoi il est propose de n afficher que certains champs. Mais je vais tester de suite.
Encore merci.
Membro registado
1.144 mensagems
Popularité : +50 (142 votes)
Publicado em abril, 07 2020 - 11:17 AM
@Serge
Lorsqu'on crée une liaison d'un fichier vers un champ table, toutes les données sont ramenés par lot. Si la table contient quelques centaines ou milliers de lignes, l'affichage dans la table sera long voire très long. Si le fichier ne contient que peu de ligne, cela peut convenir quand même.
Si la base des HFSQL classic, le problème ne devrait pas se poser.
Il vaut mieux créer une requête pour l'affichage (c'est immédiat) et faire le traitement de modification dans un second temps.

Quoiqu'il en soit, je précaunise toujours la séparation du code IHM et du code métier
Membro registado
62 mensagems
Publicado em abril, 07 2020 - 1:04 PM
Un grand merci Serge. Je vais essayer cela ce soir

Je ne comprends pas toujours tous les mots que tu utilises, mais j'ai compris le sens. C'est très bien et très sympa

Je sens que mon projet est un peu trop ambitieux pour mon niveau de dev...

Je vais essayer d'avancer doucement

Merci encore
Membro registado
62 mensagems
Publicado em abril, 07 2020 - 2:21 PM
Pardon merci Thierry
Desole pour la boulette. J ai mal lu. Cest ta methode que je vais appliquer thierry
Membro registado
213 mensagems
Popularité : +12 (12 votes)
Publicado em abril, 07 2020 - 2:44 PM
Jerome,

Mais je pensais en laissant une colonne en Saisie pouvoir la modifier

Et tu as raison, mais la sauvegarde ne se fait PAS par ÉcranVers fichier.
De l'une ou l'autre:
- Sauvegarde automatique = Onglet détail, Enregistrer en sortie de ligne (Modif.)
- Traitement spécifique dans ton code = TableEnregistre.


Mais je comprends que ma table doit contenir toutes les colle de ma base.

Tu n'as PAS à charger tous les détails de ta base de données dans ton champ table.
Mais au besoin tu peux masquer des colonnes utiles à ton traitement / code.
Par exemple une clé de parcours.


Je vais essayer d'avancer doucement

Ne sois pas surpris de reculer fréquemment pour mieux avancer.

Pour mes mots, c'est probablement mon accent Québécois.
;)

Serge
Membro registado
213 mensagems
Popularité : +12 (12 votes)
Publicado em abril, 07 2020 - 2:56 PM
Thierry,

Il vaut mieux créer une requête pour l'affichage (c'est immédiat) et faire le traitement de modification dans un second temps.

J'avais pris cette approche... avant de faire sauter la requête pour un chargement automatique.
Avec "l'impression" que Windev optimiserait comme pour une requête...

je préconise toujours la séparation du code IHM et du code métier

Que par des requêtes ?
Même pour la fenêtre propre à la gestion d'une table ciblée ?

Et donc, aucun HLit, HAjoute, HModifie et HSupprime dans ton code ?

Merci pour les précisions.

Encore une fois, désolé de polluer ton sujet Jérôme.

Serge
Membro registado
62 mensagems
Publicado em abril, 07 2020 - 5:51 PM
Merci pour tes reponses detaillees.

Je suis surtiut en marvhe arriere la
Jaimerai enfin avancer.

J ai pleiln de blocage a pleins d endroit.

Je poserai d autres post ici en fonction
Membro registado
1.144 mensagems
Popularité : +50 (142 votes)
Publicado em abril, 07 2020 - 6:16 PM
@Serge

Tout ce qui est de l'affichage je le fais avec des requêtes ou des classes.
Pour les modifications / ajouts je le fais avec des classes... où avec des structures et des collections de procédures.
J'évite tous les Hxx dans mes fenêtres, je déporte ce code dans des classes ou des procédures.
1/ ça sécurise mon code
2/ ça me permet de réutiliser le code (sans m'occuper de l'IHM)

Je ne fais donc pas de saisie/modification dans un champ table... mais c'est un choix personnel, cela fonctionne très bien.
Membro registado
62 mensagems
Publicado em abril, 08 2020 - 10:55 AM
Salut Thierry

Hélas, je ne parle pas encore très bien le WLangage
Je maîtrise le VB, mais on en est loin
Donc le système assisté m'aide beaucoup à avancer... en marche arrière parfois
Membro registado
62 mensagems
Publicado em abril, 08 2020 - 4:09 PM
Bon voila le résultat

J'ai créé un champs table
J'ai utilisé Définir une requête maintenant
J ai sélectionné toute ma base (BaseSP)
J'ai fait une condition disant d'afficher que ceux dont le critère Statut est = à SPP
Je choisis d'afficher que les colonnes Nom, Prénom, Grade et Equipe

Tout cela s'affiche juste dans mon champs table

Mais quand je tape quelque chose dans le champs Equipe (une lettre), que je sors de ma ligne, rien ne s'enregistre
Pourtant j'ai coché saisie en cascade et Enregistrement en Sortie de ligne

Dois je ajouter un tableenregistre ???
Membro registado
1.144 mensagems
Popularité : +50 (142 votes)
Publicado em abril, 08 2020 - 4:41 PM
Si le contenu du champ table vient du résultat d'une requête, alors le champ table n'est pas relié à un fichier de données. Donc aucune mise à jour ne peut se faire vers la base de données de manière automatique.
Pour faire une mise à jour, il faut le faire par code dans l'événement de modification ou sortie de ligne du champ table, avec une requête de mise à jour.

1/ soit le champ table est relié directement à un fichier de données -> la mise à jour dans la BD est immédiate
ou
2/ soit le champ table est relié à une requête --> il faut écrire le code pour faire la mise à jour dans la BD
Membro registado
3.886 mensagems
Popularité : +227 (347 votes)
Publicado em abril, 08 2020 - 5:23 PM
Tu peux aussi exécuter ta requête avec l'option hModifieFichier

--
Il y a peut être plus simple, mais, ça tourne
Membro registado
62 mensagems
Publicado em abril, 08 2020 - 5:30 PM
Je suis desole de vous sembler si con
En fait je remplis mon champs table avec une requete pour ne pas prendre tout le monde.
Donc je vais devoir faire hmodifiefichier

Merci. Je vous tiens au courant
Membro registado
62 mensagems
Publicado em abril, 08 2020 - 6:18 PM
Je rempli mon tableau avec un filtre sur le statut des pompiers
FEN_Accueil..Plan=1
sTatut est une chaîne
sTatut = "SPP"
HExécuteRequête(REQ_Charge_SP,hRequêteDéfaut,sTatut)
ConstruitTableFichier(TABLE_SPP,REQ_Charge_SP,hModifieFichier)


Ma requete




Je charge toute mon fichier BaseSP, je n'affiche que les colonnes Grade, Nom, Prénom et Equipe

Alors je voudrai pouvoir taper mon code dans la rubrique sortie de ligne de mon champs table, mais je ne vois pas quoi taper
Membro registado
3.886 mensagems
Popularité : +227 (347 votes)
Publicado em abril, 08 2020 - 6:32 PM
Je commence à comprendre d'où vient le problème.
Pourquoi utiliser ConstruitTableFichier ?
Par ailleurs si on avait un extrait de ton MLD et le code SQL de la requête, ce serait certainement plus simple pour la suite

--
Il y a peut être plus simple, mais, ça tourne