Apprentissage‎ > ‎

Ma cave à vin

Un cas pratique complet et détaillé pour débutant (un grand cru 2003 [1]).

L’analyse

Une cave est constituée de bouteilles. Une bouteille de vin est référencée de la manière suivante : 

  •  le cru : c’est la dénomination du vin :
  •  le millésime : année de la récolte
  •  l’appellation : indique la provenance et la méthode de récolte
  •  la couleur : rouge, blanc, rosé....
  •  la région : région de provenance
  •  le cépage : variété de plan de vigne cultivé
  •  la quantité : nombre de bouteille identiques
  •  l’appréciation : vos commentaires

Création d’un écran de saisie

L’analyse nous a permis de définir les champs nécessaires.

Créons d’abord la table mycave dans la Vue des requêtes :

create mycave (cru, millesime, appellation, couleur, region, cepage, quantite, memo)
key(cru, millesime, couleur)

Note : Les champs ne supportent pas les caractères accentués. Le contraire de create est drop.

Vous pouvez visualiser votre table (vide pour le moment) en exécutant :

mycave

Créons ensuite l’accès à la table dans la Vue des bibliothèques :

Exécutez Nouvelle bibliothèque / Nom : cavelib, dans l’arborescence de gauche, et à l’intérieur de celui-ci créez un nouvel élément My_CaveAccess, qui comportera le code suivant :

#(Access mycave
        title: "Ma cave à vin"
        (cru group:0) (millesime group:1) (quantite group:2) nl
        (appellation group:0) (couleur group:1) nl
        (region group:0) (cepage group:1) nl
        (memo group:0)nl
        )

Le titre (title) apparaîtra dans l’application. Les chiffres 0,1 et 2 indiquent l’ordre d’affichage dans la ligne et nl indique le changement de ligne.

Contrôlez le résultat dans l’Espace de travail en exécutant :

Window(My_CaveAccess)

Il nous faut maintenant soigner la présentation, et pour cela, dans la Vue des bibliothèques, créer un nouvel élément Field_appellation, qui comportera le code suivant :

Field_string
        {
        Prompt: 'Appellation'
        Control: ('Field' width: 20)
        Format: (Text width: 20)
        }

Les autres éléments se créent de la même manière :

Field_cepage

Field_string
        {
        Prompt: 'Cépages'
        Control: ('Field' width: 20)
        Format: (Text width: 20)
        }

Field_couleur

Field_string
        { Prompt: 'Couleur'
         Control: ('Field' width: 20)
         Format: (Text width: 20) }

Field_cru

Field_string
        {
        Prompt: 'Cru'
        Control: ('Field' width: 20)
        Format: (Text width: 20)
        }

Field_memo

Field_string
        {
        Prompt: 'Appréciations'
        Control: ('Field' width: 47)
        Format: (Text width: 20)
        }

Field_millesime

Field_number
        {
        Prompt: 'Millésime'
        Control: (Number, mask: "####")
        Format:        (Number, mask: "####")
        }

Field_quantite

Field_number
        {
        Prompt: 'Quantité'
        Control: (Number, mask: "####")
        Format:        (Number, mask: "####")
        }

Field_region

Field_string
        {
        Prompt: 'Région ou pays'
        Control: ('Field' width: 20)
        Format: (Text width: 20)
        }

Contrôlez le résultat dans l’Espace de travail en exécutant :

Window(My_CaveAccess)

et faites quelques essais de saisie.

Création d’un état

Il existe naturellement un générateur d’états très complet. En effectuant la saisie, vous avez surement vu le bouton Tous, en bas à droite, qui permet d’accéder au générateur d’états et aussi de créer un tableau croisé, d’importer ou exporter les données... Ici nous allons créer un état prêt à l’emploi en quelques lignes de code.

Il nous faudrait une liste d’inventaire de la cave triée par couleur et par année avec des totaux sur les quantités. Et un total général sur les quantités, bien sur.

Cave_Inventaire

#(Params
        title: "Inventaire de ma cave"
        name: "Cave_Inventaire"
        QueryFormat
                {
                Query()
                        {
                        return "mycave sort couleur, millesime"
                        }
                Output:
                        #(Row cru, millesime, couleur, quantite, appellation, region, cepage)
                Before()
                        {
                        return Object("Text", "Trié par couleur et par millésime")
                        }
                Before_couleur_num(data)
                        {
                        return #(Hline)
                        }
                Before_millesime(data)
                        {
                        return #(Horz  // Thanks to Jeff Ferguson
                                (Text, "Couleur: ")
                                (couleur query: "couleurs", numField: "couleur")
                                (Text, "Millésime: ")
                                (millesime))
                        }
                Total: (quantite)
                After_couleur(data)
                        {
                        return #(_output
                                quantite: (Total "total_quantite"))
                        }
                After(data)
                        {
                        return #(_output
                                quantite: (GrandTotal "total_quantite"))
                        }
                AfterAll()
                        {
                        return Object("Text", "Signature de l'inventoriste :")
                        }
                }
        )

et pour apporter la touche finale ajoutons la fonction PageHeadName qui permettra de personnaliser l’en-tête du livre

PageHeadName

function ()
{ "Ma Cave à Vin" }

Admirez le résultat dans l’Espace de travail en exécutant :

Window(Cave_Inventaire)

Faites un test en prévisualisation ou PDF/Exporter un fichier avant d’imprimer.

Création d’un livre

Dans Espace de travail / IDE / Editer un livre / Nouveau Livre indiquez le nom du nouveau livre : cavebook. Choisissez Nouvel élément pour créer les pages :

la page Saisie :

My_CaveAccess

la page Edition :

Cave_Inventaire

la page Aide :

<h1>Ma cave à vin</h1>

<p>Un logiciel pour gérer sa cave à vin.</p>

<p>Une bouteille de vin est référencée de la manière suivante :<br>
- le cru : c'est la dénomination du vin<br>
- le millésime : année de la récolte<br>
- l'appellation : indique la provenance et la méthode de récolte<br>
- la couleur : rouge, blanc, rosé....<br>
- la région : région de provenance<br>
- le cépage : variété de plan de vigne cultivé<br>
- la quantité : nombre de bouteille identiques<br>
</p>

<h3>SuneiDojo
<font color="#D42D1B">Votre guide de découverte de Suneido sur</font>
<a href="http://suneidojo.free.fr/">http://suneidojo.free.fr/</a></h3>

Admirez le résultat dans Espace de travail / IDE / Ouvrir un livre / cavebook

Variante : présentation classique avec des menus

Oui, il est absolument possible de présenter son application d’une manière classique.

Dans la Vue des bibliothèques / cavelib créons un nouvel élément Cave_Menu :

// (Controller
        {
        Title: "Ma Cave à Vin - Présentation classique avec des menus"

        On_Bouteille()
        {
        Window(My_CaveAccess);
        }

        On_Inventaire()
        {
        Window(Cave_Inventaire);
        }

        On_A_propos_de()
        {
        Window( #( Vert
        ( Static
"SuneidDojo http://www.suneidojo.free.fr/"
                        ))) ;
        }
        On_Livre()
        {
        BookControl("cavebook", title ="Ma Cave à Vin - Présentation sous forme de livre");
        }

        Menu:
                (
                ( "&amp;File",
                        "&amp;Bouteille","","&amp;Exit")
                ( "&amp;Print",
                        "&amp;Inventaire")
                ("&amp;Help",
                        "&amp;A propos de...", "&amp;Livre" )
                )
        Controls:
                ( Vert
                        Editor )

        })

Notes : Les libellés en anglais du menu sont traduits par translatelanguage. Vous pouvez éventuellement compléter les traductions pour obtenir une application avec des menus multilingues. Exit est une fonction du Controller qui déclenche la fermeture de la fenêtre. Pour que notre libellé de menu Bouteille déclenche une action, on utilise une méthode On_Bouteille (préfixeOn_+libellé) pour définir notre action. La méthode doit être déclarée avant le menu. Dans le cas de A propos de...., la méthode s’appelle On_A_propos_de, car ni les espaces ne sont admis, ni les points. Un espace à blanc nous donne un trait de séparation dans le menu.

Contrôlez le résultat dans l’Espace de travail en exécutant :

Window(Cave_Menu)

Création d’un raccourci de démarrage

C’est mieux avec un raccourci sur le bureau. Pour démarrer sur le menu, ouvrez le bloc-note et saisissez :

Use ("cavelib") ; Window(Cave_Menu, exitOnClose:)

ou pour démarrer sur le livre :

Use ("cavelib") ; Window (#(Book cavebook, "Ma Cave à Vin")

Sauvegardez le fichier sous le nom de caveappli dans le répertoire de Suneido. Enlevez l’extension .txt qui nous gênerait. Créez un icône sur le bureau d’un clic droit Nouveau / Raccourci, puis Parcourir, avec en ligne de commande C :\Suneido\suneido.exe caveappli, cliquez sur suivant et changez le nom de suneido.exe par "Menu de Ma Cave à Vin" et validez sur Terminer.

Distribution de son application

Il faut obligatoirement créer un nouveau répertoire, par exemple, SuneidoCave et y copier les fichiers : 

  •  suneido.exe et suneido.db impérativement
  •  libhpdf.dll Haru Free PDF pour les exports en pdf
  •  SciLexer.dll Scintilla qui permet à celui qui clique directement sur suneido.exe de démarrer et d’examiner le code ; c’est le principe du logiciel open source qu’il est préférable de respecter.

Il ne nous reste plus qu’à compresser les fichiers et à indiquer à l’utilisateur de créer un icône de raccourci avec dans propriété la cible "C :\SuneidoCave\suneido.exe caveappli". Note : il est possible d’alléger suneido.db en supprimant suneidoc. Pour cela dans la Vue des requêtes et exécutez :

drop suneidoc

et n’oubliez de récupérer la place perdue en compactant la base de donnée :

C:\SuneidoCave\suneido -compact

Attention : il est impératif de travailler dans un répertoire à part ! Car si vous remplacez votre suneido.db de votre répertoire suneido, vous écraserez purement et simplement le travail que vous avez effectué jusqu’à présent. Par principe, pour chaque projet, installez un suneido tout neuf dans un répertoire explicite. Vous occuperez 10 Mo environ : vous pouvez vous le permettre.

Distribution professionnelle de son application avec Inno Setup

Si vous avez la prétention de diffuser votre application de manière professionnelle, ou si vous désirez simplement faciliter la tâche à un ami novice en informatique, n’hésitez pas et utilisez Inno Setup qui est un installateur/désinstallateur gratuit de programmes windows à télécharger sur jrsoftware.

Lancez Inno Setup et ouvrez un nouveau fichier avec File/New et utilisez Wizard l’assistant. Sauvegardez le script sous le nom de Cavavin.iss dans le répertoire SuneidoCave. Créez également avec notepad un fichier texte licence.txt qui contiendra les mises en garde d’usage. Le répertoire SuneidoCave contient maintenant les fichiers :

  •  suneido.exe, suneido.db,libhpdf.dll et SciLexer.dll
  •  Cavavin.iss et licence.txt Compilez avec File/Compile (CTRL+F9) puis exécuter avec Run/Run(F9) pour tester l’installation et la désinstallation. Dans le Répertoire SuneidoCave, il existe maintenant un sous répertoire output contenant le fichier d’installation setup.exe qui contient les fichiers compressés. Renommez le en MaCaveaVin.exe et distribuez le à vos clients ou à vos amis.

Note : Inno Setup est un logiciel très sophistiqué et je vous invite très vivement à consulter sa documentation pour l’exploiter au maximum.

Sources

Si vous êtes pressés ou perdus, (si, si, ça arrive, même aux meilleurs) , téléchargez MaCave.zip, contenant les fichiers de cette application.

Pour les utiliser, vous devez au préalable les copier dans votre répertoire Suneido, puis tapez ce qui suit dans la ligne de commande que l’on obtient avec démarrer/exécuter ou Touche Windows+R.

c:\suneido\suneido -load cavelib
c:\suneido\suneido -load mycave
c:\suneido\suneido -load cavebook

Il faut mettre en service la bibliothèque cavelib dans la IDE/Vues/Vue des bibliothèques / Fichier/Utiliser une bibliothèque / Nom : cavelib Puis dans Espace de travail / IDE / Ouvrir un livre / cavebook admirez le résultat. Vous pouvez même créer le raccourci de démarrage comme indiqué ci-dessus.

Notes

[1] à consommer avec modération, l’alcool nuit à la santé et la consommation régulière d’alcool crée une addiction

haut de page