LUA : Les autolistes

Les autolistes sont des listes déroulantes qui utilisent les données de la table en cours sans utiliser d'autres tables.

C'est pratique pour des petites applications, car cela simplifie la réalisation de l'application, et rend plus conviviale l'application. Certes elles ne garantissent pas l'intégrité parfaite comme dans une base de  données classique, mais assure une certaine garantie pour limiter les fautes par non resaisie des données

Les "autolistes" sont utilisées dans l'exemple "factures" et plus particulièrement dans l'exemple "vidéothéque" où il n'y a qu'une seule table et plusieurs autolistes

Exemple dans la table "contact" , il existe un champ ville, nous n'allons pas utiliser de tables suplémentaires, mais exploiter les données saisies dans la table "contacts"

on crée tout d'abord une instance de l'objet "dataset" pour pouvoir manipuler les données de la base

local dataset=nsbase.datasetCreate("SQLQuery")

 

on sélectionne le champ "ville" dans la table "contacts" par une requête SQ, noter le mot clef "distinct" pour obtenir qu'une occurence de chaque ville

dataset.sql='select ville from contacts'

 

on récupère la liste des villes dans la variable items

local items=dataset.getItems('ville')

 

on assigne la propriété "items" de notre liste déroulante "cbxVille"

self.setProperty('cbxVille.items',items)       

 

Voici le code complet

local dataset=nsbase.datasetCreate("SQLQuery")
dataset.sql='select distinct ville from contacts'
local items=dataset.getItems('ville')
self.setProperty('cbxVille.items',items)

On peut appler ce code sur ActionOnLoaded et sur ActionOnAfterEdit....
 

LUA : Remplir une liste déroulante à partir de données contenues dans la base

Remplir une liste déroulante "ville" à partir de la table ville:

on crée tout d'abord une instance de l'objet "dataset" pour pouvoir manipuler les données de la base

local dataset=nsbase.datasetCreate("SQLQuery")

 

on sélectionne le champ ville dans la table ville par une requête SQL

dataset.sql='select ville from villes'

 

on récupère la liste des villes dans la variable items

local items=dataset.getItems('ville')

 

on assigne la propriété "items" de notre liste déroulante "cbxVille"

self.setProperty('cbxVille.items',items)       

 

Voici le code complet

local dataset=nsbase.datasetCreate("SQLQuery")
dataset.sql='select ville from villes'
local items=dataset.getItems('ville')
self.setProperty('cbxVille.items',items)      

On peut appler ce code sur ActionOnLoaded et sur ActionOnAfterEdit....

LUA : Appels méthodes, fonctions, propriétés

En Lua, les appels aux méthodes d'instance utilisent généralement les deux points ":", tandis que l'accès aux méthodes ou aux champs de classe / fabrique utilise un point ".": (tiré de http://lua-users.org/wiki/ColonForMethodCall)

     o: test () -- appel de méthode. équivalent à o.test (o)
     o.test () -- appel de fonction normal. similaire à juste test ()
     o.x = 5 -- accès au champ

 

Dans NBase la déclaration des méthodes d'une forme ou d'un rapport se fait ainsi :

    function frmMain:test()
       ...
    end

 

L'appel se fera ainsi (self étant ainsi préservé)

    frmMain:test()

    --  ou dans une autre méthode du même formulaire ou rapport

    function frmMain:mayMethod()
      self:test()
    end

A partir de la version V1.1.1, à la précompil LUA, un contrôle est effectué pour garantir et faciliter le codage

Les rapports dans NSBase

Cet article va vous aider dans la construction des rapports sous NSBase

Il existe 2 types de rapports :

  • Fiche
  • Liste

La différence est faite par l'utlisation d'un "GridPanel" pour les listes et pas de "GridPanel" pour les fiches. On utilisera 1 "GridPanel" au maxi.

Il y aura donc 1 enregistrement par fiche (page) et de 1 à n enregistements par page pour les listes. Le maximun d'enregistrements par page pour les listes est précisé par "RowCount" * "ColCount", le sens de remplissage est indiqué par "PrintDirection".

La source d'un rapport doit être renseignée, elle peut être une table ou mieux une vue simple ou paramétrée.

L'ensemble des données à imprimer doit être présent dans chaque enregistrement, y compris les données variables d'entêtes et de bas de page pour les rapports de type liste.

Les champs sont fixes ou associés à un champ de la source par la propriété "FieldName". Les champs placés dans la cellule éditable du "GridPanel", seront répétés suivant "RowCount", "ColCount" et "PrintDirection"

Un seul "GridPanel" par report.

Des champs spéciaux sont disponibles:

  • Code bar
  • Qr code
  • Système : date, heure ou n° de page

Les actions (ou évènements) dans un rapport :

ActionOnLoaded:

Se produit apès le chargement du rapport, exemple dans le modèle "Facture", permet d'imprimer la facture active.

On utilise une requête paramétrée dans ce rapport. Le paramêtre est "reference". La valeur provient du composant "referenceToPrint" qui se trouve dans le formulaire "frmFacture" (Facture).

function rptFacture:ActionOnLoaded()
  if frmFACTURE~=nil then
    self.dataset.setParameter("reference",frmFACTURE.referenceToPrint)
  end
end 

 

ActionOnChange:

Se produit à chaque enregistrement, exemple dans le modèle FISH, pour la conversion inch/cm

function rptFish:ActionOnChange()
  local value=self.dataset.getFieldName('LENGTH_CM')
  if value~='' then
    value=value ..  'CM/' .. string.format("%6.2f",value/2.54) .. 'IN'
  end
  self.setProperty('lbLength.Caption',value)
end 

 

ActionOnError:

Se produit lors d'une erreur.

 

Gestion de fichiers,images, pdf dans NSBase

NSBase peut gérer des fichiers dans sa base.

Pour cela il faut créer une table contenant des champs de type image ou fichier

Créer ensuite un formulaire

Mettre dans la propriété  datasource du formulaire, le nom de la table précédemment créée

1 Cas des images

Pour les images, on peut les afficher directement par le composant image. il faudra documenter la propriété fieldname de cette image en relation avec le champ image de la table. Le composant image gère l'importation des images directement dans la base  (click).

On peut également le réaliser par code LUA, exemple sur le clic d'un bouton (code extrait de la base Contact.nsb):

function frmContacts:btnLoadImageActionOnClick()
  local ok,filename=nsbase.dialog.fileOpen('Open image','All files|*.*','','')
  if ok then
    self.dataset.edit()
    local img=nsbase.fileSystem.readFile(filename,'bin')
    self.dataset.setFieldname('Photo',img)
  end
end

On remarque, que l'on sélection l'image par une boite de dialogue.

  local ok,filename=nsbase.dialog.fileOpen('Open image','All files|*.*','','')

Il faut mettre la table édition par

self.dataset.edit()

Lire le fichier image en format binaire dans une variable "img"

local img=nsbase.fileSystem.readFile(filename,'bin')

Affecter l'image dans le champ de la table

self.dataset.setFieldname('Photo',img)

Pour supprimer l'image de la base sans supprimer l'enregistrement complet:

function frmContacts:btnClearImageActionOnClick()
  self.dataset.edit()
  self.dataset.setFieldname('Photo','')
end

 

2 Cas des fichiers PDF

NSBase n'affiche pas les PDF(autres que les rapports) dans l'application. On va les visualiser via le système d'exploitation par Acrobat Reader ou autre.

On procède pratiquement de la même manière que pour une image

function frmText:btnLoadPDFActionOnClick()
  local ok,filename=nsbase.dialog.fileOpen('Open PDF|*.pdf|All files|*.*','','')
  if ok then
    self.dataset.edit()
    local pdf=nsbase.fileSystem.readFile(filename,'bin')
    self.dataset.setFieldname('PDFFile',pdf)
  end
end

Pour les afficher on utilisera une fonction système

function frmText:btnShowPDFActionOnClick()
  local pdf= self.dataset.setFieldname('PDFFile')
  local filename=os.getenv ('TEMP') .. '\\tmp.pdf'
  nsbase.fileSystem.writeFile(filename,pdf,'bin')
  nsbase.system.openDoc(filename)
end

Extraction du fichier de la base

local pdf= self.dataset.setFieldname('PDFFile')

Récupération de la variable d'environnement contenant le chemin des fichiers temporaires, ect concaténation avec le nom du fichier PDF que l'on va créer

local filename=os.getenv ('TEMP') .. '\\tmp.pdf'

Ecriture du fichier sur le disque en format binaire

nsbase.fileSystem.writeFile(filename,pdf,'bin')

Soumission au système pour ouvrir le PDF

nsbase.system.openDoc(filename)

 

Bien sur il faudra supprimer le fichier temporaire ansi créé.


Pour les autres type fichiers, il faudra adapter le code dans le même esprit.