Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 05.04.2021, 08:11
denzenit denzenit вне форума
Прохожий
 
Регистрация: 16.12.2020
Сообщения: 11
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию Универсальность цикла, увеличение дальшейней поддержки

Имеется следующий цикл, который распределяет полученную информацию из запроса, который соответствует i. общий цикл for i := 1 to maxI do, где maxI задан перед началом цикла и равняется 13-и при каждом i выполняется свой запрос

и при каждом i выполняется свой порядок и свои значения из запросов. Далее создаются файлы, они немного разные по расположению и наполнению ячеек.

Т.е если i=1, то выполнится 1 запрос, наполнение ячеек будет происходить на основе цикла while, который в свою очередь по условию i запихнёт значение в определённые значения и после создастся определённый файл исходя из i.

Сейчас выглядит так:
Код:
maxI:=13;
for i := 1 to maxI do
begin
  if i = 1 then
  dm.zapros.SQL.Text := 'запрос1'
  else if
  if i = 2 then
  dm.zapros.SQL.Text := 'запрос2'
  else if
  if i = 3 then
  dm.zapros.SQL.Text := 'запрос3'; 
  //И так 13 запросов
  
  dm.zapros.Open;
  if  not dm.zapros.IsEmpty then
    begin
      try
        Exsel := CreateOleObject('Excel.Application');
        Exsel.DisplayAlerts := false;
        WorkBook := Exsel.Workbooks.Add;
        Sheet := WorkBook.WorkSheets[1];
        r:=1;

        while not dm.zapros.Eof do
        begin

          if (i in [1,2,3,4,5,6,7,8,9,10,11,12,13] then
            begin
               Sheet.Cells[r,1].Value := dm.zapros.FieldByName('path').AsString;
               Sheet.Cells[r,2].Value := dm.zapros.FieldByName('kol').AsInteger;
            end;

          if (i in [1,2,8,11,12,13]) then
            begin
              Sheet.Cells[r,5].Value := dm.zapros.FieldByName('E').AsInteger;
            end;

          if (i in [3,4,7,9,10]) then
            begin
              Sheet.Cells[r,4].Value:=dm.zapros.FieldByName('E').AsInteger;
            end;

          if (i in [9,10]) then
            begin
              Sheet.Cells[r,7].Value := dm.zapros.FieldByName('F').AsString;
            end;

          if (i in [1,10,12,13]) then
            begin
              Sheet.Cells[r,6].Value := dm.zapros.FieldByName('F').AsString;
            end;

          if (i in [5,6]) then
            begin
              Sheet.Cells[r,6].Value := dm.zapros.FieldByName('G').AsString;
            end;

          if (i in [1,2,4,13]) then
            begin
              Sheet.Cells[r,7].Value := dm.zapros.FieldByName('G').AsString;
            end;

          if (i in [9,10,]) then
            begin
              Sheet.Cells[r,8].Value := dm.zapros.FieldByName('G').AsString;
            end;
          inc(r);
          dm.aqLoc.Next;
        end;
      finally
        case i of
          1: WorkBook.SaveAs(Tempkp+'\файл1 от '+dt+'.csv',6);
          2: WorkBook.SaveAs(Tempkp+'\файл2 от '+dt+'.csv',6);
          3: WorkBook.SaveAs(Tempkp+'\файл3 от '+dt+'.csv',6);
          //и так 13 файлов
         

        end;
        WorkBook.Close;
        Exsel.Application.Quit;
        Exsel := Unassigned;
      end;
    end;



end;
Собсно говоря меня интересует цикл while. Поверьте, прежний вид был куда хуже, что-то из разряда "тронул листик - всё дерево упало".

Хотелось бы поинтересоваться, Что с этим можно сделать, чтобы увеличить возможность воздействия на этот цикл, его переделки, добавления чего-то нового без применения костылей?
Ответить с цитированием
  #2  
Старый 05.04.2021, 12:00
Vladimr Vladimr вне форума
Прохожий
 
Регистрация: 17.03.2021
Сообщения: 41
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

Можно использовать цикл case of, вместо if then.

Вот примерный вариант переделки данного кода
Код:
for i := 1 to maxI do
begin
  if i = 1 then
  dm.zapros.SQL.Text := 'запрос1'
  else if
  if i = 2 then
  dm.zapros.SQL.Text := 'запрос2'
  else if
  if i = 3 then
  dm.zapros.SQL.Text := 'запрос3'; 
  //И так 13 запросов


Вместо этого участка кода попробуй использовать такой вариант в одну строку

Код:
dm.zapros.SQL.Text:= 'запрос'+inttostr(i);

Далее
Код:
          if (i in [1,2,3,4,5,6,7,8,9,10,11,12,13] then
            begin
               Sheet.Cells[r,1].Value := dm.zapros.FieldByName('path').AsString;
               Sheet.Cells[r,2].Value := dm.zapros.FieldByName('kol').AsInteger;
            end;

Тут можно не проверять условием, потому что при любом значении добавляются значения

Можно просто написать
Код:
               Sheet.Cells[r,1].Value := dm.zapros.FieldByName('path').AsString;
               Sheet.Cells[r,2].Value := dm.zapros.FieldByName('kol').AsInteger;

Вот тут же используешь case of, а почему выше не использовал?
Код:
        case i of
          1: WorkBook.SaveAs(Tempkp+'\файл1 от '+dt+'.csv',6);
          2: WorkBook.SaveAs(Tempkp+'\файл2 от '+dt+'.csv',6);
          3: WorkBook.SaveAs(Tempkp+'\файл3 от '+dt+'.csv',6);
          //и так 13 файлов
        end;

Да и здесь можно использовать одну строку, потому что значение не изменяются
Код:
WorkBook.SaveAs(Tempkp+'\файл'+inttostr(i)+' от '+dt+'.csv',6);

А так будет выглядеть все со всеми изменениями
Код:
maxI:=13;
  dm.zapros.SQL.Text:='запрос'+inttostr(i); //вывод в одну строку вместо множества использование if then

  dm.zapros.Open;
  if  not dm.zapros.IsEmpty then
      try
        Exsel:=CreateOleObject('Excel.Application');
        Exsel.DisplayAlerts:=false;
        WorkBook:=Exsel.Workbooks.Add;
        Sheet:=WorkBook.WorkSheets[1];
        r:=1;

        while not dm.zapros.Eof do
        begin

        Sheet.Cells[r,1].Value:=dm.zapros.FieldByName('path').AsString; //выделенно до проверки значения i
        Sheet.Cells[r,2].Value:=dm.zapros.FieldByName('kol').AsInteger; //потому что выводяться при любом запросе

          case i of
            01: begin
                  Sheet.Cells[r,5].Value:=dm.zapros.FieldByName('E').AsInteger;
                  Sheet.Cells[r,6].Value:=dm.zapros.FieldByName('F').AsString;
                  Sheet.Cells[r,7].Value:=dm.zapros.FieldByName('G').AsString;
                end;

            02: begin
                  Sheet.Cells[r,5].Value:= dm.zapros.FieldByName('E').AsInteger;
                  Sheet.Cells[r,7].Value:=dm.zapros.FieldByName('G').AsString;
                end;

            03: begin
                  Sheet.Cells[r,4].Value:=dm.zapros.FieldByName('E').AsInteger;
                end;

            04: begin
                  Sheet.Cells[r,4].Value:=dm.zapros.FieldByName('E').AsInteger;
                  Sheet.Cells[r,7].Value:=dm.zapros.FieldByName('G').AsString;
                end;

            05: begin
                  Sheet.Cells[r,6].Value:=dm.zapros.FieldByName('G').AsString;
                end;

            06: begin
                  Sheet.Cells[r,6].Value:=dm.zapros.FieldByName('G').AsString;
                end;

            07: begin
                  Sheet.Cells[r,4].Value:=dm.zapros.FieldByName('E').AsInteger;
                end;

            08: begin
                  Sheet.Cells[r,5].Value:=dm.zapros.FieldByName('E').AsInteger;
                end;

            09: begin
                  Sheet.Cells[r,4].Value:=dm.zapros.FieldByName('E').AsInteger;
                  Sheet.Cells[r,7].Value:=dm.zapros.FieldByName('F').AsString;
                  Sheet.Cells[r,8].Value:=dm.zapros.FieldByName('G').AsString;
                end;

            10: begin
                  Sheet.Cells[r,4].Value:=dm.zapros.FieldByName('E').AsInteger;
                  Sheet.Cells[r,6].Value:=dm.zapros.FieldByName('F').AsString;
                  Sheet.Cells[r,7].Value:=dm.zapros.FieldByName('F').AsString;
                  Sheet.Cells[r,8].Value:=dm.zapros.FieldByName('G').AsString;
                end;

            11: begin
                  Sheet.Cells[r,5].Value:=dm.zapros.FieldByName('E').AsInteger;
                end;

            12: begin
                  Sheet.Cells[r,5].Value:=dm.zapros.FieldByName('E').AsInteger;
                  Sheet.Cells[r,6].Value:=dm.zapros.FieldByName('F').AsString;
                end;

            13: begin
                  Sheet.Cells[r,5].Value:=dm.zapros.FieldByName('E').AsInteger;
                  Sheet.Cells[r,6].Value:=dm.zapros.FieldByName('F').AsString;
                  Sheet.Cells[r,7].Value:=dm.zapros.FieldByName('G').AsString;
                end;

            end; //относиться в выражению case of
         inc(r);
        end;   //к выражениею while do

      finally
        WorkBook.SaveAs(Tempkp+'\файл'+inttostr(i)+' от '+dt+'.csv',6);
        WorkBook.Close;
        Exsel.Application.Quit;
        Exsel:=Unassigned;
      end;

end;
Ответить с цитированием
Этот пользователь сказал Спасибо Vladimr за это полезное сообщение:
denzenit (05.04.2021)
  #3  
Старый 05.04.2021, 14:56
denzenit denzenit вне форума
Прохожий
 
Регистрация: 16.12.2020
Сообщения: 11
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

Цитата:
Вместо этого участка кода попробуй использовать такой вариант в одну строку


Код:
dm.zapros.SQL.Text:= 'запрос'+inttostr(i);

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

Код:
WorkBook.SaveAs(Tempkp+'\файл'+inttostr(i)+' от '+dt+'.csv',6);



Прошу прощения, я, видимо, вас слегка запутал написав
Цитата:
Имеется следующий цикл, который распределяет полученную информацию из запроса, который соответствует i

Имелось ввиду, что файлы создаются так:
Код:
case i of
          1: WorkBook.SaveAs(Tempkp+'\файл_M60 от '+dt+'.csv',6);
          2: WorkBook.SaveAs(Tempkp+'\M60_krygl от '+dt+'.csv',6);
          3: WorkBook.SaveAs(Tempkp+'\M90_s1 от '+dt+'.csv',6);
          4: WorkBook.SaveAs(Tempkp+'\M90_s2 от '+dt+'.csv',6);
          5: WorkBook.SaveAs(Tempkp+'\ALL от '+dt+'.csv',6);

Т.е i прямо влияет на то, какое будет название файла и он не должен там вообще фигурировать в названии.


Цитата:
Можно просто написать

Код:
Sheet.Cells[r,1].Value := dm.zapros.FieldByName('path').AsString;
Sheet.Cells[r,2].Value := dm.zapros.FieldByName('kol').AsInteger;

Тут вы правы, я косякнул, не подумал.

Код:
    if i = 3 then
      dm.aqLoc.SQL.Text := 'SELECT path,kol,E,F,G,' + ' switch(right(path,2)=' + quotedstr('rh') +
       ',1,right(path,2)=' + quotedstr('iz') + ',2,right(path,2)=' + quotedstr('av') + ',3, ' + ' right(path,2)=' + quotedstr('lv') +
       ',4) as srt FROM Dallan where typ=' + inttostr(i) + ' ORDER BY H, E DESC, switch(right(path,2)=' + quotedstr('rh') +
       ',1,right(path,2)=' + quotedstr('iz') + ',2,right(path,2)=' + quotedstr('av') + ',3, ' + ' right(path,2)=' + quotedstr('lv') + ',4),path'
    else if i = 1 then
      dm.aqLoc.SQL.Text := 'SELECT * FROM Dallan where typ=' + inttostr(i) + ' or typ=99 ORDER BY typ,F,E,G,path'
    else if (i = 5) then
      dm.aqLoc.SQL.Text := 'SELECT * FROM (SELECT path,kol,e,f,g,h,typ, iif(typ=5,1,iif(typ=6,3,iif(typ=7,2,iif(typ=8,4,iif(typ=9,6,5))))) as tt '
      + 'FROM Dallan where typ>=5 and typ<=10) main ORDER BY tt,F,E,G,path,H'          //if i in [5,6,9,10]
          //then dm.aqLoc.SQL.Text:='SELECT * FROM Dallan where typ='+inttostr(i)+' ORDER BY F,E,path'

Вот тут я сейчас привёл прямой пример как в зависимости от i меняется запрос.

Пример: когда у нас i становится равно 3, то мы выполняем запрос, который я вставил выше в if i = 3 then

Далее идёт проверка на i и проставления значений в определённых ячейках( покажу на вашем примере:

Код:
03: begin
                  Sheet.Cells[r,4].Value:=dm.zapros.FieldByName('E').AsInteger;
                end;

Далее уже в зависимости от i выбирается название файла. В нашем случае будет

Код:
3: WorkBook.SaveAs(Tempkp+'\M90_s1 от '+dt+'.csv',6);


В принципе вы дали мне отличный совет с case в цикле while, когда меня посетила мысль сделать так, то я посчитал что слишком заморочено и не стал так делать.

Мне посоветовали методы и запросы засунуть в объекты, которые в свою очередь засунуть в массив. Не думаю, что имеет смысл настолько сильно заморачиваться, да и не пойму как это организовать.

И спасибо вам!!!!

Последний раз редактировалось denzenit, 05.04.2021 в 16:25.
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 12:21.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter