Implémentation d'un jeu d'enregistrements de formulaire actualisable à l'aide de procédures stockées
P粉086993788
P粉086993788 2023-09-13 14:06:48
0
1
588

  1. J'essaie de configurer un formulaire utilisant un jeu d'enregistrements basé sur une procédure stockée sur un serveur MySQL. Lorsque j'utilise l'objet de commande, Set Me.Recordset = cmd.execute cela fonctionne bien, mais je dois pouvoir mettre à jour deux champs (tinyint et varchar) liés à la case à cocher et à la zone de texte de mon formulaire. Bien sûr, cela ne fonctionne pas.

  2. Compte tenu de ce problème de conception, j'ai essayé d'ouvrir le jeu d'enregistrements en utilisant la méthode .Open et la syntaxe "CALL procName ('value1', 'value2');" méthode, puis les enregistrements sont mis en boucle et ajoutés au nouveau rs. Enfin, définissez-le comme jeu d'enregistrements du formulaire comme ceci :

  3. Dim OriginalRecordset As ADODB.Recordset
     Dim Field As ADODB.Field
    
     Set NewRecordset = New ADODB.Recordset
     Set OriginalRecordset = New ADODB.Recordset
     OriginalRecordset.Open "CALL `DosarClient_Functie` ('14575','2234');", SQL_ADE.Conn, adOpenDynamic, adLockPessimistic, adCmdText
    
     For Each Field In OriginalRecordset.Fields
       NewRecordset.Fields.Append Field.Name, Field.Type, Field.DefinedSize, adFldIsNullable Or adFldUpdatable
     Next Field
    
     NewRecordset.CursorType = adOpenDynamic
     NewRecordset.CursorLocation = adUseClient
     NewRecordset.LockType = adLockOptimistic
     NewRecordset.Open
    
     OriginalRecordset.MoveFirst
    
     Do Until OriginalRecordset.EOF
        NewRecordset.AddNew
        For Each Field In OriginalRecordset.Fields
           If Not IsNull(Field.value) Then
               NewRecordset.Fields(Field.Name).value = Field.value
           Else
           End If
        Next Field
    
        NewRecordset.Update
        OriginalRecordset.MoveNext
     Loop
    
     Set Me.Recordset = NewRecordset
  4. Informations supplémentaires : les variables NewRecordset sont déclarées privées au niveau du formulaire. Je sais aussi que c'est une mauvaise pratique d'appeler une procédure comme je l'ai fait, mais je ne vois aucun autre moyen d'accomplir cette tâche.

  5. Important : Je ne peux et ne veux pas utiliser les tables locales. Ce serait la solution la plus simple, mais cela serait également incompatible avec le reste du code. Merci :)

Le problème est le suivant : si je fais ce que j'ai expliqué, j'obtiens une erreur #Name pour les champs liés, ou ils sont définis comme jeux d'enregistrements et je peux modifier leurs valeurs, mais je ne vois pas les valeurs initiales.

P粉086993788
P粉086993788

répondre à tous(1)
P粉043470158

D'après ce que j'ai compris, vous avez essayé différentes approches, telles que la création d'un nouveau jeu d'enregistrements et la copie du schéma du jeu d'enregistrements d'origine, mais vous ne parvenez toujours pas à mettre à jour le champ de case à cocher lié au formulaire.

Utiliser des procédures stockées de cette manière peut être difficile, je vous recommande de tester individuellement si la procédure stockée que vous appelez autorise les mises à jour.

  1. Essayez d'utiliser la méthode .Clone au lieu du mode de copie manuelle pour créer une copie du jeu d'enregistrements d'origine.
  2. Vérifiez que la case à cocher du formulaire est correctement liée au champ du jeu d'enregistrements et autorise les mises à jour.
  3. Envisagez d'utiliser un type de curseur différent, tel que adOpenKeyset, pour offrir plus de flexibilité dans la mise à jour des données.

J'espère que cela aide !

Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal