|
|
|
| имеется таблица,
в ней однотипные строки
00000004;2107030162703;Ванна;Ванна;1500.24;11.000;0;0;0;0;0;0;0;1;0;0;1;1;0;;;
|
необходимо перенести данные в другуютаблицу разнося по полям, согласно разделителям.
Создал функцию - всё нормально, но очень долго.
А запросом можно изловчиться или нет? | |
|
| |
|
|
|
| а обычным импортом текстового файла с разделителями, не? | |
|
| |
|
|
|
| с разделитялями не выходит - первые две строки мешаются
##@@&& первая
# вторая
Портят всю картину | |
|
| |
|
|
|
|
Private Function Подключиь_Файл(strPuti As String, strFile As String, strTbl As String)
Dim t As TableDef
On Error GoTo Подключиь_Файл_Error
If Nalichie_Tablici(strTbl) = True Then DoCmd.DeleteObject acTable, strTbl
Set t = CurrentDb.CreateTableDef(strTbl)
t.Connect = "Text;DSN=" & "Goods;" & "FMT=Fixed;HDR=NO;IMEX=2;CharacterSet=1251;DATABASE=" & strPuti & ";TABLE=" & strFile
t.SourceTableName = Me!Файл_загрузки '"ИмяФайла"
CurrentDb.TableDefs.Append t
|
Вот присоединяю текстовый файл.
Теперь надо разнести по полям в другую таблицу. | |
|
| |
|
|
|
| Скажите возможно ли такое решение с помощью запроса???
И если да, натолкните на путь истиный... | |
|
| |
|
|
|
| ЧАС, это уже 4(5)-я ваша ветка на одну тему...
В самой первой вы написали "Построчно считывать текстовый файл оказывается долго.", объясните - почему долго? Здесь аж просится чтение файла средствами VBA, построчная обработка и добавление записи в Recordset.
У ADODB.Recordset есть замечательная штучка - BathUbdate, т.е. запись скопом всех добавленных записей в таблицу. К тому же можно читать файл не построчно, а целиком, с дальнейшим преобразованием в массив строк. | |
|
| |
|
|
|
| вот как я перебрасываю
Function Переброс_товара() As Boolean ' переброс из "ИЗ_1С" в "Товар"
On Error GoTo Переброс_товара_Error
Переброс_товара = True
ClearTable ("Товар") ' Очистка таблицы товар
Dim strIN As String
Dim strText As String
Dim txtKod As String '// 1 - код товара
Dim txtHK As String '// 2 - штрихкод товара
Dim txtNAME As String '// 3 - наименование
Dim txtNAMEKKM As String '// 4 - наименование для кассы
Dim txtCENA As String '// 5 - цена
Dim txtKol_Vo As String '// 6 - количество
Dim Строки As Long
Dim F As Integer
Dim i As Integer
Dim rs1 As DAO.Recordset
Dim rs As DAO.Recordset
Set rs = CurrentDb.OpenRecordset("ИЗ_1С", dbOpenDynaset)
Set rs1 = CurrentDb.OpenRecordset("Товар", dbOpenDynaset)
If rs.EOF = False Then rs.MoveFirst
If rs1.EOF = False Then rs1.MoveFirst
Строки = 1
With rs
Do Until rs.EOF
If rs!поле1 = "##@@&&" Then GoTo dalee
If rs!поле1 = "#" Then GoTo dalee
If IsLoaded("Обмен") = True Then
Forms![Обмен]!Строк.SetFocus
Forms![Обмен]!Строк = Строки
Forms![Обмен].Recalc
Строки = Строки + 1
End If
strText = rs!поле1
i = 0
For F = 1 To 2
If i = 0 Then
i = InStr(1, strText, Chr(59)) 'Ищем первый ; в строке
txtKod = Mid(strText, 1, i - 1)
Else
strText = Mid(strText, i + 1) 'Убираем обработанное начало строки + 1 симв.
i = InStr(1, strText, Chr(59)) 'Ищем следующий ;
txtHK = Mid(strText, 1, i - 1) ' находим штрихкод
strText = Mid(strText, i + 1) 'Убираем обработанное начало строки + 1 симв.
i = InStr(1, strText, Chr(59)) 'Ищем следующий ;
txtNAME = Mid(strText, 1, i - 1) ' находим наименование
strText = Mid(strText, i + 1) 'Убираем обработанное начало строки + 1 симв.
i = InStr(1, strText, Chr(59)) 'Ищем следующий ;
txtNAMEKKM = Mid(strText, 1, i - 1) ' находим наименование для ккм
strText = Mid(strText, i + 1) 'Убираем обработанное начало строки + 1 симв.
i = InStr(1, strText, Chr(59)) 'Ищем следующий ;
txtCENA = Mid(strText, 1, i - 1) ' находим цена
strText = Mid(strText, i + 1) 'Убираем обработанное начало строки + 1 симв.
i = InStr(1, strText, Chr(59)) 'Ищем следующий ;
txtKol_Vo = Mid(strText, 1, i - 1) ' находим Количество
rs1.AddNew
rs1!Код_1С = txtKod
rs1!Штрихкод = txtHK
rs1!Наименование = txtNAME
rs1!Наименование_ККМ = txtNAMEKKM
rs1!Количество = Val(txtKol_Vo)
rs1!Цена = CCur(Val(txtCENA))
rs1.Update
'End If
'Exit For
End If
Next F
dalee:
.MoveNext
Loop
.Close
End With
Vihod:
rs1.Close
Set rs = Nothing
Set rs1 = Nothing
On Error GoTo 0
Exit Function
Переброс_товара_Error:
If Err.Number = "3022" Then
Call MsgBox("В загружаемом файе встреилось не уникальные значения штрихкода: " & txtHK _
& vbCrLf & "Загрузка товаров произведена не полностью." _
, vbCritical, "Предупреждение")
End If
Переброс_товара = False
Call Zapis_ERR("Module_Rasklad" & " процедура -> " & "Переброс_товара", Err.Number, Err.Description)
Err.Clear
End Function
|
| |
|
| |
|
|
|
| Да, "не созданы мы для легких путей"...
Вы не ответили: "Построчно считывать текстовый файл оказывается долго.", объясните - почему долго? И чем быстрее присоединить его (с муками), и читать построчно (что в лоб, что по лбу...).
У вас Access97? Это я к тому, что функция Split заменила бы вам 20 строк кода дерибана текста.
Можно все это выполнить и запросом на добавление, если написать и использовать в нем функцию, получающую строку и номер фрагмента и возврашающую этот фрагмент в качестве значения для каждого поля.
И еще. А что, 1С не может выложить эту информацию в виде Excel файла? Тогда всё было бы проще. И линковать (конкретный диапазон), и перебрасывать данные. | |
|
| |
|
|
|
| обработка такая поставляется , к ней и привязываемся.
А всё потому что MS Ofice подорожал.
Access в runtime работать будет, обмен текстовыми файлами. "(бесплатен)"
access 2002runtime или 2007runtime
|
| |
|
| |
|
|
|
| Вы не ответили: "Построчно считывать текстовый файл оказывается долго.", объясните - почему долго? И чем быстрее присоединить его (с муками), и читать построчно (что в лоб, что по лбу...).
Файл присоединяется один раз.И лежит табличка, в которой меняются данные в Link-TXT-файле
Потом только считывание данных и проверка на наличие и соответствие формата текстового файла. | |
|
| |
|
|
|
| вот нашёл
Split(expression[, delimiter[, limit[, compare]]])
Split(выражение[, разделитель[, предел[, сравнение]]])
Всё по английски ни слова не знаю....
Попробую понять что этотакое. | |
|
| |
|
|
|
| Теперь я файл не читаю, а прикрепляю его программно к базе и он в ней лежит как таблица.
Private Function Подключиь_Файл(strPuti As String, strFile As String, strTbl As String)
Dim t As TableDef
On Error GoTo Подключиь_Файл_Error
If Nalichie_Tablici(strTbl) = True Then DoCmd.DeleteObject acTable, strTbl
Set t = CurrentDb.CreateTableDef(strTbl)
t.Connect = "Text;DSN=" & "Goods;" & "FMT=Fixed;HDR=NO;IMEX=2;CharacterSet=1251;DATABASE=" & strPuti & ";TABLE=" & strFile
t.SourceTableName = Me!Файл_загрузки '"ИмяФайла"
CurrentDb.TableDefs.Append t
|
таблица выглядит вот так:
(кстати сам файл тоже такой структуры)
##@@&&
#
00000004;2107030162703;Ванна;Ванна;1500.24;11.000;0;0;0;0;0;0;0;1;0;0;1;1;0;;;
00000001;2107030162710;Гвозди;Гвозди;18.43;132.000;0;0;0;0;0;0;0;1;0;0;1;1;0;;;
00000004;2107030162704;Вантуз;Вантуз;1500.24;11.000;0;0;0;0;0;0;0;1;0;0;1;1;0;;;
00000001;2107030162715;Шуруп;Шуруп;18.43;132.000;0;0;0;0;0;0;0;1;0;0;1;1;0;;;
|
Теперь из этой таблицы надо перебросить все данные разнося по полям в основную-рабочую таблицу Товар. (см. код выше)
перенести, разнося по полям, так как строки с разделителем не очень удобны. | |
|
| |
|
|
|
| а почему FMT=Fixed?!?!?!
почему бы вам хелп не прочитать? :) чем сразу влоб начинать что-либо писать ;)
создайте спецификацию для подключения импорта файла и сохраните её
я вот создал с именем "МояCпецификацияСвязи" с разделителями в виде ";"
и воспользовался этим кодом:
Sub mcrLinkTxtFile()
Set db = CurrentDb
strDir = "C:\temp\"
strTemp = Dir(strDir & "yyy.txt")
strFileName = strTemp
strTblName = "ФайлКакТаблица"
Set tdfLink = CurrentDb.CreateTableDef(strTblName)
tdfLink.SourceTableName = strFileName
tdfLink.Connect= "Text;DSN=МояCпецификацияСвязи;FMT=Delimited;HDR=NO;IMEX=2;CharacterSet=1251;DATABASE=" & strDir
CurrentDb.TableDefs.Append tdfLink
End Sub
|
и все! подключилась таблица с полями нужными.
Поле1 Поле2 Поле3 Поле4 Поле5 Поле6
00000004 2107030162703 Ванна Ванна 1500.24 11.000
00000001 2107030162710 Гвозди Гвозди 18.43 132.000
00000004 2107030162704 Вантуз Вантуз 1500.24 11.000
00000001 2107030162715 Шуруп Шуруп 18.43 132.000
|
и не надо морочить бейцы
ни себе ни людям | |
|
| |
|
|
|
| извините, а куда Вы дели первые две строки
первые две строки мешаются
##@@&& =первая строка
# = вторая строка
Портят всю картину | |
|
| |
|
|
|
| нихрена они не портят!
ну нате вам с двумя строками результат
Поле1 Поле2 Поле3 Поле4 Поле5 Поле6 Поле7 Поле8 Поле9
##@@&&
#
00000004 2107030162703 Ванна Ванна 1500.24 11.000 0 0 0
00000001 2107030162710 Гвозди Гвозди 18.43 132.000 0 0 0
00000004 2107030162704 Вантуз Вантуз 1500.24 11.000 0 0 0
00000001 2107030162715 Шуруп Шуруп 18.43 132.000 0 0 0
|
первые две строки можете потом запросом тупо удалить | |
|
| |
|
|
|
|
| Извините, не знаю Вашего имени...
Ну Кабан- ты крут
Всё пашет за милую душу....
Держи краба к пиву.
Хотя чё то всё переносится с разделителями вместе , но уже кой чё.
аааааааааа FMT=Fixed ---- FMT=Delimited
==========================
Подскажите а поля сразу опереименовать нельзя?
Только Поле1...........Поле20
или есть выход?
А ладно запрсом на создание таблицы всё перенесу и тап в запросе напишу названия полей
поле1 As KOD | |
|
| |
|
|
|
| в созданной спецификации можно задать типы и названия полей. и сохранить эту спецификацию. и пользовать. на здоровье
з.ы. Силыч, я... | |
|
| |
|
|
|
| Пишете такую функцию в общем модуле:
Function GetPartDelimText(Text, PartNum%, Optional SimbolDelim$ = ";") As Variant
Dim Part
On Error Resume Next
If Len(Nz(Text, "")) = 0 Or Len(SimbolDelim) = 0 Or PartNum <= 0 Then Exit Function
Part = Split(Text, SimbolDelim, PartNum + 1)
Part = Part(PartNum - 1)
If Err.Number <> 0 Then Err.Clear: Exit Function
If Len(Part) = 0 Then Part = Null
GetPartDelimText = Part
End Function
|
В конструкторе запроса на добавление в строке "Добавление" для каждого поля указываете эту функцию. Например для поля "Штрихкод" (вторая часть текста в поле "поле1"):
=GetPartDelimText([поле1]; 2) | |
|
| |
|
|
|
| Чудесно !!! понял, спасибо!!!
Чего только от Вас не узнаешь
===================================
Где взять слова, чтоб передать-
мои Вам восхищения,
Какие фразы написать
В моём стихотворении.
Скажу попроще: Огромное Всем СПАСИБО!!!! | |
|
| |