Forums Développement Multimédia

Aller au contenu

[résolu] :  Écrire dans Access

Director

11 réponses à ce sujet

#1 Psykoo

    Ceinture Marron

  • Members
  • PipPipPipPipPipPip
  • 155 messages

Posté 28 September 2010 - 15:40 PM

Bonjour a tous,

Voila un bon mois que je test mon application chez un client et un problème survient 3-4 jours après l'installation. L'application sert a compiler des données dans une BD MS access. Le problème est qu'après un certain temps, pour une raison X, l'ajout de certaines données ne se font pas correctement dans la BD. Voici le code appellé pour chaque ajout de donnée par le client :



on ajouter_transaction

  Global BD2

  DateColle = String(_system.date().char[1..4])&String(_system.date().char[6..7])&String(_system.date().char[9..10])

  RS2 = DGCreateRecordset("SELECT * FROM Table1", BD2)

  DGRSAddNew(RS2)

  DGRSSetFieldValue("NUM_TRANSAC", String(member("txt_transaction").Text), RS2)
  DGRSSetFieldValue("NUM_EMPLOYE", String(member("txt_current_user").Text), RS2)
  DGRSSetFieldValue("DATE_TRANSAC", DateColle, RS2)
  DGRSSetFieldValue("HR_TRANSAC", the long time, RS2)
  DGRSSetFieldValue("MONTANT_TRANSAC", (member("txt_grand_total").Text*100), RS2)
 
  repeat with i = 1 to 7

    case member("txt_facture_pd_"&i).Text of
      10: DGRSSetFieldValue("NB_10", member("txt_facture_qt_"&i).Text, RS2)
      2.40 : DGRSSetFieldValue("NB_24", member("txt_facture_qt_"&i).Text, RS2)
      1.80 : DGRSSetFieldValue("NB_18", member("txt_facture_qt_"&i).Text, RS2)  
      1.50 : DGRSSetFieldValue("NB_15", member("txt_facture_qt_"&i).Text, RS2)  
      1.20 : DGRSSetFieldValue("NB_12", member("txt_facture_qt_"&i).Text, RS2)
      0.60 : DGRSSetFieldValue("NB_6", member("txt_facture_qt_"&i).Text, RS2)  
      0.30 : DGRSSetFieldValue("NB_30c", member("txt_facture_qt_"&i).Text, RS2)  
      0.20 : DGRSSetFieldValue("NB_20c", member("txt_facture_qt_"&i).Text, RS2)
      0.10 : DGRSSetFieldValue("NB_10c", member("txt_facture_qt_"&i).Text, RS2)
      0.05 : DGRSSetFieldValue("NB_5c", member("txt_facture_qt_"&i).Text, RS2)
    end case

  end repeat
 
  DGRSUpdate(RS2)
  DGRSClose(RS2)

  member("txt_transaction").Text = String(Integer(member("txt_transaction").Text + 1))

end

 

Ce bout de code fonctionne très bien sur ma machine... J'ai beau l'utiliser pendant 10 jours tout est OK. Cependant je n'arrive pas a reproduire ce qui se passe chez mon client. Je sais seulement ce qui arrive.

Le bon fonctionnement du code devrais donnée quelque chose comme ca dans la BD:

NUM_TRANSAC/NUM_EMPLOYE/DATE_TRANSAC/HR_TRANSAC/MONTANT_TRANSAC/NB_24/NB_18/NB_15/NB_12 NB_6/NB_10/NB_30c/NB_20c/NB_10c/NB_5c
1 2140 20100910 07:09:32 350 0 0 0 0 0 0 0 14 7 0


Ce qui arrive par moment c'est que les (5) cinq premiers champs NUM_TRANSAC/NUM_EMPLOYE/DATE_TRANSAC/HR_TRANSAC/MONTANT_TRANSAC demeure vide alors que les 10 derniers sont rempli. Comme ceci :

NUM_TRANSAC/NUM_EMPLOYE/DATE_TRANSAC/HR_TRANSAC/MONTANT_TRANSAC/NB_24/NB_18/NB_15/NB_12 NB_6/NB_10/NB_30c/NB_20c/NB_10c/NB_5c
0 0 0 0 0 0 0 2 0 0 0 0

Les 10 derniers champs sont toujours bien rempli peut importe ce qui se passe j'en suis certain. Je ne suis pas capable de provoquer ce qui se passe chez mon client et donc de savoir pourquoi les 5 premiers champs reste vide certaines fois.

Ma BD demeure toujours ouverte
J'utilise l'Xtra Datagrip de INM


Je suis dans la brume si qqun a un idée elle est la bienvenue!

MERCI infiniment

Modifié par Psykoo, 28 September 2010 - 15:42 PM.


#2 bibou34

    Ceinture Bleue

  • Members
  • PipPipPipPipPip
  • 80 messages

Posté 28 September 2010 - 16:27 PM

Voir le messagePsykoo, le 28 September 2010 - 15:40 PM, dit :

Bonjour a tous,

Voila un bon mois que je test mon application chez un client et un problème survient 3-4 jours après l'installation. L'application sert a compiler des données dans une BD MS access. Le problème est qu'après un certain temps, pour une raison X, l'ajout de certaines données ne se font pas correctement dans la BD. Voici le code appellé pour chaque ajout de donnée par le client :



on ajouter_transaction

  Global BD2

  DateColle = String(_system.date().char[1..4])&String(_system.date().char[6..7])&String(_system.date().char[9..10])

  RS2 = DGCreateRecordset("SELECT * FROM Table1", BD2)

  DGRSAddNew(RS2)

  DGRSSetFieldValue("NUM_TRANSAC", String(member("txt_transaction").Text), RS2)
  DGRSSetFieldValue("NUM_EMPLOYE", String(member("txt_current_user").Text), RS2)
  DGRSSetFieldValue("DATE_TRANSAC", DateColle, RS2)
  DGRSSetFieldValue("HR_TRANSAC", the long time, RS2)
  DGRSSetFieldValue("MONTANT_TRANSAC", (member("txt_grand_total").Text*100), RS2)
 
  repeat with i = 1 to 7

    case member("txt_facture_pd_"&i).Text of
      10: DGRSSetFieldValue("NB_10", member("txt_facture_qt_"&i).Text, RS2)
      2.40 : DGRSSetFieldValue("NB_24", member("txt_facture_qt_"&i).Text, RS2)
      1.80 : DGRSSetFieldValue("NB_18", member("txt_facture_qt_"&i).Text, RS2)  
      1.50 : DGRSSetFieldValue("NB_15", member("txt_facture_qt_"&i).Text, RS2)  
      1.20 : DGRSSetFieldValue("NB_12", member("txt_facture_qt_"&i).Text, RS2)
      0.60 : DGRSSetFieldValue("NB_6", member("txt_facture_qt_"&i).Text, RS2)  
      0.30 : DGRSSetFieldValue("NB_30c", member("txt_facture_qt_"&i).Text, RS2)  
      0.20 : DGRSSetFieldValue("NB_20c", member("txt_facture_qt_"&i).Text, RS2)
      0.10 : DGRSSetFieldValue("NB_10c", member("txt_facture_qt_"&i).Text, RS2)
      0.05 : DGRSSetFieldValue("NB_5c", member("txt_facture_qt_"&i).Text, RS2)
    end case

  end repeat
 
  DGRSUpdate(RS2)
  DGRSClose(RS2)

  member("txt_transaction").Text = String(Integer(member("txt_transaction").Text + 1))

end

 

Ce bout de code fonctionne très bien sur ma machine... J'ai beau l'utiliser pendant 10 jours tout est OK. Cependant je n'arrive pas a reproduire ce qui se passe chez mon client. Je sais seulement ce qui arrive.

Le bon fonctionnement du code devrais donnée quelque chose comme ca dans la BD:

NUM_TRANSAC/NUM_EMPLOYE/DATE_TRANSAC/HR_TRANSAC/MONTANT_TRANSAC/NB_24/NB_18/NB_15/NB_12 NB_6/NB_10/NB_30c/NB_20c/NB_10c/NB_5c
1 2140 20100910 07:09:32 350 0 0 0 0 0 0 0 14 7 0


Ce qui arrive par moment c'est que les (5) cinq premiers champs NUM_TRANSAC/NUM_EMPLOYE/DATE_TRANSAC/HR_TRANSAC/MONTANT_TRANSAC demeure vide alors que les 10 derniers sont rempli. Comme ceci :

NUM_TRANSAC/NUM_EMPLOYE/DATE_TRANSAC/HR_TRANSAC/MONTANT_TRANSAC/NB_24/NB_18/NB_15/NB_12 NB_6/NB_10/NB_30c/NB_20c/NB_10c/NB_5c
0 0 0 0 0 0 0 2 0 0 0 0

Les 10 derniers champs sont toujours bien rempli peut importe ce qui se passe j'en suis certain. Je ne suis pas capable de provoquer ce qui se passe chez mon client et donc de savoir pourquoi les 5 premiers champs reste vide certaines fois.

Ma BD demeure toujours ouverte
J'utilise l'Xtra Datagrip de INM


Je suis dans la brume si qqun a un idée elle est la bienvenue!

MERCI infiniment

Voici un souci que j'ai eu en travaillant avec des bases access si cela peut aider :

Temps de réponse de la base (surtout si tu utilise une boucle repeat) il faut laisser un delai de réponse.(resolu en ajoutant un go to the frame ce qui permet de temporiser suffisemment si tu es en local sinon il faut ajouter un timer si ta base est sur un reseau).

Autre retour d'experience : je n'utilise que des formats textes ou memo dans les champs de la base pour la recup des données (excepté les champs date) ce qui m'a évité pas mal de galères durant les transferts de données vers access.

bon chance...

#3 Psykoo

    Ceinture Marron

  • Members
  • PipPipPipPipPipPip
  • 155 messages

Posté 28 September 2010 - 18:20 PM

Voir le messagebibou34, le 28 September 2010 - 16:27 PM, dit :

Voici un souci que j'ai eu en travaillant avec des bases access si cela peut aider :

Temps de réponse de la base (surtout si tu utilise une boucle repeat) il faut laisser un delai de réponse.(resolu en ajoutant un go to the frame ce qui permet de temporiser suffisemment si tu es en local sinon il faut ajouter un timer si ta base est sur un reseau).

Autre retour d'experience : je n'utilise que des formats textes ou memo dans les champs de la base pour la recup des données (excepté les champs date) ce qui m'a évité pas mal de galères durant les transferts de données vers access.

bon chance...

Bonjour Bibou34,

Merci pour l'indice, je ne savais pas pour le temps de réponse lors de l'écriture dans une BD access. Puisque je ne vois AUCUN autre problème apparent...et que je n'arrive pas a reproduire le "bug", *croise les doigts* je vais essayer cet alternative.

Je ne pourrais malheureusement pas vous donner de feedback rapidement étant donné que le bug se produit chez mon client. Et la seul manière de savoir si s'est réglé est d'attendre que plus rien d'inattendu se produise.... :mad:

Merci encore!

Je continu de prendre les suggestions!

#4 bubarnet

  • Members
  • PipPipPipPipPipPipPipPip
  • 615 messages

Posté 29 September 2010 - 15:18 PM

J'ai travaillé avec datagrip pour un projet de base de données assez imposant. Et le résultat, j'ai jeté datagrip pour passer par une solution perso. Datagrip est complètement buggué et ne supporte pas du tout une charge trop importante (pour un accès multi-utilisateur, il tombe en quelques accès). Les accès concurrents le plante encore plus vite.

Sinon access en soit ne pose pas de problème (je bosse actuellement sur un logiciel avec une bdd access en réseau, accès concurrents et de très grosses quantités de données échangées). Les rares soucis viennent du réseau lui-même qui peut avoir du mal à faire passer toutes les données.

#5 bibou34

    Ceinture Bleue

  • Members
  • PipPipPipPipPip
  • 80 messages

Posté 29 September 2010 - 16:51 PM

exact;)

J'utilise VBscriptXtra sans problèmes.

#6 Psykoo

    Ceinture Marron

  • Members
  • PipPipPipPipPipPip
  • 155 messages

Posté 29 September 2010 - 22:06 PM

Vous êtes entrain de me dire de jeter l'Xtra Datagrip?

Est ce que les mêmes fonctions sont disponible sous VBscriptXtra? Je ne suis vraiment pas familier avec l'environnement VB, seulement l'interface MS Access.


PS: Jour 1 après avoir mis les pauses entre les "DGRSSetFieldValue" et aucun bug pour le moment.

#7 bubarnet

  • Members
  • PipPipPipPipPipPipPipPip
  • 615 messages

Posté 30 September 2010 - 11:24 AM

Je dirais que ça dépend de où tu en es, du type de programme que tu fais. Mais si tu le peux, je te conseille de le virer et de te pencher sur autre chose.

Dans tous les cas, il n'y a pas 50 manières de parler avec une base de données. Donc les noms des fonction vont changer, l'ordre des paramètres surement aussi, mais c'est à peu près tout. Tu n'auras pas besoin de tout refaire.

#8 bibou34

    Ceinture Bleue

  • Members
  • PipPipPipPipPip
  • 80 messages

Posté 30 September 2010 - 14:35 PM

Bonjour,

pour te donner une idée des commandes de l'extra VBScriptXtra, rien de mieu qu'un exemple :


bReadWrite=true -- on decide d'ecrire dans la table (true) ou de lire uniquement (false)


-- Creation de l'object MonRecordset
MonRecordset=createObject(xtra "VbScriptXtra","ADODB.Recordset")

if not objectP(MonRecordset) then
alert("Erreur lors de la création de l'objet database " & return & return & MonRecordset)
else

-- creation de la chaine de connection vers ma base access (the moviepath & "data.mdb")
cnnStr="Provider=Microsoft.Jet.OLEDB.4.0;" -- Microsoft Jet provider for MS Access databases
cnnStr=cnnStr&"Data Source="& the moviepath & "data.mdb" & ";"

if bReadWrite then
cnnStr=cnnStr &"Mode=Read|Write;"
else
cnnStr=cnnStr &"Mode=Read;"
end if

MonRecordset.ActiveConnection=cnnStr

if MonRecordset.failed then
alert(" Erreur lors de la connexion à la base ! "& return & return & MonRecordset.lastError)
else

if bReadWrite then
MonRecordset.lockType=#adLockPessimistic
MonRecordset.CursorType=#adOpenKeyset
else
MonRecordset.lockType=#adLockReadOnly
MonRecordset.CursorType=#adOpenStatic
end if

end if

end if

--------------------------- creation de la commande sql que je vais envoyer à la base :

-- dans cet exemple selection de tous les champs de Table_Identification dont le numero de dossier est 123456

sql= "SELECT * FROM Table_Identification WHERE numero_dossier = "& "'123456'"

-- envoi de la commande sql a la base :
MonRecordset.Open(sql)


if MonRecordset.failed then
alert("Echec lors de la commande !"& return & MonRecordset.lastError)
else

MonRecordset.Update() -- mise a jour des champs si ecriture
alert("Enregistrement réussi !")

end if

-- recuperation des donnees de la base dans mes members director apres un controle :

if MonRecordset.Fields["numero_dossier"].value = "123456" then
member("Nom_client").text = string(MonRecordset.Fields["Nom_client"].value)
member("Prenom_client").text = string(MonRecordset.Fields["Prenom_client"].value)
-- idem pour les autres champs
end if


-- fermeture de mon objet de liaison avec la base :
MonRecordset.close()
MonRecordset = void


PS : pour ecrire dans la base il suffit de changer la commande sql selon que tu crée un nouvel enregistrement ou que tu ecrase des champs existants exemple :
-- creation d'un enregistrement :
sql = INSERT INTO "nom de table" ("colonne 1", "colonne 2", ...) VALUES ("valeur 1", "valeur 2", ...)


-- mise a jour d'un enregistrement :
UPDATE "nom de table" SET "colonne 1" = 'nouvelle valeur' WHERE Numero_dossier = '123456'

pour plus d'info sur les commandes sql voir ce site de tutos : http://sql.1keydata.com/fr/

Voila...

#9 Psykoo

    Ceinture Marron

  • Members
  • PipPipPipPipPipPip
  • 155 messages

Posté 30 September 2010 - 16:59 PM

Bonjour!

Merci beaucoup Bibou34! Je vire Datagrip illico et me met a VBScriptXtra.

Q. Es ce vous savez si VBScriptXtra soutient la fonction SQL SUM() ?? (Fonction qui permet d'additionner le contenu d'un champ de tous les enregistrements ensemble) Je n'ai pas réussi avec Datagrip, je l'ai donc fait RS par RS mais c'est un peu lourd avec une grosse DB.

Merci encore :Hola:. Au boulo!

Modifié par Psykoo, 30 September 2010 - 16:59 PM.


#10 Psykoo

    Ceinture Marron

  • Members
  • PipPipPipPipPipPip
  • 155 messages

Posté 30 September 2010 - 17:50 PM

Bonjour,

J'obtient l'erreur : Echech lors de la commande ! Failed to invoke method or property: Microsoft JET Database Engine: Erreur de syntaxe dans la clause FROM.

Le chemin de la DB et le nom de la table sont bon (pas d'espace ni de "." avec et sans ""[]''). J'ai regarder la syntaxe dans le PDF fourni avec l'Xtra et elle semble OK. Aurais-je besoin d'autre chose que l'Xtra pour le faire fonctionner car tout semble okay dans ce code!


on nouvel_xtra_test
  bReadWrite = true
  MonRecordset = createObject(xtra "VbScriptXtra","ADODB.Recordset")
  if not objectP(MonRecordset) then
    alert("Erreur lors de la création de l'objet database " & return & return & MonRecordset)
  else
    cnnStr="Provider=Microsoft.Jet.OLEDB.4.0;"
    cnnStr=cnnStr&"Data Source="&_movie.path&"BDAccess\user.mdb;"

    if bReadWrite then
      cnnStr=cnnStr &"Mode=Read|Write;"
    else
      cnnStr=cnnStr &"Mode=Read;"
    end if
   
    MonRecordset.ActiveConnection=cnnStr
   
    if MonRecordset.failed then
      alert(" Erreur lors de la connexion à la base ! "& return & return & MonRecordset.lastError)
    else
      if bReadWrite then
        MonRecordset.lockType=#adLockPessimistic
        MonRecordset.CursorType=#adOpenKeyset
      else
        MonRecordset.lockType=#adLockReadOnly
        MonRecordset.CursorType=#adOpenStatic
      end if
    end if
  end if
 
  sql= "SELECT * FROM user WHERE NUM_EMPLOYE = "& "'1000'"
  MonRecordset.Open(sql)
  if MonRecordset.failed then
    alert("Echec lors de la commande !"& return & MonRecordset.lastError)
  end if
 
  if MonRecordset.Fields["PSW_EMPLOYE"].value = "999" then
    alert(string(MonRecordset.Fields["NOM_EMPLOYE"].value))
  end if

  MonRecordset.close()
  MonRecordset = void
end

 

Je continu mes recherches,

Merci

#11 Psykoo

    Ceinture Marron

  • Members
  • PipPipPipPipPipPip
  • 155 messages

Posté 30 September 2010 - 18:54 PM

Bonjour,

J'ai simplifier le code au max et l'erreur persiste toujours.




  MonRecordset = createObject(xtra "VbScriptXtra","ADODB.Recordset")
 
  strCnn = "Provider=Microsoft.Jet.OLEDB.4.0; Data Source="&_movie.path&"BDAccess\user.mdb; Mode=ReadWrite;"
  strSQL = "SELECT * FROM user"
  MonRecordset.Open( strSQL, strCnn )
  if MonRecordset.succeeded then
    put "Recordset state:"&&MonRecordset.State
  else
    put "Error:"&&MonRecordset.lastError
  end if
  MonRecordset.close()
  MonRecordset = void

 

me donne : Echec lors de la commande ! Failed to invoke method or property: Microsoft JET Database Engine: Erreur de syntaxe dans la clause FROM.

#12 Psykoo

    Ceinture Marron

  • Members
  • PipPipPipPipPipPip
  • 155 messages

Posté 30 September 2010 - 20:42 PM

Bonsoir,

Tous fonctionne. J'ai simplement recréer une BD... :shock:

Merci a tous! [RESOLU]



1 utilisateur(s) li(sen)t ce sujet

0 membre(s), 1 invité(s), 0 utilisateur(s) anonyme(s)

authorised training centre

Centre de Formation Mediabox - Adobe et Apple Authorised Training Center.

Déclaré auprès de la Direction du Travail et de la Formation Professionnelle

Mediabox : SARL au capital de 62.000€ - Numéro d'activité : 11 75 44555 75 - SIRET : 49371646800035

MEDIABOX, 23, rue de Bruxelles, 75009 PARIS

FFP