Помогите решить задачку с двумя БД (+)

Работа VB и СУБД (Access, MSSQL, MySQL, Oracle и пр.)
Правила форума
При создании новой темы не забывайте указывать используемую СУБД.
Kundor
Новичок
Новичок
 
Сообщения: 37
Зарегистрирован: 22.11.2003 (Сб) 15:59
Откуда: Астрахань

Помогите решить задачку с двумя БД (+)

Сообщение Kundor » 01.08.2006 (Вт) 14:31

Имею такую ситуацию одна база содержит несколько полей, которые надо вывести в datagrid. Но - одно из этих полей содержит в себе индекс, по которому из другой базы можно узнать текст, который и надо тоже вывести в datagrid. Вопрос - как это сделать? Я попробовал так:
ConnectionString = "Data Source=" + Path + ";Extended Properties=DBASE IV"
NewConn.Open (ConnectionString)
With NewRST
.ActiveConnection = NewConn
.Properties("IRowsetIdentity") = True
.CursorLocation = adUseClient
.CursorType = adOpenStatic
.LockType = adLockBatchOptimistic
End With
ComText = "select *, ' ' as cnt_name from cv00001"
NewRST.Open ComText, NewConn, , , adCmdText

потом собираю рекордсет, который надо б прибиндить к datagrid:
NewRST.AddNew
NewRST!id_pay = PlatNumber.Text
NewRST!cnt_num = RST!cnt_num
NewRST!cnt_name = RST_cnt_name
вот здесь при выполнении уже ругань -
"Произошли ошибки во время многошаговой операции". Не хочет он в фиктивное поле cnt_name ничего писать. Как победить?

HandKot
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 283
Зарегистрирован: 28.06.2006 (Ср) 13:34
Откуда: Sergiev Posad

Сообщение HandKot » 01.08.2006 (Вт) 15:07

попробуйте так

Код: Выделить всё
rs.Open "SELECT b.Field1, a.* FROM [MyTable1] a, [MyTable2] b WHERE a.FieldKey = b.FieldKey", cn, adOpenKeyset, adLockBatchOptimistic


по крайней мере в ДатаГрид выводятся записи из двух таблиц сразу

Kundor
Новичок
Новичок
 
Сообщения: 37
Зарегистрирован: 22.11.2003 (Сб) 15:59
Откуда: Астрахань

Сообщение Kundor » 01.08.2006 (Вт) 15:20

Смысл понял.Но - дело в том что исходя из этого примера a.FieldKey само ищется по значению, введённому в Textbox.text. Как это отобразить в запросе?

HandKot
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 283
Зарегистрирован: 28.06.2006 (Ср) 13:34
Откуда: Sergiev Posad

Сообщение HandKot » 02.08.2006 (Ср) 9:22

Kundor писал(а):Смысл понял.Но - дело в том что исходя из этого примера a.FieldKey само ищется по значению, введённому в Textbox.text. Как это отобразить в запросе?


и если я правильно понял, то получиться так
Код: Выделить всё
Dim strSQL As String

strSQL = "SELECT b.Field1, a.* FROM [MyTable1] a, [MyTable2] b WHERE a.FieldKey = b.FieldKey AND a.FieldKey = "  & CStr(Textbox.text)
rs.Open strSQL, cn, adOpenKeyset, adLockBatchOptimistic

Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

Сообщение Antonariy » 02.08.2006 (Ср) 9:55

А я вот ни черта не понял.
"Произошли ошибки во время многошаговой операции".
можно победить создав таблицу с двумя полями ID int и Name varchar без записей и сделав запрос
select cv00001.*, faketbl.Name as cnt_name from cv00001 left join faketbl on faketbl.id = cv00001.id_pay
но смысл дальнейшего диалога ускользнул. HandKot, начнем с того, что таблица с расшифровкой индекса (может все таки ключа?) находится в другой базе, а не таблице. Kundor, или таки в таблице?
Лучший способ понять что-то самому — объяснить это другому.

Kundor
Новичок
Новичок
 
Сообщения: 37
Зарегистрирован: 22.11.2003 (Сб) 15:59
Откуда: Астрахань

Сообщение Kundor » 02.08.2006 (Ср) 10:39

извиняюсь, что сумбурно объяснил
сейчас вот дошел умишком до следующего:
сделал запрос
"Select cnt.cnt_num, cnt.cnt_name, cv00001.cnt_val, cv00001.cnt_val_be from cnt,cv00001 where cnt.ls_num=" & LIC
в таблице cnt есть одна запись, удовлетворяющая условию where. таблица cv00001 вообще пустая - мне туда нужно будет перенести некоторые пля из грида, к которому как раз и будет прицеплен этот рекордсет, эту таблицу я цепляю к запросу что б тот показал поля, которые надо будет заполнить значениями (cv00001.cnt_val, cv00001.cnt_val_be). Но - в результате выполнения этого запроса получаю нулевой рекордсет. Где я ошибся?

Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

Сообщение Antonariy » 02.08.2006 (Ср) 11:29

В подходе. В присоединенную таблицу нельзя записать значения, если выборка без ключевых полей и в ней нет связанных записей. А рекордсет всегда будет пустым, потому что cv00001 пуста. Так ли необходимо вносить значение ручками в грид? Может лучше сделать запрос "insert into cv00001 (cnt_val, cnt_val_be) select что-то-там from cnt where cnt.ls_num=" & LIC :?:
Лучший способ понять что-то самому — объяснить это другому.

Kundor
Новичок
Новичок
 
Сообщения: 37
Зарегистрирован: 22.11.2003 (Сб) 15:59
Откуда: Астрахань

Сообщение Kundor » 02.08.2006 (Ср) 11:40

не, именно ручками - юзер с бумажки должен ввести cnt_val, cnt_val_be
:(

Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

Сообщение Antonariy » 02.08.2006 (Ср) 11:59

Тогда я не понял причем тут таблица cnt. Где связь между cnt и cv00001? Поробуй описать бизнес-процесс, который реализовываешь.
Лучший способ понять что-то самому — объяснить это другому.

Kundor
Новичок
Новичок
 
Сообщения: 37
Зарегистрирован: 22.11.2003 (Сб) 15:59
Откуда: Астрахань

Сообщение Kundor » 02.08.2006 (Ср) 12:40

пишу прогу по коммунальным платежам (срочно надо). надо на выход отдать базу cv00001, где будут записи: cnt_num (номер счётчика), cnt_val и cnt_val_beg (нач и кон значение счётчика). юзер должен иметь возможность значения счётчика поправить. но если просто дать ему в грид эти поля, то по номеру счётчика он не поймёт, что это (там будет цифра к примеру 01). Но! Есть база cnt, где по лицевому номеру клиента ls_num можно определить как минимум одну запись, где кроме cnt_num будет и cnt_name - (там к примеру при cnt_num=01 будет cnt_name=Электричество). Надо именно текст дать в грид юзеру - но только для удобства заполнения - в cv00001 надо записать не текст, а номер счётчика. Вот такая задача....
Задолбался я уже с её реализацией :?

Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

Сообщение Antonariy » 02.08.2006 (Ср) 13:06

Пфф... Я-то думал... Почему бы в дополнение к номеру счетчика не выдать поле cnt_name? Заодно посмотри сюда, по-моему это должно помочь.

Опять же неясность... cnt_num - номер счетчика, типа идентификатор прибора, считающего электричество, а cnt_name - вроде как назначение платежа, там за электричество, за воду... или как? Почему название "Электричество" соответствует номеру счетчика? Счетчик 01 называется "Электричество"?
Лучший способ понять что-то самому — объяснить это другому.

Kundor
Новичок
Новичок
 
Сообщения: 37
Зарегистрирован: 22.11.2003 (Сб) 15:59
Откуда: Астрахань

Сообщение Kundor » 02.08.2006 (Ср) 13:35

спасибо за код, сейчас попробую его :)
отдавать с полем cnt_name нельзя - таков регламент.
можно его конечно из dbf наверно стереть программно :)... как-то...
но всё равно - ещё не знаю как и его туда засунуть
да, в cnt 01 соответствует электричество, ессно другим кодам - другие счётчики.

Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

Сообщение Antonariy » 02.08.2006 (Ср) 14:07

Блин, все равно муть какая-то.
Попробую с другой стороны.
1. Что есть "счетчик"? Прибор, считающий электричество? Поле типа "Счетчик" (identity) как в аксессе? Что значит "другие счётчики"?
2. Что значит 01? Серийный номер прибора? Произвольный идентификатор? Какого типа поле cnt_num? Ключевое ли оно?
3. Что означает поле cnt_name? Какие еще есть варианты кроме "Электричество"?
4. Пример данных из таблицы или скриншот того, как это должно выглядеть.
Лучший способ понять что-то самому — объяснить это другому.

Kundor
Новичок
Новичок
 
Сообщения: 37
Зарегистрирован: 22.11.2003 (Сб) 15:59
Откуда: Астрахань

Сообщение Kundor » 02.08.2006 (Ср) 14:33

фиговый из меня объяснител :oops:
1. счётчик - это просто прибор, учитывающий эл-во, газ, вод или ещё что;
2. 01 - значение в cnt_num в таблице cnt. Там есть записи к примеру
ls_num | cnt_num | cnt_name
101000776 | 01 |Электроэнергия
101000776 | 02 | Вада

по ls_num я эту запись нахожу (их может быть несколько, т.к. у одного чела может быть несколько счётчиков). затем в cv00001 надо внести cnt_num, но так как пользователь, который бедт набивать в гриде значения счётчиков cnt_val не поймёт что за 01 - надо его название cnt_name из cnt и вытащить, по полю cnt_num.
3. конечно есть учела может быть несколько записей, на счётчик 02, 03 и т.д - на воду, газ.
4. пример cnt привел выше. желаемый cv00001 должен выглядеть так:

cnt_num | cnt_val | cnt_va_beg
01 | 500 | 100
те есть номер и значения на счётчике.

Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

Сообщение Antonariy » 02.08.2006 (Ср) 15:30

Начинаю понимать. cnt_num типа аббревиатура от cnt_name, для краткости. Но почему оба в одной таблице? А вдруг возникнет ситуация, когда cnt_num=01, а cnt_name="газ"? Однако, к делу.

Берешь контрол, который я показал.
Первым делом добавляешь в cv00001 данные, чтобы было что редактировать в гриде запросом
Код: Выделить всё
insert into cv00001 (
    cnt_num,
    cnt_val,
    cnt_val_be)
select
    cnt_num,
    0,
    0 --кстати, откуда берутся значения, которые потом надо редактировать?
from cnt where cnt.ls_num=" & LIC

Далее моему контролу в качестве DataSource присваиваешь select * from cv00001, потом делаешь выборку в рекордсет select distinct cnt_num, cnt_name from cnt, и в конце
Код: Выделить всё
DataGridTranslated1.AddColTranslation "cnt_num", rsDistinct, "cnt_num", "cnt_name"
Лучший способ понять что-то самому — объяснить это другому.

Kundor
Новичок
Новичок
 
Сообщения: 37
Зарегистрирован: 22.11.2003 (Сб) 15:59
Откуда: Астрахань

Сообщение Kundor » 02.08.2006 (Ср) 15:32

спасибо агроменное ! :D
уже пишу


Вернуться в Базы данных

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

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

    TopList