Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - Работа с данными

Страница: 1 |

 

  Вопрос: Проблемы перехода с VBA на VB Добавлено: 17.08.05 02:18  

Автор вопроса:  Walther
Снова настырный доктор :)
Работали раньше в Access, а теперь требования возросли и решили сделать приложение на VB. Но застрял на экспорте таблицы в txt файл.

1. Имеется база данных по визитам пациентов-[Report.mdb]. Как в VB6 сделать экспорт одной из таблиц-[DiagnosValue] (5 столбцов, 20-50 строк) в текстовый файл.
В VBA-Access это делается легко через DoCmd.TransferText (например DoCmd.TransferText acExportDelim, "", "DiagnosValue", "С:\Report.txt", -1, "", 1251).
Но в VB6 DoCmd не работает.
Как это можно сделать из VB6, чтобы результат был такой-же, как в VBA-Access т.е. - экспорт в txtфайл с разделителями/;/, ограничитель текста/"/, имена полей в первой строке, кириллица-1251?

2. А также, можно ли перед экспортом записать данные из этой таблицы[DiagnosValue] в строковую переменную, как обычный текст для дальнейшей работы с ним, разделяя строки с помощью например Chr(9), т.е. чтобы можно было например отобразить в текстбоксе в том-же виде, как это будет в Report.txt или потом отдельно нужно будет считывать из Report.txt через /Open For Input as #1/ и загружать в текстбокс.

Ответить

  Ответы Всего ответов: 9  

Номер ответа: 1
Автор ответа:
 Walther



Вопросов: 2
Ответов: 12
 Профиль | | #1 Добавлено: 17.08.05 02:22
Главное забыл написать!
Можно-ли решить задачу без ADO?

Ответить

Номер ответа: 2
Автор ответа:
 sne



Разработчик Offline Client

ICQ: 233286456 

Вопросов: 34
Ответов: 5445
 Web-сайт: hw.t-k.ru
 Профиль | | #2
Добавлено: 17.08.05 03:32
Без АДО можно, но при помощи ДАО :) Думаю хрен редьки не слаще, но все равно привожу примерный код на ДАО...

    On Error GoTo err

    Dim i  As Long
    Dim st As String
    Dim RS As Recordset
    Set RS = DB.OpenRecordset(";DiagnosValue";)

    If Not (RS.EOF) Then Call RS.MoveFirst

    Do Until (RS.EOF)
        For i = 0 to 4
            st = st & RS.Fields(i).Value & IIf(i = 4, vbnullstring, vbTab)
        Next

        st = st & vbCrLf

        Call RS.MoveFirst
    Loop

    Dim nf as Integer
    Dim s2file as string

    s2file = Replace(st, vbTab, ";";)
    nf = FreeFile()

    Open "c:\1.txt" For Binary Access Write As nf
        Put nf, , s2file
    Close nf

    s2file = vbnullstring

    ' Работаем с st переменной... все разделяется через Chr(9)...

Ответить

Номер ответа: 3
Автор ответа:
 Walther



Вопросов: 2
Ответов: 12
 Профиль | | #3 Добавлено: 18.08.05 02:14
Спасибо уважаемый sne, но...
1. ПРи попытке запустить код в виде отдельной процедуры - ругается Type mismatch на Set rs=Db.OpenRecordset(";DiagnosValue";) - хотя и базу я открываю через Set Db=OpenDatabase(DBName).

2. Попробовал вынести процедуру в отдельный проект (форма с одной кнопкой), при попытке запустить вообще VB вешается глухо.
Ничего не пойму, какого ему надо?
Это VB глючит или что?

Ответить

Номер ответа: 4
Автор ответа:
 AndreyMp



ICQ: 237822510 

Вопросов: 28
Ответов: 1182
 Профиль | | #4 Добавлено: 19.08.05 12:01
Главное забыл написать!
Можно-ли решить задачу без ADO?

Чем же Вам так ADO не угодил.
sne Вам дал
примерный код

В нем есть маленький баг. Цикл бесконечный. RS.EOF никогда не будет поскольку в цикле стоит RS.MoveFirst, а надо RS.MoveNext

Ответить

Номер ответа: 5
Автор ответа:
 Walther



Вопросов: 2
Ответов: 12
 Профиль | | #5 Добавлено: 20.08.05 00:27
Спасибо уважаемый АНДРЕЙ, после подсказки все отлично заработало.
А по поводу ADO - не неугодил, а просто слишком много надо будет в другой части кода переделывать, и поиск и добавление-удаление записей, в коде есть много мест, откуда вызывается Data1, и потом нужно добавлять контрол Adodc1, а там уже есть два Data, получится уж очень коряво ну и т.д.
Короче переделывать все на ADO - слишком много времени, и так бодаюсь с VB после работы уставший поздно вечером, поневоле тупить будешь.
А тут еще сегодня пациент учудил. Я говорит маг, адепт, в медицину не верю - сам буду себя лечить заклинаниями и начал шаманить прямо в палате. Верьте - не верьте, а комп кардиографа вешается наглухо, еще один прибор зашкаливает и он перестает реагировать на датчики. Красота - сигналы сигналят, лампочки мигают, магу настает карачун - насилу откачали.
Лежит сейчас в реанимации, руки пристегнули, чтобы как придет в себя снова камлать не начал. Врачи с других отделений сбежались - офонарели все, то ли трястись от страха, что магия так на технику влияет, то ли хохотать, что этот блин адепт, чуть себя случайно не укокошил. Ему выписываться было на днях, сейчас проваляется еще недели две. Нарочно не придумаешь.

Ответить

Номер ответа: 6
Автор ответа:
 Walther



Вопросов: 2
Ответов: 12
 Профиль | | #6 Добавлено: 20.08.05 02:05
....!!! ......!!! ..........!!!
Поторопился радоваться. Заработало, когда я поправил код в процедуре вынесенной в тестовый отдельный проект (форма с одной кнопкой). А когда вставляешь отдельным модулем в основной проект снова начинает ругаться на Set RS = DB.OpenRecordset(";DiagnosValue";).
Пишет Type mismatch - несоответствие типов. Ничего не пойму.
То ли туплю уже, то ли маг очухался, снова камлает.

Да и еще, первый раз на радостях не обратил внимания.
Код не пишет заголовки столбцов, и не заключает текст в кавычки.
Т.е. в В VBA-Access через DoCmd.TransferText acExportDelim, "", ";DiagnosValue", "С:\1.txt", -1, "", 1251 получается примерно так:
"NAME";"LVALUE";"LDELTA";"RVALUE";"RDELTA"
"Ли 1";0,00;0,00;45,00;1,00
"Ли 2";0,00;0,00;56,00;0,00
"Ле 10b";32,00;8,00;31,00;4,00
"Ле 11";55,00;0,00;54,00;0,00
"Тл 1b";28,00;7,00;46,00;3,00
"Нд 1a";0,00;0,00;50,00;1,00
"Нд 2";0,00;0,00;60,00;9,00
"Кр 8b";49,00;3,00;0,00;0,00
ну и т.д. (это показания прибора)

а здесь получилось так:
Ли 1;0;0;45;1
Ли 2;0;0;56;0
Ле 10b;32;8;31;4
Ле 11;55;0;54;0
Тл 1b;28;7;46;3
Нд 1a;0;0;50;1
Нд 2;0;0;60;9
Кр 8b;49;3;0;0

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

И самое главное, что это за ошибка13 Type mismatch, почему код работает отдельно и не хочет в основном проекте?

Ответить

Номер ответа: 7
Автор ответа:
 AndreyMp



ICQ: 237822510 

Вопросов: 28
Ответов: 1182
 Профиль | | #7 Добавлено: 22.08.05 18:02
Возможно надо явно прописать
Dim RS As DAO.Recordset

И посмотрите в References, может забыли DAO подключить? Я обычно цеплял Microsoft DAO 2.5/3.51 ...

Ответить

Номер ответа: 8
Автор ответа:
 AndreyMp



ICQ: 237822510 

Вопросов: 28
Ответов: 1182
 Профиль | | #8 Добавлено: 22.08.05 18:10
Кавычки ставятся примерно так (точно не помню)
st = st & chr(34) & RS.Fields(i).Value & chr(34)  IIf(i = 4, vbnullstring, vbTab)

но можно и апостров поставить вместо chr(34)-"'".
С именами полей тоже както просто - попробуй RS.Fields(i).Name, только в отдельном цикле.

Ответить

Номер ответа: 9
Автор ответа:
 Walther



Вопросов: 2
Ответов: 12
 Профиль | | #9 Добавлено: 23.08.05 01:39
О.К.
Спасибо SNE, что помогли.
Спасибо АНДРЕЙ, после подсказки все отлично заработало, все стало писаться (ударение на а) :), как надо.

З.Ы. Может еще раз вернетесь в "Как связать List с определенной колонкой в DBGrid", подмогнете и там? :)

Ответить

Страница: 1 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам