Доброго времени суток. У меня возникла проблема, которая подрывает доверие к MS Access и, пока она не будет решена, делает невозможной работу в этом пакете. Помогите, пожалуйста, решить эту проблему. Ситуация заключается в следующем: Есть большая (около 300 Мбайт) база данных, написанная на FoxPro - статистика работы газопровода за пять лет. Причем данные организован таким образом, что каждому месяцу соответствует отдельный каталог с названием Mmmyy, где mm - номер месяца, yy - номер года. В каждом каталоге 10 dbf-файлов. Задача заключается в том, чтобы выбрать из этой базы интересующую информацию, по которой расчитываются определенные параметры. Эти параметры записываются в одну таблицу Access. Я написал небольшую программку, выполняющую эти действия. Позже в эту программу было добавлено дублирование вычисления парметров (MTG и MTG1) и сравнение оригинала и дубликата друг с другом. Во время работы этой программы Access не выдает никаких собщений об ошибках, но получаются парадоксальные результаты: !!Две переменных, вычисленные по одним и тем же формулам на одних и тех же исходных данных с интервалом милисекунды, иногда имеют разное значение.!! Причем при неоднократном запуске программы такого рода "сбои вычислений" возникают в разные обрабатываемые дни. При одном проходе данные вычисляются правильно, при дугом - дают разницу. Помогите разобраться, что в приведенной ниже программе могло послужить причиной такого рода сбоев. Если такие ошибки возникают в Access'е при выполнении сравнительно простых математических операций, то о какой разработке, например, бухгалтерских приложений может идти речь? С уважением, Виктор Добров mailto: vido@sky.net.ua Attribute VB_Name = "Convert" Option Compare Database Option Explicit
Public Const DirPath = "d:\KTG" 'Путь к базе данных DBF Public DBNames$(1 To 10) 'Названия используемых таблиц Public ErrFlag As Boolean 'Флаг налчия ошибк Public StartDate As Date 'Начальная дата обработки Public FinishDate As Date 'Конечная дата обработки Public PosExel As Long 'Счетчик текущей обрабатываемй записи Dim tb As TableDef Dim rs As Recordset Const ResName$ = "Result" 'Название таблицы результатов Public CurDate As Date 'Текущий день обработки 'Вычисляемые переменные Public MTG As Single Public MTG_EG As Single Public CHTG As Single Public HGPU As Single Public PGPU As Single Public SHGPU As Single Public PLAST As Single Public CHNGG As Single Public HTG As Single Public UKRNAFTA As Single Public OTBOR As Single Public ZAKACHKA As Single Public ZAPAS As Single Public ZMINA As Single Public ZMINA_EG As Single Public CHTG_R As Single Public CHTG_R_EG As Single Public LTG As Single Public OHTIRKA As Single Public POLTAVA As Single Public RF As Single Public BILORUS As Single Public UKRAINE As Single Public PG As Single Public PG_EG As Single Public TP As Single Public TP_EG As Single 'Дублирование вычисляемых переменных Public MTG1 As Single Public MTG_EG1 As Single Public CHTG1 As Single Public HGPU1 As Single Public PGPU1 As Single Public SHGPU1 As Single Public PLAST1 As Single Public CHNGG1 As Single Public HTG1 As Single Public UKRNAFTA1 As Single Public OTBOR1 As Single Public ZAKACHKA1 As Single Public ZAPAS1 As Single Public ZMINA1 As Single Public ZMINA_EG1 As Single Public CHTG_R1 As Single Public CHTG_R_EG1 As Single Public LTG1 As Single Public OHTIRKA1 As Single Public POLTAVA1 As Single Public RF1 As Single Public BILORUS1 As Single Public UKRAINE1 As Single Public PG1 As Single Public PG_EG1 As Single Public TP1 As Single Public TP_EG1 As Single Sub InitDBNames() 'Задания названий используемых таблиц DBNames$(1) = "BF.DBF" DBNames$(2) = "IF.DBF" DBNames$(3) = "ZF.DBF" DBNames$(4) = "WF.DBF" DBNames$(5) = "PF.DBF" DBNames$(6) = "OF.DBF" DBNames$(7) = "AF.DBF" DBNames$(8) = "WLAP.DBF" DBNames$(9) = "OBJEKT.DBF" DBNames$(10) = "AGNKS.DBF" End Sub Sub AddTables() 'Загрузка в базу DBF-таблиц Dim DatePath As String, MStr As String, YStr As String Dim i As Long MStr = Month(CurDate) 'Обрабатываемый месяц If Len(MStr) = 1 Then MStr = "0" & MStr YStr = Right(Year(CurDate), 2) 'Обрабатываемый год DatePath = DirPath & "\M" & MStr & YStr & "\" For i = 1 To 10 'Процесс импорта таблиц DoCmd.TransferDatabase acImport, "dBase III", _ DatePath, acTable, DBNames$(i), Left(DBNames$(i), Len(DBNames$(i)) - 4) Next i End Sub Sub DeleteTables() 'Удаление обработанных таблиц из базы Dim i As Long On Error Resume Next 'На всякий случай For i = 1 To 10 DoCmd.DeleteObject acTable, Left(DBNames$(i), Len(DBNames$(i)) - 4) Next i On Error GoTo 0 End Sub Sub CalcParam() 'Вычисление параметров Dim mSQL As String ErrFlag = False 'Сброс индикатора ошибки MTG = Round(Nz(DSum("[Q" & Day(CurDate) & "]", "ZF", _ "([NSHIFR]='zk10') Or ([NSHIFR]='zk11') Or ([NSHIFR]='zk12') Or " & _ "([NSHIFR]='zk13') Or ([NSHIFR]='zk14') Or ([NSHIFR]='zk16')")), 2) MTG_EG = Round(Nz(DSum("[Q" & Day(CurDate) & "]", "ZF", _ "([NSHIFR]='zk10') Or ([NSHIFR]='zk11') Or ([NSHIFR]='zk12') ")), 2) CHTG = Round(Nz(DSum("[Q" & Day(CurDate) & "]", "IF", "([NSHIFR]='ik81')")), 2) HGPU = Round(Nz(DSum("[Q" & Day(CurDate) & "]", "IF", "([NSHIFR]='ik41')")), 2) PGPU = Round(Nz(DSum("[Q" & Day(CurDate) & "]", "IF", "([NSHIFR]='ik19') or ([NSHIFR]='ik50')")), 2) SHGPU = Round(Nz(DSum("[Q" & Day(CurDate) & "]", "IF", "([NSHIFR]='ik80')")), 2) PLAST = Round(Nz(DSum("[Q" & Day(CurDate) & "]", "IF", "([NSHIFR]='ik110')")), 2) CHNGG = Round(Nz(DSum("[Q" & Day(CurDate) & "]", "IF", "([NSHIFR]='ik111')")), 2) HTG = Round(Nz(DSum("[Q" & Day(CurDate) & "]", "IF", "([NSHIFR]='ik109')")), 2) UKRNAFTA = Round(Nz(DSum("[Q" & Day(CurDate) & "]", "IF", _ "([NSHIFR]='ik32') or ([NSHIFR]='ik39') or ([NSHIFR]='ik51')")) + _ Nz(DSum("[Q" & Day(CurDate) & "]", "BF", "([NSHIFR]='bk2')")), 2) OTBOR = Round(Nz(DSum("[Q" & Day(CurDate) & "]", "PF", _ "([NSHIFR]='pk1') or ([NSHIFR]=
Ответить
|