Таблица обновления MS Access с 7 коллекциями или 1 массивом? - PullRequest
0 голосов
/ 17 октября 2018

Так что стараюсь держать этот раздел очень кратким: у меня есть две таблицы.Tbl1 имеет финансовые отчеты по годам для каждой компании в отдельных строках.В таблице 2 каждая компания представлена ​​только один раз, и все финансовые данные теперь находятся в одной строке.Как я могу это сделать?В настоящее время попытка сделать это с коллекциями имеет вторую попытку с массивами.

Привет, ребята, поэтому у меня есть две таблицы: Figs1 и Sabi.Рис.1 настроен следующим образом: NIF, PeriodEnding, Материалы, Амортизация, Неторговый доход, Общий процент, Прибыль до налогообложения, TotalEmpRemu.

Таким образом, вы получите повторяющиеся идентификаторы компаний, каждый из которых имеет свои финансовые показатели в виде строк.

В Саби он изменяется, поскольку у каждой компании есть 1 строка, и все эти данные находятся в столбцах, например PeriodEnding_Latest,PeriodEnding -1, PeriodEnding -2 и т. Д. До -6.Я сделал коллекцию для каждого столбца на рис. 1 и хочу обновить таблицу Sabi в правильном порядке.

Таким образом, коллекция PeriodEnding будет иметь {(31.12.2017), (31.12.2017), (31.12.2016), (31.12.2015), (31.12.2014), (31.12.2013)}

Эти значения должны быть указаны в PeriodEnding_Latest, PeriodEnding -1, PeriodEnding -2 и т. Д.

У меня есть обновление SQL-оператора и заполнение его переменными:

    SQL = "UPDATE SabiFigures1 SET SabiFigures1.[Closing Date Last avail yr] = '& DateFiled1 &', SabiFigures1.[Closing Date Year - 1] = '& DateFiled2 &', " & _
          "SabiFigures1.[Closing Date Year - 2] = '& DateFiled3 &', SabiFigures1.[Closing Date Year - 3] = '& DateFiled4 &', SabiFigures1.[Closing Date Year - 4] = '& DateFiled5 &, " & _
          "SabiFigures1.[Closing Date Year - 5] = '& DateFiled6 &', SabiFigures1.[Material costs th EUR Last avail yr] = '2933', SabiFigures1.[Material costs th EUR Year - 1] " & _
          "= '2791', SabiFigures1.[Material costs th EUR Year - 2] = '3721', SabiFigures1.[Material costs th EUR Year - 3] = '3021', SabiFigures1.[Material costs th EUR Year - 4] " & _
         "= '3005', SabiFigures1.[Material costs th EUR Year - 5] = '1890', SabiFigures1.[Depreciation th EUR Last avail yr] = '49', SabiFigures1.[Depreciation th EUR Year - 1] = " & _
         "'52', SabiFigures1.[Depreciation th EUR Year - 2] = '47', SabiFigures1.[Depreciation th EUR Year - 3] = '42', SabiFigures1.[Depreciation th EUR Year - 4] = '54', " & _
        "SabiFigures1.[Depreciation th EUR Year - 5] = '63', SabiFigures1.[Financial revenue th EUR Last avail yr] = Null, SabiFigures1.[Financial revenue th EUR Year - 1] " & _
        "= Null, SabiFigures1.[Financial revenue th EUR Year - 2] = Null, SabiFigures1.[Financial revenue th EUR Year - 3] = Null, SabiFigures1.[Financial revenue th EUR Year " & _
        "- 4] = Null, SabiFigures1.[Financial revenue th EUR Year - 5] = Null, SabiFigures1.[Financial expenses th EUR Last avail yr] = Null, SabiFigures1.[Financial expenses " & _
       "th EUR Year - 1] = Null, SabiFigures1.[Financial expenses th EUR Year - 2] = Null, SabiFigures1.[Financial expenses th EUR Year - 3] = Null, " & _
       "SabiFigures1.[Financial expenses th EUR Year - 4] = Null, SabiFigures1.[Financial expenses th EUR Year - 5] = Null, SabiFigures1." & _
     "[P/L before tax th EUR Last avail yr] = '407', SabiFigures1.[P/L before tax th EUR Year - 1] = '252', SabiFigures1.[P/L before tax th EUR Year - 2] " & _
     "= '1076', SabiFigures1.[P/L before tax th EUR Year - 3] = '597', SabiFigures1.[P/L before tax th EUR Year - 4] = '329', SabiFigures1.[P/L before tax th EUR Year - 5] = " & _
                                            "'102', SabiFigures1.[Cost of employees th EUR Last avail yr] = '1226', SabiFigures1.[Cost of employees th EUR Year - 1] = '1205', SabiFigures1.[Cost of employees th EUR Year - 2] " & _
   "= '1310', SabiFigures1.[Cost of employees th EUR Year - 3] = '1157', SabiFigures1.[Cost of employees th EUR Year - 4] = '1319', SabiFigures1.[Cost of employees th EUR Year - 5] = '1342' " & _
   "WHERE (((SabiFigures1.[NIF Code])='A01011550'));"
   db.Execute SQL

Код в значительной степени идет к первой таблице: рис.1 и получает первый номер, затем отправляется в Саби, где я предварительно заполнил необязательные NIF.Если он находит соответствующий NIF на рисунках 1 и Саби, он должен заполнить переменные из коллекции, однако, я не знаю, как сделать переменные «переменные».Например, базовая структура переменной должна быть DateFiled, но поскольку она циклически перебирает коллекцию PeriodEndings, она должна меняться с DateFiled1 на Datefiled6.

Set rsFigs1 = CurrentDb.OpenRecordset("Select * FROM Figs1Ready ORDER BY NIF, PeriodEnding DESC;")
    If Not (rsFigs1.EOF And rsFigs1.BOF) Then
        rsFigs1.MoveFirst
        Do Until rsFigs1.EOF = True
            NIF = rsFigs1!NIF
            Set rsFormat = CurrentDb.OpenRecordset("Select * FROM SabiFigures1;")
            If Not (rsFormat.EOF And rsFormat.BOF) Then
                rsFormat.MoveFirst
                Do Until rsFormat.EOF = True
                    nIFF = rsFormat![NIF Code]
                    If NIF = nIFF Then
                        Set qdfDef = CurrentDb.QueryDefs("PopulateSabiFigures1")
                        qdfDef.Parameters("NIF: ").Value = nIFF
                        Set rstDef = qdfDef.OpenRecordset()
                        Set PeriodEnding = RSToColl(rstDef, "PeriodEnding")
                        Set Materials1 = RSToColl(rstDef, "Materials")
                        Set Depreciation1 = RSToColl(rstDef, "Depreciation")
                        Set NonTrading1 = RSToColl(rstDef, "Non-Trading Income")
                        Set TotalInterest = RSToColl(rstDef, "Total_Interest_Charges")
                        Set Pretax = RSToColl(rstDef, "Pretax_Profit")
                        Set TotalRemu = RSToColl(rstDef, "Total_Empl_Remu_000")

                        For i = 1 To 6
                        VariableName = "DateFiled" & i
                        Next i

                        For Each Period In PeriodEnding
                            Debug.Print TypeName(Period)
                        Next


                    End If
                           SQL = 'The massive SQL statement above
                           db.Execute SQL
            rsFormat.MoveNext
            Loop
        End If
    rsFigs1.MoveNext
    Loop
End If


rstDef.Close
Set rstDef = Nothing
rsFormat.Close
Set rsFormat = Nothing
rsFigs1.Close
Set rsFigs1 = Nothing

Возможно, я смотрю на проблему неправильно, любая помощьи указатели будут оценены.Заранее спасибо.Добавил несколько картинок, надеюсь, это поможет Pretty much the layout and design of Figs Design and layout of sabi

Густаву, который первым предложил массив, я могу сделать что-то вроде этого: Это будет возвращаться каждый год(ряд) индивидуально.Я хотел бы обновить строку за один раз, чтобы сэкономить время, а не обновлять каждое годовое значение.Я думаю, что достаточно много раз обновлять каждую строку 6 раз, что заняло бы намного больше времени.

Set rsFormat = CurrentDb.OpenRecordset("Select * FROM SabiFigures1;")
    If Not (rsFormat.EOF And rsFormat.BOF) Then
        rsFormat.MoveFirst
        Do Until rsFormat.EOF = True
            nIFF = rsFormat![NIF Code]
            Set qdfDef = CurrentDb.QueryDefs("PopulateSabiFigures1")
            qdfDef.Parameters("NIF: ").Value = nIFF
            Set rstDef = qdfDef.OpenRecordset()
            rstDef.MoveLast
            rstDef.MoveFirst
            varRecord = rstDef.GetRows(rstDef.RecordCount)
            For intI = 0 To 5 'UBound(varRecord, 2)
                For intJ = 0 To UBound(varRecord, 1)
                    Debug.Print varRecord(intJ, intI)
                Next intJ
            Next intI
                    'whole row updated here after each value of the array is passed to variables for each year and financial value.
            rstDef.Close
            Set rstDef = Nothing
        rsFormat.MoveNext
        Loop
    End If

1 Ответ

0 голосов
/ 18 октября 2018

Привет, так что я понял это.Код очень громоздкий, поэтому любой, кто сможет сделать его немного более упорядоченным и гибким, например, столбцы, которые мне нужны, будет очень полезен.

Dim db As DAO.Database
Set db = CurrentDb
Dim rsFormat As DAO.Recordset
Dim rsFigs1 As Object
Dim qdfDef As DAO.QueryDef
Dim rstDef As Object
Dim varRecord As Variant
Dim NIF As String
Dim nIFF As String
Dim intI As Integer
Dim intJ As Integer
Dim RegNum, LatestDate, Date1, Date2, Date3, Date4, Date5, LatestMaterial, Material1, Material2, Material3, Material4, Material5, LatestDepreciation, Depreciation1, Depreciation2 As String
Dim Depreciation3, Depreciation4, Depreciation5, LatestTrading, Trading1, Trading2, Trading3, Trading4, Trading5, LatestTotalInterest, TotalInterest1, TotalInterest2, TotalInterest3 As String
Dim TotalInterest4, TotalInterest5, LatestPreTaxProfit, PreTaxProfit1, PreTaxProfit2, PreTaxProfit3, PreTaxProfit4, PreTaxProfit5, LatestTotEmpRem, TotEmpRem1, TotEmpRem2, TotEmpRem3 As String
Dim TotEmpRem4, TotEmpRem5, SQL As String

Set rsFormat = CurrentDb.OpenRecordset("Select [NIF Code] FROM SabiFigures1;")
    If Not (rsFormat.EOF And rsFormat.BOF) Then
        rsFormat.MoveFirst
        Do Until rsFormat.EOF = True
            nIFF = rsFormat![NIF Code]
            Set qdfDef = CurrentDb.QueryDefs("PopulateSabiFigures1")
            qdfDef.Parameters("NIF: ").Value = nIFF
            Set rstDef = qdfDef.OpenRecordset()
            rstDef.MoveLast
            rstDef.MoveFirst
            varRecord = rstDef.GetRows(rstDef.RecordCount)
            For intI = 0 To 5
                For intJ = 0 To UBound(varRecord, 1)
                    Debug.Print varRecord(intJ, intI)
                    On Error Resume Next
                    If intI = 0 Then
                        If intJ = 0 Then
                            RegNum = varRecord(intJ, intI)
                        ElseIf intJ = 1 Then
                            LatestDate = varRecord(intJ, intI)
                        ElseIf intJ = 2 Then
                            LatestMaterial = varRecord(intJ, intI)
                        ElseIf intJ = 3 Then
                            LatestDepreciation = varRecord(intJ, intI)
                        ElseIf intJ = 4 Then
                            LatestTrading = varRecord(intJ, intI)
                        ElseIf intJ = 5 Then
                            LatestTotalInterest = varRecord(intJ, intI)
                        ElseIf intJ = 6 Then
                            LatestPreTaxProfit = varRecord(intJ, intI)
                        ElseIf intJ = 7 Then
                            LatestTotEmpRem = varRecord(intJ, intI)
                        Else
                            MsgBox "Error in Loop"
                            Exit Sub
                        End If
                ElseIf intI = 1 Then
                        If intJ = 0 Then
                            RegNum = varRecord(intJ, intI)
                        ElseIf intJ = 1 Then
                            Date1 = varRecord(intJ, intI)
                        ElseIf intJ = 2 Then
                            Material1 = varRecord(intJ, intI)
                        ElseIf intJ = 3 Then
                            Depreciation1 = varRecord(intJ, intI)
                        ElseIf intJ = 4 Then
                            Trading1 = varRecord(intJ, intI)
                        ElseIf intJ = 5 Then
                            TotalInterest1 = varRecord(intJ, intI)
                        ElseIf intJ = 6 Then
                            PreTaxProfit1 = varRecord(intJ, intI)
                        ElseIf intJ = 7 Then
                            TotEmpRem1 = varRecord(intJ, intI)
                        Else
                            MsgBox "Error in Loop"
                            Exit Sub
                        End If
                ElseIf intI = 2 Then
                        If intJ = 0 Then
                            RegNum = varRecord(intJ, intI)
                        ElseIf intJ = 1 Then
                            Date2 = varRecord(intJ, intI)
                        ElseIf intJ = 2 Then
                            Material2 = varRecord(intJ, intI)
                        ElseIf intJ = 3 Then
                            Depreciation2 = varRecord(intJ, intI)
                        ElseIf intJ = 4 Then
                            Trading2 = varRecord(intJ, intI)
                        ElseIf intJ = 5 Then
                            TotalInterest2 = varRecord(intJ, intI)
                        ElseIf intJ = 6 Then
                            PreTaxProfit2 = varRecord(intJ, intI)
                        ElseIf intJ = 7 Then
                            TotEmpRem2 = varRecord(intJ, intI)
                        Else
                            MsgBox "Error in Loop"
                            Exit Sub
                        End If
                ElseIf intI = 3 Then
                        If intJ = 0 Then
                            RegNum = varRecord(intJ, intI)
                        ElseIf intJ = 1 Then
                            Date3 = varRecord(intJ, intI)
                        ElseIf intJ = 2 Then
                            Material3 = varRecord(intJ, intI)
                        ElseIf intJ = 3 Then
                            Depreciation3 = varRecord(intJ, intI)
                        ElseIf intJ = 4 Then
                            Trading3 = varRecord(intJ, intI)
                        ElseIf intJ = 5 Then
                            TotalInterest3 = varRecord(intJ, intI)
                        ElseIf intJ = 6 Then
                            PreTaxProfit3 = varRecord(intJ, intI)
                        ElseIf intJ = 7 Then
                            TotEmpRem3 = varRecord(intJ, intI)
                        Else
                            MsgBox "Error in Loop"
                            Exit Sub
                        End If
                ElseIf intI = 4 Then
                        If intJ = 0 Then
                            RegNum = varRecord(intJ, intI)
                        ElseIf intJ = 1 Then
                            Date4 = varRecord(intJ, intI)
                        ElseIf intJ = 2 Then
                            Material4 = varRecord(intJ, intI)
                        ElseIf intJ = 3 Then
                            Depreciation4 = varRecord(intJ, intI)
                        ElseIf intJ = 4 Then
                            Trading4 = varRecord(intJ, intI)
                        ElseIf intJ = 5 Then
                            TotalInterest4 = varRecord(intJ, intI)
                        ElseIf intJ = 6 Then
                            PreTaxProfit4 = varRecord(intJ, intI)
                        ElseIf intJ = 7 Then
                            TotEmpRem4 = varRecord(intJ, intI)
                        Else
                            MsgBox "Error in Loop"
                            Exit Sub
                        End If
                ElseIf intI = 5 Then
                        If intJ = 0 Then
                            RegNum = varRecord(intJ, intI)
                        ElseIf intJ = 1 Then
                            Date5 = varRecord(intJ, intI)
                        ElseIf intJ = 2 Then
                            Material5 = varRecord(intJ, intI)
                        ElseIf intJ = 3 Then
                            Depreciation5 = varRecord(intJ, intI)
                        ElseIf intJ = 4 Then
                            Trading5 = varRecord(intJ, intI)
                        ElseIf intJ = 5 Then
                            TotalInterest5 = varRecord(intJ, intI)
                        ElseIf intJ = 6 Then
                            PreTaxProfit5 = varRecord(intJ, intI)
                        ElseIf intJ = 7 Then
                            TotEmpRem5 = varRecord(intJ, intI)
                        Else
                            MsgBox "Error in Loop"
                            Exit Sub
                        End If
                Else
                    MsgBox "Error in Loop"
                    Exit Sub
                End If
                Next intJ

            Next intI
    SQL = "UPDATE SabiFigures1 SET SabiFigures1.[Closing Date Last avail yr] = '" & LatestDate & "', SabiFigures1.[Closing Date Year - 1] = '" & Date1 & "', " & _
          "SabiFigures1.[Closing Date Year - 2] = '" & Date2 & "', SabiFigures1.[Closing Date Year - 3] = '" & Date3 & "', SabiFigures1.[Closing Date Year - 4] = '" & Date4 & "', " & _
          "SabiFigures1.[Closing Date Year - 5] = '" & Date5 & "', SabiFigures1.[Material costs th EUR Last avail yr] = '" & LatestMaterial & "', SabiFigures1.[Material costs th EUR Year - 1] " & _
          "= '" & Material1 & "', SabiFigures1.[Material costs th EUR Year - 2] = '" & Material2 & "', SabiFigures1.[Material costs th EUR Year - 3] = '" & Material3 & "', SabiFigures1.[Material costs th EUR Year - 4] " & _
          "= '" & Material4 & "', SabiFigures1.[Material costs th EUR Year - 5] = '" & Material5 & "', SabiFigures1.[Depreciation th EUR Last avail yr] = '" & LatestDepreciation & "', SabiFigures1.[Depreciation th EUR Year - 1] = " & _
          "'" & Depreciation1 & "', SabiFigures1.[Depreciation th EUR Year - 2] = '" & Depreciation2 & "', SabiFigures1.[Depreciation th EUR Year - 3] = '" & Depreciation3 & "', SabiFigures1.[Depreciation th EUR Year - 4] = '" & Depreciation4 & "', " & _
          "SabiFigures1.[Depreciation th EUR Year - 5] = '" & Depreciation5 & "', SabiFigures1.[Financial revenue th EUR Last avail yr] = '" & LatestTrading & "', SabiFigures1.[Financial revenue th EUR Year - 1] " & _
          "= '" & Trading1 & "', SabiFigures1.[Financial revenue th EUR Year - 2] = '" & Trading2 & "', SabiFigures1.[Financial revenue th EUR Year - 3] = '" & Trading3 & "', SabiFigures1.[Financial revenue th EUR Year " & _
          "- 4] = '" & Trading4 & "', SabiFigures1.[Financial revenue th EUR Year - 5] = '" & Trading5 & "', SabiFigures1.[Financial expenses th EUR Last avail yr] = '" & LatestTotalInterest & "', SabiFigures1.[Financial expenses " & _
          "th EUR Year - 1] = '" & TotalInterest1 & "', SabiFigures1.[Financial expenses th EUR Year - 2] = '" & TotalInterest2 & "', SabiFigures1.[Financial expenses th EUR Year - 3] = '" & TotalInterest3 & "', " & _
          "SabiFigures1.[Financial expenses th EUR Year - 4] = '" & TotalInterest4 & "', SabiFigures1.[Financial expenses th EUR Year - 5] = '" & TotalInterest5 & "', SabiFigures1." & _
          "[P/L before tax th EUR Last avail yr] = '" & LatestPreTaxProfit & "', SabiFigures1.[P/L before tax th EUR Year - 1] = '" & PreTaxProfit1 & "', SabiFigures1.[P/L before tax th EUR Year - 2] " & _
          "= '" & PreTaxProfit2 & "', SabiFigures1.[P/L before tax th EUR Year - 3] = '" & PreTaxProfit3 & "', SabiFigures1.[P/L before tax th EUR Year - 4] = '" & PreTaxProfit4 & "', SabiFigures1.[P/L before tax th EUR Year - 5] = " & _
          "'" & PreTaxProfit5 & "', SabiFigures1.[Cost of employees th EUR Last avail yr] = '" & LatestTotEmpRem & "', SabiFigures1.[Cost of employees th EUR Year - 1] = '" & TotEmpRem1 & "', SabiFigures1.[Cost of employees th EUR Year - 2] " & _
          "= '" & TotEmpRem2 & "', SabiFigures1.[Cost of employees th EUR Year - 3] = '" & TotEmpRem3 & "', SabiFigures1.[Cost of employees th EUR Year - 4] = '" & TotEmpRem4 & "', SabiFigures1.[Cost of employees th EUR Year - 5] = '" & TotEmpRem5 & "' " & _
          "WHERE (((SabiFigures1.[NIF Code])='" & RegNum & "'));"
    db.Execute SQL
    SQL = ""
    RegNum = ""
    LatestDate = ""
    Date1 = ""
    Date2 = ""
    Date3 = ""
    Date4 = ""
    Date5 = ""
    LatestMaterial = ""
    Material1 = ""
    Material2 = ""
    Material3 = ""
    Material4 = ""
    Material5 = ""
    LatestDepreciation = ""
    Depreciation1 = ""
    Depreciation2 = ""
    Depreciation3 = ""
    Depreciation4 = ""
    Depreciation5 = ""
    LatestTrading = ""
    Trading1 = ""
    Trading2 = ""
    Trading3 = ""
    Trading4 = ""
    Trading5 = ""
    LatestTotalInterest = ""
    TotalInterest1 = ""
    TotalInterest2 = ""
    TotalInterest3 = ""
    TotalInterest4 = ""
    TotalInterest5 = ""
    LatestPreTaxProfit = ""
    PreTaxProfit1 = ""
    PreTaxProfit2 = ""
    PreTaxProfit3 = ""
    PreTaxProfit4 = ""
    PreTaxProfit5 = ""
    LatestTotEmpRem = ""
    TotEmpRem1 = ""
    TotEmpRem2 = ""
    TotEmpRem3 = ""
    TotEmpRem4 = ""
    TotEmpRem5 = ""

            'For intI = 6 To UBound(varRecord, 2)
            '    For intJ = 0 To UBound(varRecord, 1)
            '        Debug.Print varRecord(intJ, intI)
            '    Next intJ
            'Next intI

            rstDef.Close
            Set rstDef = Nothing
        rsFormat.MoveNext
        Loop
    End If
...