Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Базы данных и репортинг > Получение массива из столбца таблицы БД


Автор: VSH 10.9.2003, 13:09
Ответьте пожалуйста, если можно с примером (куском кода), а то хелп Delphi очень скуден на примеры.

Автор: Cashey 10.9.2003, 13:22
Ответ на ентот вопрос есть в 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;

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

Автор: Vit 10.9.2003, 19:10
В любом случае прийдётся цикл крутить:

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

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

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

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

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

Vit всё равно спасибо, узнал хоть что перебор можно осуществлять методами таблицы и в коде у себя оставил для разнообразия wink.gif.

Автор: Akella 11.9.2003, 09:14
Если есть связанные таблицы, то циклы с EnableControls и DisableControls работают некоректно, мне пришлось отключать DBGrid на время выполнения цикла.

Автор: altarasjuk 14.9.2003, 13:21
Цитата
Если есть связанные таблицы, то циклы с 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;
Этот вариант будет работать значительно быстрее...
Можно ещё создать что-то типа конекшн-пула, тогда не надо будет тратить время на создание кверя и его убийство....

Автор: mihana 11.11.2010, 20:36
Здравствуйте уважаемые знатоки 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;


за-ранее большое

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

Автор: Akella 12.11.2010, 15:44
И куда ж ты "ставил" ProgressBar

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