|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
Универсальность цикла, увеличение дальшейней поддержки
Имеется следующий цикл, который распределяет полученную информацию из запроса, который соответствует 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; Хотелось бы поинтересоваться, Что с этим можно сделать, чтобы увеличить возможность воздействия на этот цикл, его переделки, добавления чего-то нового без применения костылей? |
#2
|
|||
|
|||
Можно использовать цикл 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
|
|||
|
|||
Цитата:
Прошу прощения, я, видимо, вас слегка запутал написав Цитата:
Имелось ввиду, что файлы создаются так: Код:
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 прямо влияет на то, какое будет название файла и он не должен там вообще фигурировать в названии. Цитата:
Тут вы правы, я косякнул, не подумал. Код:
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. |