Rambler's Top100
Форум: MS ACCESSVBVBA MS OfficeMS SQL server
Новые сообщения: 0000

Форум: MS ACCESS

Вопросы связанные с MS ACCESS

Обновить визитку
Участники «Online»
Все участники

 
 

Доброго времени суток, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: О сохранении запроса в файл adtg (поля сохраняются в алф.порядке) (A2000-2003)
 
 автор: Дядя Федор   (30.08.2009 в 10:02)   личное сообщение
 
 

Есть функции сохранения и чтения запроса в файл(из файла) (основа - Гетц,Литвин,Гилберт)
Вот они

'''' Запись таблицы tblname 
Public Sub SaveRecordset(ByVal tblname As String, ByVal filename As String)
Dim rst As ADODB.Recordset
Dim strfile As String
Set rst = New ADODB.Recordset
rst.Open tblname, CurrentProject.Connection, adOpenStatic, adLockOptimistic
strfile = filename & ".adtg" 
On Error Resume Next
Kill strfile
Err.Clear
rst.Save strfile, adPersistADTG
rst.Close
Set rst = Nothing
End Sub
'''' Чтениеь в  таблицу tblname
Public Sub ReadRecordset(ByVal tblname As String, ByVal filename As String)
Dim rstpriem As ADODB.Recordset
Dim rst As ADODB.Recordset
Dim strfile As String
Dim j As Long
strfile = filename '& ".adtg" 'CurrentProject.Path & "\t.adtg"
'открываем табл приемник
Set rstpriem = New ADODB.Recordset
rstpriem.Open tblname, CurrentProject.Connection, adOpenStatic, adLockOptimistic
'читаем из файла в rst
Set rst = New ADODB.Recordset
If Len(Dir(strfile)) > 0 Then
 rst.Open strfile, , adOpenStatic, adLockOptimistic
  rst.ActiveConnection = CurrentProject.Connection
  rst.Update
End If
'далее очистка приемника (лучше конечно запросом, но для примера пойдет)
With rstpriem
 If .RecordCount > 0 Then
  Do
  .Delete
  .MoveNext
  Loop Until .EOF
 End If
End With
'и вот запись в приемник
With rst
.MoveFirst
While Not .EOF
rstpriem.AddNew
'А ВОТ ФРАГМЕНТ ДЛЯ ОБСУЖДЕНИЯ
        For j = 1 To rst.Fields.Count - 1
        rstpriem.Fields(rst.Fields(j).Name) = .Fields(j)
    Next j
'КОНЕЦ ФРАГМЕНТА
rstpriem.Update
 .MoveNext
Wend
End With
rst.Close
Set rst = Nothing
rstpriem.Close
Set rstpriem = Nothing
End Sub

А теперь вопрос. Пришлось данные в таблицу - приемник писать по именам полей.
Хотя, казалось бы, можно было и так (тем более, что таблицы имеют одинаковую структуру)

With rst
.MoveFirst
While Not .EOF
rstpriem.AddNew
        For j = 1 To rst.Fields.Count - 1
        rstpriem.Fields(j) = .Fields(j)
       Next j
rstpriem.Update
 .MoveNext
Wend
End With

или даже колонками или массивами строк, НО.
ПРИ ЗАПИСИ МЕТОДОМ SaveRecordset ПОЛЯ ИДУТ В АЛФАВИТНОМ ПОРЯДКЕ!
т.е.
если имеются поля

штрихкод
наименование
артикул
цена

записаны будут в последовательности

артикул
наименование
цена
штрихкод


Собственно вопрос. Может быть я не доглядел чего и есть способ указать последовательность записи полей в методе сохранения?
(Файлы нужны для переноса с компа базы товаров в магазины. Можно, конечно использовать промежуточный mdb-файл, но вопрос не в этом. Файлы adtg меньше и не просто прочесть "шпионам")

  Ответить  
 
 автор: ShadowOfSun   (31.08.2009 в 00:01)   личное сообщение
 
 

Попробуй записывать имена полей через ADOX.Colimn в табличку со счетчиком при создании файла ".adtg"
А при записи в приемник используй имена полей

  Ответить  
 
 автор: osmor   (31.08.2009 в 08:49)   личное сообщение
 
 

tblname - это что таблица?
Попробуйте использовать SQL строку с явным указанием полей, т.е.
rst.Open "Select filed1,field4,field2 from tbl" .....

  Ответить  
 
 автор: Дядя Федор   (31.08.2009 в 12:19)   личное сообщение
 
 

Да, это мысль! Спасибо.

  Ответить  
HiProg.com - Технологии программирования
Rambler's Top100 TopList