FORUM DE DISCUSSION SUR LE LANGAGE PANORAMIC
Vous souhaitez réagir à ce message ? Créez un compte en quelques clics ou connectez-vous pour continuer.
FORUM DE DISCUSSION SUR LE LANGAGE PANORAMIC

Développement d'applications avec le langage Panoramic
 
AccueilAccueil  RechercherRechercher  Dernières imagesDernières images  S'enregistrerS'enregistrer  MembresMembres  Connexion  
Derniers sujets
» trop de fichiers en cours
Un gestionnaire de contacts avec SQLite3 (KGF.dll) Emptypar Marc Aujourd'hui à 11:42

» Bataille navale SM
Un gestionnaire de contacts avec SQLite3 (KGF.dll) Emptypar jjn4 Hier à 17:39

» Une calculatrice en une ligne de programme
Un gestionnaire de contacts avec SQLite3 (KGF.dll) Emptypar jean_debord Hier à 8:01

» Gestion d'un système client-serveur.
Un gestionnaire de contacts avec SQLite3 (KGF.dll) Emptypar Pedro Jeu 25 Avr 2024 - 19:31

» Les maths du crocodile
Un gestionnaire de contacts avec SQLite3 (KGF.dll) Emptypar jean_debord Jeu 25 Avr 2024 - 10:37

» Naissance de Crocodile Basic
Un gestionnaire de contacts avec SQLite3 (KGF.dll) Emptypar jean_debord Jeu 25 Avr 2024 - 8:45

» Editeur EliP 6 : Le Tiny éditeur avec 25 onglets de travail
Un gestionnaire de contacts avec SQLite3 (KGF.dll) Emptypar Froggy One Mer 24 Avr 2024 - 18:38

» Dessine-moi une galaxie
Un gestionnaire de contacts avec SQLite3 (KGF.dll) Emptypar jjn4 Lun 22 Avr 2024 - 13:47

» Erreur END_SUB
Un gestionnaire de contacts avec SQLite3 (KGF.dll) Emptypar jjn4 Lun 22 Avr 2024 - 13:43

» Bug sur DIM_LOCAL ?
Un gestionnaire de contacts avec SQLite3 (KGF.dll) Emptypar papydall Dim 21 Avr 2024 - 23:30

» Form
Un gestionnaire de contacts avec SQLite3 (KGF.dll) Emptypar leclode Dim 21 Avr 2024 - 18:09

» 2D_fill_color(résolu)
Un gestionnaire de contacts avec SQLite3 (KGF.dll) Emptypar leclode Sam 20 Avr 2024 - 8:32

» Consommation gaz électricité
Un gestionnaire de contacts avec SQLite3 (KGF.dll) Emptypar leclode Mer 17 Avr 2024 - 11:07

» on_key_down (résolu)
Un gestionnaire de contacts avec SQLite3 (KGF.dll) Emptypar leclode Mar 16 Avr 2024 - 11:01

» Sous-programme(résolu)
Un gestionnaire de contacts avec SQLite3 (KGF.dll) Emptypar jjn4 Jeu 4 Avr 2024 - 14:42

Navigation
 Portail
 Index
 Membres
 Profil
 FAQ
 Rechercher
Rechercher
 
 

Résultats par :
 
Rechercher Recherche avancée
Avril 2024
LunMarMerJeuVenSamDim
1234567
891011121314
15161718192021
22232425262728
2930     
CalendrierCalendrier
Le Deal du moment :
Funko POP! Jumbo One Piece Kaido Dragon Form : ...
Voir le deal

 

 Un gestionnaire de contacts avec SQLite3 (KGF.dll)

Aller en bas 
4 participants
AuteurMessage
Klaus

Klaus


Nombre de messages : 12274
Age : 74
Localisation : Ile de France
Date d'inscription : 29/12/2009

Un gestionnaire de contacts avec SQLite3 (KGF.dll) Empty
MessageSujet: Un gestionnaire de contacts avec SQLite3 (KGF.dll)   Un gestionnaire de contacts avec SQLite3 (KGF.dll) EmptyMer 1 Déc 2021 - 10:39

J'ai fait une petite démonstration de l'utilisation de SQLite3 via KGF.dll.

Il s'agit d'un gestionnaire de contacts - rien de bien compliqué.
Au lancement, le programme affiche ceci:
Un gestionnaire de contacts avec SQLite3 (KGF.dll) Aa180

Les champs en haut de la page montrent:
- le chemin vers SQLite3 avec sa valeur par défaut
- le nom de la DLL pour SQLite3 avec sa valeur par défaut
- le chemin et nom de la base de données SQLite3 contenant les contacts
A côté de chacun de ces champs; il y a un bouton "..." permettant de changer ces valeurs par défaut.
Voir les commentaires au début du code pour plus d'informations.

Il y a aussi un grand bouton "Demarrer". Ce bouton lance le programme en utilisant les valeurs ci-dessus.
Si la base de données n'existe pas, elle sera créée automatiquement, sinon elle sera ouverte.
Dans tous les cas, le programme signale le nombre de contacts présents dans la base. Puis, il affiche:
Un gestionnaire de contacts avec SQLite3 (KGF.dll) Aa185

On voit qu'il y a la liste des contacts à gauche. Un clic dans cette liste sélectionne un contact.
Le bandeau de commande au-dessus montre 6 boutons d'action:
- Ajouter = création d'un nouveau contact
- Modifier = changer le contenu des champs d'un contact sélectionné
- Supprimer = supprimer le contact sélectionné
- Trier = trier la liste des contacts selon un critère quelconque (tous les champs peuvent servir de critère !)
- Filtrer = filtrer la liste des contacts par égalité, avec jokers et/ou par fourchettes de valeurs
- Exporter/ Importer
Chacun de ces boutons affiche sa propre fenêtre.

Ce sont les deux derniers points qui font la démonstration de force de cet outil qu'est SQLite3.

Pour expérimenter ces fonctions, commencez par créer quelques contacts (3 ou plus) par le bouton Ajouter.
Voici la fenêtre sui s'affiche:
Un gestionnaire de contacts avec SQLite3 (KGF.dll) Aa182
On remplit les champs (seul le champ Nom est obligatoire, mais il est conseillé d'en remplir le plus possible).
Le bouton Valider crée alors le contact et son nom et prénom s'affichent aussitôt dans la liste des contacts.

Les fenêtres pour Modifier et Supprimer sont identiques mis à part le titre de la fenêtre.

Par défaut, l'affichage dans la liste des contacts se fait dans l'ordre chronologique de leur création. Le bouton Trier permet de changer cela. Voici la fenêtre de tri:
Un gestionnaire de contacts avec SQLite3 (KGF.dll) Aa183
Par défaut, le tri s'effetuera selon le Nom suivi du Prénom. Mais les 3 combos permettent de choisir n'importe quel champ comme critère (Code postal, Portable, ...). On peut combiner jusqu'à 3 critères de tri.
Le critère de tri, une fois choisi, reste actif jusqu'à ce qu'on change ce critère par un autre.

Par défaut, tous les contacts sont inclus dans la liste des contacts (pas de filtrage). Le bouton Filter permet de définir une multitude de critères de filtrage. Voici sa fenêtre:
Un gestionnaire de contacts avec SQLite3 (KGF.dll) Aa184
Une aide simple est affichée en bas  gauche.
Le bouton Valider effectue le filtrage et ce filtrage restera en vigueur jusqu'à la prochaine demande de filtrage.
Le bouton Vider le filtre efface tous les champs. En cliquant sur Valider ensuite,
on annule le filtrage en vigueur et on revient à la situation sans filtrage.

Le bouton Exporter / Importer affiche la fenêtre suivante:
Un gestionnaire de contacts avec SQLite3 (KGF.dll) Aa186
On peut choisir le fichier CSV pour l'export ou l'import.
Puis, on choisit l'option Exporter ou Importer, puis valider.

Voici le code du programme:
Code:
' Contacts_avec_SQLite.bas

' Ce programme montre la gestion d'une base de données de contacts
' à l'aide de SQLite de KGF.dll.

' SQLite3 est trouvé par défaut dans le dossier C:\SQLite367.
' Si ce dossier n'existe pas il sera créé automatiquement.
' Un bouton, actif au lancement du programme, permet de changer ce dossier.

' La version par défaut de SQLite2 est la version V.3.6.7.
' Un bouton, actif au lancement du programme, permet de changer cette version,
' par exemple pour la version V3.36 téléchargeable ici: https://sqlite.org/download.html

' La version par défaut est embarquée dans KGF.dll.
' Une éventuelle autre version devra être téléchargée séparément et copiée dans de dossier de SQLite3.
' Il est de la responsabilité de l'tilisateur de télécharger une éventuelle autre version et
' de la placer dans le dossier de SQLite3 avant le lancement du programme.

' Si le dossier choisi pour SQLite3 ne contient pas cette version de SQLite3,
' alors SQLite3 sera exrait de KGF.dll et placé dans ce dossier et la version par défaut
' sera utilisée, même si une autre version a été demandée.

' Par défaut, les contacts sont mémorisés dans un fichier MesContacts.db dans le dossier DIR_CURRENT$.
' Un bouton, actif au lancement du programme, permet de changer le nom et le chemin d'accès au fichier.
' Si ce fichier n'existe pas, il sera créé et formatté comme base SQLite3 vide.

' La base de données des contacts cntient les tables suivantes:
'  Contacts      liste des contacts

' Chaque contact est mémorisé sous forme d'un enregistrement avec le format suivant:
'  ID        numéro unique identifiant le contact (attribué automatiquement de façon chronologique)
'  Nom      nom de famille
'  Prénom    prénom(s)
'  Numero    numéro de rue
'  Bis      complément (bis, ter, ...)
'  Adresse1  première ligne d'adresse
'  Adresse2  seconde ligne d'adresse
'  Codepost  code postal
'  Ville    ville
'  Pays      paye
'  Portable  numéro de réléphone portable
'  Fixe      numéro de téléphone fixe
'  Mail      adresse mail
' Seul le champ Nom est obligatoire.
' Les autres champs peuvent rester vides, mais il est conseillé de remplir Prenom et Portable. 

label close0, select_folder, select_version, select_base, demarrer, quitter
label select_contact, ajouter_contact, valider, modifier_contact, supprimer_contact
label trier_contact, filtrer_contact, vider_filtre, exporter_contacts, select_fichier

dim res%, racine$, s$, s1$, filter$, i%, err%, Colonnes$(14), n_contacts%, SQL%, action%, index%, n_champs%
dim table$
  table$ = "Contacts"

' numaros des objets du panel 200 (liste des contacts)
dim n_list%
' numéros des objets du panel 300 (détails d'un contact)
dim n_nom%, n_prenom%, n_numero%, n_bis%, n_adresse1%, n_adresse2%, n_codepost%, n_ville%, n_pays%
dim n_portable%, n_fixe%, n_mail%
' numéros des objets du panel 400 (tri)
dim n_tri1%, n_tri2%, n_tri3%
' numéros des objets du panel 500 (filtre) pour la colonne de gauche
dim nf1_nom%, nf1_prenom%, nf1_numero%, nf1_bis%, nf1_adresse1%, nf1_adresse2%, nf1_codepost%
dim nf1_ville%, nf1_pays%, nf1_portable%, nf1_fixe%, nf1_mail%
' numéros des objets du panel 500 (filtre) pour la colonne de droite
dim nf2_nom%, nf2_prenom%, nf2_numero%, nf2_bis%, nf2_adresse1%, nf2_adresse2%, nf2_codepost%
dim nf2_ville%, nf2_pays%, nf2_portable%, nf2_fixe%, nf2_mail%
' numéros des objets du pabel 600 (export/import)
dim n_nomfichier%, n_exporter%, n_importer%
' variables contenant les critères de tri et de sélection en vigueur
dim crit$, where$
  crit$ = " ORDER BY ID"
  where$ = ""
' variables temporaires contenant les champs d'un contact
dim ID_contact$
dim nom_contact$, prenom_contact$, numero_contact$, bis_contact$, adresse1_contact$, adresse2_contact$
dim codepost_contact$, ville_contact$, pays_contact$, portable_contact$, fixe_contact$, mail_contact$

dll_on "KGF.dll"
                                           
creer_GUI()

end

' **************************************
' **************************************
' ********** les SUBs de service *******
' **************************************
' **************************************

sub creer_GUI()
  full_space 0
  on_close 0,close0
  caption 0,"Gestion de contacts avec SQLite3"

  alpha 1 : top 1,10 : left 1,10 : caption 1,"Dossier SQLite3:"
  edit 2 : top 2,10 : left 2,100 : width 2,300 : inactive 2
    text 2,"C:\SQLite367"
  button 3 : top 3,10 : left 3,left(2)+width(2) : width 3,30 : font_bold 3 : caption 3,"..."
    on_click 3,select_folder

  alpha 4 : top 4,10 : left 4,left(3) + 70 : caption 4,"Version:"
  edit 5 : top 5,10 : left 5,left(4)+50 : width 5,100 : inactive 5
    text 5,"SQLite367.dll"
  button 6 : top 6,10 : left 6,left(5)+width(5) : width 6,30 : font_bold 6 : caption 6,"..."
    on_click 6,select_version
 
  alpha 7 : top 7,10 : left 7,left(6) + 70 : caption 7,"Base de données:"
  edit 8 : top 8,10 : left 8,left(7)+100 : width 8,400 : inactive 8
    text 8,dir_current$+"\MesContacts.db"
  button 9 : top 9,10 : left 9,left(8)+width(8) : width 9,30 : font_bold 9 : caption 9,"..."
    on_click 9,select_base
 
  button 10 : top 10,40 : left 10,300 : width 10,width_client(0)-600 : caption 10,"Démarrer"
    font_bold 10 : font_size 10,16 : on_click 10,demarrer : inactive 10
  button 11 : top 11,40 : left 11,300 : width 11,width_client(0)-600 : caption 11,"Quitter"
    font_bold 11 : font_size 11,16 : on_click 11,quitter : hide 11


  memo 1001 : hide 1001 : bar_both 1001
  memo 1011 : hide 1011 : bar_both 1011

  colonnes$(1) = "ID"
  colonnes$(2) = "Nom"
  colonnes$(3) = "Prenom"
  colonnes$(4) = "Numero"
  colonnes$(5) = "Bis"
  colonnes$(6) = "Adresse1"
  colonnes$(7) = "Adresse2"
  colonnes$(8) = "Codepost"
  colonnes$(9) = "Ville"
  colonnes$(10) = "Pays"
  colonnes$(11) = "Portable"
  colonnes$(12) = "Fixe"
  colonnes$(13) = "Mail"
 
  ' panel des boutons de commande
  panel 100 : hide 100 : top 100,70 : left 100,0 : width 100,width_client(0) : height 100,40
    color 100,255,255,0
  button 101 : parent 101,100 : top 101,5 : left 101,10 : width 101,120 : caption 101,"Ajouter"
    font_bold 101 : on_click 101,ajouter_contact
  button 102 : parent 102,100 : top 102,5 : left 102,left(101)+width(101)+20 : width 102,120
    caption 102,"Modifier" : font_bold 102 : on_click 102,modifier_contact
  button 103 : parent 103,100 : top 103,5 : left 103,left(102)+width(102)+20 : width 103,120
    caption 103,"Supprimer" : font_bold 103 : on_click 103,supprimer_contact
  button 104 : parent 104,100 : top 104,5 : left 104,left(103)+width(103)+20 : width 104,120
    caption 104,"Trier" : font_bold 104 : on_click 104,trier_contact
  button 105 : parent 105,100 : top 105,5 : left 105,left(104)+width(104)+20 : width 105,120
    caption 105,"Filtrer" : font_bold 105 : on_click 105,filtrer_contact
  button 106 : parent 106,100 : top 106,5 : left 106,left(105)+width(105)+20 : width 106,180
    caption 106,"Exporter / Importer" : font_bold 106 : on_click 106,exporter_contacts
   
  ' panel des données
  panel 200 : hide 200 : top 200,110 : left 200,0 : width 200,width(100) : height 200,height_client(0) - top(200)

  list 201 : parent 201,200 : top 201,10 : left 201,10 : width 201,200 : height 201,height_client(200)-20
    on_click 201,select_contact
    n_list% = 201
 
  ' panel des champs d'un contact
  panel 300 : hide 300 : parent 300,200 : top 300,10 : left 300,left(201)+width(201)+30
    width 300,width_client(200)-left(300)-10 : height 300,height(201) : color 300,255,95,255
 
  alpha 301 : parent 301,300 : left 301,40 : top 301,80 : font_size 301,10 : caption 301,"Nom:"
    edit 302 : parent 302,300 : left 302,150 : top 302,top(301) : width 302,300
    n_nom% = 302
  alpha 303 : parent 303,300 : left 303,40 : top 303,top(301)+30 : font_size 303,10 : caption 303,"Prénom:"
    edit 304 : parent 304,300 : left 304,150 : top 304,top(303) : width 304,300
    n_prenom% = 304
  alpha 305 : parent 305,300 : left 305,40 : top 305,top(303)+50 : font_size 305,10 : caption 305,"Adresse:"
    edit 306 : parent 306,300 : left 306,150 : top 306,top(305) : width 306,40
    n_numero% = 306
    combo 307 : parent 307,300 : left 307,left(306)+width(306)+20 : top 307,top(305) : width 307,60
      item_add 307,""
      item_add 307,"Bis"
      item_add 307,"Ter"
      item_add 307,"Quater"
      res% = dll_call2("SelectComboBoxItem",handle(307),1)
      n_bis% = 307
    edit 308 : parent 308,300 : left 308,left(307)+width(307)+20 : top 308,top(307) : width 308,300
    n_adresse1% = 308
    edit 309 : parent 309,300 : left 309,left(308) : top 309,top(308)+30 : width 309,300
    n_adresse2% = 309
  alpha 310 : parent 310,300 : left 310,40 : top 310,top(309)+30 : font_size 310,10 : caption 310,"Ville:"
    edit 311 : parent 311,300 : left 311,150 : top 311,top(310) : width 311,40
    n_codepost% = 311
    edit 312 : parent 312,300 : left 312,left(311)+width(311)+20 : top 312,top(310) : width 312,300
    n_ville% = 312
  alpha 313 : parent 313,300 : left 313,40 : top 313,top(311)+30 : font_size 313,10 : caption 313,"Pays:"
    edit 314 : parent 314,300 : left 314,left(312) : top 314,top(311)+30 : width 314,300
    n_pays% = 314
  alpha 315 : parent 315,300 : left 315,40 : top 315,top(314)+50 : font_size 315,10 : caption 315,"Portable:"
    edit 316 : parent 316,300 : left 316,150 : top 316,top(315) : width 316,100
    n_portable% = 316
  alpha 317 : parent 317,300 : left 317,40 : top 317,top(316)+30 : font_size 317,10 : caption 317,"Fixe:"
    edit 318 : parent 318,300 : left 318,150 : top 318,top(317) : width 318,100
    n_fixe% = 318
  alpha 319 : parent 319,300 : left 319,40 : top 319,top(318)+30 : font_size 319,10 : caption 319,"Mail:"
    edit 320 : parent 320,300 : left 320,150 : top 320,top(319) : width 320,300
    n_mail% = 320

  alpha 330 : parent 330,300 : top 330,20 : left 330,150 : font_size 330,16 : font_bold 330
  button 331 : parent 331,300 : top 331,top(320)+50 : left 331,150 : width 331,300 : caption 331,"Valider"
    font_bold 331 : font_size 331,12 : on_click 331,valider
       
  ' panel des critères de tri
  panel 400 : hide 400 : parent 400,200 : top 400,10 : left 400,left(201)+width(201)+30
    width 400,width_client(200)-left(400)-10 : height 400,height(201) : color 400,255,95,255
   
  alpha 401 : parent 401,400 : top 401,20 : left 401,150 : font_size 401,16 : font_bold 401
    caption 401,"Critères de tri" 
   
  alpha 402 : parent 402,400 : left 402,20 : top 402,80 : font_size 402,12 : caption 402,"Trier par:"
 
  combo 403 : parent 403,400 : left 403,150 : top 403,top(402) : width 403,80
    n_tri1% = 403 : charger_criteres_tri(403,2) 

  combo 404 : parent 404,400 : left 404,left(403)+width(403)+20 : top 404,top(402) : width 404,80
    n_tri2% = 404 : charger_criteres_tri(404,3)
   
  combo 405 : parent 405,400 : left 405,left(404)+width(404)+20 : top 405,top(402) : width 405,80
    n_tri3% = 405 : charger_criteres_tri(405,1)

  button 431 : parent 431,400 : top 431,top(404)+50 : left 431,150 : width 431,300 : caption 431,"Valider"
    font_bold 431 : font_size 431,12 : on_click 431,valider

  ' panel des critères de filtrage
  panel 500 : hide 500 : parent 500,200 : top 500,10 : left 500,left(201)+width(201)+30
    width 500,width_client(200)-left(500)-10 : height 500,height(201) : color 500,255,95,255
   
  alpha 501 : parent 501,500 : left 501,20 : top 501,80 : font_size 501,10 : caption 501,"Nom:"
    edit 502 : parent 502,500 : left 502,100 : top 502,top(501) : width 502,300
    nf1_nom% = 502       
  alpha 503 : parent 503,500 : left 503,20 : top 503,top(501)+30 : font_size 503,10 : caption 503,"Prénom:"
    edit 504 : parent 504,500 : left 504,100 : top 504,top(503) : width 504,300
    nf1_prenom% = 504
  alpha 505 : parent 505,500 : left 505,20 : top 505,top(503)+50 : font_size 505,10 : caption 505,"Adresse:"
    edit 506 : parent 506,500 : left 506,100 : top 506,top(505) : width 506,40
    nf1_numero% = 506
    combo 507 : parent 507,500 : left 507,left(506)+width(506)+20 : top 507,top(505) : width 507,60
      item_add 507,""
      item_add 507,"Bis"
      item_add 507,"Ter"
      item_add 507,"Quater"
      res% = dll_call2("SelectComboBoxItem",handle(507),1)
      nf1_bis% = 507
    edit 508 : parent 508,500 : left 508,left(507)+width(507)+20 : top 508,top(507) : width 508,300
    nf1_adresse1% = 508
    edit 509 : parent 509,500 : left 509,left(508) : top 509,top(508)+30 : width 509,300
    nf1_adresse2% = 509
  alpha 510 : parent 510,500 : left 510,20 : top 510,top(509)+30 : font_size 510,10 : caption 510,"Ville:"
    edit 511 : parent 511,500 : left 511,100 : top 511,top(510) : width 511,40
    nf1_codepost% = 511
    edit 512 : parent 512,500 : left 512,left(511)+width(511)+20 : top 512,top(510) : width 512,300
    nf1_ville% = 512
  alpha 513 : parent 513,500 : left 513,20 : top 513,top(511)+30 : font_size 513,10 : caption 513,"Pays:"
    edit 514 : parent 514,500 : left 514,left(512) : top 514,top(511)+30 : width 514,300
    nf1_pays% = 514
  alpha 515 : parent 515,500 : left 515,20 : top 515,top(514)+50 : font_size 515,10 : caption 515,"Portable:"
    edit 516 : parent 516,500 : left 516,100 : top 516,top(515) : width 516,100
    nf1_portable% = 516
  alpha 517 : parent 517,500 : left 517,20 : top 517,top(516)+30 : font_size 517,10 : caption 517,"Fixe:"
    edit 518 : parent 518,500 : left 518,100 : top 518,top(517) : width 518,100
    nf1_fixe% = 518
  alpha 519 : parent 519,500 : left 519,20 : top 519,top(518)+30 : font_size 519,10 : caption 519,"Mail:"
    edit 520 : parent 520,500 : left 520,100 : top 520,top(519) : width 520,300
    nf1_mail% = 520 
 
    edit 552 : parent 552,500 : left 552,570 : top 552,top(501) : width 552,300
    nf2_nom% = 552
    edit 554 : parent 554,500 : left 554,left(552) : top 554,top(503) : width 554,300
    nf2_prenom% = 554
    edit 556 : parent 556,500 : left 556,left(552) : top 556,top(505) : width 556,40
    nf2_numero% = 556
    combo 557 : parent 557,500 : left 557,left(556)+width(556)+20 : top 557,top(505) : width 557,60
      item_add 557,""
      item_add 557,"Bis"
      item_add 557,"Ter"
      item_add 557,"Quater"
      res% = dll_call2("SelectComboBoxItem",handle(557),1)
      nf2_bis% = 557
    edit 558 : parent 558,500 : left 558,left(557)+width(557)+20 : top 558,top(507) : width 558,300
    nf2_adresse1% = 558
    edit 559 : parent 559,500 : left 559,left(558) : top 559,top(558)+30 : width 559,300
    nf2_adresse2% = 559
    edit 561 : parent 561,500 : left 561,left(556) : top 561,top(510) : width 561,40
    nf2_codepost% = 561
    edit 562 : parent 562,500 : left 562,left(561)+width(561)+20 : top 562,top(561) : width 562,300
    nf2_ville% = 562
    edit 564 : parent 564,500 : left 564,left(562) : top 564,top(511)+30 : width 564,300
    nf2_pays% = 564
    edit 566 : parent 566,500 : left 566,left(561) : top 566,top(515) : width 566,100
    nf2_portable% = 566
    edit 568 : parent 568,500 : left 568,left(566) : top 568,top(517) : width 568,100
    nf2_fixe% = 568
    edit 570 : parent 570,500 : left 570,left(568) : top 570,top(519) : width 570,300
    nf2_mail% = 570 
 
  alpha 530 : parent 530,500 : top 530,20 : left 530,150 : font_size 530,16 : font_bold 530
    caption 530,"Critères de filtrage"

  button 532 : parent 532,500 : top 532,top(520)+50 : left 532,420 : width 532,300 : caption 532,"Vider le filtre"
    font_bold 532 : font_size 532,12 : on_click 532,vider_filtre
  button 531 : parent 531,500 : top 531,top(532)+50 : left 531,420 : width 531,300 : caption 531,"Valider"
    font_bold 531 : font_size 531,12 : on_click 531,valider
   
  alpha 590 : parent 590,500 : top 590,top(532) : left 590,20
    s$ =                        "Les champs non vides de la colonne de gauche sont des critères de sélection."
    s$ = s$ + chr$(13)+chr$(10)+"Les champs peuvent contenir le caractère "+chr$(34)+"%"+chr$(34)+"."
    s$ = s$ +                  " C'est un joker."
    s$ = s$ + chr$(13)+chr$(10)+"Si la colonne de gauche est utilisée seule, on filtre sur une égalité."
    s$ = s$ + chr$(13)+chr$(10)+"L'utilisation des deux colones pour une même ligne définit une fourchette."
    s$ = s$ + chr$(13)+chr$(10)+"La colonne de droite est ignorée si celle de gauche n'est pas renseignée."
    caption 590,s$
   
  ' panel des exports / imports
  panel 600 : hide 600 : parent 600,200 : top 600,10 : left 600,left(201)+width(201)+30
    width 600,width_client(200)-left(600)-10 : height 600,height(201) : color 600,255,95,255
   
  alpha 601 : parent 601,600 : top 601,20 : left 601,150 : font_size 601,16 : font_bold 601
    caption 601,"Export / Import de contacts" 
   
  alpha 604 : parent 604,600 : top 604,top(601)+50 : left 604,20 : font_size 604,10
    caption 604,"Fichier CSV:"
  edit 605 : parent 605,600 : top 605,top(604) : left 605,150 : width 605,300
    n_nomfichier% = 605
  button 606 : parent 606,600 : top 606,top(605) : left 606,left(605)+width(605) : width 606,30
    font_bold 606 : caption 606,"..." : on_click 606,select_fichier
  container_option 607 : parent 607,600 : top 607,top(606)+40 : left 607,150 : width 607,300
    height 607,50 : caption 607,"Opération"
  option 608 : parent 608,607 : top 608,20 : left 608,20 : caption 608,"Exporter"
  option 609 : parent 609,607 : top 609,20 : left 609,150 : caption 609,"Importer"
  n_exporter% = 608   
  n_importer% = 609   

  button 631 : parent 631,600 : top 631,top(607)+height(607)+50 : left 631,150 : width 631,300
    caption 631,"Valider" : font_bold 631 : font_size 631,12 : on_click 631,valider
   

  active 10
end_sub

sub charger_contacts()
  clear 201
  if n_contacts%>0
    ' charger la table dans le gridRequête SQL
    s$ = "SELECT * FROM Contacts "+where$+crit$+";"
 
    ' préparation de la requête: sélection des enregistrements de la table selon les critères
    res% = dll_call2("CompileSQLite3Script",SQL%,adr(s$))
 
    ' Remplissage LIST par lecture ID, nom et prénom de chacun des enregistrements
    for i%=1 to n_contacts%
      res% = dll_call1("GetSQLite3NextRow",SQL%)
      if res%<0 then exit_for
      ' prendre le ID
      res% = dll_call2("GetSQLite3CellText",SQL%,1)
      s$ = text$(1001)+":  "
      ' prendre le nom
      res% = dll_call2("GetSQLite3CellText",SQL%,2)
      s$ = s$ + text$(1001)+", "
      ' prendre le prénom
      res% = dll_call2("GetSQLite3CellText",SQL%,3)
      s$ = s$ + text$(1001)
      ' ajouter cela à la liste
      item_add 201,s$
    next i%
   
    ' finaliser la requête
    res% = dll_call1("FinalizeSQLite3Request",SQL%)     
  end_if
 
end_sub

sub charger_variables() 
  ' extrauire les données des champs du panel 300 et les charger dans les variables
  prenom_contact$ = trim$(text$(n_prenom%))
  numero_contact$ = trim$(text$(n_numero%))
  bis_contact$ = str$(item_index(n_bis%))
  adresse1_contact$ = trim$(text$(n_adresse1%))
  adresse2_contact$ = trim$(text$(n_adresse2%))
  codepost_contact$ = trim$(text$(n_codepost%))
  ville_contact$ = trim$(text$(n_ville%))
  pays_contact$ = trim$(text$(n_pays%))
  portable_contact$ = trim$(text$(n_portable%))
  fixe_contact$ = trim$(text$(n_fixe%))
  mail_contact$ = trim$(text$(n_mail%))
end_sub 

sub valider_nouveau()
  ' valider l'ajout d'un nouveau contact
  nom_contact$ = trim$(text$(n_nom%))
  if nom_contact$=""        : ' ce champ est le seul chanmp obligatoire
    message "Le nom du contact manque !"
    exit_sub     
  end_if
 
  ' extraire les données du panel 300
  charger_variables()
 
  ' construire la requête SQL
  s$ = "INSERT INTO Contacts (Nom,Prenom,Numero,Bis,Adresse1,Adresse2,Codepost,ville,Pays,"
  s$ = s$ + "Portable,Fixe,Mail) VALUES ("
  s$ = s$ + "²"+nom_contact$+"²,²"+prenom_contact$+"²,²"+numero_contact$+"²,²"+bis_contact$
  s$ = s$ + "²,²"+adresse1_contact$+"²,²"+adresse2_contact$+"²,²"+codepost_contact$
  s$ = s$ + "²,²"+ville_contact$+"²,²"+pays_contact$
  s$ = s$ + "²,²"+portable_contact$+"²,²"+fixe_contact$+"²,²"+mail_contact$+"²);"
 
  ' exécuter la requête SQL
  res% = dll_call2("ExecuteSQLite3Script",SQL%,adr(s$))
  if res%<0
    message "Erreur dans requête SQL !"
    exit_sub
  end_if     
 
  ' réafficher la liste
  n_contacts% = n_contacts% + 1
  charger_contacts()
  message "Vous avez actuellement "+str$(n_contacts%)+" contacts."
 
end_sub

sub valider_modifier()
  if ID_contact$=""
    message "Aucun contact n'a été sélectionné !"
    exit_sub
  end_if
  if text$(n_nom%)=""
    message "Le nom du contat manque !"
    exit_sub
  end_if

  ' extraire les données du panel 300
  charger_variables()
 
  ' construire la requête SQL  e les exécuter les unes après les autrez
  s$ = "UPDATE Contacts SET Nom = ²"+nom_contact$+"² WHERE ID= ²"+id_contact$+"² ;"
  res% = dll_call2("ExecuteSQLite3Script",SQL%,adr(s$))
  s$ = "UPDATE Contacts SET Prenom = ²"+prenom_contact$+"² WHERE ID= ²"+id_contact$+"² ;"
  res% = dll_call2("ExecuteSQLite3Script",SQL%,adr(s$))
  s$ = "UPDATE Contacts SET Numero = ²"+numero_contact$+"² WHERE ID= ²"+id_contact$+"² ;"
  res% = dll_call2("ExecuteSQLite3Script",SQL%,adr(s$))
  s$ = "UPDATE Contacts SET Bis = ²"+bis_contact$+"² WHERE ID= ²"+id_contact$+"² ;"
  res% = dll_call2("ExecuteSQLite3Script",SQL%,adr(s$))
  s$ = "UPDATE Contacts SET Adresse1 = ²"+adresse1_contact$+"² WHERE ID= ²"+id_contact$+"² ;"
  res% = dll_call2("ExecuteSQLite3Script",SQL%,adr(s$))
  s$ = "UPDATE Contacts SET Adresse2 = ²"+adresse2_contact$+"² WHERE ID= ²"+id_contact$+"² ;"
  res% = dll_call2("ExecuteSQLite3Script",SQL%,adr(s$))
  s$ = "UPDATE Contacts SET Codepost = ²"+codepost_contact$+"² WHERE ID= ²"+id_contact$+"² ;"
  res% = dll_call2("ExecuteSQLite3Script",SQL%,adr(s$))
  s$ = "UPDATE Contacts SET Ville = ²"+ville_contact$+"² WHERE ID= ²"+id_contact$+"² ;"
  res% = dll_call2("ExecuteSQLite3Script",SQL%,adr(s$))
  s$ = "UPDATE Contacts SET Pays = ²"+pays_contact$+"² WHERE ID= ²"+id_contact$+"² ;"
  res% = dll_call2("ExecuteSQLite3Script",SQL%,adr(s$))
  s$ = "UPDATE Contacts SET Portable = ²"+portable_contact$+"² WHERE ID= ²"+id_contact$+"² ;"
  res% = dll_call2("ExecuteSQLite3Script",SQL%,adr(s$))
  s$ = "UPDATE Contacts SET Fixe = ²"+fixe_contact$+"² WHERE ID= ²"+id_contact$+"² ;"
  res% = dll_call2("ExecuteSQLite3Script",SQL%,adr(s$))
  s$ = "UPDATE Contacts SET Mail = ²"+mail_contact$+"² WHERE ID= ²"+id_contact$+"² ;"
  res% = dll_call2("ExecuteSQLite3Script",SQL%,adr(s$))
 
  charger_contacts()
  ID_contact$ = ""
end_sub

sub valider_supprimer()
  if ID_contact$=""
    message "Aucun contact n'a été sélectionné !"
    exit_sub
  end_if
  if message_confirmation_yes_no("Voulez-vous vraiment supprimer "+item_read$(201,item_index(201))+" ?")<>1 then exit_sub

  ' préparer la requête SQL
  s$ = "DELETE FROM ²Contacts² WHERE Id="+ID_contact$

  ' exécuter le script
  res% = dll_call2("ExecuteSQLite3Script",SQL%,adr(s$))
   
  ' réafficher la liste
  n_contacts% = n_contacts% - 1
  charger_contacts()
  message "Vous avez actuellement "+str$(n_contacts%)+" contacts."
end_sub

sub trier_contact()
  dim_local t1%, t2%, t3%
  if n_contacts%<1
    message "Il n'y a rien à trier !"
    exit_sub
  end_if
  t1% = item_index(n_tri1%)
  t2% = item_index(n_tri2%)
  t3% = item_index(n_tri3%)
  if t2%=t1% then t2% = 0
  if t3%=t1% then t3% = 0
  if t3%=t2% then t3% = 0
 
  ' construire le critère de tri
  crit$ = " "+critere_de_tri$(t1%,t2%,t3%)
 
  ' réafficher la liste selon le tri demandé
  charger_contacts()
end_sub

fnc generer_where$(champ1%,champ2%,nom$)
  ' construire la clause WHERE pour un seul champ ou couple de champs
  dim_local champ$, st$
  ' SELECT * FROM COMPANY WHERE AGE >= 25 AND SALARY >= 65000;
  ' SELECT * FROM COMPANY WHERE NAME LIKE 'Ki%';
  ' SELECT * FROM COMPANY WHERE AGE BETWEEN 25 AND 27;
  ' SELECT * FROM COMPANY WHERE AGE >= 25 AND SALARY >= 65000;
  champ$ = text$(champ1%)
  st$ = ""
  if champ$<>""
    if instr(champ$,"%")>0
      st$ = " "+nom$+" LIKE ²"+champ$+"² AND"
    else
      if text$(champ2%)<>""
        st$ = " "+nom$+" BETWEEN ²"+champ$+"² AND ²"+text$(champ2%)+"² AND"
      else
        st$ = " "+nom$+" = ²"+champ$+"² AND"
      end_if
    end_if
  end_if
  result st$
end_fnc

sub filtrer_contact()
  if n_contacts%<1
    message "Il n'y a rien à filtrer !"
    exit_sub
  end_if
  ' construire la clause WHERE pour tous les champs
  where$ = ""
'  where$ = where$ + generer_where$(nf1_nom%,nf2_nom%,"Nom")
  s$ = generer_where$(nf1_nom%,nf2_nom%,"Nom")
  where$ = where$ + s$
  where$ = where$ + generer_where$(nf1_prenom%,nf2_prenom%,"Prenom")
  where$ = where$ + generer_where$(nf1_numero%,nf2_numero%,"Numero")
  where$ = where$ + generer_where$(nf1_bis%,nf2_bis%,"Bis")
  where$ = where$ + generer_where$(nf1_adresse1%,nf2_adresse1%,"Adresse1")
  where$ = where$ + generer_where$(nf1_adresse2%,nf2_adresse1%,"Adresse2")
  where$ = where$ + generer_where$(nf1_codepost%,nf2_codepost%,"Codepost")
  where$ = where$ + generer_where$(nf1_ville%,nf2_ville%,"Ville")
  where$ = where$ + generer_where$(nf1_pays%,nf2_pays%,"Pays")
  where$ = where$ + generer_where$(nf1_portable%,nf2_portable%,"Portable")
  where$ = where$ + generer_where$(nf1_fixe%,nf2_fixe%,"Fixe")
  where$ = where$ + generer_where$(nf1_mail%,nf2_mail%,"Mail")
  if where$<>"" then where$ = " WHERE ("+left$(where$,len(where$)-4)+")"
 
  ' réafficher la liste selon la sélection demandée
  charger_contacts()
end_sub

fnc critere_de_tri$(n1%,n2%,n3%)
  dim_local ct$
  ct$ = " ORDER BY " +critere_tri$(n1%)
  if n2%>0 then ct$ = ct$ + ", "+critere_tri$(n2%)
  if n3%>0 then ct$ = ct$ + ", "+critere_tri$(n3%)
  result ct$
end_fnc

sub exporter_contacts()
  if checked(n_exporter%)=1
    if count(201)=0
      message "Il n'y a rien à exporter !"
      exit_sub
    end_if
    s$ = trim$(text$(n_nomfichier%))
    if s$=""
      message "Le nom du fichier d'export manque !"
      exit_sub
    end_if
    if lower$(file_extract_extension$(s$))<>".csv"
      message "Ce n'est pas un fichier CSV !"
      exit_sub
    end_if
    if file_exists(s$)=1
      if message_confirmation_yes_no("Ce fichier existe déjà ! Voulez-vous le remplacer ?")<>1 then exit_sub
    end_if
    cursor_hourglass 600
    cursor_hourglass 631
    res% = dll_call5("ExportSQLite3TableToCSV",SQL%,adr(table$),adr(s$),adr(where$),adr(crit$))
    cursor_default 600
    cursor_default 631
    message "Les contacts sélectionnés ont été exportés dans le fichier."
  else
    s$ = trim$(text$(n_nomfichier%))
    if s$=""
      message "Le nom du fichier d'import manque !"
      exit_sub
    end_if                                       
    if lower$(file_extract_extension$(s$))<>".csv"
      message "Ce n'est pas un fichier CSV !"
      exit_sub
    end_if
    if file_exists(s$)=0
      message "Ce fichier n'existe pas !"
      exit_sub
    end_if
    cursor_hourglass 600
    cursor_hourglass 631
    res% = dll_call3("ImportSQLite3TableFromCSV",SQL%,adr(s$),1)
    if res%>=0 then n_contacts% = n_contacts% + res%
    ' réafficher la liste
    charger_contacts()
    cursor_default 600
    cursor_default 631
    s$ =      "Les contacts ont été importés du fichier."+chr$(13)+chr$(10)
    s$ = s$ + "Vous avez actuellement "+str$(n_contacts%)+" contacts."
    message s$
  end_if
end_sub


sub afficher_contact() 
  ' récupérer les champs (sauf ID) 
  res% = dll_call2("GetSQLite3CellText",SQL%,2)
  nom_contact$ = text$(1001)
  res% = dll_call2("GetSQLite3CellText",SQL%,3)
  prenom_contact$ = text$(1001)
  res% = dll_call2("GetSQLite3CellText",SQL%,4)
  numero_contact$ = text$(1001)
  res% = dll_call2("GetSQLite3CellText",SQL%,5)
  bis_contact$ = text$(1001)
  res% = dll_call2("GetSQLite3CellText",SQL%,6)
  adresse1_contact$ = text$(1001)
  res% = dll_call2("GetSQLite3CellText",SQL%,7)
  adresse2_contact$ = text$(1001)
  res% = dll_call2("GetSQLite3CellText",SQL%,8)
  codepost_contact$ = text$(1001)
  res% = dll_call2("GetSQLite3CellText",SQL%,9)
  ville_contact$ = text$(1001)
  res% = dll_call2("GetSQLite3CellText",SQL%,10)
  pays_contact$ = text$(1001)
  res% = dll_call2("GetSQLite3CellText",SQL%,11)
  portable_contact$ = text$(1001)
  res% = dll_call2("GetSQLite3CellText",SQL%,12)
  fixe_contact$ = text$(1001)
  res% = dll_call2("GetSQLite3CellText",SQL%,13)
  mail_contact$ = text$(1001)
 
  ' charger les champs de l'enregistrement trouvé dans le panel 300
  text n_nom%,nom_contact$
  text n_prenom%,prenom_contact$
  text n_numero%,numero_contact$
  i% = val(bis_contact$)
  res% = dll_call2("SelectComboBoxItem",handle(307),i%)
  text n_adresse1%,adresse1_contact$
  text n_adresse2%,adresse2_contact$
  text n_codepost%,codepost_contact$
  text n_ville%,ville_contact$
  text n_pays%,pays_contact$
  text n_portable%,portable_contact$
  text n_fixe%,fixe_contact$
  text n_mail%,mail_contact$
end_sub

sub charger_criteres_tri(n%, index%)
  item_add n%," "
  item_add n%,"Nom"
  item_add n%,"Prénom"
  item_add n%,"Adresse 1"
  item_add n%,"Adresse 2"
  item_add n%,"Code Postal"
  item_add n%,"Ville"
  item_add n%,"Pays"
  item_add n%,"Portable"
  item_add n%,"Fixe"
  item_add n%,"Mail"
  res% = dll_call2("SelectComboBoxItem",handle(n%),index%)
end_sub

fnc critere_tri$(n%)
  select n%
    case  1: result "ID"
    case  2: result "Nom"
    case  3: result "Prenom"
    case  4: result "Adresse1"
    case  5: result "Adresse2"
    case  6: result "Codepost"
    case  7: result "Ville"
    case  8: result "Pays"
    case  9: result "Portable"
    case 10: result "Fixe"
    case 11: result "Mail"
  end_select
end_fnc

' **************************************
' **************************************
' ********** les routines évnements ****
' **************************************
' **************************************

close0:
  SQL% = dll_call1("CloseSQLite3",SQL%)
  res% = dll_call0("ResetSQLite3")
  return

select_folder:
  racine$ = "C:\"
  s$ = string$(255," ")
  res% = dll_call4("FolderSelect",adr(racine$),adr(s$),0,1)
  if res%=1 then text 2,trim$(s$)
  return
 
select_version:
  racine$ = text$(2)
  filter$ = "*.dll|*.dll"
  s$ = string$(255," ")
  res% = dll_call4("FileOpen",adr(racine$),adr(filter$),adr(s$),0)
  if res%=1 then text 5,file_extract_name$(trim$(s$))
  return
 
select_base:
  racine$ = "C:\"
  filter$ = "*.db|*.db"
  s$ = string$(255," ")
  res% = dll_call4("FileOpen",adr(racine$),adr(filter$),adr(s$),0)
  text 8,trim$(s$)
  return

demarrer:
  ' changer le chemin vers le dossier SQLite3
  if active(3)=1
    s$ = text$(2)
    res% = dll_call1("SelectAlternativeSQLite3Path",adr(s$))
  end_if
  ' changer la version de SQLite3
  if active(6)=1
    s$ = text$(5)
    res% = dll_call1("SelectAlternativeSQLite3Version",adr(s$))
  end_if
 
  ' initialiser SQLite3
  if active(3)=1 then res% = dll_call0("InitializeSQLite3")
  inactive 3 : inactive 6 : inactive 9
 
  ' tester si la base de données existe. Si absente, on la crée.
  if file_exists(text$(8))=0
    if message_confirmation_yes_no("Base de données absente. Voulez-vous la créer ?")<>1
      active 9
      return
    end_if
    ' ici, on crée la base
    s$ = text$(8)
    SQL% = dll_call2("OpenSQLite3",adr(s$),handle(1001))
    if SQL%=0
      message "Erreur en création du fichier !"
      active 9
      return
    end_if
    clear 1011
    item_add 1011,"CREATE TABLE Contacts ([ID] INTEGER PRIMARY KEY,"
    item_add 1011," [Nom] VARCHAR (50), [Prenom] VARCHAR (50), [Numero] INTEGER,"
    item_add 1011," [Bis] VARCHAR (10), [Adresse1] VARCHAR (100), [Adresse2] VARCHAR (100)," 
    item_add 1011," [Codepost] INTEGER, [Ville] VARCHAR (100), [Pays] VARCHAR (100),"
    item_add 1011," [Portable] INTEGER, [Fixe] INTEGER, [Mail] VARCHAR (30));"   
    res% = dll_call2("ExecuteSQLite3Script",SQL%,handle(1011))
' message text$(1011)+"res%="+str$(res%)
    if res%<0
      message "Erreur en création de la base de données !"
      active 9
      SQL% = dll_call1("CloseSQLite3",SQL%)
      return
    end_if
    n_contacts% = 0
    n_champs% = 13
  else
    ' ici, on ouvre la base et on vérifié quela structure correspond
    s$ = text$(8)
    SQL% = dll_call2("OpenSQLite3",adr(s$),handle(1001))
    if SQL%=0
      message "Ce fichier n'est pas une base SQLite3 valide :"
      active 9
      return
    end_if
    ' on charge la liste des tables
    res% = dll_call1("GetSQLite3TableNames",SQL%)
    if res%<>1
      message "Ce fichier n'est pas une base des contacts !"
      active 9
      SQL% = dll_call1("CloseSQLite3",SQL%)
      return
    end_if
    if item_read$(1001,1)<>"Contacts"
      message "Ce fichier n'est pas une base des contacts - tables non conformes !"
    message text$(1001)
      active 9
      SQL% = dll_call1("CloseSQLite3",SQL%)
      return
    end_if
    ' on carge la liste des colonnes de la table "Contacts"
    s$ = "Contacts"
    res% = dll_call2("GetSQLite3ColumnNames",SQL%,adr(s$))
    if res%<>13
      message "Ce fichier n'est pas une base des contacts - nombre des colonnes non conformes !"
      active 9
      SQL% = dll_call1("CloseSQLite3",SQL%)
      return
    end_if
    n_champs% = res%
    err% = 0
    for i%=1 to res%
      s$ = item_read$(1001,i%)
      if instr(s$,"["+Colonnes$(i%)+"]")=0 then err% = 1
    next i%
    if err%=1
      message "Ce fichier n'est pas une base des contacts - noms des colonnes non conformes !"
'  message text$(1001)
      active 9
      SQL% = dll_call1("CloseSQLite3",SQL%)
      return
    end_if
    s$ = "Contacts"
    n_contacts% = dll_call2("GetSQLite3RowCount",SQL%,adr(s$))
  end_if
  message "Vous avez actuellement "+str$(n_contacts%)+" contacts."
 
  ' charger la liste des contacts
  charger_contacts()
 
  ' afficher les données 
  hide 10
  show 11
  show 100
  show 200

  return
 
quitter:
  gosub close0
  terminate     
 
select_contact:
  ' récupérer le ID du contact choisi
  index% = item_index(201)
  s$ = item_read$(201,index%)
  ID_contact$ = left$(s$,instr(s$,":")-1)
 
  ' requête SQL pour relire l'enregistrement du contact choisi par son ID
  s$ = "SELECT * FROM Contacts"
  s$ = s$ + " WHERE ((Contacts.ID) Like ²"+ID_contact$+"²)"
 
  ' préparation de la requête: sélection des enregistrements de la table selon les critères
  res% = dll_call2("CompileSQLite3Script",SQL%,adr(s$))
 
  ' pointer sur le premier (unique) contact trouvé
  res% = dll_call1("GetSQLite3NextRow",SQL%)
  if res%<0
    message "Contact non trouvé !"
    return
  end_if
 
  ' récupérer les champs (sauf ID) et les charger dans les champs du panel 300
  afficher_contact()
 
  ' finaliser la requête
  res% = dll_call1("FinalizeSQLite3Request",SQL%)     
  return

ajouter_contact:
  font_size 101,12
  font_size 102,8
  font_size 103,8
  font_size 104,8
  font_size 105,8
  font_size 106,8
  action% = 1
  caption 330,"Ajout d'un nouveau contact"
  show 300
  hide 400
  hide 500
  hide 600
  return
 
valider:
  select action%
    case 1 : ' ajout d'un nouveau contact
      valider_nouveau()
    case 2 : ' modifier un contact
      valider_modifier()
    case 3 : ' supprimer un contact
      valider_supprimer()
    case 4 : ' trier les contacts
      trier_contact()
    case 5 : ' filtrer les contacts
      filtrer_contact()
    case 6: ' exporter les contacts
      exporter_contacts()
  end_select
  return
 
modifier_contact:
  font_size 101,8
  font_size 102,12
  font_size 103,8
  font_size 104,8
  font_size 105,8
  font_size 106,8
  action% = 2
  caption 330,"Modification d'un contact"
  show 300
  hide 400
  hide 500
  hide 600
  return 
 
supprimer_contact:
  font_size 101,8
  font_size 102,8
  font_size 103,12
  font_size 104,8
  font_size 105,8
  font_size 106,8
  action% = 3
  caption 330,"Suppression d'un contact"
  show 300
  hide 400
  hide 500
  hide 600
  return 
 
trier_contact:
  font_size 101,8
  font_size 102,8
  font_size 103,8
  font_size 104,12
  font_size 105,8
  font_size 106,8
  action% = 4
  hide 300
  show 400
  hide 500
  hide 600
  return
 
filtrer_contact:
  font_size 101,8
  font_size 102,8
  font_size 103,8
  font_size 104,8
  font_size 105,12
  font_size 106,8
  action% = 5
  hide 300
  hide 400
  show 500
  hide 600
  return
 
exporter_contacts:
  font_size 101,8
  font_size 102,8
  font_size 103,8
  font_size 104,8
  font_size 105,8
  font_size 106,12
  action% = 6
  hide 300
  hide 400
  hide 500
  show 600
  mark_on n_exporter% 
  return
 
select_fichier:
  s$ = text$(8)
  racine$ = file_extract_path$(s$)
  filter$ = "Fichier CSV|*.csv"
  s$ = string$(255," ")
  res% = dll_call4("FileCreate",adr(racine$),adr(filter$),adr(s$),0)
  if res%>0 then text n_nomfichier%,trim$(s$)
  return
 
vider_filtre:
  text nf1_nom%,""
  text nf1_prenom%,""
  text nf1_numero%,""
  res% = dll_call2("SelectComboBoxItem",handle(nf1_bis%),1)
  text nf1_adresse1%,""
  text nf1_adresse2%,""
  text nf1_codepost%,""
  text nf1_ville%,""
  text nf1_pays%,""
  text nf1_portable%,""
  text nf1_fixe%,""
  text nf1_mail%,""
  text nf2_nom%,""
  text nf2_prenom%,""
  text nf2_numero%,""
  res% = dll_call2("SelectComboBoxItem",handle(nf2_bis%),1)
  text nf2_adresse1%,""
  text nf2_adresse2%,""
  text nf2_codepost%,""
  text nf2_ville%,""
  text nf2_pays%,""
  text nf2_portable%,""
  text nf2_fixe%,""
  text nf2_mail%,""
  return


Dernière édition par Klaus le Sam 4 Déc 2021 - 12:13, édité 2 fois
Revenir en haut Aller en bas
http://klauspanoramic.comxa.com/index.html
Marc

Marc


Nombre de messages : 2380
Age : 63
Localisation : TOURS (37)
Date d'inscription : 17/03/2014

Un gestionnaire de contacts avec SQLite3 (KGF.dll) Empty
MessageSujet: Re: Un gestionnaire de contacts avec SQLite3 (KGF.dll)   Un gestionnaire de contacts avec SQLite3 (KGF.dll) EmptyMer 1 Déc 2021 - 23:57

Merci Klaus pour cette démonstration qui permet de mettre en pratique la puissance de la SQLite3 implantée dans KGF.DLL.

Mes différents tests effectués sont concluants.

Le code-source détaillé et commenté est très pédagogique. Il permet de mettre en pratique facilement sa propre base de données en se référant à ce très bel exemple tu nous donnes.

Merci !






Revenir en haut Aller en bas
Klaus

Klaus


Nombre de messages : 12274
Age : 74
Localisation : Ile de France
Date d'inscription : 29/12/2009

Un gestionnaire de contacts avec SQLite3 (KGF.dll) Empty
MessageSujet: Re: Un gestionnaire de contacts avec SQLite3 (KGF.dll)   Un gestionnaire de contacts avec SQLite3 (KGF.dll) EmptyJeu 2 Déc 2021 - 0:30

Merci, Marc !

Demain, j'ajouterai l'import/export en format CSV...
Revenir en haut Aller en bas
http://klauspanoramic.comxa.com/index.html
Klaus

Klaus


Nombre de messages : 12274
Age : 74
Localisation : Ile de France
Date d'inscription : 29/12/2009

Un gestionnaire de contacts avec SQLite3 (KGF.dll) Empty
MessageSujet: Re: Un gestionnaire de contacts avec SQLite3 (KGF.dll)   Un gestionnaire de contacts avec SQLite3 (KGF.dll) EmptyJeu 2 Déc 2021 - 12:37

Voilà - il y a maintenant un bouton Exporter / Importer dans la barre de commande. Le source ainsi que le mode d'emploi a été mis à jour dans mon premier post.

Voici un exemple d'export:
Code:
Nom, Prenom, Numero, Bis, Adresse1, Adresse2, Codepost, Ville, Pays, Portable, Fixe, Mail
 "Martin", "Dupont", "134", "2", "bld de la République", "", "72050", "Ville sur le Pont", "", "1122334455", "", "martin.dupont@orange.fr"
 "Delorme", "Juliette", "23", "1", "Rue de la Boëtie", "", "55120", "Arpant la Source", "", "644558822", "299886633", "jdelorme@gmail.com"
 "Charbonnier", "Marie-Paule", "29", "1", "Rue de l'Egalité", "face Pharmacie", "12500", "Vitré sur Ourgh", "", "1234567890", "9988776655", "josiane.charbonnier@gmail.com"

Attention: Il doit y avoir 4 lignes: 1 entête avec les noms des champs, puis 3 lignes pour les 3 contacts.
Veillez à recoller les lignes qui seraient éventuellement coupées.

Pour démarrer, il suffit alors de lancer le programme, en absence de toute base de données,
puis importer ce fichier. Et on se trouve avec 3 contacts chargés.

EDIT

Dans le code actuel, l'export en CSV et son import est codé en Panoramic ce qui est assez lon (en code, pas en exécution !). Mais une version de KGF.dll en cours de préparation incluera ces deux fonctions de façon "native" dans KGF.dll.
Revenir en haut Aller en bas
http://klauspanoramic.comxa.com/index.html
lepetitmarocain




Nombre de messages : 333
Age : 81
Localisation : Région Parisienne (à mon grand désespoir)
Date d'inscription : 04/07/2018

Un gestionnaire de contacts avec SQLite3 (KGF.dll) Empty
MessageSujet: Re: Un gestionnaire de contacts avec SQLite3 (KGF.dll)   Un gestionnaire de contacts avec SQLite3 (KGF.dll) EmptyVen 3 Déc 2021 - 19:02

Bonsoir à tous

@Klaus.

Je viens de tester le programme : Gestionnaire de Contacts , et j'ai un message d'erreur dés que j'appuie sur DÉMARRER.

(29) Not Correct Arithmetic expression : error in function line 838.

Je n'ai touché à rien sur les lignes de Dossier, Version et Base de Données

Peux tu STP me dire ce qu'il en est.

Merci

Bonne soirée
Revenir en haut Aller en bas
Klaus

Klaus


Nombre de messages : 12274
Age : 74
Localisation : Ile de France
Date d'inscription : 29/12/2009

Un gestionnaire de contacts avec SQLite3 (KGF.dll) Empty
MessageSujet: Re: Un gestionnaire de contacts avec SQLite3 (KGF.dll)   Un gestionnaire de contacts avec SQLite3 (KGF.dll) EmptyVen 3 Déc 2021 - 21:09

Difficile à dire. avec le code posté dans mon premier post, on a ceci:
Un gestionnaire de contacts avec SQLite3 (KGF.dll) Aa187
La seule cause possible de cette erreur serait que les fonctions de KGF.dll appelées ici ne soient pas présentes dans KGF.dll sur ta machine.

Conclusion: recharge KGF.dll (via ma signature dans ce port) et réessaie...
Revenir en haut Aller en bas
http://klauspanoramic.comxa.com/index.html
Klaus

Klaus


Nombre de messages : 12274
Age : 74
Localisation : Ile de France
Date d'inscription : 29/12/2009

Un gestionnaire de contacts avec SQLite3 (KGF.dll) Empty
MessageSujet: Re: Un gestionnaire de contacts avec SQLite3 (KGF.dll)   Un gestionnaire de contacts avec SQLite3 (KGF.dll) EmptySam 4 Déc 2021 - 12:18

Suite à l'jout de fonctions d'export et import en CSV à KGF.dll, j'ai adapté mon programme de gestion de contacts à ces fonctions. Résultat: les deux grandes procédures réalisant ces fonctions ont été respectivement remplacées par un seul appel à une de ces nouvelles fonctions. Fonctionnellement, cependant, rien n'a changé.

Le code source a été mis à jour dans me premier post de ce fil de discussion.
Revenir en haut Aller en bas
http://klauspanoramic.comxa.com/index.html
Minibug

Minibug


Nombre de messages : 4566
Age : 57
Localisation : Vienne (86)
Date d'inscription : 09/02/2012

Un gestionnaire de contacts avec SQLite3 (KGF.dll) Empty
MessageSujet: Re: Un gestionnaire de contacts avec SQLite3 (KGF.dll)   Un gestionnaire de contacts avec SQLite3 (KGF.dll) EmptySam 4 Déc 2021 - 14:13

Bonjour Klaus

Je me demandais s'il serai possible de gérer la liste des objets pour mon éditeur d'objets que je suis en train de développer.
En fait non, je sais que c'est possible mais je crains de mettre en place une usine à gaz...

Actuellement j'utilise des GRIDs et des DLISTs pour gérer tout ça !

Crois tu qu'au bout du compte je gagnerai d'une façon ou d'une autre en mettant en place une base de données telle que SQLite et KGF ?
Quelle serai réellement la différence ? En sachant que la base n'est soumise a aucune règle de sécurité ni aucun soucis de rapidité.

Merci d'avance pour ta réponse Klaus.
Revenir en haut Aller en bas
http://gpp.panoramic.free.fr
Klaus

Klaus


Nombre de messages : 12274
Age : 74
Localisation : Ile de France
Date d'inscription : 29/12/2009

Un gestionnaire de contacts avec SQLite3 (KGF.dll) Empty
MessageSujet: Re: Un gestionnaire de contacts avec SQLite3 (KGF.dll)   Un gestionnaire de contacts avec SQLite3 (KGF.dll) EmptySam 4 Déc 2021 - 17:46

Difficile à répondre, sans plus de renseigements. SQLite3 est un stricte gestionnaire de bases de données. On peut y créer 1 ou plusieurs tables, chaque table étant composé d'enregistrements (de lignes) de composition identique, mais différente d'une table à l'autre. Chaque enregistrement peut contenir des champs de nature différente (valeurs entières, valeurs flottantes, strings, ...).

Tout dépend ce que tu veux gérer par cela. Il est peu utile de placer des morceaux entiers de code dans la base - mieux vaut mes mettre dans des fichiers et placer le nom du fichier dans la base.

Par contre, pour gérer les attributs d'un objet, on peut imaginer, pour chaque objet, un enregistrement avec des champs "libéllé", "valeur par défaut", valeur actuelle" pour chaque propriété. Ce serait une utilisation sensée pour SQLite3. Encore faudrait-il définir un format commun pour tous les objets ce qui semble peu pratique.

Par contre, on peut imaginer une solution avec plusieurs tables dans la même base. Une première table contient la liste des objets possibles, avec le nom de tous les attributs possibles. Il suffit de définir un nombre suffisant de champs pour pouvoir enregistrer l'objet ayant le plus d'attributs.

Ensuite, on aurait une table contenant tous les attributs avec leur valeur opar défaut.

Puis, il yaurait une table similaire à la première, mais contenant uniquement la liste des objets actuels du projet.

Puis, une dernière table contenant la liste des attributs actuels des objets du prohet avec leurs valeurs actuelles.

Il faudrait créer une première base SQLite3 "maître" contenant juste les deux premières tables. Puis, on exporte ces deux tables en format CSV. Ensuite, lors de la création d'un nouveau projet, on crée une nouvelle base, on y charge les deux ables exportées en CSV pour créer la base de connaissance, puis on crée les deux autres tables vides. Enuite, lors de la création d'un objet, on copie la définition de l'objet de la première base dans la troisième, puis, pour chaque propriéé utilisée, on copie la ligne correspondante de la 2ème base dans la 4ème en y mettant la valeur actuelle.

J'espère que j'ai à peu près capté ce que tu cherchais. Cependant, puisque tu parles de GRID, eh bien SQLite3 est juste en mémoire et sur disque. Il n'y a aucun affichage qui reste à gérer séparément.
Revenir en haut Aller en bas
http://klauspanoramic.comxa.com/index.html
Minibug

Minibug


Nombre de messages : 4566
Age : 57
Localisation : Vienne (86)
Date d'inscription : 09/02/2012

Un gestionnaire de contacts avec SQLite3 (KGF.dll) Empty
MessageSujet: Re: Un gestionnaire de contacts avec SQLite3 (KGF.dll)   Un gestionnaire de contacts avec SQLite3 (KGF.dll) EmptySam 4 Déc 2021 - 17:58

Merci pour toutes ces explications Klaus.

Cela me semble quand même un peu lourd a gérer.
D'autant plus que ma base actuelle (GRID+DLIST) fonctionne parfaitement à ce jour.

Je vais laisser comme ça pour le moment. Et je verrai ensuite si le besoin s'en fait sentir.
De toutes les façons, si je décide de basculer vers SQLite il faudra que je reprenne toute la gestion.

Ca me laissera aussi le temps de me familiariser avec le fonctionnement de SQLite dans KGF ! Wink
Revenir en haut Aller en bas
http://gpp.panoramic.free.fr
Contenu sponsorisé





Un gestionnaire de contacts avec SQLite3 (KGF.dll) Empty
MessageSujet: Re: Un gestionnaire de contacts avec SQLite3 (KGF.dll)   Un gestionnaire de contacts avec SQLite3 (KGF.dll) Empty

Revenir en haut Aller en bas
 
Un gestionnaire de contacts avec SQLite3 (KGF.dll)
Revenir en haut 
Page 1 sur 1
 Sujets similaires
-
» Liste de contacts avec 2 GLIST synchronisées
» Gestion de contacts téléphoniques
» un gestionnaire banquaire
» Gestionnaire perso de plantes (ou d'autres types d'objets)
» Gestionnaire d'une librairie de fichiers

Permission de ce forum:Vous ne pouvez pas répondre aux sujets dans ce forum
FORUM DE DISCUSSION SUR LE LANGAGE PANORAMIC :: PANORAMIC :: Vos sources, vos utilitaires à partager-
Sauter vers: