Foros Club Delphi

Foros Club Delphi (http://www.clubdelphi.com/foros/index.php)
-   Conexión con bases de datos (http://www.clubdelphi.com/foros/forumdisplay.php?f=2)
-   -   Pasar datos de un adoquery a una tabla ado (http://www.clubdelphi.com/foros/showthread.php?t=89343)

aromigaret 05-11-2015 18:18:33

Pasar datos de un adoquery a una tabla ado
 
Hola, por favor si alguien puede ayudarme con el siguiente inconveniente, tengo una tabla llamada 'Pedidos' en ella los campos son cantidad, código, ubicación. Por supuesto puede haber varios códigos iguales con distintas cantidades. Necesito ordenar la tabla por el campo 'ubicación' y con los códigos iguales, sumar todos las cantidades y dejar un único registro. Para ello se me ocurrió hacer lo siguiente:

Código Delphi [-]
AUXILIAR.Close;
AUXILIAR.SQL.Text:='SELECT SUM(CANTIDAD),CODIGO,MAX(UBICACION) FROM PEDIDOS '+
                   'WHERE CANTIDAD <> NULL AND CODIGO <> NULL GROUP BY CODIGO';
AUXILIAR.Open;

el MAX(UBICACION) fue necesario, ya que sin el, no funcionaba el GROUP BY.
En un Dbgrid veo el resultado y funciona la agrupación de los que están repetidos, pero ahora no se como pasar esta consulta a otra nueva tabla 'Ordenada' la cual será ordenada luego por el campo ubicacion y enviada por ftp.

Muchas Gracias.

ecfisa 05-11-2015 19:31:40

Hola aromigaret.

No sé con que gestor de BD estas trabajando, pero de este modo:
Código SQL [-]
SELECT CODIGO, SUM(CANTIDAD)
FROM PEDIDOS
WHERE CANTIDAD IS NOT NULL AND CODIGO IS NOT NULL
GROUP BY CODIGO
me agrupa las sumatorias de cantidad por código sin problemas (o tal vez entendí mal lo que estas intentando hacer).

Saludos :)

aromigaret 05-11-2015 19:50:28

ecfisa, gracias por contestar. La agrupación funciona bien con 'Group by', mi problema radica en que ese resultado, lo quiero volcar a una nueva tabla. Es decir la tabla 'pedidos' está desagrupada y quiero agrupar los registros en una nueva tabla llamada 'ordenada'.

tabla 'pedidos':

cantidad código
2 001
5 003
1 001

resultado en tabla 'ordenada':

cantidad código
3 001
5 003

Utilizo tablas .dbf y este programa no se ejecuta en Red.

ecfisa 05-11-2015 20:06:11

Hola de nuevo.

Entiendo... entonces creo que la sentencia debería ser:
Código SQL [-]
INSERT INTO PEDIDOS2 (CODIGO, CANTIDAD) /* (*) */
SELECT CODIGO, SUM(CANTIDAD)
FROM PEDIDOS P
WHERE P.CODIGO IS NOT NULL AND P.CANTIDAD IS NOT NULL
GROUP BY CODIGO
(*) Donde PEDIDOS2 sería la tabla "ordenada"

Saludos :)

aromigaret 05-11-2015 20:28:25

v:-)v Ecfisa, impecable !!! Muchísimas gracias!!!
Y para ponerle la frutilla al postre.... En el mismo SQL se podrá poner 'Order by' para que ordene por un campo especifico al guardarlo en la nueva tabla?

ecfisa 05-11-2015 21:38:50

Hola aromigaret.

Siempre que la columna se encuentre en el SELECT no habría inconveniente, por ejemplo:
Código SQL [-]
INSERT INTO PEDIDOS2 (CODIGO, CANTIDAD)
SELECT P.CODIGO, SUM(P.CANTIDAD)
FROM PEDIDOS P
WHERE P.CODIGO IS NOT NULL AND P.CANTIDAD IS NOT NULL
GROUP BY P.CODIGO
ORDER BY P.CODIGO DESC
y las columnas por las cuales se podría ordenar, estarían limitadas a aquellas que se fueran a insertar (en el caso anterior sólamente P.CODIGO).

Saludos :)

Casimiro Notevi 05-11-2015 21:43:56

Apunto algo: no sirve de nada "insertar registros en orden", salvo que estés usando dbase o algo similar. Y aún así tampoco sirve para nada porque las consultas que hagas a la base de datos ya indicarás el orden que te interese.
En cualquier sistema de bases de datos "normal" grabará los registros donde estime oportuno y sin ningún orden físico real en la tabla.

aromigaret 06-11-2015 01:08:10

Totalmente de acuerdo con vos Casimiro, pero en este caso particular, esta base la paso ordenada via ftp, ya que un servidor recibe y procesa cientos de estas bases por hora y si cada uno la pasa desordena, le quito un tiempo considerable al servidor para realizar el orden requerido y luego realizar el proceso especifico. Por eso me parece mejor que pierda un poco de tiempo cada usuario y la envie ya ordenada.

Por otro lado ecfisa te paso el sql que utilizo:

Código SQL [-]
INSERT INTO ORDENADA (CODIGONUM, CANTIDAD, UBICACION) 
SELECT CODIGONUM, SUM(CANTIDAD), MAX(UBICACION) -------> como necesito el campo ubicacion le puse la funcion max para que el GROUP BY lo aceptara
FROM PEDIDO P 
WHERE P.CODIGONUM IS NOT NULL AND P.CANTIDAD IS NOT NULL 
GROUP BY P.CODIGONUM 
ORDER BY P.UBICACION DESC

Pero me da el siguiente error : "ha intentado ejecutar una consulta que no incluye la expresion especifica 'P.UBICACION' como parte de una funcion de agregado".
Si no lo ordeno funciona perfecto, pero al poner ORDER BY .... salta ese error.

Casimiro Notevi 06-11-2015 03:40:00

Cita:

Empezado por aromigaret (Mensaje 498960)
Totalmente de acuerdo con vos Casimiro, pero en este caso particular, esta base la paso ordenada via ftp, ya que un servidor recibe y procesa cientos de estas bases por hora y si cada uno la pasa desordena, le quito un tiempo considerable al servidor para realizar el orden requerido y luego realizar el proceso especifico. Por eso me parece mejor que pierda un poco de tiempo cada usuario y la envie ya ordenada.

Vuelvo a insistir: no sirve para nada que estén ordenados los registros a insertar. No pierdas el tiempo en ello.

aromigaret 06-11-2015 13:53:21

Ok, Casimiro tomare tu recomendación.

aromigaret 06-11-2015 17:44:22

Crear tabla ado con la union de dos tablas ado
 
Hola, quiero crear una tabla con la unión de dos tablas. Ejemplifico:

Tabla Temporal
cantidad códigonum
1 002
5 003

Tabla Articulo
codigonum articulo marca ubicacion
001 AAAA BBBB 6
002 CCCC DDDD 10
003 EEEE FFFF 8

Tabla Pedido (Tabla resultante)

cantidad codigonum articulo marca ubicacion
1 002 CCCC DDDD 10
5 003 EEEE FFFF 8

Utilizo tablas .dbf con ADO, he probado con:

Código SQL [-]
SELECT T.CANTIDAD, A.ARTICULO, A.MARCA, T.CODIGONUM, A.UBICACION FROM TEMPORAL T INNER JOIN ARTICULO A ON (T.CODIGONUM=A.CODIGONUM)

pero no funciona, he revisado el foro y no encontré ninguna pregunta o respuesta a mi inquietud.

Gracias

aromigaret 06-11-2015 17:54:28

Ya lo resolví lo dejo por si alguien tiene la misma inquietud

Código SQL [-]
INSERT INTO ORDENADA (CANTIDAD,ARTICULO,MARCA,CODIGONUM,UBICACION)  
SELECT T.CANTIDAD, A.ARTICULO, A.MARCA, T.CODIGONUM, A.UBICACION 
FROM TEMPORAL T 
INNER JOIN ARTICULO A ON (T.CODIGONUM=A.CODIGONUM)

ecfisa 07-11-2015 14:23:29

Hola aromigaret.
Cita:

Empezado por aromigaret (Mensaje 498960)
...
Pero me da el siguiente error : "ha intentado ejecutar una consulta que no incluye la expresion especifica 'P.UBICACION' como parte de una funcion de agregado".
Si no lo ordeno funciona perfecto, pero al poner ORDER BY .... salta ese error.

Para que no te aparezca ese error:
Código SQL [-]
INSERT INTO ORDENADA (CODIGONUM, CANTIDAD, UBICACION)
SELECT P.CODIGONUM, SUM(P.CANTIDAD), MAX(UBICACION) AS MAXUBIC
FROM PEDIDOS P
WHERE P.CODIGONUM IS NOT NULL AND P.CANTIDAD IS NOT NULL
GROUP BY P.CODIGONUM
ORDER BY MAXUBIC
Aunque como dice Casimiro, el órden en que se mostrarán los datos luego, dependerá del modo en que realizen la consulta mas que de como fueron guardándose.

Saludos :)


La franja horaria es GMT +2. Ahora son las 04:14:30.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2017, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi