ADO - Mise à jour de la base de données

cs_dan24 Messages postés 39 Date d'inscription lundi 9 février 2004 Statut Membre Dernière intervention 15 avril 2005 - 6 avril 2005 à 19:14
cs_dan24 Messages postés 39 Date d'inscription lundi 9 février 2004 Statut Membre Dernière intervention 15 avril 2005 - 7 avril 2005 à 17:31
Bonjour,

J'ai ce code :

Public Sub RemplirDgProduits()
With FrmStock
Set rsRemplirDgProduits = New ADODB.Recordset rsRemplirDgProduits.Open "SELECT P.*, E.EMB_UNITE FROM PRODUIT P, EMBALLAGE E WHERE E.EMB_NO P.PROD_EMB_NO AND P.PROD_TP_NO " & .typeSelectionne & " ORDER BY P.PROD_NOM", frmPrincipale.bdd, adOpenStatic, adLockBatchOptimistic

'Cette boucle sert à calculer la quantité actuelle pour chaque produit et l'insère (ou devrait normalement l'insérer) dans la bdd au niveau du champ "PROD_STOCK_ACTUEL" qui est donc un champ calculé
For i = 0 To rsRemplirDgProduits.RecordCount - 1

Là il y a normalement un code assez long pour calculer la quantité actuelle (rsCalculQteActuelle!STOCK_ACTUEL) du produit en cours. Je vous l'épargne d'autant plus qu'il fonctionne.
rsRemplirDgProduits.Fields("PROD_STOCK_ACTUEL") = rsCalculQteActuelle!STOCK_ACTUEL
rsRemplirDgProduits.Update
rsRemplirDgProduits.MoveNext
Next

Set .dgProduits.DataSource = rsRemplirDgProduits
.dgProduits.Refresh
End With
End Sub

Le code marche parfaitement. Tout s'affiche nickel dans le datagrid dgProduits quand j'exécute le prog. Par contre, quand je vais voir dans la bdd, les modifications au niveau de "PROD_STOCK_ACTUEL" n'apparaissent pas. Le champ est à null pour tous les enregistrements. Je sais que normalement les champs calculés ne se mettent pas dans la bdd mais j'avais besoin de le faire apparaître dans le datagrid dgProduits. Tout ce que j'aimerais qu'on m'explique c'est pourquoi les modifs ne restent pas dans la bdd et comment faire pour qu'elles restent ?

Merci d'avance pour votre aide

2 réponses

cs_pluplu Messages postés 615 Date d'inscription mercredi 18 décembre 2002 Statut Membre Dernière intervention 4 juillet 2012
7 avril 2005 à 11:10
Tu devrais essayer de définir ton curseur de cette façon adOpenDynamic au lieu de
adOpenStatic


Statique (adOpenStatic)
Position : Oui
Défilement : Bidirectionnel
Sensibilité : Pas de mise à jour des données modifiées
Copie de données. Les curseurs côté client sont toujours statiques.


Dynamique (adOpenDynamic)
Position : Oui
Défilement : Bidirectionnel
Sensibilité : Reflète toutes les modifications de données ainsi que les enregistrements ajoutés ou supprimés par d'autres utilisateurs
Ce poids lourd des curseurs, uniquement serveur, n'est pas supporté par tous les fournisseurs.

Pascal Laurençon
0
cs_dan24 Messages postés 39 Date d'inscription lundi 9 février 2004 Statut Membre Dernière intervention 15 avril 2005
7 avril 2005 à 17:31
Merci pour ta réponse mais quand je met le curseur à adOpenDynamic ou a adOpenForwardOnly, "rsRemplirDgProduits.RecordCount" est égal à -1 comme s'il n'y avait pas d'enregistrements dans mon recordset et du coup il y a un bug (erreur 7004 : "Le jeu d'enregistrements ne peut pas prendre en compte les signets") au niveau de ".dgProduits.DataSource = rsRemplirDgProduits". Par conséquent, je suis obligé de mettre adOpenKeyset ou adOpenStatic.

Une idée???

Encore merci
0
Rejoignez-nous