2017-10-17 8 views
0

J'ai été invité à apporter une modification à un projet VB6. Le problème que je rencontre est que j'essaie d'obtenir des données d'une base de données Access et d'affecter les données à certaines variables.VB6 Affectation de données à des variables d'une base de données

J'ai le code:

Dta_Period.DatabaseName = DB_Accounts_Name$ 
Dta_Period.RecordSet = "SELECT * FROM [Period]" 
Dta_Period.Refresh 

Le tableau Period contient 2 champs. Le champ sMonth contient les mois de janvier à décembre. Le champ Period stocke un nombre compris entre 0 et 11, pour représenter le nombre attribué à quel mois de l'année financière des clients. Janvier peut être 0, ou peut être 11, essentiellement.

J'ai besoin de savoir quel mois va avec quelle période, c'est pourquoi j'ai sélectionné ces données dans la base de données. Cependant, je suis coincé avec ce qu'il faut faire ensuite.

Comment faire une boucle sur le RecordSet (si cela est même possible?) Et savoir quel numéro a été attribué à chaque mois? Je ne pense pas que je puisse utiliser une boucle Do Until. Est-il plus facile d'utiliser seulement 12 requêtes séparées, puis de créer un tableau de chaînes et un tableau d'entiers, puis boucle sur le tableau de chaînes jusqu'à ce que je trouve le bon mois, l'utilisation du même index pour le tableau sur les entiers?

EDIT 1

Pour rendre les choses plus simples à suivre pour moi-même et toute personne qui tenterait de fournir une réponse, je l'ai modifié le code.

Dim rstPeriod As DAO.RecordSet 
Dim accDB As DAO.Database 

' DB_Session is a Workspace, whilst DB_Accounts_Name$ is the name of the DB I am using 
Set accDB = DB_Session.OpenDatabase(DB_Accounts_Name$) 

SQL = "SELECT * FROM [Period] ORDER BY [Period]" 

Set rstPeriod = accDB.OpenRecordset(SQL, dbOpenDynaset) 

If rstPeriod.BOF = False Then 
    rstPeriod.MoveFirst 
End If 

Dim strMonth(11) As String 
Dim pNumber(11) As Integer 

idée pseudocode:

Do Until rstPeriod.EOF 
    Select Case currentRow.Field("Month") 
    Case "January" 
     strMonth(0) = "January" 
     pNumber(0) = currentRow.Field("Number") 
    Case "February" 
     strMonth(1) = "February" 
     pNumber(1) = currentRow.Field("Number") 
    End Select 
Loop 
+0

C'est un code étrange que vous avez là. Vous définissez un jeu d'enregistrements égal à une chaîne? Normalement, vous pouvez juste faire 'Do Until Recordset.EOF' pour faire une boucle dans un jeu d'enregistrements, mais je doute que c'est un jeu d'enregistrements DAO ou ADO normal que vous avez là. Si vous voulez une réponse spécifique, vous devrez partager assez de code pour que nous comprenions ce qui se passe. –

+1

Je pense que vous devriez être capable de faire quelque chose comme ceci: https://msdn.microsoft.com/en-us/library/bb243789(v=office.12).aspx – Jeremy

+0

Y at-il une classe d'emballage de jeu d'enregistrements par hasard? –

Répondre

0

boucle à travers les enregistrements et remplir des tableaux avec le nom du mois et le numéro de mois.

Cela suppose que le jeu d'enregistrements ne renvoie pas plus de 12 enregistrements.

Public Sub LoopThroughtRecordset() 
    On Error GoTo ErrorTrap 

    Dim rs As DAO.Recordset 
    Set rs = CurrentDb().OpenRecordset("SELECT * FROM [Period] ORDER BY [Period]", dbOpenSnapShot) 
    With rs 
     If .EOF Then GoTo Leave 
     .MoveLast 
     .MoveFirst 
    End With 

    Dim strMonth(11) As String 
    Dim pNumber(11) As Integer 

    Dim idx As Long 
    For idx = 0 To rs.RecordCount -1 
     strMonth(idx) = rs![Month] 
     pNumber(idx) = rs![Number] 
     rs.MoveNext 
    Next idx 

Leave: 
    On Error Resume Next 
     rs.Close 
    Set rs = Nothing 
    On Error GoTo 0 
    Exit Sub 

ErrorTrap: 
    MsgBox Err.Description, vbCritical, CurrentDb.Properties("AppTitle") 
    Resume Leave 
End Sub 

'strMonth(0) = January 
'strMonth(1) = February 
'... 
'pNumber(0) = 1 
'pNumber(1) = 2 
'...