Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Базы данных > Экспорт данных из БД в Excel или Отчет


Автор: mamed05 21.4.2009, 00:50
Здрасте!
Делаю курсач "учета поступления материалов на склад".

Вот пример моей программы:
user posted image

На форме имеются компоненты: TDateTimePicker, TTable, TDataSourse, TDBGrid и TDBNavigator и т.д.

Задача заключается в следующем: 
  •  Из имеющейся базы мне нужно отобрать материалы за сегодняшний день.
  •  И на основании этих данных создать отчет вида "Приходной ордер (М-4)" (Файл  вложен). Экспортировать ли его в Excel или можно как обычный отчет QuickReport? И как именно?  smile
 
Помогите пожалуйста!  smile 

Принимается любая помошь!  smile 

Автор: mrbrooks 21.4.2009, 08:17
Цитата(mamed05 @  21.4.2009,  00:50 Найти цитируемый пост)
 Из имеющейся базы мне нужно отобрать материалы за сегодняшний день.

SQL - запросом. Используй TQuery.
Цитата(mamed05 @  21.4.2009,  00:50 Найти цитируемый пост)
можно как обычный отчет QuickReport?

я бы сделал именно так.

Цитата(mamed05 @  21.4.2009,  00:50 Найти цитируемый пост)
И как именно?

Камрад. Читай спец.литературу. Не ленись. Не такие уж и объемные книги по БД в Бормане

http://www.helloworld.ru/texts/comp/lang/builder/buid5/report.htm

Автор: Лапоть 21.4.2009, 11:15
ИМХО - хранить цену в виде строки (27 000,00р.) - это гарантированный геморрой при дальнейшем вычислении стоимости.

Автор: mamed05 22.4.2009, 15:19
Вот такая загвоздка возникла теперь:

Код

Query1->Close();
Query1->SQL->Strings[3]="WHERE Products."Date"="+DateTimePicker1->Date.CurrentDate();
Query1->Open();


Нужно чтоб в этом слове Products."Date"   он перенес эти кавычки в SQL запрос.
Как это сделать?

Автор: Лапоть 22.4.2009, 19:23
Вот тестик с пикером, кнопкой и эдитом:
Код

void __fastcall TForm1::Button3Click(TObject *Sender) {
  char buf[64];
  sprintf(buf, "WHERE Products.\"Date\" = %s", String(DateTimePicker1->Date.CurrentDate()));
  Edit1->Text = String(buf);
}

Не забудь приинклюдить stdio.h

Автор: mrbrooks 23.4.2009, 08:20
Лапоть, если уж на то пошло, то проще так:
Код

void __fastcall TForm1::Button3Click(TObject *Sender) 
{
   Edit1->Text = String().sprintf("WHERE Products.\"Date\" = %s", DateTimePicker1->DateString());
}

Если используем CG 2009 то соответственно не забываем про L.

mamed05, 
Код

Query1->Close();
Query1->SQL->Strings[3]="WHERE Products.\"Date\"="+DateTimePicker1->DateString();
Query1->Open();


Только не стоит забывать, что при формировании запроса его надо очищать от предыдущего. Это я к тому, что содержит список от Strings[0] ... Strings[2]? Один мощный SELECT  smile 

Автор: Лапоть 23.4.2009, 10:45
Цитата(mrbrooks @  23.4.2009,  09:20 Найти цитируемый пост)
Лапоть, если уж на то пошло, то проще так:
Согласен! Но никак не избавлюсь от того, к чему когда-то привык smile 

Автор: mrbrooks 23.4.2009, 11:20
Цитата(Лапоть @  23.4.2009,  10:45 Найти цитируемый пост)
Согласен! Но никак не избавлюсь от того, к чему когда-то привык

Кстати очень дельное замечание. Поддержка так сказать некой кроссплатформенности  smile 

Автор: mamed05 23.4.2009, 14:13
Почему он так ругается?

user posted image


Код

Query1->Close();
Query1->SQL->Strings[0]="SELECT ProductNo, PostNo, Name, Products.\"Index\", Ed_izmer, Kol, KolDoc, Price, Products.\"Date\"";
Query1->SQL->Strings[1]="FROM Products";
Query1->SQL->Strings[2]="WHERE Products.\"Date\"="+DateTimePicker1->Date.CurrentDate();
Query1->Open();

Автор: azesmcar 23.4.2009, 14:17
mamed05

потому что вышел за пределы массива..это не ПХП в конце концов smile 

Код

Query1->Close();
Query1->SQL->Lines->Add("SELECT ProductNo, PostNo, Name, Products.\"Index\", Ed_izmer, Kol, KolDoc, Price, Products.\"Date\"");
Query1->SQL->Lines->Add("FROM Products");
Query1->SQL->Lines->Add("WHERE Products.\"Date\"="+DateTimePicker1->Date.CurrentDate());
Query1->Open();

если правильно помню

Автор: Лапоть 23.4.2009, 15:29
Код

Query1->Close();
Query1->SQL->Clear();  // очисти то, что там уже может быть!
Query1->SQL->Add("SELECT ProductNo, PostNo, Name, Products.\"Index\", Ed_izmer, Kol, KolDoc, Price, Products.\"Date\"");
Query1->SQL->Add("FROM Products");
Query1->SQL->Add("WHERE Products.\"Date\"="+DateTimePicker1->Date.CurrentDate());
Query1->Open();

Автор: mamed05 23.4.2009, 16:14
Без Lines прокатило но не с DateTimePicker1->Date.CurrentDate()

По полю PostNo отсортировать получилось.
Код

Query1->Close();
Query1->SQL->Add("SELECT ProductNo, PostNo, Name, Products.\"Index\", Ed_izmer, Kol, KolDoc, Price, Products.\"Date\"");
Query1->SQL->Add("FROM Products");
Query1->SQL->Add("WHERE PostNo=1");
Query1->Open();


А по полю Products."Date" выдает ошибку.
Код

Query1->Close();
Query1->SQL->Add("SELECT ProductNo, PostNo, Name, Products.\"Index\", Ed_izmer, Kol, KolDoc, Price, Products.\"Date\"");
Query1->SQL->Add("FROM Products");
Query1->SQL->Add("WHERE Products.\"Date\"="+DateTimePicker1->Date.CurrentDate());
Query1->Open();


user posted image


По идее DateTimePicker1->Date.CurrentDate() должен выдать дату в формате 23.04.2009
А в ошибке только 23.04
Кажется ошибка возникает из-за точек в дате.
Что тут можно сделать?



Автор: mrbrooks 23.4.2009, 16:33
mamed05, я же тебе привел пример выше по поводу времени в виде строки.

Код

Query1->Close();
Query1->SQL->Clear();
Query1->SQL->Add("SELECT ProductNo, PostNo, Name, Products.\"Index\", Ed_izmer, Kol, KolDoc, Price, Products.\"Date\"");
Query1->SQL->Add("FROM Products");
Query1->SQL->Add("WHERE Products.\"Date\"="+DateTimePicker1->DateString());
Query1->Open();


будь бдителен.

Автор: mamed05 23.4.2009, 16:58
Стараюсь быть бдительным! Я ведь уже проверял этот метод smile 

user posted image

А когда пишу DateTimePicker1->Date.DateString() получается подобие этого:
user posted image

Но только с датой 18.04. Кстати mrbrooks, как раз это значение мне и нужно было! smile 

Но проблема все еще не решена  smile 

Автор: Лапоть 24.4.2009, 07:11
Похоже, собака порылась вот в чём - у тебя запрос на выборку из единственной таблицы Products, так зачем ты лепишь имена в виде Таблица.Имя_поля? Далее - Инвалид юз оф Киворд - скорее всего слово Date для твоей СУБД (что за сервер, кстати?) - служебное. Поэтому либо поменяй название колонки, либо пиши его в квадратных скобках [Date].

Цитата(mamed05 @  23.4.2009,  17:14 Найти цитируемый пост)
Без Lines прокатило 
Вместо плясок с бубном советую хоть изредка в хэлпы поглядывать smile 

Автор: mrbrooks 24.4.2009, 08:09
Цитата(mamed05 @  23.4.2009,  16:58 Найти цитируемый пост)
А когда пишу DateTimePicker1->Date.DateString() получается подобие этого:

Конечно это правильно - я ошибся - писал то здесь  smile 
Цитата(mamed05 @  23.4.2009,  16:58 Найти цитируемый пост)
Но только с датой 18.04. Кстати mrbrooks, как раз это значение мне и нужно было! 

Это дата когда ты добавил компонент на форму. В конструкторе напиши

Код

DateTimePicker1->Date = Date();


Это будет текущая дата - либо сам выбирай в ручную.

Как я понимаю работаешь с Paradox? Присоединяюсь к Лапоть - смотри какой формат там метки времени в хелпе.

Автор: mamed05 24.4.2009, 21:41
Всем спасибо! Последняя проблема решена  smile 
Дату нужно было заключить в кавычки.

Код

Query1->Close();
Query1->SQL->Clear();
Query1->SQL->Add("SELECT ProductNo, PostNo, Name, IndexProduct, Ed_izmer, Kol, KolDoc, Price, DDate");
Query1->SQL->Add("FROM Products");
Query1->SQL->Add("WHERE DDate = \""+DateTimePicker1->Date.DateString()+"\"");
Query1->Open();


Курсовик почти готов  smile 

Автор: Palladin 28.4.2009, 16:55
Лапоть и MrBrooks получают '+' Просто за то что у меня настроение хорошоее smile 

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