lundi 17 décembre 2012

Error(s) occured while starting Wakanda Server

Eh ! Zut, voilà ma première error à la noix de coco....
 Cela faisait plusieurs jour que je n'ai pas touché mon petit projet et vlan ! en essayant de le redémarrer aujourd'hui, the error de je n'y comprend rien....


Que faire, je cherche les logs.... bah pas grand chose d'interressant, j'essaye de remplacer la base de données (enfin les fichiers) par une copie (un backup).... Pas mieux..... :-(

Je relance Wakanda Studio...... bah non (même en ayant re sauvegarder le modèle de données)

Je tante de lancer le serveur de manière indépandante, puis je lance Wakanda Studio, et là j'ai une fenêtre qui s'affiche en demandant si je veux utilisé le serveur déjà en cours :

Eh ben parreille ..

Dans mon désespoirs je supprime les fichiers de données (la base)...... Pas mieux toujours le même message....

Comment faut faire pour que cela remarche  ???? .....

Un peu plus de log

Pour info le répertoire de log qui contient les log (coté serveur) est :

$BASE_DIR/<solution name> Solution/Logs

Et dans ce fichier de log j'ai :
2012-12-17 12:20:52 [com.wakanda-software.LAmiOeufs] INFO - Opening the solution
2012-12-17 12:20:52 [com.wakanda-software.LAmiOeufs] INFO - Opening the users and groups directory
2012-12-17 12:20:52 [com.wakanda-software.LAmiOeufs] INFO - Users and groups directory opened (duration: 14 ms)
2012-12-17 12:20:52 [com.wakanda-software.LAmiOeufs.LAmiOeufs] INFO - Opening the project
2012-12-17 12:20:52 [com.wakanda-software.LAmiOeufs.LAmiOeufs] INFO - Opening the database
2012-12-17 12:20:52 [com.wakanda-software.LAmiOeufs.LAmiOeufs] FATAL - Failed to open database (duration: 306 ms)
2012-12-17 12:20:52 [com.wakanda-software.LAmiOeufs.LAmiOeufs.dbmg] ERROR - [1020] Wrong field reference in database Model
2012-12-17 12:20:52 [com.wakanda-software.LAmiOeufs.LAmiOeufs.dbmg] ERROR - [1532] The datastore model cannot be loaded for database "Model"

2012-12-17 12:20:52 [com.wakanda-software.LAmiOeufs.LAmiOeufs.dbmg] ERROR - [1024] Cannot open structure of database Model
2012-12-17 12:20:52 [com.wakanda-software.LAmiOeufs.LAmiOeufs.iasv] ERROR - [1035] Cannot open the database
2012-12-17 12:20:52 [com.wakanda-software.LAmiOeufs.LAmiOeufs.iasv] ERROR - [1035] Cannot open the database
2012-12-17 12:20:52 [com.wakanda-software.LAmiOeufs.iasv] ERROR - [1013] Cannot open 'LAmiOeufs' project
2012-12-17 12:20:52 [com.wakanda-software.LAmiOeufs.LAmiOeufs] INFO - Closing the project
2012-12-17 12:20:52 [com.wakanda-software.LAmiOeufs.LAmiOeufs] INFO - Project closed (duration: 0 ms)
2012-12-17 12:20:52 [com.wakanda-software.LAmiOeufs.dbmg] ERROR - [1020] Wrong field reference in database Model
2012-12-17 12:20:52 [com.wakanda-software.LAmiOeufs.dbmg] ERROR - [1532] The datastore model cannot be loaded for database "Model"
2012-12-17 12:20:52 [com.wakanda-software.LAmiOeufs.dbmg] ERROR - [1024] Cannot open structure of database Model
2012-12-17 12:20:52 [com.wakanda-software.LAmiOeufs.iasv] ERROR - [1035] Cannot open the database
2012-12-17 12:20:52 [com.wakanda-software.LAmiOeufs.iasv] ERROR - [1035] Cannot open the database
2012-12-17 12:20:52 [com.wakanda-software.LAmiOeufs] INFO - Closing the solution
2012-12-17 12:20:53 [com.wakanda-software.LAmiOeufs] INFO - Solution closed (duration: 454 ms)



Résolution du problème.... to be continued !

Un poste en court sur le forum : http://forum.wakanda.org/showthread.php?3669-Error%28s%29-occured-while-starting-Wakanda-Server

The solution :

Eh bien c'est de ma faute...
J'ai voulu faire bien en utilisant la possibilité de supprimer dans des Classses de données dérivées les champs apparament pas utile....
Dans mon cas j'ai une classe de données Captions, que je l'ai dérivée en CmdStatus qui est un sous ensemble de Captions pour tout les statuts d'une commande.
Dans la classe de données CmdStatus j'ai ajouté une requête de restriction pour uniquement retourner les lignes ayant une valeur spécifique dans le champs "type"... Et comme ce champ n'est pas utilisé coté GUI (vu que c'est ce dernier qui permet d'indiquer la nature de la classe (notament la dérivée)).
Mais voilà, en utilisant la possibilité de "supprimer" certain champs de la classe mère, cela les rend innaccessible coté classe dérivé (y compris pour la fameuse requête de restriction...) d'où le plantage au décollage de la base de données....

Ouf je n'ai rien perdu, et appris encore un peu...


mardi 11 décembre 2012

Trigger ? oui Event (et methode d'entité)

Voilà un autre petit thème à propos des classes de données.

L'idée ici est réaliser l'équivalent d'un trigger dans Wakanda, par exemple si nous avons une relation 1->N entre deux classes de données, et que la suppression d'une entité de la première implique (règle de gestion) la surpression des entités liées dans l'autre classe. Habituellement ce type de règle de gestion est réalisée via un trigger, qui lors de la suppression de la ligne déclenchera une ou plusieurs instructions pour nettoyer l'autre table.

Imaginons que nous ayons un morceau de modèle de données comme ci dessous








Dans ce modèle de données nous avons une classe de données qui représente les commandes "Commande" et une classe de données qui représente les lignes de la commande "CmdLigne".
La règle de gestion que nous souhaitons ajouté est la suivante :
Si je supprime une commande, alors il faudra supprimer toutes les lignes associées à cette commande
Pour faire ceci en Wakanda, je propose d'abord de créer une méthode de classe qui s'applique aux entités. Cette méthode de classe devra remplir la fonction de suppression des entités "CmdLigne" associées à l'entité de "Commande" (ceci est implicite du faite que la méthode de classe s'applique aux entités de la classe de données "Commande").

Ajout d'une méthode de classe s’appliquant aux entités

Dans la fenêtre de données, localisez votre classe (ici ce sera "Commande") et cliquez sur le petit plus (+) vert en face de Methods.

Puis sélectionnez "Applied to an Entity"

Puis dans l'espace nom saisissez "deleteCmdLigne"

Une fois validé, cliquez sur l'icône d'édition à droite du nom de la méthode.

Dans l'éditeur vous allez pouvoir saisir le code permettant de supprimmer les entités de la classe de données "CmdLigne" :

deleteCmdLigne:function()
{
           
  console.log("Model.Commande.deleteCmd(%s)", this.ID);
                                                               
  // Récupère la liste des lignes de commandes à supprimer
  var listLigne = this.cmdLigneCollection;
               
  if(listLigne == null)
      console.log(".. listLigne is null")
  else
    {
      console.log(".. Nombre Ligne Cmd a supprimer : %s", listLigne.length);
      // supprime la collection
      listLigne.remove();
    }               
}


La première instruction (var) récupère la collection des lignes de commande associée à cette commande, le this étant l'entité de la commande sur laquelle nous travaillons (et qui va être supprimée). Ici le nom cmdLigneCollection correspond à l'attribut qui a été automatiquement généré lorsque j'ai créé la liason 1->N entre la classe de données "Commande" et la classe de données "CmdLigne". Ceci est très pratique car pour obtenir l'ensemble des lignes de commande associées à une commande il suffit d'appeler cette propriété (c'est cool ;-) ).

Ensuite il y a un petit test qui est fait sur le retour juste pour l'exemple, mais dans le cas où j'ai bien un objet en retour, ce sera une collection d'entité de la classe de données "CmdLigne".
Il ne reste plus qu'à supprimer toutes ces entités en appelant la méthode .remove() sur cette collection.

Wouah! C'est simple... j'aime bien :-) !

Ok, nous avons maintenant une méthode que nous pouvons appeler pour supprimer les lignes de commandes associées à une commande précise... Maintenant il faut détecter le moment où le système souhaite supprimer une entité de la classe de données "Commande"...

Ajout d'un événement OnRemove sur la classe de données "Commande"

Pour détecter une suppression à la manière d'un trigger il faut utiliser les événements associables à la classe de données. Et dans le cas de la suppression c'est "On Remove" :

 Pour cela sélectionnez votre classe de données puis dans la partie droite de l'éditeur, cliquez sur le bouton "Events" puis le petit plus vert en face de "On Remove".

Dans l'éditeur il est maintenant possible d'ajouter le code suivant pour appeler notre fonction .deleteCmdLigne() précédemment créée :

onRemove:function()
{
    var error = {error: 0, errorMessage: ''};                
   
    // Vérification de l'état avant suppression
    // pour supprimer une commande il faut qu'elle soit dans l'état "Créée, Clos ou Abandonnée"

    if (this.isDeletable())
        this.deleteCmdLigne()
    else
        error = {error: 101, errorMessage: 'La commande doit être annulée avant suppression'};
       
    return error;
}


Dans le code ci-dessus le point le plus important étant l'appel de la fonction .deleteCmdLine() à l’intérieur du if, le reste correspond à la vérification d'une autre règle de gestion liée aux statuts des commandes, dans mon projet une commande n'est supprimable que dans les états "Créée, Clos ou Abandonnée" j'ai donc implémenté une autre méthode .isDeletable() applicable aux entités qui me retourne un boolean en fonction que la commande en cours est supprimable ou pas.

J'aime bien l'approche de pouvoir créer des méthodes de classe de données applicables aux entités, comme cela nous n'avons pas à transmettre l'ID des entités en paramètre de ces fonctions que nous souhaitons utiliser sur une entité (merci l'objet). Cela permet aussi d'avoir une meilleur décomposition du code et donc une maintenance aisée. Bien évidement tout le code qui a été mis dans la fonction pourrait être directement ajouté au niveau du code associé à l'événement On Remove. Mais peut être que cela sera moins pratique si vous avez de nombreuses règles de gestion à traiter sur la suppression d'une commande.




lundi 10 décembre 2012

Comment ajouter des données à une classe de données "manuellement"

Dans ce poste je vais exposer un petit point qui m'a pris un peu de temps avant de le résoudre complètement :

Comment ajouter une entité (cad une ligne de données) dans une Classe de données (ie: une table) de manière programmée (cad sans utiliser les fonctions helper du widget Datagrid). De plus dans l'exemple ci dessous, il y a une notion de lien (utilisation de référence sur d'autre classe de données).

Le modèle de données

Voici rapidement le modèle de données utilisée :

L'idée de ce modèle (tiré de ma première vrai application en Wakanda) est de générée une commande type (qui est unique dans le système), et une commande type est un ensemble de ligne liant un membre (classe de données "Membre") et un article (classe de données "Article"). Cette liason sera réalisée dans la classe de donnés "CmdType"

La classe de données  "CmdType" contient donc un référence aux classe "Membre" et "Article"

L'interface Graphique

Voici maintenant l'écran qui permet d'éditer le contenue de la Classe de données "CmdType" :


Cette écran est divisé en 3 parties :
  • La partie du haut qui est un DataGrid connecté à une source de données correspondant à la classe de données "CmdType"
  • La partie bas gauche qui permet de choisir un membre dans la liste des membre disponible via un DataGrid connecté à une source de données correspondant à la classe de données "Membre", puis un article dans la liste déroulante (connecté à la source de données correspondant à la classe de données "Article"), et enfin un slider qui permet de définir le nombre d'unités désiré. Le bouton ajouter contiendra le code qui créera la nouvelle entité de la classe "CmdType".
  • La partie bas droite qui permet de générer une commande en fonction d'une date de livraison.

Le code du bouton ajouté

Mon problème a été de choisir les bonne fonction entre addNewEntity(), newEntity() etc...

Je suis arrivé au code suivant :

btnAddArticle.click = function btnAddArticle_click (event)
{
// Ajout d'une ligne dans la commande type

var tMemberID = sources.membreList.getCurrentElement();
var tArticleID = sources.articleList.getCurrentElement();

var newCmdLine = ds.CmdType.newEntity();

if (newCmdLine == null) alert("newCmdLine is Null !!!");

newCmdLine.qte.setValue($("slNbUnite").getValue());
newCmdLine.membreID.setValue(tMemberID);
newCmdLine.articleID.setValue(tArticleID);


newCmdLine.save({
          onSuccess:function(event)
          {
               sources.cmdType.addEntity(newCmdLine);
               sources.cmdType.serverRefresh();
          },
          onError:function(event)
          {
               alert("Erreur !");
         }
     });

};



Les deux premières lignes permettent la récupération des références sur le membre sélectionné et l'article.
Ensuite nous devons créer une nouvelle entité ds.CmdType.newEntity(), lors de la première tentative j'ai voulu utiliser cette version source.cmdType.addNewEntity(), le propblème c'est que je ne pouvais pas modifier les informations concenrant les références sur l'article et le membre.

Les trois lignes suivantes hormis le if, permettent de modifier les attributs de l'entité nouvellement créée.
Ensuite vient la fonction .save() qui permet donc de sauvegarder l'entitée nouvellement créée.

Si nous nous arrêtons là, cela fonctionne correctement, mais il est nécessaire de faire un <F5> dans le browser pour que la grille de données soit rafraîchie avec les nouvelles données.

Pour faire le rafraichissement, j'ai bien tenté d'utiliser la commande .sync(), mais cette dernière ne fonctionne que sur des données locales et dans le code ici nous avons ajouté notre entité sur le serveur (ceci est du au faite de l'utilisation de ds à la place de sources). Donc la première chose à faire est d'ajouter notre nouvelle entité à la collection en utilisant la fonction .addEntity(<nouvelle entité>) puis de demander un rafraichissement de la fenêtre utilisateur via le commande .serverRefresh(). Ces deux fonctions s'appliquent sur la source "locale" (sources).




mardi 4 décembre 2012

Histoire de code s'exécutant coté serveur

Ah cela faisait un petit bout temps que je ne suis pas venu écrire un petit morceau ici....

Et bien voilà je profite de l'occasion d'avoir élucider un petit truc hier à propos de l'exécution de code coté serveur. En effet pour ceux qui ont un peu bidouillé Wakanda, il est possible de faire tout un tas de script coté Client, via les événements associés au widget que l'on a soigneusement déposé sur la page. Mais voilà qu'un cas m'a ammené à réfléchir où allais je mettre le code, je l'expose brievement ici :

L'idée est de générer un ensemble de lignes dans une nouvelle classe de données à partir d'information stockées dans une autre classe de données. Et ceci sera déclanché par l'utilisateur en cliquant sur le bouton "Générer".
A partir de là deux options se présentent :
  1. J'écris tous le code dans le "OnClick" du bouton
  2. J'écris le code dans un fichier qui sera exécuté coté serveur
La première solution est facile, rapide, mais je pense qu'il y aura trop d'impact réseaux, en effet les données risquent de faire des "va et vient" entre le client et le serveur, et si plus tard nous souhaitons limiter l'exposition des données coté client, cela ne sera plus possible puisque nous devrions les manipuler du coté client....
Donc la logique pousserait plutôt dans le choix de la seconde methode....

Mais comment fait on ceci ?, alors voici un petit exemple ;-) ! :

Pour l'exemple je vais reprendre la solution démo que j'ai commencé précédament:

Paramétrage de l'interface

Édition du style de la grille de donnée:

Nous allons aligner notre grille de données ( dataGrid1) en haut en s'ajustant à 10 points de chaque bord (sauf celui du bas).

  1. Cliquez sur l'édition de la page (pgArticle),
  2. Cliquez sur le widget 
  3. Dans la parie de droite sélectionnez "Style"





Et saisissez les valeurs suivantes :


Sauvegardez







Ajout d'un bouton

Ajoutez un bouton à l'interface :

Ouvrir la page de scirpt associé à l'évènement "OnClick"

A partir de cette endroit il est possible d'ajouter du code :

WAF.onAfterInit = function onAfterInit() {

// @region namespaceDeclaration
    var btnAdd = {};    // @button
// @endregion

// eventHandlers


    btnAdd.click = function btnAdd_click (event)
    {
        alert("J'ai cliqué sur le bouton ;-) !!!");
    };

// @region eventManager
    WAF.addListener("btnAdd", "click", btnAdd.click, "WAF");
// @endregion

};


Seule la partie colorée en orange a été ajoutée, le reste est auto-généré par l'édietur

Le test :

Exécuter la page en cliquant sur le bouton "Flèche verte/Page blanche"  et cliquez sur le bouton:

Ajout d'un module JS (code coté serveur)

 Un module JS consistera en un page de code dans laquelle nous allons exposer des fonctions qui seront (moyennement un petit paramétrage) accessible coté client.

Création d'un moduleJS

Dans cette exemple nous utiliserons le "Mode RPC" (Remote Procedure Call).
Ensuite une fenêtre avec un exemple de code apparait, peur ceux qui parlent l'anglais allez voir le lien proposé c'est encore la meilleur source d'information : par ici.

Pour les autres j'espère que je serais assez claire...

Structure d'une fonction appelable depuis le client

Si nous regardons de plus prêt le code, nous constatons que nous définissons une fonctions qui sera affecté à une variable du type : exports.<nomDeMaFonction>, voici l'exemple proposé en standard :

exports.helloWorld = function helloWorld () {
    return ('Hello world');
  
};


Notez au passage qu'aucun type n'est nécessaire pour les arguments de fonction (ici il n'y en pas de toute façon) ou pour les information de retour. Je pense que le mode string sera le plus simple.

Ajout de notre fonction AjouteArticle()


exports.ajouteArticle = function ajouteArticle(nomArticle, codeArticle) {

    try {
        // Log
        console.log("Début de la fonction(après le try)");
       
        var newArticle = 
ds.Article.createEntity();  // Création d'une nouvelle entité
           
       

        // Log
        console.log("Après la création de l'entité nouvelle ID=" + newArticle.getKey());   
        

       
        // Affectation des valeurs aux attributs
        newArticle.code = codeArticle;
        newArticle.nom = nomArticle;
       
        // Log
        console.log("Avant le Save");
       
        newArticle.save(); // Enregistrement de l'entité
       
        // Log
        console.log("Article '%s' ['%s'] a été ajouté ID=%d.", nomArticle, codeArticle, newArticle.getKey());
       
        return "Ok";
    }
    catch(ErrorEvt)
    {
        console.log("ERREUR lors de l'ajout de l'article '%s' ['%s'].", nomArticle, codeArticle);
        return "KO";
    };

};


Utilisation de la nouvelle fonction dans notre bouton

Ajout d'une référence à notre module

Retourner dans l'éditeur graphique de la page pgArticle, puis cliquez dans le fond blanc, ou sélectionnez l'objet "Document" (Partie Gauche > Outline > Document)


Dans la partie de droite (Properties), vous pouvez cliquer sur le petit (+) vers en face de "Module", ceci va nous permettre d'ajouter une référence à moduleJS dans notre page...

Dans notre cas vous choisirez le module pgArticleAction (correspond au nom du fichier que nous avons créé précédament), et vous pouvez par exemple donner le nom "vArticleAction" au namespace. C'est par cet identifiant que nous pourrons appeler notre fonction.

N'oubliez pas de sauvegarder après modification ;-) !

Modification du code OnClick du bouton

Maintenant éditons le code OnClick associé à notre bouton pour utiliser notre code

    btnAdd.click = function btnAdd_click (event)
    {
       
        alert(
            vArticleAction.ajouteArticle("Crêpe au caramel", "CREPECARA")
            );

    };


Puis save....

Test

Affichage de la console (dans la fenêtre de debug) :

Et voilà....

PS: pour voir le résultat dans la grille, il faut faire encore un "F5", cela doit pouvoir s'améliorer ;-) !!!

mardi 27 novembre 2012

Un petit truc rapide sur l'interface REST et les entitées

Au détour d'une présentation (p 37), j'ai aperçu la syntaxe suivante dans un Browser web :

http://127.0.0.1:8081/rest/Article(7)

et ceci retourne la chose suivante dans le Browser :


C'est simple et pratique... la valeur qui est entre les parenthèse à savoir ici 7, correspond à l'ID de l'entité (instance de la classe de donnée de type Article)

Et pour avoir la totale, utiliser la syntaxe suivante :

http://127.0.0.1:8081/rest/Article

Et pour finir le top c'est qu'il y a aussi un explorateur de données accessible par l'adresse suivante :

http://127.0.0.1:8081/walib/dataBrowser/index.html






lundi 26 novembre 2012

Une classe de données dans une page web

 Dans le précédant poste nous avons créer un classe de données, nous avons également vu quelques lignes de code pour jouer avec, et bien il y a encore plus simple....

Wakanda propose un certain nombre de composants d'interface (widget) qui s'utilisent via un Browser web pour manipuler les classes de données, le plus impressionnant de tous à ce moment est la DataGrid, je vous propose donc de faire une petite expérience avec.


Dans le dernier poste nous avions créé une Classe de données Article :

Ajout d'une page a notre projet: 

Maintenant nous allons ajouter une nouvelle page à notre projet Démo, pour cela cliquer dans la bar des bouton sur "New Page" et donnez lui un petit nom :



 Une fois le fichier créé, ce dernier est ajouté dans le WebFolder de votre projet, notez que par défaut une page "index" est créée. Cette dernière est la page par défaut de votre projet.
 Un éditeur de contenue de la page est également apparue dans la partie central de Wakanda Studio,
dans cette fenêtre il sera possible de concevoir votre page web à l'aide des différents Widget proposés.  La liste de ces Widgets devrait normalement augmenter avec la popularité de Wakanda car il est possible d'en créer de nouveau... à suivre... cela me rappelle Delphi et si cela suit la même courbe, ce ne sera que du bon....

 Si nous regardons de plus près l'interface voici ce que nous y trouvons :



 En haut à Gauche la liste des Widget, classer par type :
  • Automatic Controls : qui doivent être les composants avec une logique métier intégrée comme une grille de données avec les fonction d'édition ou un systeme de login complet
  • Form Controls : qui correspondent à décomposant standard d'affichage, avec leurs évènements (On Click, On Double Click) etc
  • Containers/Placeholders : Composant de structuration d'une page, notamment il y a le widget (objet) "Component", mais également le "Container" une sorte de "Div", le Dialog très utile pour afficher des messages bloquants, le "TabView" et l’impressionnant "Matrix"..
  • Les Miscellaneous Controls : Il y a parmis eux le "Canvas" à éxplorer bien sûre ;-), le Menu Bar pour réaliser les menus, etc...
  • Utilities : A explorer
  • External : Composants externes...
En dessous cette partie il y a les Source de données, notez qu'en entête de cette partie d'interface, il y an bouton qui est soit positionné sur "Model", soit sur "Datasources" :

  • En mode "Model" : Cela nous permet d'accéder à nos Classes de Données (que nous avons créer dans la partie "Model" de Wakanda Studio)
  • En mode "Datasource" : Cela nous permet d'accéder aux sources de données déclarées dans notre page. Noter qu'il y a cinq catégories de source de données, nous les explorerons plus tard ;-) !. Dans l'exemple ici, nous allons créer une source de données de type "Datastore Classes"
 Dans la partie droite de l'interface de Wakanda Studio nous avons les propriétés, évènements, Skin et Style de l'objet actif dans l'éditeur. Cette partie nous sera très utile pour jouer sur le comportement ou le paraître de nos composants.

Ajoutons le super composant "Grid" à notre fenêtre :


Pour cela vous pouvez sélectionnez le composant dans la liste, puis le glisser/déplacer dans la partie centrale :

Notons que l'interface nous invite alors à "Glisser/Déplacer" une source de données à l'intérieur de ce composant, essayons donc :



Notez que plusieurs choses ont changé dans votre interface :
Une source de données (Datastore Classes) à automatiquement été créée et ajoutée à votre page.


  1. Le Composant, affiche dynamiquement le titre des colonne en fonction des attribut qui ont été créer dans la Classe de données.
  2. Dans les propriétés du composant nous pouvons noter que la propriété "Source" est associée à l'objet "article" qui est le nom de la source de données de la page créée. La section inférieure contient la liste de colonnes qui ont été ajoutées au composant (par défaut: toutes).

Exécutons la page pour voir ce que cela donne :


 Pour cela il suffit de cliquer sur le bouton "Flèche verte et Page" dans la barre de bouton contextuelle :

Et voilà :

Bon nous verrons que nous pouvons améliorer ce résultat en jouant sur le style et autres...


vendredi 23 novembre 2012

Petit tour autour des classes de données

Les classes de données permettent de stocker des informations de manière persistante. C'est le rôle "Base de données" du framework Wakanda.
Comme c'est une classe et qu'elles sont objets, nous pouvons utiliser le concept d'héritage dessus. Ce point est très intérresant. Dans ce poste je vous propose d'abord de prendre contact avec le "Model".

Lorsque l'on met au point un modèle de données une des choses qui est utile, c'est de stocker la date de création de l'enregistrement et sa date de dernière modification. Ces informations permettront plus tard de développer des algorithmes de traitement différentiel. Par exemple s'il était nécessaire de faire des calculs complexes par regroupement, dans le cas d'un grand nombre de données, balayer l'ensemble des enregistrements pourrait prendre beaucoup de temps. Par contre si nous pouvons uniquement nous intéresser qu'au données qui ont été modifiées que depuis le dernier lancement du calcul cela optimise le temps de traitement.

Exemple de création d'une table dans le modèle de données

L'idée ici va d'être de créer une Classe de données "Article", puis nous allons ajouter le code nécessaire pour maintenir deux propriété de cette classe qui seront :
  • La date de création que nous nommerons : creDate
  • La date de modification qui sera nommé : modDate
Une fois Wakanda studio lancé, créer une nouvelle solution ( New > Solution), donner le nom que vous souhaitez à votre solution (ici : Demo),  puis dans la barre de bouton sélectioner le bouton "Model"

 Automatiquement un classe de données est créée pour vous et se nomme "DataClass1". D'après ce que j'ai lu dans le documents du site Wakanda les conventions de nommages sont les suivantes:
  • Pour les classes de données : Commencer par une majuscule, et pour chaque nouveau mot mettre la première lettre en majuscule. Je vous recommande bien sûre d'éviter tous genre d'accents, espaces, noms réservés. Par exemple : PremierSecondMot
  • Pour les propriétés (ou champs) : la première lettre est en minuscule et pour tout autre mot première lettre en majuscule (comme la convention de nommage Java). Par exemple : nom, dateDeNaissance.
 Pour changer le nom de la classe créée par défaut double cliquer sur son nom et renommer la en "Article". Noter au passage de l'utilisation du singulier. En effet les évangélistes de Wakanda recommandent de réserver le plurielle pour les collections, je ne rentrerais pas dans le détail à ce sujet maintenant, mais ce nom est modifiable dans la fenêtre qui concerne les propriétés de la classe normalement sur la droite :

Vous pouvez noter qu'une première propriété (ou attribut) à été ajoutée à notre classe : ID, ceci sera un nombre qui nous permettra d'identifier de manière unique une "Entité" (une instance) de notre classe.

Maintenant nous allons pouvoir ajouter nos attributs (propriétés) que nous souhaitons utiliser pour définir un article, je propose les champs suivants :
  • code de type caractère et unique : qui sera un identifiant "humain" donc unique et utilisable par nos futur utilisateur. Il jouera le même rôle que l'ID, mais avec un coté plus humain...
  • nom de type caractère : qui sera le nom de l'article.
  • et nos deux dates (creDate et modDate) de type date.
Pour ce faire il suffit d'utiliser le petit bouton (+) en vert en face de "Attributes" :












En suite pour spécifier le type, vous puvez utiliser la touche "Tab" et saisir le début du type, dans notre cas "str..." pour "string".






 Faire de même pour les autres "attributs" :


Et voilà vous venez de créer votre première classe de persistance dans Wakanda (ou première table de données dans le monde traditionnel des base de données).



Maintenant nous allons nous voir comment faire pour utiliser cette classe. Wakanda propose d'utiliser un fichier Java Script qui s'exécutera du coté serveur comme un peu une console.


Création d'un script de test

Dans la barre de bouton cliquez sur "New JS" :

Et à partir de ce point nous pouvons écrire tout sorte de code en Java Script. Dans ce que j'ai peu comprendre des différente vidéo voici que petits trucs pour jouer avec les Classe de données, bien sûre il existe plein d'autre méthodes....

La variable ds :

Cette variable est un objet qui va nous permettre d'accéder à toutes nos classe de données, ds comme dataSource...

En utilisant la méthode des chemin de points, nous pouvons accéder à notre classe "Article", par exemple si je souhaite conaître le nombre d'article enregistré j'écrirais la syntaxe suivante :

var nbEnregistrements = ds.Article.length;

De plus il faut noter que la dernière ligne du script pourra être utilisée pour retournner des information, le système cherchera à l'évaluer comme un printf ou un stdout etc...

Je vous propose d'essayer le petit script suivant :

Si vous souhaitez voir le contenue de la table entièrement, remplacer tous le code par :



Comme nous pouvons le voir dans la dernière copie d'écran, les date n'ont pas été mise à jour... C'est un peu normal vu que nous n'avons encore rien fait....



 Dernier petit truc pour la route : si vous souahitez tout supprimer dans votre nouvelle classe suite à de nombreux test, vous pouvez utiliser l'instruction suivante :

ds.Article.remove();





jeudi 22 novembre 2012

Wakanada Euh... c'est quoi ?


Wakanda Studio est un peu l'EDI qui permet d'editer son "site web" ou plus exactement sont application web. Le principe de Wakanda est JS.everyWhere() qui signifie apprend Java Script et tait toi !
Mais bon, d'un autre coté Java Script est connu... dans le monde du Net, donc cela ne sera pas une perte de temps....
Alors OK Java Script dans mon Webrowser pour faire des applications web, ça me va... mais pourquoi donc everyWhere ? Et bien parce que il n'y a pas que dans le browser que nous allons programmer, mais aussi coté serveur (un peu comme on fait du PHP ou du JSP), et le truc c'est que là aussi c'est JavaScript... héhé vous voyez un peu mieux maintenant !

Et ce n'est pas tout, car le Wakanda Server qui est un peu le "Web Server" customisé (genre qui contient plein de trucs incompréhensibles dedans, mais bon cela nous regarde pas..., on verra ça plus tard), contient un moteur de persistance des données.... N'ayez pas peur... c'est un truc capable de stocker d'une façon logique des informations sur le serveur et les retrouver plus tard.... Ah ça y est là au fond il y en a un qui fait le malin avec Oracle, My SQL, SQL Server.... et son fameux SQL !
Eh bien non !, dans le Wakanda Server, il y a un truc qui appartient à la série NoSQL database... héhé encore un truc tordu....
Alors pour juste effleurer le sujet, les données dans Wakanda serveur sont représentées par des Classes (un objet), et ces classes quand elles sont instanciées (en d'autre mot: créées) cela représente une entité (autrement dit une ligne d'une table dans l'ancien monde des bases de données). Mais comme c'est une classe, et bien nous pouvons y ajouter des fonctions (méthodes) à cette classe qui peuvent donc jouer sur le comportement de la Classe et de ces données !
Devinez quoi, dans quel langage on écrit les fonctions..... eh oui en Java Script !

Et paf, nous y voilà, il y a bien du JS partout : JS dans le front (Webrowser), JS dans le metier (Code du site) et JS dans la base de données.... si vous souhaitez faire du Wakanda, il va falloir aimer le JS.... et c'est bien là où je suis newbie.....

Bref, c'est ultra light comme description, mais ça pose le décore...

Yo! Ca y est je m'y met a Wakanda !

Bonjour à tous !

Bon voilà, un matin je me suis dit que 20 ans de développement en C++/DELPHI et autre assembleur, ne servaient plus à grand chose dans le monde du Net d'aujourd'hui... :-(

Et oui !, à l'aube du HTML5 & CSS3 et de la Cloud mania, je fais grise mine avec mon gcc (mais si beaucoup disent... "mais non c'est la mère des langages blabla"...). Delphi m'a fait découvrir le concept de composants et du RAD (Rapid Application Development)... trop classe pour faire des applications en 2 cuillères à soupe (euh oui des très grosses alors !... ;-) )

Après j'ai été faire un p'tit tour de JSP, PHP, Python, Java et plein d'autre.... pas de coup de foudre; fallait repartir de zéro, se rettaper des nuits blanches pour assimiler les Librairies etc....

Et puis Android.... ça c'est à cause du téléphone de ma copine.... (euh en faite ma femme) et puis Go (google langage qui va révolutionner le mode -sic-). Et puis Windows 8... Aie ! Y-aie !, j’attends la tablette pro !

Et en attendant, un bon framework pour faire du Rad sur du Web, une application qui s'exécute dans un Webrowser.... Ah j'ai essayé des trucs du genre Django ou Symphony ...

Et Paf !, je suis tombé sur Wakanda (via un livre blanc de Programmez pour les connaisseurs).... Et justement ma femme commençait à s'arracher les cheveux sur la gestion d'une association qui gère la mise en relation de membre avec un petit producteur d'œufs local bio.... Bref il n'y a pas d'APP pour ça (-sic- Iphone beuh...). Donc me voilà au turbin pour faire une APP pour ça...

Alors voilà, cela fait une semaine que je me fais des soirées vidéo sur le thème (d’ailleurs ceux qui connaissent la langue de Shakespeare, je vous recommande la play list Youtube.

Et je suis un vrai newbie -oups- en développement Web.... Donc pour me souvenir de ce que j'apprends; j'ai entrepris d'ouvrir ce blog pour poster toutes mes découvertes et dans la langue de Molière héhé !