From a48565127316e6b9190834e70e7637745f33860d Mon Sep 17 00:00:00 2001 From: StillHammer Date: Tue, 30 Dec 2025 16:51:25 +0700 Subject: [PATCH] Phase 5: Form generator script + import guide MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Add mod_FormBuilder.bas to generate 5 forms programmatically - Add IMPORT_FORMS.md with step-by-step instructions - Update PLAN.md and README.md with new progress - Created 5 empty forms via MCP (to be populated by script) Run BuildAllForms() in Access VBA to create form controls. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 --- PLAN.md | 16 +- README.md | 20 +- db/TimeTrackPro.accdb | Bin 434176 -> 577536 bytes docs/IMPORT_FORMS.md | 113 +++++++ scripts/forms/frm_Accueil.txt | Bin 0 -> 2976 bytes scripts/modules/mod_FormBuilder.bas | 446 ++++++++++++++++++++++++++++ 6 files changed, 581 insertions(+), 14 deletions(-) create mode 100644 docs/IMPORT_FORMS.md create mode 100644 scripts/forms/frm_Accueil.txt create mode 100644 scripts/modules/mod_FormBuilder.bas diff --git a/PLAN.md b/PLAN.md index ecc0581..0e386ea 100644 --- a/PLAN.md +++ b/PLAN.md @@ -103,14 +103,16 @@ tbl_Projets (1) ──── (N) tbl_Temps | Phase | Contenu | Methode | Duree | Status | |-------|---------|---------|-------|--------| | 1 | Structure BDD + relations | MCP VBA | 1h | Done | -| 2 | Formulaires de base (CRUD) | Access UI | 3h | Done | -| 3 | Saisie temps + calculs | MCP VBA + UI | 2h | Done | -| 4 | Rapports + export | Access UI + VBA | 2h | Done | -| 5 | UI polish + navigation | Access UI | 2h | Manuel | -| 6 | Tests + documentation | Manuel | 2h | En cours | +| 2 | Donnees de test | MCP VBA | 30min | Done | +| 3 | Modules VBA (6 modules) | MCP VBA | 1h | Done | +| 4 | Requetes SQL | MCP VBA | 30min | Done | +| 5 | Formulaires (5 forms) | Script VBA | 1h | Pret* | +| 6 | Tests + documentation | Manuel | 2h | Done | -**Total estime:** ~12h -**Progression:** 85% complete +*Phase 5: Formulaires prets via mod_FormBuilder.bas - voir docs/IMPORT_FORMS.md + +**Total estime:** ~6h +**Progression:** 95% complete --- diff --git a/README.md b/README.md index ac8dc3c..b59ffc8 100644 --- a/README.md +++ b/README.md @@ -27,13 +27,13 @@ Outil de suivi des heures par client/projet, propre et fonctionnel, qui demontre | Phase | Description | Status | |-------|-------------|--------| | 1 | Structure BDD + relations | Done | -| 2 | Formulaires de base (CRUD) | Done | -| 3 | Saisie temps + calculs | Done | -| 4 | Rapports + export | Done | -| 5 | UI polish + navigation | Manuel (Access UI) | -| 6 | Tests + documentation | En cours | +| 2 | Donnees de test | Done | +| 3 | Modules VBA (6 modules, 715 lignes) | Done | +| 4 | Requetes SQL | Done | +| 5 | Formulaires (5 forms via script) | Pret | +| 6 | Tests + documentation | Done | -**Progression globale:** 85% - En phase finale +**Progression globale:** 95% - Formulaires a generer via script --- @@ -80,7 +80,13 @@ Outil de suivi des heures par client/projet, propre et fonctionnel, qui demontre 3. **Activer les macros** si demande -4. **Utiliser l'application** +4. **Generer les formulaires** (premiere utilisation) + - Ouvrir l'editeur VBA: `Alt + F11` + - Importer: Fichier > Importer > `scripts/modules/mod_FormBuilder.bas` + - Executer: `Ctrl + G`, taper `BuildAllForms`, Entree + - Voir `docs/IMPORT_FORMS.md` pour details + +5. **Utiliser l'application** - Le formulaire principal s'ouvre automatiquement - Naviguer via les boutons du menu diff --git a/db/TimeTrackPro.accdb b/db/TimeTrackPro.accdb index a12152f3f7d7fe8c836a1fa94723ee43f1e0e9ae..a6cfc64c37bb5beb663256eee23289c32de9a889 100644 GIT binary patch delta 59430 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 delta 3004 zcmcH*3v5%@^?u&-d$!|eJ0aL4Zv03>V$zU0KZyCo#7-(G2}yt3+5i=#d_oZ+Y!Ehy zn5-&vT?fV`m)}ZE`G_K#=eY1XrcNmVB+$A9s&&#PjT8uMofe=_X`3k7xi*A>%BD%% zeY*FZ&pqd!d(J)Q-cVOgs5hfap?*9qZdb13h^i<(wzF2zh7h{L>4(MEa{B6LQmUc#unPJU;o^Oe~OLkzc{hzgSM-F#754^ z>GDwXo3II20o$C4rx=&z?OU8=wtOs&lZKibfjN%-^=(5QQ_^s%+ zZK!!l(h=YfgleBHK~A<{SaPVDfMS#aqXE^SRcIwLB8)i={|Ldyx_@TK&{w75@0r!W zulr8NxIv(*7Cnd7qctdq7NMc$>lFE`3-mu_VGm{<{lv*UD$WcaQuW0u&U1&gb=!Ic zoT`rx;fvr3*T2KwXu-!@2=SV2rnxW9nhT4e8fNJtr7vY$v-`9AcPcx7^S}MxH^rjk z4I=jn(r;dsMhN)}Vi{jbe|{`2={-Dwg@&bEJdu4oEP1e--5r*)5;CLwtfM58`414I z<1wCQKkO!*Vj=8uCQH{y(YTp>$M@Ppu->SV{aI{wx51Auv92EC=NVF+NE1=O@1#7L zIEA5NcEK$a#k5y38$3@Aif)9wS*+s%nX2XiIH5g+P(A>89Pj{;&w+^mc-Ti5$XgR< z063k~{u2<3E=_@zOHHt{lRYs=3hN*z{V0)|i9_Uv%!IU4`GHb-!gA*Q0jQk$=s-9v zIYc&Itcht9>w{mA0?gK5CiU#|%cPOOhRUvx1rD!=+i7oKvb^c#hT4^DUcsQvo6ink zA^F5RfnB&l<`ZuoD;^>n*zbnOu6AHg%CELvH7CNKyfXQq6rLo3%UT&1HN!z4( z5|WM?It(6z=gimQZgKbNWuhV~r~e>q6gHl!6K>PneV@>!bZK7(Jx^YT+8PXNb*xFC z&#)x|o&E3-pb}(6u|(6@B!Sv2ua~}js~d_>4ICed4GPr7=dWa{NM%t2qCp2@Gi?W- zpnCKynuq3~Y7{`vBRfzC^mN&CiL1E(ZzISrHYB%HfeKMBav>)g1C@{<3AIZ+IUZ59 z4hrPs)D40WLc_wOzUjyd;%Y+Us6L1aYC_9VD@p~3oAgKgut~#ENa;P3ya|KGK-Q!@ zFe#6HxJk+>dsMDG9h5CW=dT1cX>9Pxk3=$h3n%soJnv%CUTU zDL>(nUu1w8?1Rmc!)gFUbq_SKyC#||COpRaE!4>>&D4{`_1DaF0TGk3z*{dSV#E{$ zroF1r`OK0+W&NB&E3kQ*fr4V*o?;doT^Nf_Gw6rL(&awU1Vj@{uct-WqzCKiuiW&E zr94^7%<;2b4!C&tvBA~!CH;jCdc+deG9iP$eacwf-a)VPDV=#K&v>7SR1|>`$nh6`rIei8;pyC{f)=Dd!u4 zWZ>mzb>KV4)8BE zrNn$fHp!=?Skxu4UM5ds?K|W;>#XWo0bf~JMRlOO!dG3+-gSs`*mF+t2^MsS8LY)A zIk4D2E4(tWCzaE zff?D=Rn@*=ad1|kDpkF#}!gRY-A)0Sp3ghJ`@D=D8?yY69HN8Q3w **Importer un fichier...** +3. Naviguer vers `scripts/modules/mod_FormBuilder.bas` +4. Cliquer **Ouvrir** + +### Etape 3: Executer le generateur + +1. Dans l'editeur VBA, appuyer sur `Ctrl + G` pour ouvrir la fenetre Execution +2. Taper: `BuildAllForms` +3. Appuyer sur `Entree` +4. Attendre le message "Tous les formulaires ont ete crees!" + +### Etape 4: Verifier + +1. Fermer l'editeur VBA (`Alt + Q`) +2. Dans le panneau de navigation, section **Formulaires** +3. Vous devriez voir: + - frm_Accueil + - frm_Clients + - frm_Projets + - frm_SaisieTemps + - frm_Historique + +### Etape 5: Definir le formulaire de demarrage + +1. Menu **Fichier** > **Options** +2. Section **Base de donnees active** +3. **Afficher le formulaire**: selectionner `frm_Accueil` +4. Cliquer **OK** + +--- + +## Alternative: Creer les formulaires manuellement + +Si le module ne fonctionne pas, suivez le guide complet dans `docs/FORMS_GUIDE.md`. + +--- + +## Formulaires crees + +| Formulaire | Description | Source | +|------------|-------------|--------| +| frm_Accueil | Menu principal avec stats | Non lie | +| frm_Clients | CRUD clients | tbl_Clients | +| frm_Projets | CRUD projets | tbl_Projets | +| frm_SaisieTemps | Saisie rapide | tbl_Temps | +| frm_Historique | Vue historique | Requete jointure | + +--- + +## Fonctionnalites + +### frm_Accueil +- Titre et sous-titre +- 4 boutons de navigation +- Statistiques en temps reel (clients, projets, heures) + +### frm_Clients +- Affichage: Nom, Email, Telephone, Notes +- Boutons: Nouveau, Supprimer, Retour +- Navigation entre enregistrements + +### frm_Projets +- ComboBox pour selectionner le client +- Champs: Nom, Taux horaire, Actif, Description +- Boutons: Nouveau, Supprimer, Retour + +### frm_SaisieTemps +- Mode DataEntry (saisie uniquement) +- ComboBox projet avec "Client - Projet" +- Date par defaut = aujourd'hui +- Bouton "Enregistrer + Nouveau" + +### frm_Historique +- Vue Feuille de donnees (lecture seule) +- Colonnes: Client, Projet, Date, Duree, Montant, Description +- Total heures affiche dans l'en-tete + +--- + +## En cas d'erreur + +### "Erreur de compilation" +- Verifier que les 6 modules VBA sont presents (mod_Config, mod_Navigation, etc.) +- Les fonctions appelees (OpenFormClients, etc.) doivent exister + +### "Formulaire deja existant" +- Le script supprime automatiquement les formulaires existants avant de les recreer + +### "Impossible de creer le controle" +- Fermer tous les formulaires ouverts +- Reessayer + +--- + +## Contact + +Alexis Trouve - alexistrouve.pro@gmail.com diff --git a/scripts/forms/frm_Accueil.txt b/scripts/forms/frm_Accueil.txt new file mode 100644 index 0000000000000000000000000000000000000000..27f36fc031c305a3d3a41d16027b4ca59bf55cdc GIT binary patch literal 2976 zcmb`JTTk0S5QXQtQvXB5b5%Ly{?G>~g(6WvBn9;`#3rDIKodjDpKtq}-K^}5NeESC z+3R>`&di*-Z2tT{x6EcXw;Q{&snzU*ZCl;m+8c{^&XD_I56I1UOBa%flRV}7rA^qI z+qIq8z2zl5kM@zB%trPdnFqUd`W;KGV{M*^HL%-qXuHUb(U&*-cr`;>{?r!N9(#}6 zsgoJoky|rx<$cYL(aCKOlq(xzYr?Ox{tjOz$ozCNihPVM`8Q-8qqiwiY~viH3{-jH zc?lj5K)!UI42fo+U$@9k?CBZVQ+7sp{NQ+&uin2~u%~?Y87jxK2VTxC?lZ334$u`p z(w*{UZsJt&i8nDSlt#o#(D~-}>Prz^IJ_JTX|}D$)r|D3UMP3+_%pT@!}Y@Z`l7x9 zJ7-I~9qV$%4DPy|<~&2?G^rL}F9E0OL5Qi~;Ufsjy=R~f!Zy(~h(>i-W>xh*vOba{ z>csP2b3FRmEXxKD68i;C%6-Y*;@RVF@!kck4P$XspWr8rtRC1`JH(z?-o)A!HQt2J zF6eEZ4eZEf$|`F;zRDN%wE9cTw%pf*ola!C>dmpM)XcuH-f!$vg7kba;p5sS(iOOtpjJ( z$TX3>r&DnBw#%xyUhS=(tGgaC#JyETUDv6q+$s~|EVltM^s%mZG#@vKAox3giHv!Y zl{`Om9huR`RV2-znd__>c3;wsr)wb}Dr21`f9ho$Sc$W}IyZ&=B1`K$SdHZCNApDt z_2}>SOEs$Vw@*zxI%WsVvkS-8l)0vA)LA%T&)0WcZ^hYP?zm8m#cmA?n$O{X#&gm^ zYx(@q{L|cDrxW+B&Uu}%>e9G#gN?AhW_|~quCOum8{ogz8|Qzm+yIP2^*9dk|g zM#yv)zejGyrf}LtdR