Page en cours de chargement

  
    
     
trans

 

CPDB.Net

 

[fr]
trans
[en]

 

Accueil
Accueil

 

Nouvelles
Nouvelles

 

Téléchargements
Téléchargements

 

Stats
Stats

 

 

Admin
Admin

trans

Retour :

PPCompiler

trans

Sommaire

CPDB librairie
1- Intégrer les fonctionnalités CPDB dans vos projets
2- Ouvrir et fermer vos bases de données
3- Fonctions de parcours d'une base de données
4- Fonctions de gestion des champs
5- Fonctions de modification d'une base de données
6- Fonctions de tri et de recherche
7- Index des fonctions
8- Codes d'erreur
Documentation
Conduit CPDB
Fonctionnalités de CPDB

trans

Préférences

Votre nom : Invité


Utilisateurs en ligne

( personne )

trans

Webmaster

Webmaster : Palmipod

E-mail : phc­@­palmipod­.­com

Ce site est compatible avec les navigateurs de version 4 minimum.

trans

trans

7- Index des fonctions

CPDB_AjouteEnregistrement





err = CPDB_AjouteEnregistrement(UInt8 iHandle)
Parametres :
UInt8 iHandle : Handle de la base de données CPDB, renvoyé par CPDB_Ouvrir.
Description :
Ajoute un enregistrement à la base de données.
Recopie l'enregistrement courant et ses modifications si une lecture et/ou des
modifications ont précédé l'appel à la fonction.

Utilisez CPDB_RAZ avant l'appel à CPDB_AjouteEnregistrement pour ajouter un
enregistrement vide.

Retourne 0 si aucune erreur ne s'est produite.
Retourne CPDB_ERR_WRITEFAILED si l'écriture a échoué.
Retourne CPDB_ERR_MEMORYERROR si le système a refusé l'ajout de l'enregistrement.

CPDB_Avancer





err = CPDB_Avancer(UInt8 iHandle, UInt16 piOffset)
Parametres :
UInt8 iHandle : Handle de la base de données CPDB, renvoyé par CPDB_Ouvrir.

UInt16 piOffset : Nombre d'enregistrement à sauter.
Description :
Utiliser CPDB_Avancer pour avancer le curseur de "piOffset" enregistrements, le saut
est relatif à la position courante du curseur.


Retourne 0 si aucune erreur ne s'est produite.

CPDB_CompterEnregistrement





err = CPDB_CompterEnregistrement(UInt8 iHandle, UInt16 *iValeur)
Parametres :
UInt8 iHandle : Handle de la base de données CPDB, renvoyé par CPDB_Ouvrir.
UInt16 *iValeur : Pointeur sur une variable UInt16, où sera stocké le nombre
d'enregistrements comptés.
Description :
Utiliser CPDB_CompterEnregistrement pour obtenir le nombre d'enregistrement
contenu dans la base de données ouverte.

Retourne 0 si aucune erreur ne s'est produite.

CPDB_CreerDatabase





err = CPDB_CreerDatabase(UInt16 iCardNo, const Char *sNom, UInt32 iCreator,
const Char *sDescription)
Parametres :
UInt8 iHandle : Handle de la base de données CPDB, renvoyé par CPDB_Ouvrir.
UInt16 iCardNo : Numéro de carte mémoire du Palm, utiliser 0 pour la RAM.
const Char *sNom : Nom de la base de données à créer
UInt32 iCreator : ID du créateur, exemple 'CPDB'
const Char *sDescription : Masque de description de la structure
Description :
Crée une nouvelle base de données. Si la base de données existe déjà la fonction échoue.

Format du masque de description :
NOMRUBRIQUE1=TYPE[TAILLE];NOMRUBRIQUE2=TYPE[TAILLE];...

Type acceptés :
SHORTINT : Entier court sur 8 bits
INT : Entier sur 16 bits
LONGINT : Entier long sur 32 bits
STRING[TAILLE] : Chaine de caractère

Chaque rubrique est séparée par un ';' et est décrite par son nom, le signe '=', son type
et sa taille entre [] si le type est STRING. La taille est exprimée en C, donc caractère
ASCIIZ compris. Exemple : une chaine de taille 20 ne peut contenir que 19 caractères utiles.
Attention : la taille n'est à décrire que pour les rubriques de type chaine (STRING).

Retourne 0 si aucune erreur ne s'est produite.
Retourne CPDB_ERR_INVALID si le masque de description est incorrect.
Retourne CPDB_ERR_DATABASEALREADYEXIST si la base de données existe déjà.
Retourne CPDB_ERR_CARDNOTPRESENT si iCardNo ne correspond pas à une carte existante.
Retourne CPDB_ERR_RAMONLYCARD si iCardNo ne correspond pas à une carte inscriptible.
Retourne CPDB_ERR_NOTENOUGHSPACE si la mémoire est insuffisante.

CPDB_DatabaseExiste





err = CPDB_DatabaseExiste(const Char *sNom)
Parametres :
const Char *sNom : Nom de la base de données.
Description :
Retourne 0 si la base de données existe, CPDB_ERR_NOEXIST sinon.

CPDB_EcrireChaine





err = CPDB_EcrireChaine(UInt8 iHandle, const Char* sNom, const Char *sValeur)
Parametres :
UInt8 iHandle : Handle de la base de données CPDB, renvoyé par CPDB_Ouvrir.

const Char *sNom : Nom de la rubrique.

const Char *sValeur : Valeur à inscrire dans l'enregistrement.

Description :
Ecrit dans une rubrique de type Chaine de l'enregistrement courant.
Exemple :
err = CPDB_EcrireChaine(handleClients, "nom", "CPDB.NET");

Si la chaine est plus grande que la taille maximum de la rubrique, elle est tronquée.
Retourne 0 si aucune erreur ne s'est produite.
Retourne CPDB_ERR_WRITEFAILED si l'écriture a échoué.

CPDB_EcrireEntier





err = CPDB_EcrireEntier(UInt8 iHandle, const Char* sNom, Int16 iValeur)
Parametres :
UInt8 iHandle : Handle de la base de données CPDB, renvoyé par CPDB_Ouvrir.

const Char *sNom : Nom de la rubrique.

Int16 iValeur : Valeur à inscrire dans l'enregistrement.

Description :
Ecrit dans une rubrique de type Entier de l'enregistrement courant.
Exemple :
Int16 annee = 2002;
err = CPDB_EcrireEntier(handleClients, "annee", annee);
Retourne 0 si aucune erreur ne s'est produite.
Retourne CPDB_ERR_WRITEFAILED si l'écriture a échoué.


CPDB_EcrireEntierCourt





err = CPDB_EcrireEntierCourt(UInt8 iHandle, const Char* sNom, Int8 iValeur)
Parametres :
UInt8 iHandle : Handle de la base de données CPDB, renvoyé par CPDB_Ouvrir.

const Char *sNom : Nom de la rubrique.

Int8 iValeur : Valeur à inscrire dans l'enregistrement.

Description :
Ecrit dans une rubrique de type Entier Court de l'enregistrement courant.
Exemple :
Int8 numero = 123;
err = CPDB_EcrireEntierCourt(handleClients, "numero", numero);
Retourne 0 si aucune erreur ne s'est produite.
Retourne CPDB_ERR_WRITEFAILED si l'écriture a échoué.


CPDB_EcrireEntierLong





err = CPDB_EcrireEntierLong(UInt8 iHandle, const Char* sNom, Int32 iValeur)
Parametres :
UInt8 iHandle : Handle de la base de données CPDB, renvoyé par CPDB_Ouvrir.

const Char *sNom : Nom de la rubrique.

Int32 iValeur : Valeur à inscrire dans l'enregistrement.

Description :
Ecrit dans une rubrique de type Entier Long de l'enregistrement courant.
Exemple :
Int32 code = 123456789;
err = CPDB_EcrireEntierLong(handleClients, "code", code);
Retourne 0 si aucune erreur ne s'est produite.
Retourne CPDB_ERR_WRITEFAILED si l'écriture a échoué.


CPDB_EstTrouve





err = CPDB_EstTrouve(UInt8 iHandle, Boolean *piFlag)
Parametres :
UInt8 iHandle : Handle de la base de données CPDB, renvoyé par CPDB_Ouvrir.

Boolean *piFlag : Pointeur sur une valeur Booléene, dans laquelle le résultat de la dernière
opération de recherche sera écrit.
Description :
Après l'exécution d'une fonction de recherche la valeur de piFlag est 'true' si la recherche
a abouti, 'false' sinon.
Pour un parcours de tous les enregistrements, utiliser plutôt CPDB_EstEnDehors().

Retourne 0 si aucune erreur ne s'est produite.

CPDB_EstEnDehors





err = CPDB_EstEnDehors(UInt8 iHandle, Boolean *piFlag)
Parametres :
UInt8 iHandle : Handle de la base de données CPDB, renvoyé par CPDB_Ouvrir.
Boolean *piFlag : Pointeur sur une valeur Booléene, dans lequel le résultat de la dernière
opération de parcours sera écrit.
Description :
Après une opération de recherche, CPDB_EstEnDehors est utilisé pour connaitre l'état du
curseur dans la base de données.
Le "curseur" est la position du dernier enregistrement chargé en mémoire.

Après l'exécution d'une fonction de parcours la valeur de piFlag est 'true' si la recherche
a abouti, 'false' sinon.

CPDB_EstEnDehors est très utilisé pour parcourir une base de données ou pour controler
la validité du curseur.

Retourne 0 si aucune erreur ne s'est produite.

CPDB_Fermer





err = CPDB_Fermer(UInt8 iHandle)
Parametres :
UInt8 iHandle : Handle de la base de données CPDB, renvoyé par CPDB_Ouvrir.
Description :
Ferme la base de données. Pour ouvrir la base de données, utiliser CPDB_Ouvrir.

Retourne 0 si aucune erreur ne s'est produite.

CPDB_LireChaine




err = CPDB_LireChaine(UInt8 iHandle, const Char* sNom, MemHadle* hValeur)
Parametres :
UInt8 iHandle : Handle de la base de données CPDB, renvoyé par CPDB_Ouvrir.

const Char *sNom : Nom de la rubrique.

MemHandle *hValeur : Pointeur sur un Memhandle, dans laquelle sera écrite un handle
pointant sur la chaine de caractère lu dans la rubrique.


Description :
Lit la chaine contenu dans la rubrique. Le MemHandle est allouée par CPDB, vous devrez
libérer la mémoire après utilisation.
Exemple :

MemHandle hClient_nom;
Char *sClient_nom;

err = CPDB_LireChaine(handleClients, "nom", &hClient_nom);
sClient_nom = MemHandleLock(hClient_nom);
...
// votre traitement sur la chaine ici
...
MemHandleUnlock(hClient_nom);
MemHandleFree(hClient_nom);

Retourne 0 si aucune erreur ne s'est produite.

CPDB_LireDernier




err = CPDB_LireDernier(UInt8 iHandle, const Char *sNom)
Parametres :
UInt8 iHandle : Handle de la base de données CPDB, renvoyé par CPDB_Ouvrir.

const Char *sNom : Nom de la rubrique.

Description :
Lit le dernier enregistrement de la base de données.
Utiliser CPDB_EstEndehors pour savoir si un enregistrement a été correctement chargé.

Retourne 0 si aucune erreur ne s'est produite.

CPDB_LireEntier




err = CPDB_LireEntier(UInt8 iHandle, const Char* sNom, Int16 *iValeur)
Parametres :
UInt8 iHandle : Handle de la base de données CPDB, renvoyé par CPDB_Ouvrir.

const Char *sNom : Nom de la rubrique.

Int16 *iValeur : Pointeur sur une valeur Int16 dans laquelle sera écrite la valeur de
la rubrique.


Description :
Lit la rubrique Entier de l'enregistrement courant.
Exemple :
Int16 annee_courante;
err = CPDB_LireEntier(handleClients, "annee", &annee_courante);
Retourne 0 si aucune erreur ne s'est produite.

CPDB_LireEntierCourt




err = CPDB_LireEntierCourt(UInt8 iHandle, const Char* sNom, Int8 *iValeur)
Parametres :
UInt8 iHandle : Handle de la base de données CPDB, renvoyé par CPDB_Ouvrir.

const Char *sNom : Nom de la rubrique.

Int8 *iValeur : Pointeur sur une valeur Int8, dans laquelle sera écrite la valeur
de la rubrique.


Description :
Lit l'Entier Court contenu dans la rubrique sNom.
Exemple :
Int8 client_age;

err = CPDB_LireEntierCourt(handleClients, "age", &client_age);
Retourne 0 si aucune erreur ne s'est produite.

CPDB_LireEntierLong




err = CPDB_LireEntierLong(UInt8 iHandle, const Char* sNom, Int32 *iValeur)
Parametres :
UInt8 iHandle : Handle de la base de données CPDB, renvoyé par CPDB_Ouvrir.

const Char *sNom : Nom de la rubrique.

Int32 *iValeur : Pointeur sur une valeur Int32, dans laquelle sera écrite la valeur de
la rubrique.

Description :
Lit l'Entier long contenu dans la rubrique sNom.
Exemple :
Int32 client_nombre;
err = CPDB_LireEntierLong(handleClients, "nombre", &client_nombre);
Retourne 0 si aucune erreur ne s'est produite.

CPDB_LirePosition




err = CPDB_LirePosition(UInt8 iHandle, UInt16 *iValeur)
Parametres :
UInt8 iHandle : Handle de la base de données CPDB, renvoyé par CPDB_Ouvrir.

UInt16 *iValeur : Pointeur sur une valeur UInt16 valeur, dans laquelle sera écrite la
valeur de la rubrique.
Description :
Utiliser CPDB_LirePosition pour obtenir la position du curseur dans la base de données
ouverte.

Vous pouvez utiliser cette valeur avec CPDB_Positionner (La première position étant 1).
Retourne 0 si aucune erreur ne s'est produite.

CPDB_LirePrecedent




err = CPDB_LirePrecedent(UInt8 iHandle, const Char *sNom)
Parametres :
UInt8 iHandle : Handle de la base de données CPDB, renvoyé par CPDB_Ouvrir.

const Char *sNom : Nom de la rubrique.

Description :
Lit l'enregistrement précédent à partir de l'enregistrement courant.
Utiliser CPDB_EstEndehors pour savoir si un enregistrement a été correctement chargé.

Retourne 0 si aucune erreur ne s'est produite.

CPDB_LirePremier





err = CPDB_LirePremier(UInt8 iHandle, const Char *sNom)
Parametres :
UInt8 iHandle : Handle de la base de données CPDB, renvoyé par CPDB_Ouvrir.

const Char *sNom : Nom de la rubrique.

Description :
Lit le premier enregistrement de la base de données.
Utiliser CPDB_EstEndehors pour savoir si un enregistrement a été correctement chargé.

Retourne 0 si aucune erreur ne s'est produite.

CPDB_LireSuivant




err = CPDB_LireSuivant(UInt8 iHandle, const Char *sNom)
Parametres :
UInt8 iHandle : Handle de la base de données CPDB, renvoyé par CPDB_Ouvrir.

const Char *sNom : Nom de la rubrique.

Description :
Lit l'enregistrement suivant à partir de l'enregistrement courant.
Utiliser CPDB_EstEndehors pour savoir si un enregistrement a été correctement chargé.
Retourne 0 si aucune erreur ne s'est produite.

CPDB_LireVersion




err = CPDB_LireVersion(MemHandle *hVersion)
Parametres :
MemHandle *hVersion : Pointeur sur un MemHandle qui sera utilisé pour contenir le résultat
de la fonction.
Description :
Lire la version de la librairie. La version sera retournée dans une chaine de caractère.
Le MemHandle est allouée par CPDB, vous devrez libérer la mémoire après utilisation.
Retourne 0 si aucune erreur ne s'est produite.

CPDB_ListerRubrique





err = CPDB_ListerRubrique(UInt8 iHandle, MemHandle *phListe)
Parametres :
UInt8 iHandle : Handle de la base de données CPDB, renvoyé par CPDB_Ouvrir.
MemHandle *phListe : Pointeur sur un MemHandle libre.
Description :
Utiliser CPDB_ListerRubrique pour obtenir la liste des rubriques de la base de données.

La liste resultat est une chaine de caractère allouée par CPDB, vous devrez la libérer
après utilisation.
Format de la chaine résultat :
NomChamps=TypeRubrique;NomChamps=TypeRubrique;NomChamps=TypeRubrique;...
Description de TypeRubrique :

enum __cpdb_TypeRubrique {
CPDB_TYPECHAINE = 0,
CPDB_TYPEENTIERCOURT = 1,
CPDB_TYPEENTIER = 2,
CPDB_TYPEENTIERLONG = 3,
CPDB_TYPEINCONNU = 0xFF
};
Retourne 0 si aucune erreur ne s'est produite.

CPDB_MetAJourEnregistrement





err = CPDB_MetAJourEnregistrement(UInt8 iHandle)
Parametres :
UInt8 iHandle : Handle de la base de données CPDB, renvoyé par CPDB_Ouvrir.
Description :
Met à jour un enregistrement à la base de données.
Valide les modifications apportées à l'enregistrement courant.

Retourne 0 si aucune erreur ne s'est produite.
Retourne CPDB_ERR_WRITEFAILED si l'écriture a échoué.
Retourne CPDB_ERR_NOPREVREAD si aucun enregistrement n'est chargé en mémoire.


CPDB_Ouvrir





err = CPDB_Ouvrir(UInt16 cardNo, const Char* pnameP, UInt16 mode, UInt8 *piHandle)
Parametres :
UInt16 cardNo : Numéro de carte, 0 si aucune carte n'a été ajoutée.

const Char* pnameP : Nom de la base CPDB.

UInt16 mode : Mode d'ouverture.

UInt8 *piHandle : Pointeur sur une valeur Int8, qui contiendra le handle résultat.
Description :
Utiliser CPDB_Ouvrir pour ouvrir une base de données CPDB et obtenir un handle dessus.
Description des modes d'ouverture :

dmModeReadWrite : Acces en Lecture/Ecriture.
dmModeReadOnly : Acces en Lecture seule.
dmModeWrite : Acces en Ecriture seule.
dmModeExclusive : Ne laisse personne ouvrir cette base de données.
Note : Le mode dmModeReadWrite est nécessaire si vous devez utiliser la fonction CPDB_Trier.

Retourne 0 si aucune erreur ne s'est produite.

CPDB_Positionner





err = CPDB_Positionner(UInt8 iHandle, UInt16 piPosition)

Parametres :
UInt8 iHandle : Handle de la base de données CPDB, renvoyé par CPDB_Ouvrir.

UInt16 piPosition : Nouvelle position du curseur dans la base de données.

Description :
Utiliser CPDB_Positionner pour positionner directement le curseur sur un enregistrement.
La première position dans la base de données est 1.

Retourne 0 si aucune erreur ne s'est produite.

CPDB_RAZ





err = CPDB_RAZ(UInt8 iHandle)
Parametres :
UInt8 iHandle : Handle de la base de données CPDB, renvoyé par CPDB_Ouvrir.
Description :
Utilisez CPDB_RAZ avant l'appel à CPDB_AjouteEnregistrement,
CPDB_MetAJourEnregistrement ou les fonctions de modifications de rubrique pour
travailler sur un enregistrement vide.

Retourne 0 si aucune erreur ne s'est produite.


CPDB_Rechercher





err = CPDB_Rechercher(UInt8 iHandle, const Char *sNom, const Char *sValeur, UInt8 iMode)
Parametres :
UInt8 iHandle : Handle de la base de données CPDB, renvoyé par CPDB_Ouvrir.

const Char *sNom : Nom de la rubrique.

const Char *sValeur : Valeur recherchée dans la rubrique.

UInt8 iMode : Mode de recherche, voir la description.
Description :
Recherche une valeur dans une rubrique de la base de données et se positionne sur
l'enregistrement correspondant. Si le champs est un champ numérique, une conversion est
effectuée.
Valeur possible pour iMode :
CPDB_SEARCH_REVERSE : La base de données est parcouru en sens inverse.
CPDB_SEARCH_FROMCURRENT : La recherche est effectuée à partir de l'enregistrement courant.
CPDB_FIND_UNTIL : La recherche trouve la valeur égale ou supérieure (inférieure dans le cas
d'une recherche avec CPDB_SEARCH_REVERSE)

Pour une rubrique de type Chaine seulement :
CPDB_SEARCH_WITHIN : Recherche à l'intérieur de la chaine (Par defaut, le mode
est : "Commence par")
CPDB_SEARCH_CASELESS : Ne respecte pas la casse (Par defaut, le mode est "Sensible à la
casse")
Exemple :
err = CPDB_Rechercher(handleClients, "pays", "france", CPDB_SEARCH_WITHIN
+ CPDB_SEARCH_CASELESS);
Retourne 0 si aucune erreur ne s'est produite.

CPDB_RechercherNumerique




err = CPDB_RechercherNumerique(UInt8 iHandle, const Char *sNom, const Int32 iValeur, 
UInt8 iMode)
Parametres :
UInt8 iHandle : Handle de la base de données CPDB, renvoyé par CPDB_Ouvrir.

const Char *sNom : Nom de la rubrique.

const Int32 iValeur : Valeur recherchée dans la rubrique

UInt8 iMode : Mode de recherche, voir la description.
Description :
Recherche la valeur numérique dans une rubrique de la base de données et se positionne sur
l'enregistrement correspondant. Si le champs est de type inférieur à Int32, une conversion
est effectuée, faite donc attention au risque de perte de données.

Valeur possible pour iMode :
CPDB_SEARCH_REVERSE : La base de données est parcouru en sens inverse.
CPDB_FIND_UNTIL : La recherche trouve la valeur égale ou supérieure (inférieure dans le cas
d'une recherche avec CPDB_SEARCH_REVERSE)

CPDB_SEARCH_FROMCURRENT : La recherche est effectuée à partir de l'enregistrement courant.

(Les autres modes sont ignorés)
Exemple :
// Recherche le prochain utilisateur dont le champs "annee" = 2001.

err = CPDB_RechercherNumerique(handleClients, "annee", 2001, CPDB_SEARCH_FROMCURRENT);
Retourne 0 si aucune erreur ne s'est produite.

CPDB_Reculer




err = CPDB_Reculer(UInt8 iHandle, UInt16 piOffset)
Parametres :
UInt8 iHandle : Handle de la base de données CPDB, renvoyé par CPDB_Ouvrir.

UInt16 piOffset : Nombre d'enregistrement à sauter.
Description :
Utiliser CPDB_Reculer pour reculer le curseur de "piOffset" enregistrements, le saut
est relatif à la position courante.
Retourne 0 si aucune erreur ne s'est produite.

CPDB_SupprimeEnregistrement





err = CPDB_SupprimeEnregistrement(UInt8 iHandle)
Parametres :
UInt8 iHandle : Handle de la base de données CPDB, renvoyé par CPDB_Ouvrir.
Description :
Supprime l'enregistrement en cours de lecture de la base de données.

Retourne 0 si aucune erreur ne s'est produite.
Retourne CPDB_ERR_NOPREVREAD si aucun enregistrement n'est chargé en mémoire.

CPDB_Trier




err = CPDB_Trier(UInt8 iHandle, const Char *sNom, UInt8 iDirection)
Parametres :
UInt8 iHandle : Handle de la base de données CPDB, renvoyé par CPDB_Ouvrir.

const Char *sNom : Nom de la rubrique.

UInt8 iDirection : Direction du tri, voir la description.
Description :
Tri la base de données selon une rubrique défini. Cette opération peut prendre du temps
sur de grosse base de données.
Valeur possible pour iDirection :

CPDB_SORT_ASC : Le tri est effectué de manière Croisssante
CPDB_SORT_DESC
: Le tri est effectué de manière Décroisssante

Note : Une opération de tri est une opération de modification, vous devez ouvrir votre
base de données en mode Ecriture.
Retourne 0 si aucune erreur ne s'est produite.


Date de création : 01/10/2003 @ 07:02
Dernière modification : 01/10/2003 @ 07:44
Catégorie : CPDB librairie
Page lue 6675 fois

Prévisualiser la pagePrévisualiser la page

  

Imprimer la pageImprimer la page

Librairie CPDB.net

La librairie PalmOS est compilée en C, fournie avec son .h et sa documentation.

La librairie est utilisable par toutes applications développées avec CodeWarrior, Falch.net ou PRC-Tools.


Inclus :
Conduit générique
CPDBConduit et assistant CPDBWizard


Le conduit générique CPDBConduit permet de convertir une base de données PC au format proche du CSV en une base de données Palm au format CPDB.


CPDBWizard vous permet de décrire vos bases de données et génère pour vous le code source nécessaire à leur exploitation.

trans

Recherche

trans

trans

Visites (depuis Août 2006)

  visiteurs

  visiteur en ligne

trans

trans

Haut

trans

GuppY - http://www.freeguppy.org/
Site fonctionnant sous GuppY v3.0p5mod - GNU Public License - © 2002-2004

trans

Page chargée en 0.02 seconde