Ver Mensaje Individual
  #1  
Antiguo 15-01-2009
mjjj mjjj is offline
Miembro
 
Registrado: mar 2007
Posts: 652
Reputación: 18
mjjj Va por buen camino
SQL inventario

Hola amigos, alguna idea para mejorara esto...

Tengo una consulta SQL, que demora aproximadamente 15 segundo en devolver resultados. Esto empezo a ocurrir mientras mas registro tengo en mi base de datos.

Este es el codigo que utilizo.

Código Delphi [-]
IBQUERY1.CLOSE;
IBQUERY1.SQL.Clear;
IBQUERY1.SQL.ADD('SELECT m.cod_insum,M.nom_insum, m.unidad, M.CRITICO, m.rotacion,');
if sComboBox1.ItemIndex <> 0 then
begin
IBQUERY1.SQL.ADD('((SELECT coalesce(sum(cantidad),0) FROM inventario I WHERE I.id=M.cod_insum and tipo ='+QUOTEDSTR('I'));
IBQUERY1.SQL.ADD('AND I.EMPRESA ='+quotedstr(form1.label1.caption));
IBQUERY1.SQL.ADD('AND I.bodega =(SELECT ID FROM BODEGA WHERE NOMBRE ='+quotedstr(scombobox1.text));
IBQUERY1.SQL.ADD('AND EMPRESA ='+quotedstr(form1.label1.caption));
IBQUERY1.SQL.ADD('))-(SELECT coalesce(sum(cantidad),0) FROM inventario i WHERE I.id=M.cod_insum and (tipo ='+QUOTEDSTR('E'));
IBQUERY1.SQL.ADD('OR TIPO ='+QUOTEDSTR('T')+')');
IBQUERY1.SQL.ADD('AND I.EMPRESA ='+quotedstr(form1.label1.caption));
IBQUERY1.SQL.ADD('AND I.bodega =(SELECT ID FROM BODEGA WHERE NOMBRE ='+quotedstr(scombobox1.text));
IBQUERY1.SQL.ADD('AND EMPRESA ='+quotedstr(form1.label1.caption));
IBQUERY1.SQL.ADD('))) AS SALDO, ((SELECT coalesce(sum(cantidad * precio * tc),0) FROM inventario I WHERE I.id=M.cod_insum and tipo ='+QUOTEDSTR('I'));
IBQUERY1.SQL.ADD('AND EMPRESA ='+quotedstr(form1.label1.caption));
IBQUERY1.SQL.ADD('AND I.bodega =(SELECT ID FROM BODEGA WHERE NOMBRE ='+quotedstr(scombobox1.text));
IBQUERY1.SQL.ADD('AND EMPRESA ='+quotedstr(form1.label1.caption));
IBQUERY1.SQL.ADD('))- (SELECT coalesce(sum(cantidad * precio * tc),0) FROM inventario I WHERE I.id=M.cod_insum and (tipo ='+QUOTEDSTR('E'));
IBQUERY1.SQL.ADD('OR TIPO ='+QUOTEDSTR('T')+')');
IBQUERY1.SQL.ADD('AND EMPRESA ='+quotedstr(form1.label1.caption));
IBQUERY1.SQL.ADD('AND I.bodega =(SELECT ID FROM BODEGA WHERE NOMBRE ='+quotedstr(scombobox1.text));
IBQUERY1.SQL.ADD('AND EMPRESA ='+quotedstr(form1.label1.caption));
IBQUERY1.SQL.ADD(')))/coalesce(NULLIF((SELECT sum(cantidad) FROM inventario I WHERE I.id=M.cod_insum and tipo ='+QUOTEDSTR('I'));
IBQUERY1.SQL.ADD('AND EMPRESA ='+quotedstr(form1.label1.caption));
IBQUERY1.SQL.ADD('AND I.bodega =(SELECT ID FROM BODEGA WHERE NOMBRE ='+quotedstr(scombobox1.text));
IBQUERY1.SQL.ADD('AND EMPRESA ='+quotedstr(form1.label1.caption));
IBQUERY1.SQL.ADD('))-(SELECT COALESCE(sum(cantidad),0) FROM inventario i WHERE I.id=M.cod_insum and (tipo ='+QUOTEDSTR('E'));
IBQUERY1.SQL.ADD('OR TIPO ='+QUOTEDSTR('T')+')');
IBQUERY1.SQL.ADD('AND EMPRESA ='+quotedstr(form1.label1.caption));
IBQUERY1.SQL.ADD('AND I.bodega =(SELECT ID FROM BODEGA WHERE NOMBRE ='+quotedstr(scombobox1.text));
IBQUERY1.SQL.ADD('AND EMPRESA ='+quotedstr(form1.label1.caption));
IBQUERY1.SQL.ADD(')),0),1) as UNITARIO, ');
IBQUERY1.SQL.ADD('((SELECT coalesce(sum(cantidad),0) FROM inventario I WHERE I.id=M.cod_insum and tipo ='+QUOTEDSTR('I'));
IBQUERY1.SQL.ADD('AND I.EMPRESA ='+quotedstr(form1.label1.caption));
IBQUERY1.SQL.ADD('AND I.bodega =(SELECT ID FROM BODEGA WHERE NOMBRE ='+quotedstr(scombobox1.text));
IBQUERY1.SQL.ADD('AND EMPRESA ='+quotedstr(form1.label1.caption));
IBQUERY1.SQL.ADD('))-(SELECT coalesce(sum(cantidad),0) FROM inventario i WHERE I.id=M.cod_insum and (tipo ='+QUOTEDSTR('E'));
IBQUERY1.SQL.ADD('OR TIPO ='+QUOTEDSTR('T')+')');
IBQUERY1.SQL.ADD('AND I.EMPRESA ='+quotedstr(form1.label1.caption));
IBQUERY1.SQL.ADD('AND I.bodega =(SELECT ID FROM BODEGA WHERE NOMBRE ='+quotedstr(scombobox1.text));
IBQUERY1.SQL.ADD('AND EMPRESA ='+quotedstr(form1.label1.caption));
IBQUERY1.SQL.ADD('))) AS SALDO, ((SELECT coalesce(sum(cantidad * precio * tc),0) FROM inventario I WHERE I.id=M.cod_insum and tipo ='+QUOTEDSTR('I'));
IBQUERY1.SQL.ADD('AND EMPRESA ='+quotedstr(form1.label1.caption));
IBQUERY1.SQL.ADD('AND I.bodega =(SELECT ID FROM BODEGA WHERE NOMBRE ='+quotedstr(scombobox1.text));
IBQUERY1.SQL.ADD('AND EMPRESA ='+quotedstr(form1.label1.caption));
IBQUERY1.SQL.ADD('))- (SELECT coalesce(sum(cantidad * precio * tc),0) FROM inventario I WHERE I.id=M.cod_insum and (tipo ='+QUOTEDSTR('E'));
IBQUERY1.SQL.ADD('OR TIPO ='+QUOTEDSTR('T')+')');
IBQUERY1.SQL.ADD('AND EMPRESA ='+quotedstr(form1.label1.caption));
IBQUERY1.SQL.ADD('AND I.bodega =(SELECT ID FROM BODEGA WHERE NOMBRE ='+quotedstr(scombobox1.text));
IBQUERY1.SQL.ADD('AND EMPRESA ='+quotedstr(form1.label1.caption));
IBQUERY1.SQL.ADD(')))/coalesce(NULLIF((SELECT sum(cantidad) FROM inventario I WHERE I.id=M.cod_insum and tipo ='+QUOTEDSTR('I'));
IBQUERY1.SQL.ADD('AND EMPRESA ='+quotedstr(form1.label1.caption));
IBQUERY1.SQL.ADD('AND I.bodega =(SELECT ID FROM BODEGA WHERE NOMBRE ='+quotedstr(scombobox1.text));
IBQUERY1.SQL.ADD('AND EMPRESA ='+quotedstr(form1.label1.caption));
IBQUERY1.SQL.ADD('))-(SELECT COALESCE(sum(cantidad),0) FROM inventario i WHERE I.id=M.cod_insum and (tipo ='+QUOTEDSTR('E'));
IBQUERY1.SQL.ADD('OR TIPO ='+QUOTEDSTR('T')+')');
IBQUERY1.SQL.ADD('AND EMPRESA ='+quotedstr(form1.label1.caption));
IBQUERY1.SQL.ADD('AND I.bodega =(SELECT ID FROM BODEGA WHERE NOMBRE ='+quotedstr(scombobox1.text));
IBQUERY1.SQL.ADD('AND EMPRESA ='+quotedstr(form1.label1.caption));
IBQUERY1.SQL.ADD(')),0),1) * ');
IBQUERY1.SQL.ADD('((SELECT coalesce(sum(cantidad),0) FROM inventario I WHERE I.id=M.cod_insum and tipo ='+QUOTEDSTR('I'));
IBQUERY1.SQL.ADD('AND I.EMPRESA ='+quotedstr(form1.label1.caption));
IBQUERY1.SQL.ADD('AND I.bodega =(SELECT ID FROM BODEGA WHERE NOMBRE ='+quotedstr(scombobox1.text));
IBQUERY1.SQL.ADD('AND EMPRESA ='+quotedstr(form1.label1.caption));
IBQUERY1.SQL.ADD('))-(SELECT coalesce(sum(cantidad),0) FROM inventario i WHERE I.id=M.cod_insum and (tipo ='+QUOTEDSTR('E'));
IBQUERY1.SQL.ADD('OR TIPO ='+QUOTEDSTR('T')+')');
IBQUERY1.SQL.ADD('AND I.EMPRESA ='+quotedstr(form1.label1.caption));
IBQUERY1.SQL.ADD('AND I.bodega =(SELECT ID FROM BODEGA WHERE NOMBRE ='+quotedstr(scombobox1.text));
IBQUERY1.SQL.ADD('AND EMPRESA ='+quotedstr(form1.label1.caption));
IBQUERY1.SQL.ADD('))) AS SUBTOTAL');
 
IBQUERY1.SQL.ADD('FROM insumos M where m.empresa ='+quotedstr(form1.label1.caption));
IBQUERY1.SQL.ADD('AND (M.TIPO ='+quotedstr('T'));
IBQUERY1.SQL.ADD('OR M.TIPO IS NULL)');
IBQUERY1.SQL.ADD('GROUP BY m.cod_insum,M.nom_insum, m.unidad, m.critico, m.rotacion');

Es muy larga... alguna idea para hacerla mas eficiente.

Lo que hace es:
Busca los codigos en la tabla insumos (aproximadamente 1000 registros), utiliza estos codigo en la tabla inventario dado que la suma de todos los ingresos, menos la suma de todos los egresos. (calcula la cantidad de existe de cada uno de los insumos).

Además para cada uno de los insumos calcula el precio pondera, segun la sumatoria de los ingresos por su precio, menos los egresos por su precio.

UFFFF.... bueno, el tema es que esta funcionando, pero es muy relento.... unos 15 segundo en entregar la info.

Que me dicen ustedes, valdra la pena mejorar esto?
Como lo puedo hacer?
Alguna idea?

Gracias anticipadas.
Responder Con Cita