Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Центр помощи > [Builder C++] Базы данных, ADO-технология


Автор: Varyen 20.12.2009, 19:09
Всем здравствуйте! smile 
В-общем задание такое, составить программу на Билдер С++ которая будет работать с 4-мя таблицами (Приходный кассовый ордер, Информация о плательщиках, Информация о предприятиях, Бухгалтерские счета). Использовать необходимо dBase, желательно по ADO-технологии. При построении соединения через ADOConnection выбираю Microsoft OLE DB Provider for ODBC Drivers как поставщика, далее когда делаю connection string выбираю Microsoft dBase Driver, кажется так называется.
  И тут вот проблема возникла (причем боюсь возникнет ещё немеряно, при необходимости в этой же теме буду спрашивать совета) - 
Код

ADOTable1->Delete();

Не работает корректно - строка удаляется, но при повторном запуске программы все становится как было до удаления! Открывал таблицу через Database Desktop - строки удалены, но! В режиме редактирования в Десктопе порядковый номер строки ставится неправильно - если вся таблица пуста, он может например поставить №11, в зависимости от того сколько строк было до удаления в программном режиме. Помогает только Empty. 

Ещё одна проблема - при запуске проекта вылетает несколько ошибок с указанием на 
Код

Form3->ADOTable1->First();

Код

Form3->ADOTable12->First();


сама ошибка собственно: Could not convert variant of type (Null) into type (String).

с чем может быть связано? в таблице есть пустые ячейки, но это так и должно быть, что можно сделать чтобы ошибок этих не было?

Очень прошу помочь, сроки сильно поджимают. Заранее благодарен за любую помощь.


Автор: Данкинг 20.12.2009, 21:25
Таким образом ты из .dbf строку не удалишь. Как именно удалять - не знаю, но .Delete просто помечает строку на удаление.

Цитата(Varyen @  20.12.2009,  19:09 Найти цитируемый пост)
сама ошибка собственно: Could not convert variant of type (Null) into type (String).

Может быть, таблица не открыта или пустая?

Автор: Varyen 20.12.2009, 21:38
Спасибо за подсказку, только вот узнать бы у кого-нить как всетаки удалять... 
Открыта имеете ввиду ADOTable->Active = true? это имеется... Но есть пустые ячейки. При запуске ехе-шника этих ошибок нет.

Автор: Данкинг 20.12.2009, 22:05
Цитата(Varyen @  20.12.2009,  21:38 Найти цитируемый пост)
Спасибо за подсказку, только вот узнать бы у кого-нить как всетаки удалять... 

Есть компонент TDbf, но, насколько я знаю, на Билдер он встаёт криво, если вообще встаёт (т.е. он для Дельфи предназначен). У меня на Билдере в BDS 2006 он глючит, т.е. работать невозможно.

Цитата(Varyen @  20.12.2009,  21:38 Найти цитируемый пост)
Но есть пустые ячейки.

Просто ->First не может выдавать подобной ошибки. Это же просто переход в начало.

Автор: Varyen 20.12.2009, 22:16
Просто дело в том, что из-за этой неполадки с удалением сплошные ошибки идут в ходе редактирования строк, добавления новых...
Но спасибо и на этом smile Буду очень благодарен если кто-нибудь ещё сможет помочь.

Автор: Varyen 23.12.2009, 23:23
Так и не нашел пока нигде как же в Билдере удалить строку из dBase.... Очень надеюсь что тут кто-нибудь знает smile
И по поводу ошибки этой, если у кого было отпишите пожалуйста, как можно избавиться.

Автор: djamshud 23.12.2009, 23:32
Когда-то в пыхе использовал DBase. Там после удаления записи нужно было делать что-то вроде sync'а, т.е. синхронизировать текущее программное представление таблицы с файлом. Тут вероятно то же самое. Посмотрите по списку API этой БД что-нибудь похожее.

Автор: Varyen 25.12.2009, 17:48
Перевел все под BDE, стало лучше smile 

только теперь вот с чем проблема, в ADOQuery сделал запрос

Код


SELECT IncCashOrder.PKO_NUMBER AS НомерПКО, IncCashOrder.DATE AS Дата, IncCashOrder.ACCOUNT AS Счёт, IncCashOrder.SUBACCOUNT AS Субсчёт, IIf(IsNull([INN]),[PAYER_NAME],[COMP_NAME]) AS Плательщик,  IncCashOrder.SUM AS Сумма
FROM Payer INNER JOIN IncCashOrder ON Payer.PAYER_CODE = IncCashOrder.PAYER_CODE;



в простом Query жалуется на все что не лень, даже букву "ч" воспринимать не хочет... 
Код

IIf(IsNull([INN]),[PAYER_NAME],[COMP_NAME]) AS Плательщик


и вот на эту самую важну строчку в запросе жалуется... может кто подсказать, что не так?)

смысл в том, что есть таблица по приходно-кассовым ордерам и плательщикам, причем плательщики как юр. так и физ. лица, т.е. у кого-то заполнено поле TABEL и  PAYER_NAME, у кого-то INN и COMP_NAME, а в запросе надо PAYER_NAME и COMP_NAME вписать в одно поле.

Автор: Varyen 27.12.2009, 00:54
вобщем если в эту тему ещё кто-то заглядывает...проект подходит к концу, но тут такая проблема неизвестно из-за чего: запрос по фильтрации по дате не обрабатывается, пишет parameter d_from not found.


Код

if (CheckBox1->Checked == true)
{
Query1->SQL->Add("AND (DATE Between :d_from And :d_to)");
Query1->ParamByName("d_from")->DataType==ftDate;
Query1->ParamByName("d_to")->DataType==ftDate;
Query1->ParamByName("d_from")->AsDate=StrToDate(MaskEdit1->Text);
Query1->ParamByName("d_to")->AsDate=StrToDate(MaskEdit2->Text);
}



извиняюсь если вопрос тупой, но мне как новичку не видно причины неработоспособности smile

Автор: Varyen 27.12.2009, 23:54
Попробовал на дату по-другому написать текст запроса:

Код

Query1->SQL->Add("AND (Inccashorder.'DATE' Between "+StrToDate(MaskEdit1->Text)+" And "+StrToDate(MaskEdit2->Text)+" )");


пишет что не распознает .09 , в этом роде

Автор: Данкинг 28.12.2009, 00:00
Какой StrToDate может быть в строке? Query1->SQL-> - это строка, а не дата.

Добавлено через 2 минуты и 35 секунд
К тому же в .dbf дата обозначается так: 
{^2009-12-25}

Автор: Varyen 28.12.2009, 00:24
Спасибо! Посоветуйте тогда пожалуйста, как можно сделать в моем случае запрос по дате, чтобы выбирать строки от ... и до...?
Без StrToDate тоже не работало, потому и решил попробовать дописать...

Автор: Данкинг 28.12.2009, 00:50
Конечно, пробовать я такую страсть не буду, пишу здесь:  smile 
Код

Query1->SQL->Add("AND (Between (Inccashorder.'DATE',CTOD('"+MaskEdit1->Text+"'),CTOD('"+MaskEdit2->Text+"'))");



Автор: Varyen 28.12.2009, 02:15
Неа, на слово Between жалуется :(

Автор: Данкинг 28.12.2009, 02:33
Может, перед (Between скобку убрать всё же?

Вообще в общем случае на самом фоксе вот такой запрос работает:
Код

SELECT * from DBF() WHERE BETWEEN(ddd,CTOD('25.12.2009'),CTOD('30.12.2009'))

(ddd - это поле типа DATA)

Автор: Varyen 28.12.2009, 02:59
И все равно не хочет обрабатывать... ни через параметры, ни вот так вот, с прямым указанием на MaskEdit... Маску __.__.__ не воспринимает в запросе :(

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)