Eksportowanie wyników TQuery do pliku.

dział ogólny

Eksportowanie wyników TQuery do pliku.

Nowy postprzez miko » wtorek, 28 kwietnia 2009, 13:26

Czy ktos wie jak wyeksportowac dane z komponentu TQuery do jakiegokolwiek pliku - najlepiej txt, ale równiez moze byc np. xml.
Problem jest tego typu, ze Query zwraca ok 5000 wierszy w trzynastu kolumnach. Wynik musze przepisac do komponentu TStringGrid.
Nie moge równiez uzyc DBGrida, poniewaz program ma pelnic funkcje edytora, do którego mozna wczytywac pliki jak równiez zapisac zawartosc StringGrida do pliku. Jednym slowem moj grid ma byc powiazany z plikiem (mozliwym do odczytania przez MsExcell) a nie z baza. Komunikacja z baza nastepuje jedynie po to aby pobrac dane z bazy (przez uzytkownika, który ma prawa jedynie do odczytu) wczytac je do pliku a nastepnie dowolnie edytowac.

Przejscie przez baze kodem:
Kod: Zaznacz cały
Query1->First();
While(!Query1->Eof)
{
StringGrid1->Cells[0][0]=Query1Field1->AsString;
StringGrid1->Cells[0][1]=Query1Field2->AsString;

(...)

Query1->Next();
}

zajmuje wieki.
Problem rozwiazaloby wyeksportowanie wyników zapytania SQL z Query do jakiegos pliku a nastepnie wczytanie go do StringGrida.
Sprawdzilem juz i samo wczytanie danych z pliku zajmuje chwilke.
Puscilem tez sama petle :
Kod: Zaznacz cały
Query1->First();
While(!Query1->Eof)
{
Query1->Next();
}

czyli przejscie przez baze bez wykonywania jakiegokolwiek kodu - zajmuje wieki - co potwierdza, ze samo wczytanie 5000 wierszy do Grida nie jest problemem. Problemem jest wykonanie polecienia Query1->Next(); 5000 razy.

Dodam jeszcze, ze 8 kolumn to kolumny bezposrednio zwrocone w wyniku zapytania SQL, pozostale piec to pola typu fkCalculated, wyliczane dynamicznie podczas wykonania
Kod: Zaznacz cały
Query->Active=true;

w zdarzeniu OnCalcFields.
Ale jak juz wspomnialem samo aktywowanie TQuery zajmuje do 3 sekund.
Avatar użytkownika
miko
Bladawiec
Bladawiec
 
Posty: 29
Dołączył(a): poniedziałek, 30 marca 2009, 12:11
PodziÄ™kowaÅ‚ : 1
OtrzymaÅ‚ podziÄ™kowaÅ„: 0
    NieznanyNieznana

Re: Eksportowanie wyników TQuery do pliku.

Nowy postprzez Corvis » Å›roda, 29 kwietnia 2009, 08:44

Możesz to zrobić tak :

Dodać na formę kompnenty

DataSetProvider
ClientDataSet


w DataSetProvider ustawiasz w inspektorze : DataSet -> wskazuejsz swoje Query
w ClientDataSet uwstaiwasz ProviderName -> wskazujesz na DataSetPrivider

w Query ustawiasz CommandText
robisz ClientDatSet Active na true

i potem tylko

ClientDataSet->SaveToFile.... - polecam HELPA z tym poleceniem
"Sukcesy trwają, dopóki ich ktoś nie spieprzy. Porażki są wieczne"

Dr Gregory House
Avatar użytkownika
Corvis
Programista I
Programista I
 
Posty: 880
Dołączył(a): sobota, 26 lipca 2008, 00:31
PodziÄ™kowaÅ‚ : 80
OtrzymaÅ‚ podziÄ™kowaÅ„: 30
System operacyjny: WINDOWS 7 64-bity
Kompilator: Praca - C++ Builder XE2 ENTERPRISE - Update 4, Dom - C++ Builder XE4 - Uddate 1
Gadu Gadu: 0
    NieznanyNieznana

Re: Eksportowanie wyników TQuery do pliku.

Nowy postprzez miko » Å›roda, 29 kwietnia 2009, 15:26

Dzieki, technicznie wszystko ladnie chodzi, ale niestety nie do konca.
Wiem juz w czym mam problem - to te pola Calculated. Kiedy usune pola wyliczane jest OK, moge chodzic po bazie bez problemu. Mi to jest wszystko jedno czy przejde baze w petli i zapisze do pliku linie po linii czy wyeksportuje cale Query do pliku. Problem w tym, ze jak tylko podlacze pola wyliczane cala operacja po prostu wisi. Tak jak mówiles uzylem komponentow DataSetProvider i ClientDataSet, podlaczylem do Query zapisalem do pliku xml. Po dodaniu pol wylicznanych program nawet nie wyswietla mi glownej formy. Widze w procesach, ze jest, ale gdzies 'wisi'. Sprobowalem ustawic ClientDataSet na true dynamicznie. A nastepnie wyeksportowac do pliku. Nic z tego. Po próbie wykonania
Kod: Zaznacz cały
ClientDataSet->Active=true;

program sie wiesza, nie mozna go nawet zamknac. :x
To mój kod, który wykonuje w zdarzeniu OnCalcFields:

Kod: Zaznacz cały

void __fastcall Tdane::qDataCalcFields(TDataSet *DataSet)
{
TLocateOptions Opts;
Opts.Clear();

label= "L"+qDataPRODUCT->AsString;
sleeve ="S"+qDataPRODUCT->AsString;

//---------------------------------------------------------------- price file info

if (qCustomer->Locate("PRODUCT",qDataPRODUCT->AsString,Opts))
qDataPriceFile->AsString=qCustomerADDRESS1->AsString;
else
qDataPriceFile->AsString="NO PRICE FILE DATA";

//------------------------------------------------------------------ decoration info
qDecor->Locate("PRODUCT",sleeve,Opts);

if (qDecor->Locate("PRODUCT",sleeve,Opts))
  {
   qDataDECORATION->AsString="SLEEVED";
   qDataDECOCODE->AsString=dane->qDecorPRODUCT->AsString;
   qDataDECSTOCK->AsFloat=dane->qDecorPHYSICAL_QTY->AsFloat;

  }
if (qDecor->Locate("PRODUCT",label,Opts))
  {
   qDataDECORATION->AsString="LABELLED";
   qDataDECOCODE->AsString=dane->qDecorPRODUCT->AsString;
   qDataDECSTOCK->AsFloat=dane->qDecorPHYSICAL_QTY->AsFloat;
  }
if (!qDecor->Locate("PRODUCT",label,Opts) && !qDecor->Locate("PRODUCT",sleeve,Opts))
  {
   qDataDECORATION->AsString="n/a";
   qDataDECOCODE->AsString="";
   qDataDECSTOCK->AsFloat=0;
  }
//-------------------------------------------------------------------- chooser


sum=qDataPHYSICAL_QTY->AsFloat+qDataDECSTOCK->AsFloat;
if (sum>0)
  qDataCHOOSER->AsString="STOCK";
else
  qDataCHOOSER->AsString="NO STOCK";

//------------------------------------------------------------------------- last Made


if(qDateLastMade->Locate("PRODUCT_CODE",qDataPRODUCT->AsString,Opts))
dane->qDataLastMade->AsString=DateToStr(qDateLastMadeMAXBMWOHMCOMPLETION_DATE->AsDateTime);
if(!qDateLastMade->Locate("PRODUCT_CODE",qDataPRODUCT->AsString,Opts))
dane->qDataLastMade->AsString="NOT MADE";

}

i domyslam sie, ze wykonanie tego 5000 razy zajmuje komputerowi chwile. Najgorsze jest to, ze jakos nie umiem tego logicznie obejsc.
Sprobowalem tez z komponentami ADO. ADOQuery ma funkcje wyeksportowania do xmla, ale niestety nie eksportuje pól wyliczanych :evil:
wiec jest to na nic. Wylaczalem obsluge OnCalc w trakcie przepisywania zawartosci query do pliku - nic z tego. Nie pokazuje wartosci...
Szukam dalej.
Avatar użytkownika
miko
Bladawiec
Bladawiec
 
Posty: 29
Dołączył(a): poniedziałek, 30 marca 2009, 12:11
PodziÄ™kowaÅ‚ : 1
OtrzymaÅ‚ podziÄ™kowaÅ„: 0
    NieznanyNieznana


  • Podobne tematy
    Odpowiedzi
    Wyświetlone
    Ostatni post

Powrót do Ogólne problemy z programowaniem

Kto przeglÄ…da forum

Użytkownicy przeglądający ten dział: Brak zalogowanych użytkowników i 4 gości