2017-09-03 9 views
0

C'est la première fois que j'ai posé une question bien que j'aie trouvé la solution à beaucoup de mes problèmes ici au cours des années. J'ai un problème frustrant auquel je ne trouve pas de réponse. Je veux effectuer la lecture initiale avant une lecture de manière séquentielle à travers une table liée ouverte en tant que jeu d'enregistrements DAO dynaset en utilisant un nom d'index spécifique tel que défini sur la table.MS Access 2007 ouvert DAO jeu d'enregistrements utilisant un index spécifié

Mon code renvoie l'erreur 3251 'l'opération n'est pas prise en charge ...' sur la ligne .index. Pas de doute, il y a une solution évidente (Attention, j'essaie d'éviter d'ouvrir une requête SQL qui serait la réponse évidente).

Public Function IOrdCustomerStock(CustomerID As Long, ProductID As Long, KeepRsOpen As Boolean, Optional UseIndexName As String) As Boolean 

    Set zcls_CS.CS_rs = CurrentDb.OpenRecordset(Name:=CS_TableName, Type:=RecordsetTypeEnum.dbOpenDynaset) 
    With zcls_CS.CS_rs 
     If Not IsMissing(UseIndexName) Then 
      .Index = UseIndexName 
     End If 
     .FindFirst "CS_CustomerID = " & CustomerID & " and CS_ProductID = " & ProductID 
     If .NoMatch Then 
      zcls_CS.CS_EOF = True 
     Else 
      zcls_CS.CS_EOF = False 
      zcls_CS.CS_ID = .Fields("[ID]") 
      zcls_CS.CS_CustomerID = .Fields("[CS_CustomerID]") 
      zcls_CS.CS_PhysSalesStock = .Fields("[CS_PhysSalesStock]") 
      zcls_CS.CS_ProductID = .Fields("[CS_ProductID]") 
      zcls_CS.CS_PurQuantityRecvd = .Fields("[CS_PurQuantityRecvd]") 
      zcls_CS.CS_PurUnitDesc = .Fields("[CS_PurUnitDesc]") 
      zcls_CS.CS_PurUnitFactor = .Fields("[CS_PurUnitFactor]") 
      zcls_CS.CS_SaleQuantityAlloc = .Fields("[CS_SaleQuantityAlloc]") 
      zcls_CS.CS_SaleQuantityOrdered = .Fields("[CS_SaleQuantityOrdered]") 
      zcls_CS.CS_SaleUnitDesc = .Fields("[CS_SaleUnitDesc]") 
      zcls_CS.CS_SaleUnitFactor = .Fields("[CS_SaleUnitFactor]") 
     End If 
    End With 
    If Not KeepRsOpen Then 
     Call IOclCustomerStock 
    End If 

    IOrdCustomerStock = Not zcls_CS.CS_EOF 

End Function 
+0

post-scriptum Si je change le type de jeu d'enregistrements à Type: = RecordsetTypeEnum.dbOpenTable puis j'obtiens une opération non valide sur la ligne openrecordset et également si je change la définition recordert de dao.recordset en jeu d'enregistrements simple. – user7425513

+0

P.P.S. J'obtiens les mêmes erreurs si j'utilise un jeu d'enregistrements défini localement (juste pour éliminer tous les probems utilisant un jeu d'enregistrements défini en tant qu'élément d'une classe). Je pense que le problème fondamental est que j'ai besoin d'ouvrir le jeu d'enregistrements en tant que type de table pour me permettre d'utiliser la propriété d'index du jeu d'enregistrements mais je fais évidemment quelque chose (je m'attends assez évident) faux. – user7425513

+0

Toutes mes excuses pour le typo ... Je me bats avec un clavier français sur mon ordinateur de sauvegarde car ma machine principale est pooly ... – user7425513

Répondre

0

Une fois que je l'avais restreint le problème aux tables liées, je trouve le poste suivant:

https://social.msdn.microsoft.com/Forums/office/en-US/d402a8d2-0771-458c-b57e-09e2d6f0c536/trying-to-open-a-linked-table-whats-going-on?forum=accessdev

Je ne prétends pas comprendre les paramètres de OpenDatabase, mais il fonctionne. J'ai juste besoin d'ajouter l'habituel traitement des erreurs de ma petite preuve de concept:

Public Function IOksInitRsIX1CustomerStock(UseIndexName As String, CustomerID As Long, ProductID As Long) As Boolean 
Set zcls_CS.CS_rs = OpenDatabase(Mid(DBEngine(0)(0).TableDefs(CS_TableName).Connect, 11)).OpenRecordset(CS_TableName) 
With zcls_CS.CS_rs 
    zcls_CS.CS_rs.Index = UseIndexName 
    If (CustomerID > 0 And ProductID > 0) Then 
     .Seek "=", CustomerID, ProductID 
    Else 
     If CustomerID > 0 Then 
      .Seek "=", CustomerID 
     End If 
    End If 
    If .NoMatch Then 
     zcls_CS.CS_EOF = True 
    Else 
     zcls_CS.CS_EOF = False 
     zcls_CS.CS_ID = .Fields("[ID]") 
     zcls_CS.CS_CustomerID = .Fields("[CS_CustomerID]") 
     zcls_CS.CS_PhysSalesStock = .Fields("[CS_PhysSalesStock]") 
     zcls_CS.CS_ProductID = .Fields("[CS_ProductID]") 
     zcls_CS.CS_PurQuantityRecvd = .Fields("[CS_PurQuantityRecvd]") 
     zcls_CS.CS_PurUnitDesc = .Fields("[CS_PurUnitDesc]") 
     zcls_CS.CS_PurUnitFactor = .Fields("[CS_PurUnitFactor]") 
     zcls_CS.CS_SaleQuantityAlloc = .Fields("[CS_SaleQuantityAlloc]") 
     zcls_CS.CS_SaleQuantityOrdered = .Fields("[CS_SaleQuantityOrdered]") 
     zcls_CS.CS_SaleUnitDesc = .Fields("[CS_SaleUnitDesc]") 
     zcls_CS.CS_SaleUnitFactor = .Fields("[CS_SaleUnitFactor]") 
    End If 
End With 

IOksInitRsIX1CustomerStock = Not zcls_CS.CS_EOF 

End Function