Casa
Top.Mail.Ru Yandeks.Metrika
Foro: "Bases";
Archivo actual: 2002.01.08;
Descargar: [xml.tar.bz2];

abajo

Una pregunta abstracta sobre la optimización. Encontrar ramas similares


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

La pregunta es ...

El siguiente código puede optimizar de alguna manera ... ???

Y él escribió y yo pereklinilo. No puedo pensar en otra cosa ...: - (((

Procedimiento TFSearch.BitBtn3Click (Sender: TObject);
var
s: cuerda;
katId, strId: integer;
filt: string;
comenzar
Si edit2.text <> "" entonces
comenzar
dm1.q1.close;
dm1.q1.sql.clear;
dm1.q1.sql.add ("seleccionar * de las calles donde nombre =: nombre");
dm1.q1.prepare;
dm1.q1.ParamByName ("name"). asstring: = edit2.text;
dm1.q1.open;
strId: = dm1.q1.fieldbyname ("idstreet"). asinteger;
fin;

Si edit3.text <> "" entonces
comenzar
dm1.q1.close;
dm1.q1.sql.clear;
dm1.q1.sql.add ("select * from kategor donde name =: name");
dm1.q1.prepare;
dm1.q1.ParamByName ("name"). asstring: = edit3.text;
dm1.q1.open;
katId: = dm1.q1.fieldbyname ("idkat"). asinteger;
fin;

sqlsearch: = "seleccionar" +
"otd.predpr", +
"otd.otdid," +
"pre.idPredpr", +
"otd.name as otdname," +
"otd.phone", +
"pre.katalog", +
"otd.kindid," +
"pre.name como orgname," +
"otd.home", +
"otd.office", +
"str.name as street," +
"(seleccione el nombre de katalog donde Idkat = pre.katalog) como katal," +
"kat.name as kateg" +
"de" +
"otdel otd," +
"predpr pre", +
"calles str, kategor kat" +
"donde otd.predpr = pre.IdPredpr y otd.kindId = kat.idkat y otd.streetId = str.IdStreet";

Si edit1.text <> "" entonces
comenzar
sqlsearch: = sqlsearch + "y pre.name como" + "" "*" + edit1.text + "*" "";
fin;
Si edit4.text <> "" entonces
sqlsearch: = sqlsearch + "y otd.home =" + "" "" + edit4.text + "" "";
Si edit5.text <> "" entonces
sqlsearch: = sqlsearch + "y otd.office =" + "" "" + edit5.text + "" "";
Si edit6.text <> "" entonces
sqlsearch: = sqlsearch + "y otd.name como" + "" "*" + edit6.text + "*" "";
Si edit7.text <> "" entonces
sqlsearch: = sqlsearch + "y otd.phone como" + "" "*" + edit7.text + "*" "";

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

filt: = "";
Si edit2.text <> "" entonces
filt: = "street =" "" + edit2.text + "" "";
if (edit3.text <> "") y (edit2.text <> "") entonces
filt: = filt + "y kateg =" "" + edit3.text + "" "";
si (edit3.text <> "") y (edit2.text = "") entonces
filt: = filt + "kateg =" "" + edit3.text + "" "";
dm1.qSearch.open;
si filt <> "" entonces
comenzar
dm1.qSearch.Filter: = filt;
dm1.qSearch.Filtered: = true;
final
más
dm1.qSearch.Filtered: = false;
fin;



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

Pequeño comentario. No profundicé en eso. Pero me parecen construcciones peligrosas como "kateg =" "" + edit3.text + "" "". Debe usar ParamByName; de ​​lo contrario, imagine lo que ocurrirá si el usuario ingresa una comilla en el texto. Puedes probarlo, tengo un gran impulso una vez ... Y si soy completamente insoportable, entonces uso mejor "kateg =" + QuotedStr (edit3.text). La función QuotedStr lo protegerá de fallas cuando use comillas por parte del usuario. Reemplaza todas las comillas simples con comillas dobles en el texto.



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

Hmmm ...
No sabía de tal operador ...
TNX ......

ParamByName no es adecuado, porque Este texto de solicitud se usa en otras llamadas en otras formas ...
Por ejemplo, para ordenar por diferentes campos.
Cuando llamo, produzco sobre las siguientes acciones:


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 siempre se puede usar después de agregar "order by otd.home". Comience a usar el paso de parámetros a las consultas (para hacer esto, basta con nombrarlos en el texto con dos puntos delante del texto ": myparam"). Pronto estarás convencido de que es muy cómodo y elegante. Después de escribir el texto en la propiedad SQL y hacer Preparar, pasa valores para todos los parámetros, por ejemplo, para la cadena: ParamByName ("myparam"). AsString: = .. La ventaja más importante de los parámetros es que pasan los tipos de datos correctos. Por ejemplo, alguien cambió la instalación regional en Windows de "dd / mm / aa" a "mm / dd / aa". Entonces, todos los parámetros de fecha transmitidos por la cadena causarán un error, y los transmitidos como AsDateTime funcionarán correctamente. Entonces, Preparar solo tiene sentido si envía diferentes parámetros a la consulta con el mismo texto y vuelve a abrir la consulta (lea sobre Preparar).



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

También puedes optimizar el código así:

si Edit2.Text <> "" entonces comenzar con dm1.q1 hacer comenzar Cerca Sql.Clear; Sql.Add ("seleccionar * de las calles donde nombre =: nombre"); Preparar ParamByName ("nombre"). Asstring: = edit2.text; Abierto strId: = dm1.q1.FieldByName ("idstreet"). AsInteger; fin fin



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

> Kaif
Guy ... Lo hice primero, pero luego tuve que dejarlo.
Los parámetros que obtengo de una forma creada dinámicamente. Por ejemplo, el usuario hizo clic en el botón de búsqueda. La forma saltó, entró en los términos de búsqueda. Creé esta misma consulta, y destruí el formulario. Y luego digamos que el mismo evaluador decidió ordenar el resultado de la búsqueda por otro campo. ¿Y qué debo hacer en este caso? Aquí estoy a través de un jardín y subí. La solicitud se almacena en variable en el formulario principal.
PD: Cómo usar parambyname, lo sé ...; -) ... Y para ser honesto, prefiero esta manera.

> ilysha
No lo sé, una vez vi en un par de artículos una advertencia de no usar la construcción cuando se trabaja con bases de datos. Aunque puede estar mal ...



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

Bueno, guarde los parámetros en algunas variables y vuelva a enviarlos tantas veces como desee, después de reemplazar el texto de la consulta en relación con ORDER BY. Aunque, en principio, no hay nada malo en su versión, no lo veo. Para el código óptimo no tiene que perseguir. Pero para mayor claridad y visibilidad es. ¿De repente necesitas un mes para volver a este programa? A veces es importante ahorrar tiempo de trabajo futuro. La mejor opción es escribir un procedimiento universal que haga algo similar.



Páginas: 1 rama entera

Foro: "Bases";
Archivo actual: 2002.01.08;
Descargar: [xml.tar.bz2];

arriba









Memoria: 0.59 MB
Tiempo: 0.039 c
14-22362
Mifi
2001-11-04 02:34
2002.01.08
como encontrar una persona


7-22446
Paradoja
2001-09-25 19:12
2002.01.08
¡No te lo pierdas! Bueno, muy necesario.


14-22323
Melamed
2001-11-04 19:57
2002.01.08
¿Cómo corregir estos datos personales, registrados en el registro?


14-22383
Vadim
2001-11-08 11:01
2002.01.08
Programador foros


3-21924
Andrés
2001-12-04 14:37
2002.01.08
DbLookUpComboBox





africaans albanés Arabic armenio Azerbaiyán vasco Bielorruso Bulgarian Catalán Chino (simplificado) Chino (tradicional) Croata Checo Danés Dutch Inglés Estonia filipina Finnish Francés
gallego georgiano Alemán Griego criollo haitiano hebreo hindi Húngaro islandés Indonesian irlandés Italiana Japonés Korean letón lituano macedonio Malay maltés Noruego
persa polaco Portuguese rumano Ruso Serbio Slovak Esloveno Español swahili Sueco Thai turco ucranio Urdu vietnamita galés yídish bengalí bosnio
cebuano esperanto gujarati hausa hmong igbo javanés kannada khmer lao latín maorí marathi mongol nepali punjabi somalí Tamil telugu yoruba
zulú
Английский Francés Alemán Italiano portugués Русский Español