Проблемы перехода с VBA на VB

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
Walther
Начинающий
Начинающий
 
Сообщения: 5
Зарегистрирован: 10.08.2005 (Ср) 21:18
Откуда: Брянск

Проблемы перехода с VBA на VB

Сообщение Walther » 10.08.2005 (Ср) 21:43

Ребята помогите доктору.
Работали раньше в Access, а теперь требования возросли и решили сделать проиложение на VB. Но застрял :shock: , може подмогнете, а мы вас за это небольно вылечим, чик и готово :)

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

Я здесь новичок, не знаю можно-ли задавать второй вопрос здесь же или отдельной темой? Почитал ваши правила - у вас тут строго. Но думаю, что если речь идет об одной программе, то можно. Если, что товарищи поправят :D

2. На форме есть контрол Data1 и текстбоксы, куда выводятся данные конкретного пациента (имя,возраст,пол и т.д.) из таблицы[PacientData], а также контрол Data2 и DBGrid1 (7 колонок), куда через SQLзапрос из связанной таблицы[PacientVisit] выводятся данные о визитах пациента(дата, диагноз, назначения и пр.). Данные для контроллов установлены не через свойства, а загружаются программно при загрузке формы.
Нужно сделать, чтобы столбец DateVisit с данными о датах визитов в DBGrid1 был не виден, а вместо этого даты визитов выводились в отдельный список List1 с одной колонкой.
Спрятать столбец DateVisit легко - делаем его Columns(1).Visible=False.
А вот как программно привязать List1 к столбцу DateVisit в DBGrid1, чтобы в List1 отображались все визиты, а DBGrid1 показывал только одну строку соответствующую выбранному в List1 визиту?
На другой форме похожая ситуация, но попроще - там сейчас DBGrid, но он там не нужен вообще, а вместо него нужен только List с одной колонкой с датами визитов. Как обойтись в этом случае вообще без DBGrid - т.е. можно ли загружать список визитов в List непосредственно - используя контрол Data2 и упоминавшийся SQLзапрос. Если не очень трудно покажите пожалуйста оба варианта.

Заранее признателен всем откликнувшимся.

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Re: Проблемы перехода с VBA на VB

Сообщение alibek » 11.08.2005 (Чт) 8:04

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


Допустим, так
Код: Выделить всё
Dim rs As ADODB.Recordset, FN As Integer, C As Long, L As String, res As String
Set rs = New ADODB.Recordset
Set rs.ActiveConnection = <cnn>
rs.Open "DiagnosValue"
FN = FreeFile()
Open "C:\Report.txt" For Output As #FN
For C = 0 To rs.Fields.Count - 1
  If C > 0 Then Print #FN, ";";
  Print #FN, rs.Fields(C).Name;
Next C
Print #FN,
Do Until rs.EOF
  For C = 0 To rs.Fields.Count - 1
    If C > 0 Then
      Print #FN, ";";
      res = res & Chr$(9)
    End If
    If rs.Fields(C).Type And adText = adText Then
      Print #FN, """" & rs.Fields(C).Value & """";
      res = res & """" & rs.Fields(C).Value & """"
    Else
      Print #FN, rs.Fields(C).Value;
      res = res & rs.Fields(C).Value
    End If
  Next C
  Print #FN,
  res = res & vbNewLine
  rs.MoveNext
Loop
Close #FN
rs.Close
Set rs = Nothing


Walther писал(а):А вот как программно привязать List1 к столбцу DateVisit в DBGrid1, чтобы в List1 отображались все визиты, а DBGrid1 показывал только одну строку соответствующую выбранному в List1 визиту?
На другой форме похожая ситуация, но попроще - там сейчас DBGrid, но он там не нужен вообще, а вместо него нужен только List с одной колонкой с датами визитов. Как обойтись в этом случае вообще без DBGrid - т.е. можно ли загружать список визитов в List непосредственно - используя контрол Data2 и упоминавшийся SQLзапрос.

Список надо будет загружать вручную. Примерно так:
Код: Выделить всё
Dim rs As ADODB.Recordset
Set rs = New ADODB.Recordset
Set rs.ActiveConnection = <cnn>
rs.Open "DiagnosValue"
List1.Clear
Do Until rs.EOF
  List1.AddItem rs.Fields("Name").Value
  List1.ItemData(List1.NewIndex) = rs.Fields("ID").Value
  rs.MoveNext
Loop
rs.Close
Set rs = Nothing


Затем, при выборе элемента списка, обновлять грид:
Код: Выделить всё
Private Sub List1_Click()
Dim ID As Long
If List1.ListIndex >= 0 Then ID = List1.ItemData(List1.ListIndex)
If ID = 0 Then
  Grid1.Filter = vbNullString
Else
  Grid1.Filter = "[ID] = " & Trim$(Str$(ID))
End If
Grid1.Requery
End Sub


Это примерный код, я его не проверял.
Lasciate ogni speranza, voi ch'entrate.

Andrev
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 108
Зарегистрирован: 19.01.2005 (Ср) 9:22
Откуда: Kursk

Сообщение Andrev » 11.08.2005 (Чт) 18:35

А можно и проще. Подцепляешь библиотеку для работы с акцессом, объявляешь переменную типа Access - и в ней есть все те же методы, что и в акцессе - разницы не почувствуешь.
В этой жизни нет ничего невозможного. Если у вас что-то не получается, значит, вы что-то делаете не так.

Walther
Начинающий
Начинающий
 
Сообщения: 5
Зарегистрирован: 10.08.2005 (Ср) 21:18
Откуда: Брянск

Сообщение Walther » 11.08.2005 (Чт) 22:12

alibek
Спасибо, буду пробовать, хотя по правде еще не работали с ADO

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

Спасибо. А как она обзывается.

Walther
Начинающий
Начинающий
 
Сообщения: 5
Зарегистрирован: 10.08.2005 (Ср) 21:18
Откуда: Брянск

Сообщение Walther » 12.08.2005 (Пт) 3:15

А можно, все таки сделать без ADO? :(
Я понимаю, сейчас это модно, круто, прогрессивно, наверное даже удобно и все такое, но...
во-первых надо все это осваивать, а это время, которого нет - и так вожусь только вечерами, а программа, как говорится, нужна была уже вчера - сроки сильно поджимают. :shock:
во-вторых, слишком много надо будет в другой части кода переделывать, и поиск и добавление-удаление записей, в коде есть много мест, откуда вызывается Data1,
в третьих нужно добавлять контрол Adodc1, а там уже есть два Data, получится уж очень коряво ну и т.д.
И так еще куча проблем с отчетами (они все были в Аксессе и Экселе, их тоже еще предстоит ваять в VB. Мне бы сейчас сделать, хоть "на нитку", чтобы работало, а уже потом, спокойно буду дальше работать над собой, изучу ADO и буду приводить все в божеский вид, и присланный вами сегодня код не пропадет, пойдет в дело, только чуть позже.
Так что, может все-таки подскажете, как сейчас "сделать это" по старинке, без ADO.

Итак по 1-му вопросу в принципе все понятно и с переменной, ну и вообще, мне бы только без ADO, и еще - если преположим использовать Аксесс библиотеку, то как насчет переменной, ее наверное параллельно не получить, видимо нужно будет всетаки дополнительно считывать получившийся текстовый файл через /Open For Input as #1/ - или я ошибаюсь?:

Насчет 2-го вопроса:
Чтобы облегчить вам задачу, приведу то место кода, где нужно добавить List1.
Напомню, в данном случае у нас участвуют две связанные таблицы:
[PacientData] - данные пациента (номер пациента, имя, возраст, пол и т.д.)
[PacientVisit] - ВСЕ визиты ВСЕХ пациентов(номер пациента, дата визита, диагноз, назначения и пр.)
таблицы связаны через номер пациента (PacNo)
На форме есть контрол Data1 и связанные с ним текстбоксы txtFields(7) - тут выводятся данные пациента,
Data1 связан с [PacientData],
также есть контрол Data2 и связанный с ним DBGrid1,
Data2 связан с Data1 через SQLзапрос (str1)
соответственно DBGrid1 показывает все визиты ТОЛЬКО ДАННОГО пациента
Это то, что мы имеем
Теперь, что нужно, уточню (может первый раз написал сумбурно и невнятно) насчет собственно вопроса:
Добавляю на форму List1.
Нужно - привязать его к столбцу DateVisit в DBGrid1, чтобы в List1 отображались даты визитов ТОЛЬКО ДАННОГО пациента, а DBGrid1 показывал только одну строку соответствующую выбранному в List1 визиту.
Существующий кусок кода:
Код: Выделить всё
Option Explicit
Dim DBName As String
Dim tblName As String

Private Sub Form_Load()
DBName = "REPORT.MDB"
tblName = "PacientData"
  With Data1
    .DatabaseName = App.Path + DBName
    .RecordsetType = vbRSTypeDynaset
    .RecordSource = tblName
    .Refresh
  End With
End Sub

Public Sub Data1_Reposition()
Dim str1 As String
'В txtFields(0) отображается PacNo,
  If txtFields(0).Text = Empty Then
     txtFields(0).Text = "0"
  End If
str1 = "SELECT * FROM PacientVisit WHERE PacNo=" & txtFields(0).Text
  With Data2
    .DatabaseName = App.Path + DBName
    .RecordsetType = vbRSTypeDynaset
    .RecordSource = str1
    .Refresh
  End With
DBGrid1.ReBind 'DBGrid1 привязан к Data2
End Sub

Спасибо

З.Ы. Только что надыбал кусок кода, который без ADO вроде решает 1-ю задачу, насчет экспорта в txtфайл, буду разбираться. А второй вопрос все-таки специфический, без вашей помощи не обойтись.

Walther
Начинающий
Начинающий
 
Сообщения: 5
Зарегистрирован: 10.08.2005 (Ср) 21:18
Откуда: Брянск

Сообщение Walther » 15.08.2005 (Пн) 14:10

Никто из великих так и не снисходит?
Наверное нужно вынести вопрос в отдельную тему


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 65

    TopList