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

Форум: MS ACCESS

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

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

 
 

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

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

тема: раснос сроки по полям
 
 автор: час   (24.04.2008 в 18:54)   личное сообщение
 
 

имеется таблица,
в ней однотипные строки

00000004;2107030162703;Ванна;Ванна;1500.24;11.000;0;0;0;0;0;0;0;1;0;0;1;1;0;;;

необходимо перенести данные в другуютаблицу разнося по полям, согласно разделителям.
Создал функцию - всё нормально, но очень долго.
А запросом можно изловчиться или нет?

  Ответить  
 
 автор: Кабан   (24.04.2008 в 19:01)   личное сообщение
 
 

а обычным импортом текстового файла с разделителями, не?

  Ответить  
 
 автор: час   (24.04.2008 в 19:11)   личное сообщение
 
 

с разделитялями не выходит - первые две строки мешаются
##@@&& первая
# вторая

Портят всю картину

  Ответить  
 
 автор: час   (24.04.2008 в 19:14)   личное сообщение
 
 



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


Вот присоединяю текстовый файл.
Теперь надо разнести по полям в другую таблицу.

  Ответить  
 
 автор: час   (25.04.2008 в 09:57)   личное сообщение
 
 

Скажите возможно ли такое решение с помощью запроса???
И если да, натолкните на путь истиный...

  Ответить  
 
 автор: Анатолий (Киев)   (25.04.2008 в 10:33)   личное сообщение
 
 

ЧАС, это уже 4(5)-я ваша ветка на одну тему...
В самой первой вы написали "Построчно считывать текстовый файл оказывается долго.", объясните - почему долго? Здесь аж просится чтение файла средствами VBA, построчная обработка и добавление записи в Recordset.
У ADODB.Recordset есть замечательная штучка - BathUbdate, т.е. запись скопом всех добавленных записей в таблицу. К тому же можно читать файл не построчно, а целиком, с дальнейшим преобразованием в массив строк.

  Ответить  
 
 автор: час   (25.04.2008 в 10:35)   личное сообщение
 
 

вот как я перебрасываю


    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

  Ответить  
 
 автор: Анатолий (Киев)   (25.04.2008 в 12:31)   личное сообщение
 
 

Да, "не созданы мы для легких путей"...
Вы не ответили: "Построчно считывать текстовый файл оказывается долго.", объясните - почему долго? И чем быстрее присоединить его (с муками), и читать построчно (что в лоб, что по лбу...).

У вас Access97? Это я к тому, что функция Split заменила бы вам 20 строк кода дерибана текста.

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

И еще. А что, 1С не может выложить эту информацию в виде Excel файла? Тогда всё было бы проще. И линковать (конкретный диапазон), и перебрасывать данные.

  Ответить  
 
 автор: час   (25.04.2008 в 12:51)   личное сообщение
 
 

обработка такая поставляется , к ней и привязываемся.
А всё потому что MS Ofice подорожал.
Access в runtime работать будет, обмен текстовыми файлами. "(бесплатен)"

access 2002runtime  или 2007runtime 

  Ответить  
 
 автор: час   (25.04.2008 в 12:54)   личное сообщение
 
 

Вы не ответили: "Построчно считывать текстовый файл оказывается долго.", объясните - почему долго? И чем быстрее присоединить его (с муками), и читать построчно (что в лоб, что по лбу...).

Файл присоединяется один раз.И лежит табличка, в которой меняются данные в Link-TXT-файле
Потом только считывание данных и проверка на наличие и соответствие формата текстового файла.

  Ответить  
 
 автор: час   (25.04.2008 в 12:58)   личное сообщение
 
 

вот нашёл
Split(expression[, delimiter[, limit[, compare]]])
Split(выражение[, разделитель[, предел[, сравнение]]])

Всё по английски ни слова не знаю....
Попробую понять что этотакое.

  Ответить  
 
 автор: час   (25.04.2008 в 10:40)   личное сообщение
 
 

Теперь я файл не читаю, а прикрепляю его программно к базе и он в ней лежит как таблица.
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;;;



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

  Ответить  
 
 автор: Кабан   (25.04.2008 в 13:09)   личное сообщение
 
 

а почему 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

и не надо морочить бейцы
ни себе ни людям

  Ответить  
 
 автор: час   (25.04.2008 в 13:22)   личное сообщение
 
 

извините, а куда Вы дели первые две строки
первые две строки мешаются
##@@&& =первая строка
# = вторая строка

Портят всю картину

  Ответить  
 
 автор: Кабан   (25.04.2008 в 13:27)   личное сообщение
 
 

нихрена они не портят!
ну нате вам с двумя строками результат

Поле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


первые две строки можете потом запросом тупо удалить

  Ответить  
 
 автор: час   (25.04.2008 в 13:29)   личное сообщение
 
 




Спасибо!!! попробую щас....

  Ответить  
 
 автор: час   (25.04.2008 в 13:41)   личное сообщение
 
 

Извините, не знаю Вашего имени...
Ну Кабан- ты крут
Всё пашет за милую душу....
Держи краба к пиву.
Хотя чё то всё переносится с разделителями вместе , но уже кой чё.
аааааааааа FMT=Fixed ---- FMT=Delimited
==========================
Подскажите а поля сразу опереименовать нельзя?
Только Поле1...........Поле20
или есть выход?
А ладно запрсом на создание таблицы всё перенесу и тап в запросе напишу названия полей
поле1 As KOD

  Ответить  
 
 автор: Кабан   (25.04.2008 в 14:09)   личное сообщение
 
 

в созданной спецификации можно задать типы и названия полей. и сохранить эту спецификацию. и пользовать. на здоровье

з.ы. Силыч, я...

  Ответить  
 
 автор: Анатолий (Киев)   (25.04.2008 в 14:03)   личное сообщение
 
 

Пишете такую функцию в общем модуле:

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)

  Ответить  
 
 автор: час   (25.04.2008 в 14:09)   личное сообщение
 
 

Чудесно !!! понял, спасибо!!!


Чего только от Вас не узнаешь
===================================
Где взять слова, чтоб передать-
мои Вам восхищения,
Какие фразы написать
В моём стихотворении.

Скажу попроще: Огромное Всем СПАСИБО!!!!

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