CRUD pour la base de données MYSQL


comment effectuer les opérations CRUD pour
 la base de données MYSQL pour une application WM (android)?

Le but de ce Tutorial est d'apprendre comment effectuer les différents opération de la base de données MYSQL tel que l'ajout, suppression, modification ou la sélection dans une application Android sous WM .

Prérequis:

Vous avez besoin de suivre le Tutorial précédent:      Connecter Android avec Mysql sous WM  

Préparation de l'espace:

Création d'une table "Produits" (ref,libelle,prix,description) dans la base de données qu'on a vu précédemment.
Remplir quelque ligne, au moins 3 ligne de la table "Produits".

sélection:

Maintenant ouvrez votre IDE ainsi ton projet déjà réalisé dans le tuto précédent,
et insérer le chaps ZONE_repeté et ajouter 6 libellé (textView) et une button "afficher la liste des produits"
dedans comme suit:


Je vais maintenant prendre à récupérer toutes les lignes de ma base de données et de les mettre dans les champs textes pour chaque zone càd chaque Zone correspond à une ligne de la BD mysql.

Les nom des champs:

Zone_repeté: ZR_produit
num              : LIB_ref
LIBELLé     : LIB_libelle
Prix              : LIB_prix
Description  : LIB_desc

dans le code du  button "afficher la liste des produits" ecrit ça:

LOCAL
retCode is entier
ZoneRépétéeSupprimeTout(ZR_produit)

retCode = monAccess:mySQLExec("SELECT *  FROM produits   ", 0)
i est un entier=1
IF (retCode=1) THEN
monAccess:mySQLPremier(0)
WHILE (NOT monAccess:mySQLEnDehors)
ZoneRépétéeAjoute(ZR_produit,i)
ZR_produit[i].LIB_ref = monAccess:mySQLCol(0,1)//reference
ZR_produit[i].LIB_libelle = monAccess:mySQLCol(0,2)//libelle
ZR_produit[i].LIB_prix = monAccess:mySQLCol(0,3)//Prix
ZR_produit[i].LIB_desc = monAccess:mySQLCol(0,4)//description
i++
monAccess:mySQLSuivant(0)
END
ELSE
Erreur("Erreur n° " + monAccess:mySQLErreur, monAccess:mySQLGetErrorMessage())
END
monAccess:mySQLFerme(0)


si tout Va bien vous aurez ça:


Suppression , modifiocation et insertion:

En fait, les trois opérations suppression, modification et insertion ont le même traitement càd on change tout simplement la requete SQL at le numero juste acoté ce numéro est l'identifiant de la requete en question .
Je vais traiter un exemple pour la suppression et à vous de terminer les autres.
dans le code de la button "afficher la liste des produits" on va ajouter une nouvelle evenement (Event) "Click long" ou bien Appui long .
coller le code suivant:


LOCAL
retCode1 is entier
retCode is boolean
SI OuiNon("Confirmer la supression ") = Oui ALORS

///****ici la requete à modifiée pour toute opération****///

retCode = monAccess:mySQLExec("DELETE FROM produits where ref="+ZR_produit.LIB_ref, 1)
monAccess:mySQLFerme(1)
IF (retCode = False) THEN
Erreur("Erreur n° "  + monAccess:mySQLErreur, monAccess:mySQLGetErrorMessage())
ELSE
ToastAffiche("Le produit "+ZR_produit.LIB_ref+" est supprimé avec succé",toastLong,cvMilieu,chCentre)
END
FIN
///******Actualisé la liste des produits****///

ZoneRépétéeSupprimeTout(ZR_produit)

retCode1 = monAccess:mySQLExec("SELECT *  FROM produits   ", 0)
i est un entier=1
IF (retCode1=1) THEN
monAccess:mySQLPremier(0)
WHILE (NOT monAccess:mySQLEnDehors)
ZoneRépétéeAjoute(ZR_produit,i)
ZR_produit[i].LIB_ref = monAccess:mySQLCol(0,1)//reference
ZR_produit[i].LIB_libelle = monAccess:mySQLCol(0,2)//libelle
ZR_produit[i].LIB_prix = monAccess:mySQLCol(0,3)//Prix
ZR_produit[i].LIB_desc = monAccess:mySQLCol(0,4)//description
i++
monAccess:mySQLSuivant(0)
END
ELSE
Erreur("Erreur n° " + monAccess:mySQLErreur, monAccess:mySQLGetErrorMessage())
END
monAccess:mySQLFerme(0)


Si tout va bien vous aurez ça avec une toast qui vous informe que le produit a été bien supprimé:


Si vous avez des suggestions  ou des proposition n'hésitez pas de me laisser des commentaires ;) .
Bonne dev sous windev Mobile et à la prochaine Tutorial.

35 commentaires:

  1. Merci pour votre tutoriel elouardi, Allah Ihafdek

    RépondreSupprimer
  2. Merci pour le tuto c'est vraiment excellent !! merci... par contre j'ai des losanges avec un point d'interrogation dedans qui signifie en fait des accents et autres caractères spéciaux, j'ai éssayé des codes html, ascii mais rien n'y fait, une idée peut être ??? merci
    Vincent

    RépondreSupprimer
    Réponses
    1. re bonjour, personne n'a une solution pour les losange avec un ? dedans ???

      Merci d'avance pour les réponses...

      Vincent

      Supprimer
  3. salut
    d'abord merci pour les tutos, j'ai une question, serait il possible de m'envoyer tout le code? je débute sur wdm et si j'ai réussi a faire le premier tuto, celui là, je n'arrive pas à faire la zone répété avec les 6 textview...
    en te remerciant par avance
    yann

    RépondreSupprimer
  4. Salam
    tout d'abord Je vous remercie pour tes effort.
    A propos de mon intervention, Je voudrais juste vous suggérer d'utiliser des vidéos dans votre tutos.

    RépondreSupprimer
    Réponses
    1. Merci pour votre suggestion, c'est mieux de le faire comme ça pour simplifier le codage afin d'éviter les fautes de frappes...

      Supprimer
  5. salam
    quelqu’un pourra me donner le code pour afficher une image dans ma fenêtre à partir de la base ?

    RépondreSupprimer
  6. Bonjour,
    Tuto super génial.

    Dans ma base de données MYSQL, j'ai des accents qui ne sont pas repris sous Windev, en fait ils sont carrément supprimés...

    Par exemple : Rhône dans ma BD MYSQL devient Rhne sous Windev...c'est pas cool.

    Quelqu'un pourrait-il me dire comment régler ce problème ?

    Par avance merci....

    RépondreSupprimer
  7. Bonjour,
    Super sympa ce tuto...cool oui.

    Cela marche sans problème sous l'émulateur Windev Mobile mais lorsque je mets l'application sur ma tablette Galaxy tab 2, une fois appuyé sur le bouton "Connexion" l'application ne répond plus...???

    Quelqu'un pourrait m'aider ?

    Merci.

    RépondreSupprimer
    Réponses
    1. il faut vérifier l'adresse ip du serveur ou du pc dans connect.php et btn_connect , chez moi je fix l'adresse ip puit dans les paramètre , server=xxx.xxx.xxx.xxx , car il ni y a pas ma résolution de nom !!!

      Supprimer
    2. Bonjour,
      Je ne comprend pas ce problème, l'adresses du serveur distant dans le fichier connect.php doit-elle être la même que dans la classe c_php4wd.
      ex: dans c_php4wd j'ai mis http://www.monadresse.fr/php4wd.php et dans connect.php j'ai mis db549861809.db.1and1.com

      depuis l'emulateur windev ca marche nickel mais sur le telephone, rien, ca bloque quand on appuie sur "connexion".

      Supprimer
  8. Salam, le Tuto est Parfait Merci bcp.
    j'ai une Question:
    s'il vous plait est ce que vous pouvez m'éclaircir sur le sujets: " le numero juste acoté ce numéro est l'identifiant de la requete en question ."
    dans le premier Exemple(Requette select) vous avez Utilisé un ID=0
    mais sur le deusieme(Requette Delete) vous avez utilisé un ID=1
    alors quel sont les valeur ID qu'on peut utiliser ??
    ajout , modification ??
    est ce que le code 0 signifie Mode Lecture et le 1 signifie Mode Écriture ?
    est ce que je peut utiliser le code 1 pour faire l'insertion par exemple ?
    Merci d'avance :)

    C Mouad.

    RépondreSupprimer
    Réponses
    1. Bonjour,

      le snimero de requete sont des identifiant pour connaitre la requete.
      par exemple je peux faire un select avec id = 0 et un autre avec id = 1 ensuite dans windev je peux parcourir ces requete par leur ID

      cela n'a rien a voir avec la lecture / ecriture c'est un identifiant et il peut aller de 0 a 4 pour avoir 4 requetes simaultannée ou imbriqué, mais generalement vous verrez vous en utiliserez 1 souvent le 1 car si vous couplez SQLManagerX lui utilise par defaut le 0

      bref ce numero permet d'identifer la requete et son resultat

      Firetox
      (createur de SQLManagerX et des acces alter natif: php4wd, php4VM, msSQL4wd, SQLite4WD ,ADO4wd .....
      a decouvrir sur SQLManagerX.com)

      Supprimer
  9. Merci cela fonctionne parfaitement, par contre si quelqu un peut me dire comment utiliser un filtre dans ma zone répétée comme on pourrait le faire avec la fonction tableactivefiltre mais avec php4wd , cela me serait d une grande aide :)

    RépondreSupprimer
  10. Finalement le problème a été résolu ^^ Si ça peut aider quelqu'un je post mon code.


    LOCAL
    retCode is entier
    ZoneRépétéeSupprimeTout(ZR_produitsT)
    ZoneRépétéeSupprimeTout(ZR_produitsF)

    retCode = monAccess:mySQLExec("SELECT * FROM produits ",0)


    i est un entier=1
    SI (retCode=1) ALORS
    monAccess:mySQLPremier(0)
    TANTQUE (PAS monAccess:mySQLEnDehors)
    SELON monAccess:mySQLCol(0,4)
    CAS "1"
    ZoneRépétéeAjoute(ZR_produitsT,i)
    ZR_produitsT[i].LIB_Nom = monAccess:mySQLCol(0,2)//reference
    ZR_produitsT[i].LIB_saveur = monAccess:mySQLCol(0,3)//libelle
    ZR_produitsT[i].LIB_prix = monAccess:mySQLCol(0,6)//Prix
    sAdrimage est une chaîne
    sAdrimage = monAccess:mySQLCol(0,7)//description
    HTTPRequête(sAdrimage)
    ZR_produitsT[i].ATT_img = HTTPDonneRésultat()

    monAccess:mySQLSuivant(0)

    CAS "2"
    ZoneRépétéeAjoute(ZR_produitsF,i)
    ZR_produitsF[i].LIB_Nom1 = monAccess:mySQLCol(0,2)//reference
    ZR_produitsF[i].LIB_saveur1 = monAccess:mySQLCol(0,3)//libelle
    ZR_produitsF[i].LIB_prix1 = monAccess:mySQLCol(0,6)//Prix
    sAdrimage est une chaîne
    sAdrimage = monAccess:mySQLCol(0,7)//description
    HTTPRequête(sAdrimage)
    ZR_produitsF[i].ATT_img1 = HTTPDonneRésultat()

    monAccess:mySQLSuivant(0)

    AUTRE CAS


    FIN


    FIN

    SINON
    Erreur("Erreur n° " + monAccess:mySQLErreur, monAccess:mySQLGetErrorMessage())

    FIN



    monAccess:mySQLFerme(0)

    RépondreSupprimer
  11. Bonjour, et merci super tuto, je rencontre un problème, j’essaie de faire INSERT dans une base mysql avec un champ longblob. Je prend une photo avec l'appareil, la convertie en png, l'enregistre dans la sdcard et l'envoi sur le serveur. La photo fait 100ko. La requete met 20 minutes pour s’exécuter sur le serveur voici mon code :
    -----------------------------------------------
    sFichier est un chaîne

    sFichier = monAccess:mySQLEscapeString(Crypte(fChargeTexte(gsRepDroidTemp + "/imgtemp.png"),"",crypteAucun))

    sRsqlInsertBlob est un chaîne = "INSERT INTO rubriquesblobs (RbDate_DataRub, RbDate_IDDos) VALUES ( " + sFichier +", '" + gsPatGuid + "') "

    ThreadExécute("InsertImage",threadNormal,"TreadAjouteImage_datas",sRsqlInsertBlob)
    // Obliger de le mettre dans un thread sinon android me dit l'application ne repond pas
    --------------------------------------------------------------------------------------------

    //Le code du thread
    PROCEDURE TreadAjouteImage_datas(sRsqlInsertBlob)
    SI estConnecte = Faux ALORS
    ExécuteTraitement(FEN_Menu.BTN_conn,trtClic)
    FIN

    LOCAL
    nXretour est un entier

    info(sRsqlInsertBlob) //Me renvoie la requête mis en forme instantanément sans erreur

    nXretour = monAccess:mySQLExec(sRsqlInsertBlob,2)

    SI nXretour =0 ALORS
    Erreur("Erreur n° " + monAccess:mySQLErreur, monAccess:mySQLGetErrorMessage())
    FIN
    monAccess:mySQLFerme(2)
    Info("mysql 2 fermé")
    ------------------------------------------------------------------------------------------

    J'ai essayé avec la fonction zip pareil, si j'insere que du texte de petite taille cela fonctionne tout de suite.
    La tablette est en wifi (ADSL 17Mo), serveur VPS ohv. Je peux uploader directement sur mon serveur de gros fichier par php cela fonctionne sans problème.

    Merci pour votre aide

    RépondreSupprimer
    Réponses
    1. Bonjour,
      essayer d'appliquer les fonctions de la sérialisation avant l'envoie et aprés la réception de tes images.
      Fonction windev: Sérialise() et désérialise()
      Bon dev

      Supprimer
  12. bonjour les amis
    merci à vous pour l'aide que vous avez apporté dans le développement des appli android avec windev mobile.
    j'ai un problème au de la requete d'insertion. INSERT TO.
    je veux avoir le code pour inserer les données dans la base de données.
    Merci

    RépondreSupprimer
  13. bonjour ;
    j'essaie de réaliser un insert à ma base de donnée mais je sais po comment, si quelqun peut m'aider sur ce point merci

    RépondreSupprimer
  14. quand je compile dans mon ordi, ca marche a merveille; mais dans ma tablette ca marche pas . quand j'ai affcher ce que ce passe dedans j'ai trouver que l'application envoi des caractere chinoi dans la variable vPost. le reponse serai automatiquement vide de la part du serveur. quelqu'un peut m'aider s.v.p

    RépondreSupprimer
  15. bonjour, je n'arrive pas a trouver l'erreur dans mon script., il me dit que la colone n'existe pas avec se script

    LOCAL
    retCode is entier




    retCode = monAccess:mySQLExec("DELETE FROM utilisateurs WHERE nomusersa="+LIB_nom_users, 0)
    i est un entier=1
    IF (retCode=1) THEN
    monAccess:mySQLPremier(0)
    WHILE (NOT monAccess:mySQLEnDehors)
    ZoneRépétéeAjoute(ZR_produit,i)

    ZR_produit[i].LIB_nom_users = monAccess:mySQLCol(0,2)//reference
    i++

    monAccess:mySQLSuivant(0)
    END
    ELSE
    Erreur("Erreur n° " + monAccess:mySQLErreur, monAccess:mySQLGetErrorMessage())
    END

    ZoneRépétéeSupprimeTout(ZR_produit)

    retCode = monAccess:mySQLExec("SELECT * FROM utilisateurs ", 0)
    IF (retCode=1) THEN
    monAccess:mySQLPremier(0)
    WHILE (NOT monAccess:mySQLEnDehors)
    ZoneRépétéeAjoute(ZR_produit,i)
    ZR_produit[i].LIB_nom_users = monAccess:mySQLCol(0,2)//reference
    i++

    monAccess:mySQLSuivant(0)
    END
    ELSE
    Erreur("Erreur n° " + monAccess:mySQLErreur, monAccess:mySQLGetErrorMessage())
    END



    par contre si je remplace par

    LOCAL
    retCode is entier




    retCode = monAccess:mySQLExec("DELETE FROM utilisateurs WHERE nomusersa= 'daniepikke'", 0)
    i est un entier=1
    IF (retCode=1) THEN
    monAccess:mySQLPremier(0)
    WHILE (NOT monAccess:mySQLEnDehors)
    ZoneRépétéeAjoute(ZR_produit,i)

    ZR_produit[i].LIB_nom_users = monAccess:mySQLCol(0,2)//reference
    i++

    monAccess:mySQLSuivant(0)
    END
    ELSE
    Erreur("Erreur n° " + monAccess:mySQLErreur, monAccess:mySQLGetErrorMessage())
    END

    ZoneRépétéeSupprimeTout(ZR_produit)

    retCode = monAccess:mySQLExec("SELECT * FROM utilisateurs ", 0)
    IF (retCode=1) THEN
    monAccess:mySQLPremier(0)
    WHILE (NOT monAccess:mySQLEnDehors)
    ZoneRépétéeAjoute(ZR_produit,i)
    ZR_produit[i].LIB_nom_users = monAccess:mySQLCol(0,2)//reference
    i++

    monAccess:mySQLSuivant(0)
    END
    ELSE
    Erreur("Erreur n° " + monAccess:mySQLErreur, monAccess:mySQLGetErrorMessage())
    END


    il me suprime bien une entrée mais toujours la meme :-(

    RépondreSupprimer
  16. Merci pour le tuto.
    En supprimant (Delete) l'opération est effectué sur la base sauf que l'application entre en boucle infini.
    C pas le cas pour une requete select.
    Merci de me répondre

    RépondreSupprimer
  17. Bonjour,
    C'est la partie modification et insertion qui présente souvent de difficulté pour moi. Lors des séances de pratique, j'ai du mal à me repérer dans toutes ces données. Lors de mes heures perdues je me fais une autoformation à l'aide d'un tutoriel sur http://www.alphorm.com/tutoriel/formation-en-ligne-windev-mobile-20-ios mais je suis encore loin de maîtriser windev mobile.

    RépondreSupprimer
  18. Qui peut m'aider avoir le code qui permet d'insérer un fichier dans une base de données et les afficher sur une page web.

    RépondreSupprimer
  19. Bonjour,

    Merci beaucoup !!!
    J'ai enfin réussi à installer ce script, j'ai accès à ma BDD Mysql depuis mon téléphone android avec une connexion 4G, j'ai vraiment galéré au début.

    Pour ceux que ça intéresse, il ne faut pas oublier de corriger les erreurs comme indiqué dans les commentaires. Pour l'accès distant, il faut l'activer dans Wamp + créer un compte utilisateur AVEC mot de passe sur phpMyAdmin, et les modifier sur le bouton connection et connect.php. Quand vous générez l'apk et que vous l'installer sur votre mobile ça devrait passer.

    C'est exactement ce qu'il me fallait, merci, merci vraiment !

    RépondreSupprimer
    Réponses
    1. Bonsoir,
      Quelles sont les erreurs indiqué sur les commentaires
      Merci de m'aider j'ai le meme problème

      Supprimer
  20. bsr ,
    depuis des mois j'arrive pas à me connecter sur la base de données d'un hebergeur en ligne, svp venez à mon aide
    merci d'avance

    RépondreSupprimer
  21. connexion à ma base de données s'est établie correctement
    mais la requete :

    MonAccess:mySQLExec("select count(*) from user where login = '"+SAI_LOGIN+"'and pass = '"+SAI_PASSE+"'",1)
    MonAccess:mySQLPremier(1)
    Info(MonAccess:mySQLCol(1,1))

    affiche un message vide

    RépondreSupprimer
    Réponses
    1. amin Zouaoui

      Je suis le même problème Avez-vous résolu

      Supprimer
  22. Bonsoir tout le monde,
    Mr Amine Zouaoui avez-vous trouver une solution? car je suis dans la même situation.

    RépondreSupprimer
  23. Bonjour,

    je rencontre un problème de lenteur pour afficher une table de ma base de données qui contient 5000 lignes,sur le simulateur wm le resultat est instantané alors que sur mon téléphone android la requête prend environ deux minutes.
    Merci pour votre aide
    Reda

    RépondreSupprimer
  24. Bonjour tous le monde j'arrive pas à reussir de faire une requette d'insertin par contre j'utilise une base de donnée heberger a distance dans un serveur je puis me connecté a la base mais l'insertin reste impossible aidé moi svp

    RépondreSupprimer
  25. Nice post thank you Dave

    RépondreSupprimer
  26. Salut, je suis entrain de chercher mssql4wd est-ce que vous l'avez?

    RépondreSupprimer