Casa
Top.Mail.Ru Yandeks.Metrika
Fórum: "Bases";
Arquivo atual: 2002.01.08;
Download: [xml.tar.bz2];

Para baixo

Uma questão abstrata sobre otimização. Encontre agências semelhantes


Котелок   (2001-11-30 02:16) [0]

A questão é ...

O código abaixo pode ser otimizado de alguma forma .... ???

E então ele escreveu e eu fiquei viciado. Não consigo pensar em mais nada ....: - (((

procedimento TFSearch.BitBtn3Click (Sender: TObject);
var
s: string;
katId, strId: integer;
filt: string;
começar
se edit2.text <> "" então
começar
dm1.q1.close;
dm1.q1.sql.clear;
dm1.q1.sql.add ("selecione * de ruas onde nome =: nome");
dm1.q1.prepare;
dm1.q1.ParamByName ("name"). asstring: = edit2.text;
dm1.q1.open;
strId: = dm1.q1.fieldbyname ("idstreet"). asinteger;
end;

se edit3.text <> "" então
começar
dm1.q1.close;
dm1.q1.sql.clear;
dm1.q1.sql.add ("selecione * de kategor onde nome =: nome");
dm1.q1.prepare;
dm1.q1.ParamByName ("name"). asstring: = edit3.text;
dm1.q1.open;
katId: = dm1.q1.fieldbyname ("idkat"). asinteger;
end;

sqlsearch: = "selecionar" +
"otd.predpr", +
"otd.otdid," +
"pre.idPredpr" +
"otd.name as otdname," +
"otd.phone" +
"pre.katalog", +
"otd.kindid", +
"pre.name as orgname" +
"otd.home" +
"otd.office" +
"str.name as street" +
"(selecione o nome do katalog onde Idkat = pre.katalog) como katal," +
"kat.name as kateg" +
"de" +
"otdel otd", +
"predpr pre" +
"ruas str, kategor kat" +
"onde otd.predpr = pre.IdPredpr e otd.kindId = kat.idkat e otd.streetId = str.IdStreet";

se edit1.text <> "" então
começar
sqlsearch: = sqlsearch + "e pre.name como" + "" "*" + edit1.text + "*" "";
end;
se edit4.text <> "" então
sqlsearch: = sqlsearch + "e otd.home =" + "" "" + edit4.text + "" "";
se edit5.text <> "" então
sqlsearch: = sqlsearch + "e otd.office =" + "" "" + edit5.text + "" "";
se edit6.text <> "" então
sqlsearch: = sqlsearch + "e otd.name como" + "" "*" + edit6.text + "*" "";
se edit7.text <> "" então
sqlsearch: = sqlsearch + "e otd.phone como" + "" "*" + edit7.text + "*" "";

dm1.qSearch.close;
dm1.qSearch.sql.clear;
dm1.qSearch.sql.add (sqlsearch);
dm1.qSearch.Prepare;

filt: = "";
se edit2.text <> "" então
filt: = "street =" "" + edit2.text + "" "";
if (edit3.text <> "") e (edit2.text <> "") então
filt: = filt + "e kateg =" "" + edit3.text + "" "";
if (edit3.text <> "") e (edit2.text = "") então
filt: = filt + "kateg =" "" + edit3.text + "" "";
dm1.qSearch.open;
se filt <> "" então
começar
dm1.qSearch.Filter: = filt;
dm1.qSearch.Filtered: = true;
final
outro
dm1.qSearch.Filtered: = false;
end;



kaif   (2001-11-30 04:40) [1]

Um pequeno comentário. Eu não mergulhei profundamente. Mas construções como "kateg =" "" + edit3.text + "" "" me parecem perigosas. Você precisa usar o ParamByName, caso contrário, imagine o que acontecerá se o usuário inserir uma aspa no texto. Você pode tentar, uma vez eu me envolvi nisso uma vez ... E se é absolutamente insuportável, então use "kateg =" + QuotedStr (edit3.text) melhor. A função QuotedStr protege contra falhas ao usar aspas do usuário. Ele substitui todas as aspas simples por aspas duplas no texto.



Котелок   (2001-11-30 08:21) [2]

Hmmm .....
Eu não sabia sobre tal operador ...
TNX ......

ParamByName não é adequado, porque este texto de consulta é usado em outras chamadas em outros formulários ...
Por exemplo, para classificar por campos diferentes.
Quando eu ligo, executo aproximadamente as seguintes ações:


dm1.qSearch.close;
dm1.qSearch.sql.clear;
dm1.qSearch.sql.add (sqlsearch);
dm1.qSearch.sql.add ("order by otd.home");
dm1.qSearch.Prepare;
dm1.qSearch.open;



kaif   (2001-12-01 02:37) [3]

ParamByName sempre pode ser ativado depois de adicionar "order by otd.home". Comece usando a transferência de parâmetros para consultas (para isso, basta rotulá-las no texto com nomes com dois pontos na frente de ": myparam"). Você logo verá que é muito confortável e elegante. Depois de martelar o texto na propriedade SQL e fazer Prepare, você passa valores para todos os parâmetros, por exemplo, para a string: ParamByName ("myparam"). AsString: = .. A vantagem mais importante dos parâmetros é que eles passam os tipos de dados corretos. Por exemplo, alguém alterou a instalação regional no Windows de "dd / mm / aa" para "mm / dd / aa". Então, todos os parâmetros de data transferidos pela string causarão um erro e serão transferidos conforme o AsDateTime funcionará humanamente. Em seguida, Preparar faz sentido somente se você enviar parâmetros diferentes para a solicitação com o mesmo texto e reabrir a solicitação (leia sobre Preparar).



ilysha   (2001-12-01 16:29) [4]

Você também pode otimizar o código como este:

se Edit2.Text <> "" então começar com dm1.q1 do começar Fechar Sql.Clear; Sql.Add ("select * from streets onde name =: name"); Prepare-se ParamByName ("name"). Asstring: = edit2.text; Aberto strId: = dm1.q1.FieldByName ("idstreet"). AsInteger; fim; fim;



Котелок   (2001-12-04 08:15) [5]

> Kaif
Gyk ... No começo eu fiz isso, mas depois tive que recusar porque
Eu recebo os parâmetros de um formulário criado dinamicamente. Por exemplo, o usuário clicou no botão de pesquisa. O formulário apareceu, ele digitou os termos da pesquisa. Eu criei este mesmo pedido e destruí o formulário. E então vamos dizer que o mesmo usuário decidiu ordenar o resultado da pesquisa por outro campo. E o que devo fazer neste caso? Então eu subi através de um jardim assim. A solicitação é armazenada em uma variável no formulário principal.
PS: Eu sei como usar parambyname .... ;-) ... E honestamente, eu prefiro assim.

> ilysha
Eu não sei, uma vez em alguns artigos, eu vi um aviso para não usar o constructo ao trabalhar com bancos de dados. Embora possa não estar certo ...



kaif   (2001-12-04 16:10) [6]

Bem, salve os parâmetros em algumas variáveis ​​e reorganize-as quantas vezes quiser, depois de substituir o texto da consulta por ORDER BY. Embora, em princípio, nada de ruim em sua versão, eu não vejo. Não é necessário buscar a otimização do código. Mas isso significa clareza e visibilidade. E se você precisar retornar a este programa em um mês? Às vezes é importante salvar seu tempo de trabalho futuro. A melhor opção é escrever um procedimento universal que faça algo semelhante.



Страницы: 1 filial inteira

Fórum: "Bases";
Arquivo atual: 2002.01.08;
Download: [xml.tar.bz2];

em cima









Memória: 0.59 MB
Hora: 0.027 c
14-22391
Serg5
2001-11-10 10:29
2002.01.08
Quem não é preguiçoso, vá para http://forum.ru-board.com/, ele realmente trava, ou filtragem de IP, eles não me deixam.


6-22293
Dark_dan
2001-10-02 18:09
2002.01.08
Soquetes devem morrer !!!!!!!


14-22338
Dima-k17
2001-11-05 10:57
2002.01.08
Os petros


14-22387
- = CrazyFish = -
2001-11-09 16:28
2002.01.08
a questão não é o tópico


3-21954
Strahov
2001-12-05 15:32
2002.01.08
Alguém já encontrou um bug





afrikaans albanês Arabic armênio azerbaijano basco belarusian Bulgarian catalão Chinês simplificado) Chinês tradicional) croata checo dinamarquês Dutch Inglês estoniano filipino Finnish French
Galego georgiano German grego crioulo haitiano hebraico hindi húngaro islandês Indonesian irlandês Italian Japanese Korean letão lituano macedónio Malay maltês Norwegian
persa polonês Portuguese romeno Russa sérvio Slovak esloveno espanhol swahili sueco tailandês turco ucraniano urdu vietnamita galês ídiche bengali bósnio
cebuano esperanto gujarati hausa hmong igbo javanês kannada khmer lao latino maori marata mongol Nepali punjabi somali tâmil telugu yoruba
zulu
Английский francês Alemão Italiano Португальский russo Espanhol