Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Получение массива из столбца таблицы БД, Какой самый быстрый способ? 
:(
    Опции темы
VSH
Дата 10.9.2003, 13:09 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Ответьте пожалуйста, если можно с примером (куском кода), а то хелп Delphi очень скуден на примеры.
  Вверх
Cashey
Дата 10.9.2003, 13:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бессмертный
****


Профиль
Группа: Завсегдатай
Сообщений: 3441
Регистрация: 13.11.2002
Где: в столице

Репутация: нет
Всего: 60



Ответ на ентот вопрос есть в FAQ'е.
А вот этим кодом я формировал массив из БД и заносил из него сведения в текстовик
Код

procedure TForm2.Button8Click(Sender: TObject);
var
f: TextFile;
i, j: Integer;
print: array of array of String;
begin

 if SaveDialog1.Execute then
       begin
        AssignFile(F, SaveDialog1.FileName);
        {$I-}
        Rewrite(F);
        WriteLn(F,'  Присвоение кода пользователям ');
        WriteLn(F,'');
        WriteLn(F,' Пользователь                              Код  ');
        WriteLn(F,'');

print := nil;
setLength(print,DBGrid1.SelectedRows.Count,25);
 if DBGrid1.SelectedRows.Count>0 then
   with DBGrid1.DataSource.DataSet do
     for i:=0 to DBGrid1.SelectedRows.Count-1 do
     begin
       GotoBookmark(pointer(DBGrid1.SelectedRows.Items[i]));
       for j := 3 to FieldCount-1 do

         begin
           if (j>0) then
           print[i,j]:=print[i,j]+ Fields[j].AsString;

               end;                        
       WriteLn(F, print[i,1]+' '+print[i,2]+' '+print[i,3]+ '..........'+print[i,14]);
     end;


       CloseFile(F);
        {$I+}
        if IOResult <> 0 then
        Showmessage ('Невозможно сохранить файл' + inttostr(IOResult));

      end;
end;



--------------------
библия учит любить ближнего, а камасутра обучает как именно
PM Jabber   Вверх
VSH
Дата 10.9.2003, 18:57 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Спасибо, Cashey
Но Lookup'ы из фака не подходят, мне нужны: ARR1, содержащий все данные 1-го столбца таблицы БД, ARR2 - второго и т.д. Перебор записей в цикле используя TDataSet - это очень печально по скорости выполнения.
Меня интересует, есть ли что-нибудь побыстрее или хотябы те же циклы, но оформленные стандартными методами (всёже быстрее чем писать своё)?
  Вверх
Vit
Дата 10.9.2003, 19:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Vitaly Nevzorov
****


Профиль
Группа: Экс. модератор
Сообщений: 10964
Регистрация: 25.3.2002
Где: Chicago

Репутация: 14
Всего: 207



В любом случае прийдётся цикл крутить:

For...
MyArray[i]:=Table1.fields[0].asstring
Table1.next


--------------------
With the best wishes, Vit
I have done so much with so little for so long that I am now qualified to do anything with nothing
Самый большой Delphi FAQ на русском языке здесь: www.drkb.ru
PM MAIL WWW ICQ   Вверх
Cashey
Дата 10.9.2003, 16:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бессмертный
****


Профиль
Группа: Завсегдатай
Сообщений: 3441
Регистрация: 13.11.2002
Где: в столице

Репутация: нет
Всего: 60



Сразу же извеняюсь, не знаю сработает ли это в Delphi (не проверял). А в FoxPro можно сформировать массив SQL запросом (работает моментально). Если есть желание можешь попробовать.
Код

SELECT *;
FROM tablename;
WHERE esli_nado;
INTO ARRAY arrayname

Попробуй через TQuery


--------------------
библия учит любить ближнего, а камасутра обучает как именно
PM Jabber   Вверх
VSH
Дата 10.9.2003, 16:20 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Скорость инициализации 3-х массивов из 400 записей методами TDataSet и TADOTable оказалась одинаковой (только что таймером измерял) = 2 сек. не 2-м пне.
Вспомнил про волшебные свойства DataSet.DisableControls; (перед циклом) и DataSet.EnableControls; (после), скорость - доли секунды.

Vit всё равно спасибо, узнал хоть что перебор можно осуществлять методами таблицы и в коде у себя оставил для разнообразия wink.gif.
  Вверх
Akella
Дата 11.9.2003, 09:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 29
Всего: 329



Если есть связанные таблицы, то циклы с EnableControls и DisableControls работают некоректно, мне пришлось отключать DBGrid на время выполнения цикла.
PM MAIL   Вверх
altarasjuk
Дата 14.9.2003, 13:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 331
Регистрация: 7.5.2003
Где: Харьков

Репутация: нет
Всего: 1



Цитата
Если есть связанные таблицы, то циклы с EnableControls и DisableControls работают некоректно, мне пришлось отключать DBGrid на время выполнения цикла.
Народ, а вам не кажется ли, что формирование массива и интерфейс - немгого разные вещи? Может стоит так:
Код
function GetArray: TMyArray;
var
 query: TADOQuery;
 ret: TMyArray;
 pos: Integer;
begin
 query.ConnectionString:= .....;
 query.SQL.Text:= .....;
 query.Parameters.......;
 ..........
 query.ExecSql;
 SetLength(ret, query.Recordset.RecordCount);
 pos:= 0;
 while not query.Recordset.EOF do begin
   ret[pos].<....>:= query.Recordset.Fields[....].Value;
   ret[pos].<....>:= query.Recordset.Fields[....].Value;
   .............
   Inc(pos);
   query.Recordset.MoveNext;
 end;
 query.Free;
 Result:= ret;
end;
Этот вариант будет работать значительно быстрее...
Можно ещё создать что-то типа конекшн-пула, тогда не надо будет тратить время на создание кверя и его убийство....

Это сообщение отредактировал(а) altarasjuk - 14.9.2003, 13:22


--------------------
Правда - изобретение маньяков: колет глаза и режет уши.
PM MAIL ICQ   Вверх
mihana
  Дата 11.11.2010, 20:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 1
Регистрация: 3.11.2010

Репутация: нет
Всего: нет



Здравствуйте уважаемые знатоки Delphi и не ток, у меня такая проблемка может посоветуйте че-нить. есть у меня база в которой идет расчет коммунальных услуг в базе этой около 300 записей и при расчете я бы хотел чтоб за время етого расчета отображалось состояние Progressbar но когда я ставил его то все бесполезно прога при расчете подвисает.
если кто что-нибудь знает подскажите пожалуйста.
вот код на расчет по дому № 4...
Код

if LabeledEdit101.Text='4'
Then
begin
LabeledEdit1.Text:=LabeledEdit101.Text;
LabeledEdit2.Text:='КРАВЧЕНКО ДМИТРИЙ С';
ADOQuery5.SQL.Clear ;
ADOQuery5.SQL.Add('SELECT SPRLS.id_sprls, SPRLS.KODLS, SPRGL.NAIMEN, SPRUL.NAIMEN, SPRLS.KODUL, SPRLS.DOM, SPRLS.KDOM, SPRLS.KVART, SPRLS.PO, SPRLS.QKOM, SPRLS.QPROG, SPRLS.SPOLZ, SPRLS.SPOLN, SPRLS.SALDV, SPRLS.NACH, SPRLS.OPL, SPRLS.PENI, SPRLS.SALDI'); 
ADOQuery5.SQL.Add('FROM SPRUL INNER JOIN (SPRGL INNER JOIN SPRLS ON SPRGL.KODLS = SPRLS.KODLS) ON SPRUL.KODUL = SPRLS.KODUL');
//Adoquery5.SQL.Add('WHERE (((SPRLS.KODLS) Like "400313") AND ((SPRLS.DOM) Like "2ш"));');
ADOQuery5.SQL.Add('WHERE (((SPRGL.NAIMEN) Like "%'+LabeledEdit2.Text+'%") AND ((SPRLS.DOM) Like "%'+LabeledEdit1.Text+'%"));');//поиск ФИО и дома
Adoquery5.Active :=False;
Adoquery5.Active :=true;
end;
begin
         ADOQuery5.SQL.Clear ;
         ADOQuery5.SQL.Add('SELECT Sum(SPRLS.QPROG) AS [Sum-QPROG]');
         ADOQuery5.SQL.Add('FROM SPRUL INNER JOIN (SPRGL INNER JOIN SPRLS ON SPRGL.KODLS = SPRLS.KODLS) ON SPRUL.KODUL = SPRLS.KODUL');
         ADOQuery5.SQL.Add('WHERE (((SPRGL.NAIMEN) Like "%'+LabeledEdit2.Text+'%") AND ((SPRLS.DOM) Like "%'+LabeledEdit1.Text+'%"))');
         ADOQuery5.SQL.Add('HAVING (((Sum(SPRLS.QPROG)) Is Not Null));');
         Adoquery5.Active :=False;
         Adoquery5.Active :=true;//поиск и вывод в определенный LabeledEdit кол-во проживающих
end;
begin
        QPROG.Text:=ADOQuery5.FieldByName('Sum-QPROG').AsString;
end;
begin
         ADOQuery5.SQL.Clear ;
         ADOQuery5.SQL.Add('SELECT Sum(SPRLS.spoln) AS [Sum-SPOLN]');
         ADOQuery5.SQL.Add('FROM SPRUL INNER JOIN (SPRGL INNER JOIN SPRLS ON SPRGL.KODLS = SPRLS.KODLS) ON SPRUL.KODUL = SPRLS.KODUL');
         ADOQuery5.SQL.Add('WHERE (((SPRGL.NAIMEN) Like "%'+LabeledEdit2.Text+'%") AND ((SPRLS.DOM) Like "%'+LabeledEdit1.Text+'%"))');
         ADOQuery5.SQL.Add('HAVING (((Sum(SPRLS.SPOLN)) Is Not Null));');
         Adoquery5.Active :=False;
         Adoquery5.Active :=true;поиск и вывод в определенный LabeledEdit полной площади квартиры
end;
begin
        SPOLNTEH.Text:=ADOQuery5.FieldByName('Sum-SPOLN').AsString;
end;
begin
         ADOQuery5.SQL.Clear ;
         ADOQuery5.SQL.Add('SELECT Sum(SPRLS.SPOLN) AS [Sum-SPOLN]');
         ADOQuery5.SQL.Add('FROM SPRUL INNER JOIN (SPRGL INNER JOIN SPRLS ON SPRGL.KODLS = SPRLS.KODLS) ON SPRUL.KODUL = SPRLS.KODUL');
         ADOQuery5.SQL.Add('WHERE (((SPRGL.NAIMEN) Like "%'+LabeledEdit2.Text+'%") AND ((SPRLS.DOM) Like "%'+LabeledEdit1.Text+'%"))');
         ADOQuery5.SQL.Add('HAVING (((Sum(SPRLS.SPOLN)) Is Not Null));');
         Adoquery5.Active :=False;
         Adoquery5.Active :=true;
end;
begin
         SPOLNOTOP.Text:=ADOQuery5.FieldByName('Sum-SPOLN').AsString;
         if SPOLNOTOP.Text='0'
         then
         SPOLNOTOP.Text:='1';
         if SPOLNOTOP.Text=''
         then
         SPOLNOTOP.Text:='1'
end;
{?} begin
         ADOQuery5.SQL.Clear ;
         ADOQuery5.SQL.Add('SELECT Sum(SPRLS.KOL) AS [Sum-KOL]');
         ADOQuery5.SQL.Add('FROM SPRUL INNER JOIN (SPRGL INNER JOIN SPRLS ON SPRGL.KODLS = SPRLS.KODLS) ON SPRUL.KODUL = SPRLS.KODUL');
         ADOQuery5.SQL.Add('WHERE (((SPRGL.NAIMEN) Like "%'+LabeledEdit2.Text+'%") AND ((SPRLS.DOM) Like "%'+LabeledEdit1.Text+'%"))');
         ADOQuery5.SQL.Add('HAVING (((Sum(SPRLS.KOL)) Is Not Null));');
         Adoquery5.Active :=False;
         Adoquery5.Active :=true;
end;
begin
         kol.Text:=ADOQuery5.FieldByName('Sum-KOL').AsString;
        if kol.Text='0'
        then
        kol.Text:='1';
        if kol.Text=''
        then
        kol.Text:='1';
end;
    begin
        q:=StrToFloat(SPOLNTEH.Text);
        w:=StrToFloat(KAT0TEH.Text);
        e:=StrToFloat(SPOLNOTOP.Text);
        r:=StrToFloat(SOTOP0.Text);
        t:=StrToFloat(KAT0GKAL.Text);
        y:=StrToFloat(kol.Text);
        u:=StrToFloat(KAT0PODOGREV.Text);
        i:=StrToFloat(KUB0.Text);
        o:=StrToFloat(QPROG.Text);
        p:=StrToFloat(SMUS0.Text);
        a:=StrToFloat(KAT0MUSOR.Text);
        s:=q*w;
        d:=e*r*t;
        f:=y*u*i;
        g:=o*p*a;
        sumteh.Text:=FloatToStr(s);
        sumotop.Text:=FloatToStr(d);
        sumpod.Text:=FloatToStr(f);
        summus.Text:=FloatToStr(g);
       sum:=s+d+f+g;
     Edit5.Text:=FloatToStr(sum);
     nachisleno.Text:=Edit5.Text;//тут происходит расчет по тому что было занесено в LabeledEdit'ы
    end;
    begin

ADOQuery5.SQL.Clear ;
ADOQuery5.SQL.Add('SELECT SPRLS.id_sprls, SPRLS.KODLS, SPRGL.NAIMEN, SPRUL.NAIMEN, SPRLS.KODUL, SPRLS.DOM, SPRLS.KDOM, SPRLS.KVART, SPRLS.PO, SPRLS.QKOM, SPRLS.QPROG, SPRLS.SPOLZ, SPRLS.SPOLN, SPRLS.SALDV, SPRLS.NACH, SPRLS.OPL, SPRLS.PENI, SPRLS.SALDI'); 
ADOQuery5.SQL.Add('FROM SPRUL INNER JOIN (SPRGL INNER JOIN SPRLS ON SPRGL.KODLS = SPRLS.KODLS) ON SPRUL.KODUL = SPRLS.KODUL');
ADOQuery5.SQL.Add('WHERE (((SPRGL.NAIMEN) Like "%'+LabeledEdit2.Text+'%") AND ((SPRLS.DOM) Like "%'+LabeledEdit1.Text+'%"));');
//Adoquery5.SQL.Add('WHERE SPRLS.DOM like "%'+LabeledEdit101.Text+'%";');
Adoquery5.Active :=False;
Adoquery5.Active :=true;

{ADOQuery2.SQL.Clear;
ADOQuery2.SQL.Add('SELECT OPNA.OPNA, OPNA.KODLS, SPRGL.NAIMEN, OPNA.KODNA, SPRNA.NAIMEN, OPNA.SUMMA, OPNA.IZM, OPNA.KOL, OPNA.TARIF');
ADOQuery2.SQL.Add('FROM SPRNA INNER JOIN (SPRGL INNER JOIN OPNA ON SPRGL.KODLS = OPNA.KODLS) ON SPRNA.KODNA = OPNA.KODNA');
ADOQuery2.SQL.Add('WHERE SPRLS.DOM Like "%'+LabeledEdit101.Text+'%"');
ADOQuery2.Active:=False;
ADOQuery2.Active:=True;}
end;
    begin
      sprglnaimen.Text:=ADOQuery5.FieldByName('SPRGL.NAIMEN').AsString;
      sprulnaimen.Text:=ADOQuery5.FieldByName('SPRUL.NAIMEN').AsString;
      KODLS.Text:=ADOQuery5.FieldByName('KODLS').AsString;
      KODUL.Text:=ADOQuery5.FieldByName('KODUL').AsString;
      DOM.Text:=ADOQuery5.FieldByName('DOM').AsString;
      KDOM.Text:=ADOQuery5.FieldByName('KDOM').AsString;
      KVART.Text:=ADOQuery5.FieldByName('KVART').AsString;
      PO.Text:=ADOQuery5.FieldByName('PO').AsString;
      QKOMN.Text:=ADOQuery5.FieldByName('QKOM').AsString;
      SPOLZ.Text:=ADOQuery5.FieldByName('SPOLZ').AsString;
      SALDOV.Text:=ADOQuery5.FieldByName('SALDV').AsString;
      //OPL.Text:=ADOQuery5.FieldByName('OPL').AsString;
//      PENI.Text:=ADOQuery5.FieldByName('PENI').AsString;
      //SALDI.Text:=ADOQuery5.FieldByName('SALDI').AsString;
      end;
begin
if (KDOM.Text='') then KDOM.Text:='0';
if (SALDOV.Text='') then SALDOV.Text:='0';
ADOQIZM.Parameters.ParamByName('KODLS').Value:=KODLS.Text;;
ADOQIZM.Parameters.ParamByName('KODUL').Value:=KODUL.Text;
ADOQIZM.Parameters.ParamByName('DOM').Value:=DOM.Text;
ADOQIZM.Parameters.ParamByName('KDOM').Value:=KDOM.Text;
ADOQIZM.Parameters.ParamByName('KVART').Value:=KVART.Text;
ADOQIZM.Parameters.ParamByName('PO').Value:=PO.Text;
ADOQIZM.Parameters.ParamByName('QKOM').Value:=QKOMN.Text;
ADOQIZM.Parameters.ParamByName('QPROG').Value:=QPROG.Text;
ADOQIZM.Parameters.ParamByName('SPOLZ').Value:=SPOLZ.Text;
ADOQIZM.Parameters.ParamByName('SPOLN').Value:=SPOLNTEH.Text;
ADOQIZM.Parameters.ParamByName('SALDV').Value:=SALDOV.Text;
ADOQIZM.Parameters.ParamByName('NACH').Value:=nachisleno.Text;
{ADOQIZM.Parameters.ParamByName('OPL').Value:='--';
ADOQIZM.Parameters.ParamByName('PENI').Value:='--';
ADOQIZM.Parameters.ParamByName('SALDI').Value:='--';}
ADOQIZM.Parameters.ParamByName('id_sprls').Value:=ADOQuery5.FieldByName('id_sprls').AsInteger;
ADOQIZM.ExecSQL;
ADOQuery5.Active:=false;
ADOQuery5.Active:=true;
end;


за-ранее большое
PM MAIL   Вверх
Данкинг
Дата 11.11.2010, 22:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Yersinia pestis
****


Профиль
Группа: Завсегдатай
Сообщений: 8302
Регистрация: 7.11.2006
Где: მოსკოვი

Репутация: 35
Всего: 130



mihana, создай новую тему (к этой твой вопрос явно не относится) и уточни, куда именно хочешь ProgressBar вставить в своём коде.


--------------------
There's nothing left but silent epitaphs.
PM MAIL WWW   Вверх
Akella
Дата 12.11.2010, 15:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 29
Всего: 329



И куда ж ты "ставил" ProgressBar
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Базы данных и репортинг"
Vit
Петрович

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами


Обязательно указание:

1. Базы данных (Paradox, Oracle и т.п.)

2. Способа доступа (ADO, BDE и т.д.)


  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • Вопросы по SQL и вопросы по базам данных не связанные с Дельфи задавать здесь

FAQ раздела лежит здесь!


Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Vit, Петрович.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Базы данных и репортинг | Следующая тема »


 




[ Время генерации скрипта: 0.1441 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.