PDA

Ver la Versión Completa : Ayuda con un query de Actualizacion en MySQL


marcoev
10-10-2008, 18:58:03
Muy buenos días o tardes tengan todos, espero y puedan ayudarme.

Tengo 2 tablas, la primer tabla seria el padre y la otra la hija, en ambas tengo un campo o bandera que es para indicar si el registro esta disponible, la bandera de la tabla padre depende de todas las banderas de la tabla hija, por lo que si todas las banderas están en True en la hija la bandera del padre debe de estar en True, pero si uno solo de la tabla hija esta en False, la bandera del padre debe de estar en False.

necesito hacer un query (si es que es posible) para que haga estos cambios, el query lo ejecutaría desde mi aplicación.

estoy utilizando MySQL 5, y la verdad no tengo idea de como puedo lograr esto desde SQL, pues lo que hago actualmente es por medio de ciclos y no se me hace que sea la mejor opción.

Cualquier ayuda es bienvenida.

Saludos y espero sus amables comentarios.

marcoev
10-10-2008, 19:58:41
pues aqui tengo algo, aunque no esta completo, y no jala :(, pero es un avance y creo que por aqui va

UPDATE Facturas, (SELECT COUNT(Saldada) As Saldadas From FacturasDet Where Saldada = False) As @Saldadas
Set Facturas.Saldada = IF(@Saldadas=0, True, False)


aclaro que las tabla padre es Facturas y la Hijo es FacturasDet, el campo bandera se llama Saldada.

alguien que sepa mas al respecto... gracias.

roman
10-10-2008, 20:01:03
Suponiendo que entendí lo que preguntas y tomando en cuenta que un valor booleano es 1 ó 0, se me ocurre lo siguiente:


update padre
set disponible = (select min(disponible) from hijo where codigo_padre = padre.codigo)


Si todos los hijos están disponibles, el mínimo será 1, si por lo menos uno no lo está, el mínimo será 0.

// Saludos

enecumene
10-10-2008, 20:02:53
EDITO: Roman ya contestó.

marcoev
10-10-2008, 20:19:34
muchas gracias roman por tu respuesta. en si me quedo el codigo como sigue

UPDATE Facturas
Set Facturas.Saldada = IF((SELECT count(Saldada) As Saldadas From FacturasDet Where Saldada = False) = 0, True, False)

utilice count e if, pues nose, me gusto mas :p, pero la idea seria casi lo mismo. aunque todavia me falta ahora si utilizar las llaves foraneas y esas cosas, espero y me funcione correctamente.

marcoev
10-10-2008, 20:33:58
roman, otra consulta, el query funcionaria para cuando se tienen que actualizar varios padres?

osea
update padre
set disponible = (select min(disponible) from hijo where codigo_padre = padre.codigo) Where Padre.Master = ejemplo

donde el padre.Master puede repetirse? esto porque el padre a su vez tiene otro padre... complicado, me imagino quetendria que hacer algun ciclo :(

marcoev
14-10-2008, 18:26:17
pues creo que me habia hecho bolas con lo que intentaba hacer, pero ya lo resolvi y creo que de buena forma.

en total hago 3 querys, el primer query marca los hijos del primer padre como saldados si estos ya no tienen "saldo" pendiente

el segundo query verifica si la factura tiene hijos pendientes de saldar, dependiendo del resultado salda o no la factura

y el tercero hace lo mismo que el anterior pero con las entradas y las facturas.

Este es el codigo que finalmente utilize para el proceso...

//Registra las salidas y marca o desmarca como saldada...
qAccion.Close;
qAccion.SQL.Text:='Update FacturasDet Set Salidas = Salidas + '+
FloatToStr(edCantidad.FloatValue-CantTmp)+', Saldada = IF(Salidas = CantRec, True, False)' +
' Where FolioDet = '+qSalidasDet.FieldByName('FolioDet').AsString;
qAccion.Execute;

//Marca o demarca como saldada la factura
qAccion.Close;
qAccion.SQL.Text:='Update Facturas Set Saldada = If((Select Count(Saldada) As Total From '+
'FacturasDet Where Folio = '+FDFolio+' and Saldada = False)>0, False, True)';
qAccion.Execute;

//Marca o demarca como saldada la entrada
qAccion.Close;
qAccion.SQL.Text:='Update Entradas Set Saldada = If((Select Count(Saldada) As Total From '+
'Facturas Where NoEntrada = '+QuotedStr(FDEntrada)+' and Saldada = False)>0, False, True)';
qAccion.Execute;


de igual forma, muchas gracias por su apoyo.

martinb
01-12-2008, 14:58:47
Hola tengo un problema cuando quiero hacer un reporte utilizando un query como master y una ttable como detail.

Cuando uso grillas en un formulario anda bien, pero cuando quiero hacer un reporte, este solo imprime los registros del maestro pero ninguno del detalle.

Hay alguna solucion posible o simplemente no se puede hacer un reporte de este tipo. Por cierto uso el componente Qreport.

Espero respuestas. Desde ya gracias.

Saludos CLub delphi