Heim  >  Fragen und Antworten  >  Hauptteil

Implementieren eines aktualisierbaren Formulardatensatzes mithilfe gespeicherter Prozeduren

  1. Ich versuche, ein Formular mithilfe eines Recordsets einzurichten, das auf einer gespeicherten Prozedur auf einem MySQL-Server basiert. Wenn ich dann das Befehlsobjekt verwende Set Me.Recordset = cmd.execute, funktioniert es einwandfrei, aber ich muss in der Lage sein, zwei Felder (Tinyint und Varchar) zu aktualisieren, die an das Kontrollkästchen und das Textfeld in meinem Formular gebunden sind. Das funktioniert natürlich nicht.

  2. Angesichts dieses Designproblems habe ich versucht, das Recordset mit der .Open-Methode und der Syntax „CALL procName ('value1', 'value2');“ zu öffnen und dann ein neues getrenntes Recordset aus .Open zu erstellen Methode, und dann werden die Datensätze in einer Schleife ausgeführt und an die neuen RS angehängt. Legen Sie es schließlich wie folgt als Recordset des Formulars fest:

  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. Zusätzliche Informationen: NewRecordset-Variablen werden auf Formularebene als privat deklariert. Ich weiß auch, dass es eine schlechte Praxis ist, eine Prozedur so aufzurufen, wie ich es getan habe, aber ich kann mir keinen anderen Weg vorstellen, diese Aufgabe zu erledigen.

  5. Wichtig: Ich kann und möchte keine lokalen Tabellen verwenden. Das wäre die einfache Lösung, würde aber auch nicht mit dem Rest des Codes vereinbar sein. Danke :)

Das Problem ist: Wenn ich vorgehe, was ich erklärt habe, erhalte ich einen #Name-Fehler für die gebundenen Felder, oder sie sind als Recordsets festgelegt und ich kann ihre Werte ändern, aber ich sehe die Anfangswerte nicht.

P粉086993788P粉086993788423 Tage vor559

Antworte allen(1)Ich werde antworten

  • P粉043470158

    P粉0434701582023-09-14 00:32:59

    据我所了解,您已尝试了各种方法,例如创建一个新的记录集并从原始记录集复制模式,但您仍然无法更新绑定到表单上的复选框字段。

    以这种方式使用存储过程可能会有挑战性,我建议您单独测试调用的存储过程是否允许更新。

    1. 尝试使用 .Clone 方法而不是手动复制模式来创建原始记录集的副本。
    2. 验证表单上的复选框控件是否正确绑定到记录集字段并允许更新。
    3. 考虑使用不同的游标类型,例如 adOpenKeyset,以提供更多更新数据的灵活性。

    希望对您有所帮助!

    Antwort
    0
  • StornierenAntwort